Skip to content

Commit 8d80e67

Browse files
authored
Use .get to avoid keyError issues (#226)
1 parent b14e6aa commit 8d80e67

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

datadog_lambda/tracing.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -553,8 +553,8 @@ def create_inferred_span(event, context):
553553
def create_inferred_span_from_lambda_function_url_event(event, context):
554554
request_context = event.get("requestContext")
555555
domain = request_context.get("domainName")
556-
method = request_context.get("http").get("method")
557-
path = request_context.get("http").get("path")
556+
method = request_context.get("http", {}).get("method")
557+
path = request_context.get("http", {}).get("path")
558558
resource = "{0} {1}".format(method, path)
559559
tags = {
560560
"operation_name": "aws.lambda.url",
@@ -583,11 +583,7 @@ def create_inferred_span_from_lambda_function_url_event(event, context):
583583

584584

585585
def is_api_gateway_invocation_async(event):
586-
return (
587-
"headers" in event
588-
and "X-Amz-Invocation-Type" in event.get("headers")
589-
and event.get("headers").get("X-Amz-Invocation-Type") == "Event"
590-
)
586+
return event.get("headers", {}).get("X-Amz-Invocation-Type") == "Event"
591587

592588

593589
def create_inferred_span_from_api_gateway_websocket_event(event, context):
@@ -663,17 +659,17 @@ def create_inferred_span_from_api_gateway_event(event, context):
663659
def create_inferred_span_from_http_api_event(event, context):
664660
request_context = event.get("requestContext")
665661
domain = request_context.get("domainName")
666-
method = request_context.get("http").get("method")
662+
method = request_context.get("http", {}).get("method")
667663
path = event.get("rawPath")
668664
resource = "{0} {1}".format(method, path)
669665
tags = {
670666
"operation_name": "aws.httpapi",
671667
"endpoint": path,
672668
"http.url": domain + path,
673-
"http.method": request_context.get("http").get("method"),
674-
"http.protocol": request_context.get("http").get("protocol"),
675-
"http.source_ip": request_context.get("http").get("sourceIp"),
676-
"http.user_agent": request_context.get("http").get("userAgent"),
669+
"http.method": request_context.get("http", {}).get("method"),
670+
"http.protocol": request_context.get("http", {}).get("protocol"),
671+
"http.source_ip": request_context.get("http", {}).get("sourceIp"),
672+
"http.user_agent": request_context.get("http", {}).get("userAgent"),
677673
"resource_names": resource,
678674
"request_id": context.aws_request_id,
679675
"apiid": request_context.get("apiId"),
@@ -710,10 +706,10 @@ def create_inferred_span_from_sqs_event(event, context):
710706
"queuename": queue_name,
711707
"event_source_arn": event_source_arn,
712708
"receipt_handle": event_record.get("receiptHandle"),
713-
"sender_id": event_record.get("attributes").get("SenderId"),
709+
"sender_id": event_record.get("attributes", {}).get("SenderId"),
714710
}
715711
InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="async")
716-
request_time_epoch = event_record.get("attributes").get("SentTimestamp")
712+
request_time_epoch = event_record.get("attributes", {}).get("SentTimestamp")
717713
args = {
718714
"service": "sqs",
719715
"resource": queue_name,
@@ -756,7 +752,7 @@ def create_inferred_span_from_sqs_event(event, context):
756752
def create_inferred_span_from_sns_event(event, context):
757753
event_record = get_first_record(event)
758754
sns_message = event_record.get("Sns")
759-
topic_arn = event_record.get("Sns").get("TopicArn")
755+
topic_arn = event_record.get("Sns", {}).get("TopicArn")
760756
topic_name = topic_arn.split(":")[-1]
761757
tags = {
762758
"operation_name": "aws.sns",
@@ -773,7 +769,7 @@ def create_inferred_span_from_sns_event(event, context):
773769

774770
InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="async")
775771
sns_dt_format = "%Y-%m-%dT%H:%M:%S.%fZ"
776-
timestamp = event_record.get("Sns").get("Timestamp")
772+
timestamp = event_record.get("Sns", {}).get("Timestamp")
777773
dt = datetime.strptime(timestamp, sns_dt_format)
778774

779775
args = {
@@ -804,10 +800,12 @@ def create_inferred_span_from_kinesis_event(event, context):
804800
"event_id": event_id,
805801
"event_name": event_record.get("eventName"),
806802
"event_version": event_record.get("eventVersion"),
807-
"partition_key": event_record.get("kinesis").get("partitionKey"),
803+
"partition_key": event_record.get("kinesis", {}).get("partitionKey"),
808804
}
809805
InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="async")
810-
request_time_epoch = event_record.get("kinesis").get("approximateArrivalTimestamp")
806+
request_time_epoch = event_record.get("kinesis", {}).get(
807+
"approximateArrivalTimestamp"
808+
)
811809

812810
args = {
813811
"service": "kinesis",
@@ -839,7 +837,9 @@ def create_inferred_span_from_dynamodb_event(event, context):
839837
"size_bytes": str(dynamodb_message.get("SizeBytes")),
840838
}
841839
InferredSpanInfo.set_tags(tags, synchronicity="async", tag_source="self")
842-
request_time_epoch = event_record.get("dynamodb").get("ApproximateCreationDateTime")
840+
request_time_epoch = event_record.get("dynamodb", {}).get(
841+
"ApproximateCreationDateTime"
842+
)
843843
args = {
844844
"service": "dynamodb",
845845
"resource": table_name,
@@ -856,16 +856,16 @@ def create_inferred_span_from_dynamodb_event(event, context):
856856

857857
def create_inferred_span_from_s3_event(event, context):
858858
event_record = get_first_record(event)
859-
bucket_name = event_record.get("s3").get("bucket").get("name")
859+
bucket_name = event_record.get("s3", {}).get("bucket", {}).get("name")
860860
tags = {
861861
"operation_name": "aws.s3",
862862
"resource_names": bucket_name,
863863
"event_name": event_record.get("eventName"),
864864
"bucketname": bucket_name,
865-
"bucket_arn": event_record.get("s3").get("bucket").get("arn"),
866-
"object_key": event_record.get("s3").get("object").get("key"),
867-
"object_size": str(event_record.get("s3").get("object").get("size")),
868-
"object_etag": event_record.get("s3").get("object").get("eTag"),
865+
"bucket_arn": event_record.get("s3", {}).get("bucket", {}).get("arn"),
866+
"object_key": event_record.get("s3", {}).get("object", {}).get("key"),
867+
"object_size": str(event_record.get("s3", {}).get("object", {}).get("size")),
868+
"object_etag": event_record.get("s3", {}).get("object", {}).get("eTag"),
869869
}
870870
InferredSpanInfo.set_tags(tags, synchronicity="async", tag_source="self")
871871
dt_format = "%Y-%m-%dT%H:%M:%S.%fZ"

datadog_lambda/trigger.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def parse_event_source(event: dict) -> _EventSource:
125125
event_source.subtype = EventSubtypes.API_GATEWAY
126126
if "routeKey" in event:
127127
event_source.subtype = EventSubtypes.HTTP_API
128-
if "requestContext" in event and "messageDirection" in event["requestContext"]:
128+
if event.get("requestContext", {}).get("messageDirection"):
129129
event_source.subtype = EventSubtypes.WEBSOCKET
130130

131131
if request_context and request_context.get("elb"):
@@ -186,15 +186,17 @@ def parse_event_source_arn(source: _EventSource, event: dict, context: Any) -> s
186186
event_record = get_first_record(event)
187187
# e.g. arn:aws:s3:::lambda-xyz123-abc890
188188
if source.to_string() == "s3":
189-
return event_record.get("s3")["bucket"]["arn"]
189+
return event_record.get("s3", {}).get("bucket", {}).get("arn")
190190

191191
# e.g. arn:aws:sns:us-east-1:123456789012:sns-lambda
192192
if source.to_string() == "sns":
193-
return event_record.get("Sns")["TopicArn"]
193+
return event_record.get("Sns", {}).get("TopicArn")
194194

195195
# e.g. arn:aws:cloudfront::123456789012:distribution/ABC123XYZ
196196
if source.event_type == EventTypes.CLOUDFRONT:
197-
distribution_id = event_record.get("cf")["config"]["distributionId"]
197+
distribution_id = (
198+
event_record.get("cf", {}).get("config", {}).get("distributionId")
199+
)
198200
return "arn:{}:cloudfront::{}:distribution/{}".format(
199201
aws_arn, account_id, distribution_id
200202
)
@@ -215,18 +217,18 @@ def parse_event_source_arn(source: _EventSource, event: dict, context: Any) -> s
215217
if source.event_type == EventTypes.API_GATEWAY:
216218
request_context = event.get("requestContext")
217219
return "arn:{}:apigateway:{}::/restapis/{}/stages/{}".format(
218-
aws_arn, region, request_context["apiId"], request_context["stage"]
220+
aws_arn, region, request_context.get("apiId"), request_context.get("stage")
219221
)
220222

221223
# e.g. arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-xyz/123
222224
if source.event_type == EventTypes.ALB:
223225
request_context = event.get("requestContext")
224-
return request_context.get("elb")["targetGroupArn"]
226+
return request_context.get("elb", {}).get("targetGroupArn")
225227

226228
# e.g. arn:aws:logs:us-west-1:123456789012:log-group:/my-log-group-xyz
227229
if source.event_type == EventTypes.CLOUDWATCH_LOGS:
228230
with gzip.GzipFile(
229-
fileobj=BytesIO(base64.b64decode(event["awslogs"]["data"]))
231+
fileobj=BytesIO(base64.b64decode(event.get("awslogs", {}).get("data")))
230232
) as decompress_stream:
231233
data = b"".join(BufferedReader(decompress_stream))
232234
logs = json.loads(data)
@@ -265,7 +267,7 @@ def extract_http_tags(event):
265267
method = event.get("httpMethod")
266268
if request_context and request_context.get("stage"):
267269
if request_context.get("domainName"):
268-
http_tags["http.url"] = request_context["domainName"]
270+
http_tags["http.url"] = request_context.get("domainName")
269271

270272
path = request_context.get("path")
271273
method = request_context.get("httpMethod")
@@ -282,7 +284,7 @@ def extract_http_tags(event):
282284

283285
headers = event.get("headers")
284286
if headers and headers.get("Referer"):
285-
http_tags["http.referer"] = headers["Referer"]
287+
http_tags["http.referer"] = headers.get("Referer")
286288

287289
return http_tags
288290

0 commit comments

Comments
 (0)