Skip to content
This repository was archived by the owner on Jun 13, 2023. It is now read-only.

Commit 83054ca

Browse files
authored
feat(boto3): trace boto3 rds data cs 24 (#382)
1 parent b74ec77 commit 83054ca

File tree

1 file changed

+89
-1
lines changed

1 file changed

+89
-1
lines changed

epsagon/events/botocore.py

+89-1
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,95 @@ def get_secret_value_response(self):
18371837
self._add_data_to_metadata('Response', response_data)
18381838

18391839

1840+
class BotocoreAuroraServerlessEvent(BotocoreEvent):
1841+
"""
1842+
Represents data API (aurora serverless) botocore event.
1843+
"""
1844+
1845+
RESOURCE_TYPE = 'rdsdataservice'
1846+
RESOURCE_TYPE_UPDATE = 'database'
1847+
EXECUTE_STATEMENT_OPERATION = 'ExecuteStatement'
1848+
DATABASE_FIELD = 'database'
1849+
RESOURCE_ARN_FIELD = 'resourceArn'
1850+
1851+
def _get_resource_name(self):
1852+
"""
1853+
Gets the relevant resource name - the managed RDS name
1854+
"""
1855+
resource_arn = self.request_data.get(self.RESOURCE_ARN_FIELD, '')
1856+
return resource_arn.split(':')[-1]
1857+
1858+
1859+
def __init__(self, wrapped, instance, args, kwargs, start_time, response,
1860+
exception):
1861+
"""
1862+
Initialize.
1863+
:param wrapped: wrapt's wrapped
1864+
:param instance: wrapt's instance
1865+
:param args: wrapt's args
1866+
:param kwargs: wrapt's kwargs
1867+
:param start_time: Start timestamp (epoch)
1868+
:param response: response data
1869+
:param exception: Exception (if happened)
1870+
"""
1871+
self.OPERATION_TO_FUNC.update({
1872+
self.EXECUTE_STATEMENT_OPERATION: self.execute_statement_op,
1873+
})
1874+
1875+
self.RESPONSE_TO_FUNC.update({
1876+
self.EXECUTE_STATEMENT_OPERATION: self.execute_statement_response,
1877+
})
1878+
_, request_data = args
1879+
self.request_data = request_data
1880+
self.response = response
1881+
1882+
super(BotocoreAuroraServerlessEvent, self).__init__(
1883+
wrapped,
1884+
instance,
1885+
args,
1886+
kwargs,
1887+
start_time,
1888+
response,
1889+
exception
1890+
)
1891+
self.resource['name'] = self._get_resource_name()
1892+
self.resource['type'] = self.RESOURCE_TYPE_UPDATE
1893+
self.OPERATION_TO_FUNC.get(self.resource['operation'], empty_func)()
1894+
1895+
def update_response(self, response):
1896+
"""
1897+
Adds response data to event.
1898+
:param response: Response from botocore
1899+
"""
1900+
super(BotocoreAuroraServerlessEvent, self).update_response(response)
1901+
self.RESPONSE_TO_FUNC.get(self.resource['operation'], empty_func)()
1902+
1903+
def execute_statement_op(self):
1904+
"""
1905+
Handles execute statement operation.
1906+
"""
1907+
self.resource['metadata']['database'] = self.request_data.get(
1908+
self.DATABASE_FIELD
1909+
)
1910+
self.resource['metadata']['Secret Arn'] = self.request_data.get(
1911+
'secretArn'
1912+
)
1913+
add_data_if_needed(
1914+
self.resource['metadata'], 'sql', self.request_data.get('sql')
1915+
)
1916+
1917+
def execute_statement_response(self):
1918+
"""
1919+
Handles execute statement response.
1920+
"""
1921+
add_data_if_needed(
1922+
self.resource['metadata'], 'records', self.response.get('records')
1923+
)
1924+
self.resource['metadata']['number of records updated'] = (
1925+
self.response.get('numberOfRecordsUpdated')
1926+
)
1927+
1928+
18401929
class BotocoreEventFactory(object):
18411930
"""
18421931
Factory class, generates botocore event.
@@ -1866,7 +1955,6 @@ def create_event(wrapped, instance, args, kwargs, start_time, response,
18661955
instance_type,
18671956
None
18681957
)
1869-
18701958
if event_class is not None:
18711959
event = event_class(
18721960
wrapped,

0 commit comments

Comments
 (0)