diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index f1b5b38378..b8ce076465 100644 --- a/sentry_sdk/integrations/aws_lambda.py +++ b/sentry_sdk/integrations/aws_lambda.py @@ -1,3 +1,5 @@ +from datetime import datetime, timedelta +from os import environ import sys from sentry_sdk.hub import Hub, _should_send_default_pii @@ -158,17 +160,25 @@ def inner(*args, **kwargs): def _make_request_event_processor(aws_event, aws_context): # type: (Any, Any) -> EventProcessor - def event_processor(event, hint): - # type: (Event, Hint) -> Optional[Event] + start_time = datetime.now() + + def event_processor(event, hint, start_time=start_time): + # type: (Event, Hint, datetime) -> Optional[Event] extra = event.setdefault("extra", {}) extra["lambda"] = { - "remaining_time_in_millis": aws_context.get_remaining_time_in_millis(), "function_name": aws_context.function_name, "function_version": aws_context.function_version, "invoked_function_arn": aws_context.invoked_function_arn, + "remaining_time_in_millis": aws_context.get_remaining_time_in_millis(), "aws_request_id": aws_context.aws_request_id, } + extra["cloudwatch logs"] = { + "url": _get_cloudwatch_logs_url(aws_context, start_time), + "log_group": aws_context.log_group_name, + "log_stream": aws_context.log_stream_name, + } + request = event.get("request", {}) if "httpMethod" in aws_event: @@ -214,3 +224,31 @@ def _get_url(event, context): if proto and host and path: return "{}://{}{}".format(proto, host, path) return "awslambda:///{}".format(context.function_name) + + +def _get_cloudwatch_logs_url(context, start_time): + # type: (Any, datetime) -> str + """ + Generates a CloudWatchLogs console URL based on the context object + + Arguments: + context {Any} -- context from lambda handler + + Returns: + str -- AWS Console URL to logs. + """ + formatstring = "%Y-%m-%dT%H:%M:%S" + + url = ( + "https://console.aws.amazon.com/cloudwatch/home?region={region}" + "#logEventViewer:group={log_group};stream={log_stream}" + ";start={start_time};end={end_time}" + ).format( + region=environ.get("AWS_REGION"), + log_group=context.log_group_name, + log_stream=context.log_stream_name, + start_time=(start_time - timedelta(seconds=1)).strftime(formatstring), + end_time=(datetime.now() + timedelta(seconds=2)).strftime(formatstring), + ) + + return url