From a1f2ed267aeffb4aa1336f3a536ac9f70d37e27d Mon Sep 17 00:00:00 2001 From: Dan Rosenbloom Date: Mon, 6 Jan 2020 14:40:05 -0500 Subject: [PATCH 1/3] feat: add cloudwatch logs URL to lambda additional data --- sentry_sdk/integrations/aws_lambda.py | 44 +++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index f1b5b38378..0abcf36604 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): + start_time = datetime.now() + + def event_processor(event, hint, start_time=start_time): # type: (Event, Hint) -> 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,33 @@ 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: (LambdaContext, datetime) -> str + """ + Generates a CloudWatchLogs console URL based on the LambdaContext object + + Arguments: + context {LambdaContext} -- context from lambda handler + + Returns: + str -- AWS Console URL to logs. + """ + formatstring = "%Y-%m-%dT%H:%M:%S" + start_time_str = (start_time - timedelta(seconds=1)).strftime(formatstring) + end_time_str = (datetime.now() + timedelta(seconds=2)).strftime(formatstring) + url = ''.join([ + "https://console.aws.amazon.com/cloudwatch/home?region=", + environ.get('AWS_REGION'), + "#logEventViewer:group=", + context.log_group_name, + ";stream=", + context.log_stream_name, + ";start=", + start_time_str, + ";end=", + end_time_str, + ]) + + return url From 376ce9cc9ab7918ed5681037925492fc1649bf41 Mon Sep 17 00:00:00 2001 From: Dan Rosenbloom Date: Thu, 13 Feb 2020 15:59:50 -0500 Subject: [PATCH 2/3] style: change url string generation --- sentry_sdk/integrations/aws_lambda.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index 0abcf36604..d6198d97ed 100644 --- a/sentry_sdk/integrations/aws_lambda.py +++ b/sentry_sdk/integrations/aws_lambda.py @@ -238,19 +238,17 @@ def _get_cloudwatch_logs_url(context, start_time): str -- AWS Console URL to logs. """ formatstring = "%Y-%m-%dT%H:%M:%S" - start_time_str = (start_time - timedelta(seconds=1)).strftime(formatstring) - end_time_str = (datetime.now() + timedelta(seconds=2)).strftime(formatstring) - url = ''.join([ - "https://console.aws.amazon.com/cloudwatch/home?region=", - environ.get('AWS_REGION'), - "#logEventViewer:group=", - context.log_group_name, - ";stream=", - context.log_stream_name, - ";start=", - start_time_str, - ";end=", - end_time_str, - ]) + + 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 From 625a68612406f66cf209598bbb28c21362e245a8 Mon Sep 17 00:00:00 2001 From: Dan Rosenbloom Date: Fri, 14 Feb 2020 11:33:49 -0500 Subject: [PATCH 3/3] style: fix for linters --- sentry_sdk/integrations/aws_lambda.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index d6198d97ed..b8ce076465 100644 --- a/sentry_sdk/integrations/aws_lambda.py +++ b/sentry_sdk/integrations/aws_lambda.py @@ -163,7 +163,7 @@ def _make_request_event_processor(aws_event, aws_context): start_time = datetime.now() def event_processor(event, hint, start_time=start_time): - # type: (Event, Hint) -> Optional[Event] + # type: (Event, Hint, datetime) -> Optional[Event] extra = event.setdefault("extra", {}) extra["lambda"] = { "function_name": aws_context.function_name, @@ -227,12 +227,12 @@ def _get_url(event, context): def _get_cloudwatch_logs_url(context, start_time): - # type: (LambdaContext, datetime) -> str + # type: (Any, datetime) -> str """ - Generates a CloudWatchLogs console URL based on the LambdaContext object + Generates a CloudWatchLogs console URL based on the context object Arguments: - context {LambdaContext} -- context from lambda handler + context {Any} -- context from lambda handler Returns: str -- AWS Console URL to logs. @@ -244,7 +244,7 @@ def _get_cloudwatch_logs_url(context, start_time): "#logEventViewer:group={log_group};stream={log_stream}" ";start={start_time};end={end_time}" ).format( - region=environ.get('AWS_REGION'), + 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),