From 7893e9b7b9ad041f81b9a9351820b8c04be09229 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Thu, 30 Jan 2025 17:30:36 -0500 Subject: [PATCH 1/5] Move span pointer to inferred (root) span (#552) --- datadog_lambda/tracing.py | 3 +- .../logs/async-metrics_python310.log | 90 +++++++++--------- .../logs/async-metrics_python311.log | 90 +++++++++--------- .../logs/async-metrics_python312.log | 90 +++++++++--------- .../logs/async-metrics_python313.log | 90 +++++++++--------- .../snapshots/logs/async-metrics_python38.log | 90 +++++++++--------- .../snapshots/logs/async-metrics_python39.log | 90 +++++++++--------- .../snapshots/logs/sync-metrics_python310.log | 90 +++++++++--------- .../snapshots/logs/sync-metrics_python311.log | 90 +++++++++--------- .../snapshots/logs/sync-metrics_python312.log | 92 +++++++++---------- .../snapshots/logs/sync-metrics_python313.log | 92 +++++++++---------- .../snapshots/logs/sync-metrics_python38.log | 90 +++++++++--------- .../snapshots/logs/sync-metrics_python39.log | 90 +++++++++--------- 13 files changed, 544 insertions(+), 543 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 973cb562..9189eb3b 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -1368,8 +1368,9 @@ def create_function_execution_span( if parent_span: span.parent_id = parent_span.span_id if span_pointers: + root_span = parent_span if parent_span else span for span_pointer_description in span_pointers: - span._add_span_pointer( + root_span._add_span_pointer( pointer_kind=span_pointer_description.pointer_kind, pointer_direction=span_pointer_description.pointer_direction, pointer_hash=span_pointer_description.pointer_hash, diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index b3b94ca4..ed0d3b43 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python310", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python310", - "functionname": "integration-tests-python-XXXX-async-metrics_python310", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python310", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python310", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python310", + "functionname": "integration-tests-python-XXXX-async-metrics_python310", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 5ea440b3..b57a1b5a 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python311", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python311", - "functionname": "integration-tests-python-XXXX-async-metrics_python311", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python311", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python311", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python311", + "functionname": "integration-tests-python-XXXX-async-metrics_python311", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index ceaaa759..1b7e4b08 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python312", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python312", - "functionname": "integration-tests-python-XXXX-async-metrics_python312", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python312", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python312", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python312", + "functionname": "integration-tests-python-XXXX-async-metrics_python312", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/async-metrics_python313.log b/tests/integration/snapshots/logs/async-metrics_python313.log index 45ca3b14..32342559 100644 --- a/tests/integration/snapshots/logs/async-metrics_python313.log +++ b/tests/integration/snapshots/logs/async-metrics_python313.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python313", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python313", - "functionname": "integration-tests-python-XXXX-async-metrics_python313", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python313", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python313", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python313", + "functionname": "integration-tests-python-XXXX-async-metrics_python313", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 3ce5c99d..9dc9edf6 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python38", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python38", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python38", - "functionname": "integration-tests-python-XXXX-async-metrics_python38", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python38", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python38", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python38", + "functionname": "integration-tests-python-XXXX-async-metrics_python38", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index ede453ff..89e5d227 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -249,37 +249,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-async-metrics_python39", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python39", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-async-metrics_python39", - "functionname": "integration-tests-python-XXXX-async-metrics_python39", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -313,6 +283,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-async-metrics_python39", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-async-metrics_python39", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-async-metrics_python39", + "functionname": "integration-tests-python-XXXX-async-metrics_python39", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -944,7 +944,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -974,19 +986,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python310.log b/tests/integration/snapshots/logs/sync-metrics_python310.log index 540ce081..6eab44c2 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python310.log +++ b/tests/integration/snapshots/logs/sync-metrics_python310.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python310", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python310", - "functionname": "integration-tests-python-XXXX-sync-metrics_python310", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python310", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python310", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python310", + "functionname": "integration-tests-python-XXXX-sync-metrics_python310", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python311.log b/tests/integration/snapshots/logs/sync-metrics_python311.log index 68b930db..87cd6a6a 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python311.log +++ b/tests/integration/snapshots/logs/sync-metrics_python311.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python311", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python311", - "functionname": "integration-tests-python-XXXX-sync-metrics_python311", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python311", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python311", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python311", + "functionname": "integration-tests-python-XXXX-sync-metrics_python311", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python312.log b/tests/integration/snapshots/logs/sync-metrics_python312.log index 9e4d916e..41b5a71c 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python312.log +++ b/tests/integration/snapshots/logs/sync-metrics_python312.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python312", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python312", - "functionname": "integration-tests-python-XXXX-sync-metrics_python312", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python312", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python312", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python312", + "functionname": "integration-tests-python-XXXX-sync-metrics_python312", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -546,6 +546,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -584,7 +585,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept ] ] } -END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python313.log b/tests/integration/snapshots/logs/sync-metrics_python313.log index 09402164..439e44d6 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python313.log +++ b/tests/integration/snapshots/logs/sync-metrics_python313.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python313", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python313", - "functionname": "integration-tests-python-XXXX-sync-metrics_python313", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python313", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python313", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python313", + "functionname": "integration-tests-python-XXXX-sync-metrics_python313", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", @@ -1302,6 +1302,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A ] } HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept-Encoding:gzip, deflate","Accept:*/*","Connection:keep-alive","Content-Encoding:deflate","Content-Length:XXXX","Content-Type:application/json","DD-API-KEY:XXXX","User-Agent:datadogpy/XX (python XX; os linux; arch XXXX)","traceparent:XXX","tracestate:XXX +END Duration: XXXX ms Memory Used: XXXX MB { "traces": [ [ @@ -1340,7 +1341,6 @@ HTTP POST https://api.datadoghq.com/api/v1/distribution_points Headers: ["Accept ] ] } -END Duration: XXXX ms Memory Used: XXXX MB START { "m": "aws.lambda.enhanced.invocations", diff --git a/tests/integration/snapshots/logs/sync-metrics_python38.log b/tests/integration/snapshots/logs/sync-metrics_python38.log index 6c7b3c50..b30289ca 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python38.log +++ b/tests/integration/snapshots/logs/sync-metrics_python38.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python38", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python38", - "functionname": "integration-tests-python-XXXX-sync-metrics_python38", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python38", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python38", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python38", + "functionname": "integration-tests-python-XXXX-sync-metrics_python38", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", diff --git a/tests/integration/snapshots/logs/sync-metrics_python39.log b/tests/integration/snapshots/logs/sync-metrics_python39.log index 26db0d4b..772ea5d1 100644 --- a/tests/integration/snapshots/logs/sync-metrics_python39.log +++ b/tests/integration/snapshots/logs/sync-metrics_python39.log @@ -248,37 +248,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" - }, - { - "trace_id": "XXXX", - "parent_id": "XXXX", - "span_id": "XXXX", - "service": "aws.lambda", - "resource": "integration-tests-python-XXXX-sync-metrics_python39", - "name": "aws.lambda", - "error": 0, - "start": "XXXX", - "duration": "XXXX", - "meta": { - "_dd.origin": "lambda", - "cold_start": "false", - "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", - "function_version": "$LATEST", - "request_id": "XXXX", - "resource_names": "integration-tests-python-XXXX-sync-metrics_python39", - "functionname": "integration-tests-python-XXXX-sync-metrics_python39", - "datadog_lambda": "X.X.X", - "dd_trace": "X.X.X", - "span.name": "aws.lambda", - "function_trigger.event_source": "dynamodb", - "function_trigger.event_source_arn": "XXXX", - "_dd.base_service": "integration-tests-python" - }, - "metrics": { - "_dd.top_level": 1 - }, - "type": "serverless", + "type": "web", "span_links": [ { "trace_id": "XXXX", @@ -312,6 +282,36 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A } ] }, + { + "trace_id": "XXXX", + "parent_id": "XXXX", + "span_id": "XXXX", + "service": "aws.lambda", + "resource": "integration-tests-python-XXXX-sync-metrics_python39", + "name": "aws.lambda", + "error": 0, + "start": "XXXX", + "duration": "XXXX", + "meta": { + "_dd.origin": "lambda", + "cold_start": "false", + "function_arn": "arn:aws:lambda:eu-west-1:XXXX:eu-west-1-tests-python-XXXX-sync-metrics_python39", + "function_version": "$LATEST", + "request_id": "XXXX", + "resource_names": "integration-tests-python-XXXX-sync-metrics_python39", + "functionname": "integration-tests-python-XXXX-sync-metrics_python39", + "datadog_lambda": "X.X.X", + "dd_trace": "X.X.X", + "span.name": "aws.lambda", + "function_trigger.event_source": "dynamodb", + "function_trigger.event_source_arn": "XXXX", + "_dd.base_service": "integration-tests-python" + }, + "metrics": { + "_dd.top_level": 1 + }, + "type": "serverless" + }, { "trace_id": "XXXX", "parent_id": "XXXX", @@ -1019,7 +1019,19 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "_dd.top_level": 1, "_sampling_priority_v1": 1 }, - "type": "web" + "type": "web", + "span_links": [ + { + "trace_id": "XXXX", + "span_id": "XXXX", + "attributes": { + "ptr.kind": "aws.s3.object", + "ptr.dir": "u", + "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", + "link.kind": "span-pointer" + } + } + ] }, { "trace_id": "XXXX", @@ -1049,19 +1061,7 @@ HTTP GET https://www.datadoghq.com/ Headers: ["Accept-Encoding:gzip, deflate","A "metrics": { "_dd.top_level": 1 }, - "type": "serverless", - "span_links": [ - { - "trace_id": "XXXX", - "span_id": "XXXX", - "attributes": { - "ptr.kind": "aws.s3.object", - "ptr.dir": "u", - "ptr.hash": "1dc3e5d00dae48c1f07d95371a747788", - "link.kind": "span-pointer" - } - } - ] + "type": "serverless" }, { "trace_id": "XXXX", From b64be3b098faf2743af1a1009f0c414f7fae8f33 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Thu, 30 Jan 2025 17:30:48 -0500 Subject: [PATCH 2/5] Skip and log warning when `lambda_metric` called with invalid name or value (#553) --- datadog_lambda/metric.py | 16 ++++++++++++++++ tests/test_metric.py | 26 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index d312e3bb..6389c268 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -55,6 +55,22 @@ def lambda_metric(metric_name, value, timestamp=None, tags=None, force_async=Fal Note that if the extension is present, it will override the DD_FLUSH_TO_LOG value and always use the layer to send metrics to the extension """ + if not metric_name or not isinstance(metric_name, str): + logger.warning( + "Ignoring metric submission. Invalid metric name: %s", metric_name + ) + return + + try: + float(value) + except (ValueError, TypeError): + logger.warning( + "Ignoring metric submission for metric '%s' because the value is not numeric: %r", + metric_name, + value, + ) + return + flush_to_logs = os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true" tags = [] if tags is None else list(tags) tags.append(dd_lambda_layer_tag) diff --git a/tests/test_metric.py b/tests/test_metric.py index 345740a4..d10a0f0d 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -92,6 +92,32 @@ def test_lambda_metric_flush_to_log(self): del os.environ["DD_FLUSH_TO_LOG"] + @patch("datadog_lambda.metric.logger.warning") + def test_lambda_metric_invalid_metric_name_none(self, mock_logger_warning): + lambda_metric(None, 1) + self.mock_metric_lambda_stats.distribution.assert_not_called() + mock_logger_warning.assert_called_once_with( + "Ignoring metric submission. Invalid metric name: %s", None + ) + + @patch("datadog_lambda.metric.logger.warning") + def test_lambda_metric_invalid_metric_name_not_string(self, mock_logger_warning): + lambda_metric(123, 1) + self.mock_metric_lambda_stats.distribution.assert_not_called() + mock_logger_warning.assert_called_once_with( + "Ignoring metric submission. Invalid metric name: %s", 123 + ) + + @patch("datadog_lambda.metric.logger.warning") + def test_lambda_metric_non_numeric_value(self, mock_logger_warning): + lambda_metric("test.non_numeric", "oops") + self.mock_metric_lambda_stats.distribution.assert_not_called() + mock_logger_warning.assert_called_once_with( + "Ignoring metric submission for metric '%s' because the value is not numeric: %r", + "test.non_numeric", + "oops", + ) + class TestFlushThreadStats(unittest.TestCase): def setUp(self): From d580d5fd8539809f1ed24edb826f9474d57abd90 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 28 Feb 2025 12:39:33 -0800 Subject: [PATCH 3/5] Ddtrace now requires patch.py rather than __init__.py files. (#566) --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 554766df..a1b24bf3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,10 +47,10 @@ RUN rm -rf \ # https://docs.python.org/3.11/using/cmdline.html#cmdoption-O # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONNODEBUGRANGES RUN PYTHONNODEBUGRANGES=1 python -OO -m compileall -b ./python/lib/$runtime/site-packages -# remove all .py files except ddtrace/contrib/*/__init__.py which are necessary +# remove all .py files except ddtrace/contrib/*/patch.py which are necessary # for ddtrace.patch to discover instrumationation packages. RUN find ./python/lib/$runtime/site-packages -name \*.py | grep -v ddtrace/contrib | xargs rm -rf -RUN find ./python/lib/$runtime/site-packages/ddtrace/contrib -name \*.py | grep -v __init__ | xargs rm -rf +RUN find ./python/lib/$runtime/site-packages/ddtrace/contrib -name \*.py | grep -v patch.py | xargs rm -rf RUN find ./python/lib/$runtime/site-packages -name __pycache__ -type d -exec rm -r {} \+ # When building ddtrace from branch, remove extra source files. These are From 189f49e74c1b0ff3fd25c984abc048762bcf25ca Mon Sep 17 00:00:00 2001 From: Abhinav Vedmala Date: Fri, 28 Feb 2025 16:38:57 -0500 Subject: [PATCH 4/5] Update Step Functions Parent ID Generation (#559) Co-authored-by: purple4reina --- datadog_lambda/tracing.py | 15 +++++++----- tests/test_tracing.py | 50 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 9189eb3b..a73423e1 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -385,21 +385,24 @@ def _parse_high_64_bits(trace_tags: str) -> str: def _generate_sfn_parent_id(context: dict) -> int: """ - The upstream Step Function can propagate its execution context to downstream Lambdas. The - Lambda can use these details to share the same traceID and infer its parent's spanID. + Generates a stable parent span ID for a downstream Lambda invoked by a Step Function. The + upstream Step Function execution context is used to infer the parent's span ID, ensuring trace + continuity. - Excluding redriveCount when its 0 to account for cases where customers are using an old - version of the Lambda layer that doesn't use this value for its parentID generation. + `RetryCount` and `RedriveCount` are appended only when both are nonzero to maintain + compatibility with older Lambda layers that did not include these fields. """ execution_id = context.get("Execution").get("Id") redrive_count = context.get("Execution").get("RedriveCount", 0) state_name = context.get("State").get("Name") state_entered_time = context.get("State").get("EnteredTime") + retry_count = context.get("State").get("RetryCount", 0) - redrive_postfix = "" if redrive_count == 0 else f"#{redrive_count}" + include_counts = not (retry_count == 0 and redrive_count == 0) + counts_suffix = f"#{retry_count}#{redrive_count}" if include_counts else "" return _deterministic_sha256_hash( - f"{execution_id}#{state_name}#{state_entered_time}{redrive_postfix}", + f"{execution_id}#{state_name}#{state_entered_time}{counts_suffix}", HIGHER_64_BITS, ) diff --git a/tests/test_tracing.py b/tests/test_tracing.py index 89a7712c..5480a92c 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -622,6 +622,7 @@ def test_step_function_trace_data(self): "Name": "72a7ca3e-901c-41bb-b5a3-5f279b92a316", "RoleArn": "arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j", "StartTime": "2024-12-04T19:38:04.069Z", + "RedriveCount": 0, }, "State": { "Name": "Lambda Invoke", @@ -657,6 +658,51 @@ def test_step_function_trace_data(self): expected_context, ) + @with_trace_propagation_style("datadog") + def test_step_function_trace_data_retry(self): + lambda_ctx = get_mock_context() + sfn_event = { + "Execution": { + "Id": "arn:aws:states:sa-east-1:425362996713:execution:abhinav-activity-state-machine:72a7ca3e-901c-41bb-b5a3-5f279b92a316", + "Name": "72a7ca3e-901c-41bb-b5a3-5f279b92a316", + "RoleArn": "arn:aws:iam::425362996713:role/service-role/StepFunctions-abhinav-activity-state-machine-role-22jpbgl6j", + "StartTime": "2024-12-04T19:38:04.069Z", + "RedriveCount": 0, + }, + "State": { + "Name": "Lambda Invoke", + "EnteredTime": "2024-12-04T19:38:04.118Z", + "RetryCount": 1, + }, + "StateMachine": { + "Id": "arn:aws:states:sa-east-1:425362996713:stateMachine:abhinav-activity-state-machine", + "Name": "abhinav-activity-state-machine", + }, + } + ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx) + self.assertEqual(source, "event") + expected_context = Context( + trace_id=435175499815315247, + span_id=5063839446130725204, + sampling_priority=1, + meta={"_dd.p.tid": "3e7a89d1b7310603"}, + ) + self.assertEqual(ctx, expected_context) + self.assertEqual( + get_dd_trace_context(), + { + TraceHeader.TRACE_ID: "435175499815315247", + TraceHeader.PARENT_ID: "10713633173203262661", + TraceHeader.SAMPLING_PRIORITY: "1", + TraceHeader.TAGS: "_dd.p.tid=3e7a89d1b7310603", + }, + ) + create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY) + self.mock_send_segment.assert_called_with( + XraySubsegment.TRACE_KEY, + expected_context, + ) + # https://github.com/DataDog/logs-backend/blob/c17618cb552fc369ca40282bae0a65803f82f694/domains/serverless/apps/logs-to-traces-reducer/src/test/resources/test-json-files/stepfunctions/RedriveTest/snapshots/RedriveLambdaSuccessTraceMerging.json#L46 @with_trace_propagation_style("datadog") def test_step_function_trace_data_redrive(self): @@ -683,7 +729,7 @@ def test_step_function_trace_data_redrive(self): self.assertEqual(source, "event") expected_context = Context( trace_id=435175499815315247, - span_id=5063839446130725204, + span_id=8782364156266188026, sampling_priority=1, meta={"_dd.p.tid": "3e7a89d1b7310603"}, ) @@ -716,6 +762,7 @@ def test_step_function_trace_data_lambda_root(self): "State": { "Name": "my-awesome-state", "EnteredTime": "Mon Nov 13 12:43:33 PST 2023", + "RetryCount": 0, }, "x-datadog-trace-id": "5821803790426892636", "x-datadog-tags": "_dd.p.dm=-0,_dd.p.tid=672a7cb100000000", @@ -759,6 +806,7 @@ def test_step_function_trace_data_sfn_root(self): "State": { "Name": "my-awesome-state", "EnteredTime": "Mon Nov 13 12:43:33 PST 2023", + "RetryCount": 0, }, "RootExecutionId": "4875aba4-ae31-4a4c-bf8a-63e9eee31dad", "serverless-version": "v1", From fe3385fc1910796697f3eaf2f4e7a68a55af0e62 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Tue, 4 Mar 2025 13:47:33 -0500 Subject: [PATCH 5/5] Release with ddtrace@2.21.3 (#565) * release with ddtrace@2.21.3 * v6.106.0 * version * move the version pining logic to dockerfile --- Dockerfile | 2 +- datadog_lambda/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index a1b24bf3..757d671a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ ENV PATH=/root/.cargo/bin:$PATH # Install datadog_lambda and dependencies from local COPY . . -RUN pip install . -t ./python/lib/$runtime/site-packages +RUN pip install . ddtrace==2.21.3 -t ./python/lib/$runtime/site-packages # Remove botocore (40MB) to reduce package size. aws-xray-sdk # installs it, while it's already provided by the Lambda Runtime. diff --git a/datadog_lambda/version.py b/datadog_lambda/version.py index 0942ef40..0c8d879b 100644 --- a/datadog_lambda/version.py +++ b/datadog_lambda/version.py @@ -1 +1 @@ -__version__ = "6.105.0" +__version__ = "6.106.0" diff --git a/pyproject.toml b/pyproject.toml index 34181459..869b3a86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "datadog_lambda" -version = "6.105.0" +version = "6.106.0" description = "The Datadog AWS Lambda Library" authors = ["Datadog, Inc. "] license = "Apache-2.0"