Skip to content

Commit 385d6ac

Browse files
committed
feat(aap): update api gateway inferred span tags for better correlation
1 parent ed75966 commit 385d6ac

17 files changed

+348
-111
lines changed

datadog_lambda/tracing.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,7 @@ def create_inferred_span_from_lambda_function_url_event(event, context):
927927
InferredSpanInfo.set_tags(tags, tag_source="self", synchronicity="sync")
928928
if span:
929929
span.set_tags(tags)
930+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
930931
span.start_ns = int(request_time_epoch * 1e6)
931932
return span
932933

@@ -1047,6 +1048,7 @@ def create_inferred_span_from_api_gateway_websocket_event(
10471048
span = tracer.trace("aws.apigateway.websocket", **args)
10481049
if span:
10491050
span.set_tags(tags)
1051+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
10501052
span.start_ns = int(
10511053
finish_time_ns
10521054
if finish_time_ns is not None
@@ -1061,6 +1063,8 @@ def create_inferred_span_from_api_gateway_event(
10611063
event, context, decode_authorizer_context: bool = True
10621064
):
10631065
request_context = event.get("requestContext")
1066+
identity = request_context.get("identity")
1067+
10641068
domain = request_context.get("domainName", "")
10651069
api_id = request_context.get("apiId")
10661070
service_name = determine_service_name(
@@ -1072,11 +1076,11 @@ def create_inferred_span_from_api_gateway_event(
10721076
resource_path = _get_resource_path(event, request_context)
10731077
resource = f"{method} {resource_path}"
10741078
tags = {
1075-
"operation_name": "aws.apigateway.rest",
10761079
"http.url": http_url,
10771080
"endpoint": path,
10781081
"http.method": method,
10791082
"resource_names": resource,
1083+
"http.useragent": identity.get("userAgent"),
10801084
"span.kind": "server",
10811085
"apiid": api_id,
10821086
"apiname": api_id,
@@ -1091,7 +1095,7 @@ def create_inferred_span_from_api_gateway_event(
10911095
args = {
10921096
"service": service_name,
10931097
"resource": resource,
1094-
"span_type": "http",
1098+
"span_type": "web",
10951099
}
10961100
tracer.set_tags(_dd_origin)
10971101
upstream_authorizer_span = None
@@ -1103,6 +1107,7 @@ def create_inferred_span_from_api_gateway_event(
11031107
span = tracer.trace("aws.apigateway", **args)
11041108
if span:
11051109
span.set_tags(tags)
1110+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
11061111
# start time pushed by the inserted authorizer span
11071112
span.start_ns = int(
11081113
finish_time_ns
@@ -1140,13 +1145,12 @@ def create_inferred_span_from_http_api_event(
11401145
resource_path = _get_resource_path(event, request_context)
11411146
resource = f"{method} {resource_path}"
11421147
tags = {
1143-
"operation_name": "aws.httpapi",
11441148
"endpoint": path,
11451149
"http.url": http_url,
11461150
"http.method": http.get("method"),
11471151
"http.protocol": http.get("protocol"),
11481152
"http.source_ip": http.get("sourceIp"),
1149-
"http.user_agent": http.get("userAgent"),
1153+
"http.useragent": http.get("userAgent"),
11501154
"resource_names": resource,
11511155
"request_id": context.aws_request_id,
11521156
"apiid": api_id,
@@ -1167,10 +1171,11 @@ def create_inferred_span_from_http_api_event(
11671171
Headers.Parent_Span_Finish_Time
11681172
)
11691173
span = tracer.trace(
1170-
"aws.httpapi", service=service_name, resource=resource, span_type="http"
1174+
"aws.httpapi", service=service_name, resource=resource, span_type="web"
11711175
)
11721176
if span:
11731177
span.set_tags(tags)
1178+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
11741179
span.start_ns = int(inferred_span_start_ns)
11751180
return span
11761181

@@ -1237,6 +1242,7 @@ def create_inferred_span_from_sqs_event(event, context):
12371242
)
12381243
if span:
12391244
span.set_tags(tags)
1245+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
12401246
span.start = start_time
12411247
if upstream_span:
12421248
span.parent_id = upstream_span.span_id
@@ -1278,6 +1284,7 @@ def create_inferred_span_from_sns_event(event, context):
12781284
)
12791285
if span:
12801286
span.set_tags(tags)
1287+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
12811288
span.start = dt.replace(tzinfo=timezone.utc).timestamp()
12821289
return span
12831290

@@ -1313,6 +1320,7 @@ def create_inferred_span_from_kinesis_event(event, context):
13131320
)
13141321
if span:
13151322
span.set_tags(tags)
1323+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
13161324
span.start = request_time_epoch
13171325
return span
13181326

@@ -1345,6 +1353,7 @@ def create_inferred_span_from_dynamodb_event(event, context):
13451353
)
13461354
if span:
13471355
span.set_tags(tags)
1356+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
13481357

13491358
span.start = int(request_time_epoch)
13501359
return span
@@ -1381,6 +1390,7 @@ def create_inferred_span_from_s3_event(event, context):
13811390
)
13821391
if span:
13831392
span.set_tags(tags)
1393+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
13841394
span.start = dt.replace(tzinfo=timezone.utc).timestamp()
13851395
return span
13861396

@@ -1421,10 +1431,11 @@ def create_inferred_span_from_eventbridge_event(event, context):
14211431
)
14221432
if span:
14231433
span.set_tags(tags)
1434+
span.set_metric(InferredSpanInfo.METRIC, 1.0)
14241435
span.start = dt.replace(tzinfo=timezone.utc).timestamp()
14251436

14261437
# Since inferred span will later parent Lambda, preserve Lambda's current parent
1427-
if dd_trace_context.span_id:
1438+
if dd_trace_context and getattr(dd_trace_context, "span_id", None):
14281439
span.parent_id = dd_trace_context.span_id
14291440

14301441
return span
@@ -1512,6 +1523,7 @@ class InferredSpanInfo(object):
15121523
BASE_NAME = "_inferred_span"
15131524
SYNCHRONICITY = f"{BASE_NAME}.synchronicity"
15141525
TAG_SOURCE = f"{BASE_NAME}.tag_source"
1526+
METRIC = f"_dd.{BASE_NAME}"
15151527

15161528
@staticmethod
15171529
def set_tags(

datadog_lambda/wrapper.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,16 @@ def _after(self, event, context):
346346
if status_code:
347347
self.inferred_span.set_tag("http.status_code", status_code)
348348

349-
if self.trigger_tags and (route := self.trigger_tags.get("http.route")):
350-
self.inferred_span.set_tag("http.route", route)
349+
if self.trigger_tags:
350+
route = self.trigger_tags.get("http.route")
351+
if route:
352+
self.inferred_span.set_tag("http.route", route)
353+
354+
event_source_arn = self.trigger_tags.get(
355+
"function_trigger.event_source_arn"
356+
)
357+
if event_source_arn:
358+
self.inferred_span.set_tag("dd_resource_key", event_source_arn)
351359

352360
if config.service:
353361
self.inferred_span.set_tag("peer.service", config.service)

tests/integration/snapshots/logs/async-metrics_python310.log

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
5454
"meta": {
5555
"runtime-id": "XXXX",
5656
"_dd.origin": "lambda",
57-
"operation_name": "aws.apigateway.rest",
5857
"http.url": "https://XXXX.execute-api.us-east-2.amazonaws.com/",
5958
"endpoint": "/",
6059
"http.method": "GET",
6160
"resource_names": "GET /",
61+
"http.useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
6262
"span.kind": "server",
6363
"apiid": "XXXX",
6464
"apiname": "XXXX",
@@ -68,6 +68,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
6868
"_inferred_span.tag_source": "self",
6969
"http.status_code": "200",
7070
"http.route": "/",
71+
"dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/70ixmpl4fl/stages/Prod",
7172
"peer.service": "integration-tests-python",
7273
"_dd.peer.service.source": "peer.service",
7374
"_dd.p.dm": "-0",
@@ -76,10 +77,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
7677
},
7778
"metrics": {
7879
"process_id": XXXX,
80+
"_dd._inferred_span": 1,
7981
"_dd.top_level": 1,
8082
"_sampling_priority_v1": 1
8183
},
82-
"type": "http"
84+
"type": "web"
8385
},
8486
{
8587
"trace_id": "XXXX",
@@ -375,6 +377,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
375377
"size_bytes": "26",
376378
"_inferred_span.synchronicity": "async",
377379
"_inferred_span.tag_source": "self",
380+
"dd_resource_key": "arn:aws:dynamodb:us-east-1:XXXX:us-east-1/ExampleTableWithStream/stream/2015-06-27T00:48:05.899",
378381
"peer.service": "integration-tests-python",
379382
"_dd.peer.service.source": "peer.service",
380383
"_dd.p.dm": "-0",
@@ -383,6 +386,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
383386
},
384387
"metrics": {
385388
"process_id": XXXX,
389+
"_dd._inferred_span": 1,
386390
"_dd.top_level": 1,
387391
"_sampling_priority_v1": 1
388392
},
@@ -574,6 +578,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
574578
},
575579
"metrics": {
576580
"process_id": XXXX,
581+
"_dd._inferred_span": 1,
577582
"_dd.top_level": 1,
578583
"_sampling_priority_v1": 1
579584
},
@@ -718,13 +723,12 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
718723
"meta": {
719724
"runtime-id": "XXXX",
720725
"_dd.origin": "lambda",
721-
"operation_name": "aws.httpapi",
722726
"endpoint": "/httpapi/get",
723727
"http.url": "https://XXXX.execute-api.eu-west-1.amazonaws.com/httpapi/get",
724728
"http.method": "GET",
725729
"http.protocol": "HTTP/1.1",
726730
"http.source_ip": "XXXX",
727-
"http.user_agent": "XXXX/7.64.1",
731+
"http.useragent": "curl/7.64.1",
728732
"resource_names": "GET /httpapi/get",
729733
"request_id": "XXXX",
730734
"apiid": "XXXX",
@@ -734,6 +738,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
734738
"_inferred_span.tag_source": "self",
735739
"http.status_code": "200",
736740
"http.route": "/httpapi/get",
741+
"dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/x02yirxc7a/stages/$default",
737742
"peer.service": "integration-tests-python",
738743
"_dd.peer.service.source": "peer.service",
739744
"_dd.p.dm": "-0",
@@ -742,10 +747,11 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
742747
},
743748
"metrics": {
744749
"process_id": XXXX,
750+
"_dd._inferred_span": 1,
745751
"_dd.top_level": 1,
746752
"_sampling_priority_v1": 1
747753
},
748-
"type": "http"
754+
"type": "web"
749755
},
750756
{
751757
"trace_id": "XXXX",
@@ -904,6 +910,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
904910
"partition_key": "XXXX",
905911
"_inferred_span.synchronicity": "async",
906912
"_inferred_span.tag_source": "self",
913+
"dd_resource_key": "arn:aws:kinesis:EXAMPLE",
907914
"peer.service": "integration-tests-python",
908915
"_dd.peer.service.source": "peer.service",
909916
"_dd.p.dm": "-0",
@@ -912,6 +919,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
912919
},
913920
"metrics": {
914921
"process_id": XXXX,
922+
"_dd._inferred_span": 1,
915923
"_dd.top_level": 1,
916924
"_sampling_priority_v1": 1
917925
},
@@ -1066,6 +1074,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
10661074
"object_etag": "XXXX",
10671075
"_inferred_span.synchronicity": "async",
10681076
"_inferred_span.tag_source": "self",
1077+
"dd_resource_key": "arn:aws:s3:::example-bucket",
10691078
"peer.service": "integration-tests-python",
10701079
"_dd.peer.service.source": "peer.service",
10711080
"_dd.p.dm": "-0",
@@ -1074,6 +1083,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
10741083
},
10751084
"metrics": {
10761085
"process_id": XXXX,
1086+
"_dd._inferred_span": 1,
10771087
"_dd.top_level": 1,
10781088
"_sampling_priority_v1": 1
10791089
},
@@ -1241,6 +1251,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
12411251
"subject": "TestInvoke",
12421252
"_inferred_span.synchronicity": "async",
12431253
"_inferred_span.tag_source": "self",
1254+
"dd_resource_key": "arn:aws:sns:us-east-2:XXXX:us-east-2-lambda",
12441255
"peer.service": "integration-tests-python",
12451256
"_dd.peer.service.source": "peer.service",
12461257
"_dd.p.dm": "-0",
@@ -1249,6 +1260,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
12491260
},
12501261
"metrics": {
12511262
"process_id": XXXX,
1263+
"_dd._inferred_span": 1,
12521264
"_dd.top_level": 1,
12531265
"_sampling_priority_v1": 1
12541266
},
@@ -1403,6 +1415,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
14031415
"sender_id": "AIDAIENQZJOLO23YVJ4VO",
14041416
"_inferred_span.synchronicity": "async",
14051417
"_inferred_span.tag_source": "self",
1418+
"dd_resource_key": "arn:aws:sqs:us-east-2:XXXX:us-east-2-queue",
14061419
"peer.service": "integration-tests-python",
14071420
"_dd.peer.service.source": "peer.service",
14081421
"_dd.p.dm": "-0",
@@ -1411,6 +1424,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
14111424
},
14121425
"metrics": {
14131426
"process_id": XXXX,
1427+
"_dd._inferred_span": 1,
14141428
"_dd.top_level": 1,
14151429
"_sampling_priority_v1": 1
14161430
},
@@ -1571,6 +1585,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
15711585
"_inferred_span.synchronicity": "sync",
15721586
"_inferred_span.tag_source": "self",
15731587
"http.status_code": "200",
1588+
"dd_resource_key": "arn:aws:apigateway:eu-west-1:XXXX:eu-west-1/restapis/p62c47itsb/stages/dev",
15741589
"peer.service": "integration-tests-python",
15751590
"_dd.peer.service.source": "peer.service",
15761591
"_dd.p.dm": "-0",
@@ -1579,6 +1594,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A
15791594
},
15801595
"metrics": {
15811596
"process_id": XXXX,
1597+
"_dd._inferred_span": 1,
15821598
"_dd.top_level": 1,
15831599
"_sampling_priority_v1": 1
15841600
},

0 commit comments

Comments
 (0)