in elasticapm/contrib/serverless/aws.py [0:0]
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
"""
Transaction teardown
"""
if self.response and isinstance(self.response, dict):
elasticapm.set_context(
lambda: get_data_from_response(self.response, capture_headers=self.client.config.capture_headers),
"response",
)
if "statusCode" in self.response:
try:
result = "HTTP {}xx".format(int(self.response["statusCode"]) // 100)
elasticapm.set_transaction_result(result, override=False)
if result == "HTTP 5xx":
elasticapm.set_transaction_outcome(outcome="failure", override=False)
except ValueError:
logger.warning("Lambda function's statusCode was not formed as an int. Assuming 5xx result.")
elasticapm.set_transaction_result("HTTP 5xx", override=False)
elasticapm.set_transaction_outcome(outcome="failure", override=False)
if exc_val:
self.client.capture_exception(exc_info=(exc_type, exc_val, exc_tb), handled=False)
if self.source in SERVERLESS_HTTP_REQUEST:
elasticapm.set_transaction_result("HTTP 5xx", override=False)
elasticapm.set_transaction_outcome(http_status_code=500, override=False)
elasticapm.set_context({"status_code": 500}, "response")
else:
elasticapm.set_transaction_result("failure", override=False)
elasticapm.set_transaction_outcome(outcome="failure", override=False)
self.client.end_transaction()
# Collect any custom+prometheus metrics if enabled
self.client.metrics.collect()
try:
logger.debug("Flushing elasticapm data")
self.client._transport.flush()
logger.debug("Flush complete")
except ValueError:
logger.warning("Flush timed out")