diff --git a/integration_tests/snapshots/logs/esm_node18.log b/integration_tests/snapshots/logs/esm_node18.log index 89e3b8dc..7e97d980 100644 --- a/integration_tests/snapshots/logs/esm_node18.log +++ b/integration_tests/snapshots/logs/esm_node18.log @@ -72,6 +72,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -88,7 +89,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -178,6 +178,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -191,7 +192,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -281,6 +281,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -294,7 +295,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -384,6 +384,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -397,7 +398,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -486,6 +486,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -499,7 +500,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -588,6 +588,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -601,7 +602,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -690,6 +690,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -703,7 +704,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -791,6 +791,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -804,7 +805,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -891,6 +891,7 @@ START "service": "integration-tests-js-XXXX-esm_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -904,7 +905,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/esm_node20.log b/integration_tests/snapshots/logs/esm_node20.log index e20dd2d4..5ba9f569 100644 --- a/integration_tests/snapshots/logs/esm_node20.log +++ b/integration_tests/snapshots/logs/esm_node20.log @@ -72,6 +72,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -88,7 +89,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -178,6 +178,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -191,7 +192,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -281,6 +281,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -294,7 +295,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -384,6 +384,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -397,7 +398,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -486,6 +486,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -499,7 +500,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -588,6 +588,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -601,7 +602,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -690,6 +690,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -703,7 +704,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -791,6 +791,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -804,7 +805,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -891,6 +891,7 @@ START "service": "integration-tests-js-XXXX-esm_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -904,7 +905,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/esm_node22.log b/integration_tests/snapshots/logs/esm_node22.log index abc1d77c..24cc90b7 100644 --- a/integration_tests/snapshots/logs/esm_node22.log +++ b/integration_tests/snapshots/logs/esm_node22.log @@ -72,6 +72,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -88,7 +89,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -178,6 +178,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -191,7 +192,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -281,6 +281,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -294,7 +295,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -384,6 +384,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -397,7 +398,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -486,6 +486,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -499,7 +500,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -588,6 +588,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -601,7 +602,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -690,6 +690,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -703,7 +704,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -791,6 +791,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -804,7 +805,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -891,6 +891,7 @@ START "service": "integration-tests-js-XXXX-esm_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -904,7 +905,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/process-input-traced_node18.log b/integration_tests/snapshots/logs/process-input-traced_node18.log index cb54b2ba..e09dca39 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node18.log +++ b/integration_tests/snapshots/logs/process-input-traced_node18.log @@ -79,6 +79,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -97,7 +98,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -244,6 +244,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -257,7 +258,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -402,6 +402,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -415,7 +416,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -560,6 +560,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -573,7 +574,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -717,6 +717,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -731,7 +732,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -853,6 +853,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -867,7 +868,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -989,6 +989,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -1003,7 +1004,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1124,6 +1124,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -1138,7 +1139,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1258,6 +1258,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -1272,7 +1273,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/process-input-traced_node20.log b/integration_tests/snapshots/logs/process-input-traced_node20.log index 29407e07..5bb896f7 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node20.log +++ b/integration_tests/snapshots/logs/process-input-traced_node20.log @@ -79,6 +79,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -97,7 +98,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -244,6 +244,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -257,7 +258,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -402,6 +402,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -415,7 +416,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -560,6 +560,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -573,7 +574,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -717,6 +717,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -731,7 +732,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -853,6 +853,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -867,7 +868,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -989,6 +989,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -1003,7 +1004,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1124,6 +1124,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -1138,7 +1139,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1258,6 +1258,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -1272,7 +1273,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/process-input-traced_node22.log b/integration_tests/snapshots/logs/process-input-traced_node22.log index 128ed8e6..c2ff6932 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node22.log +++ b/integration_tests/snapshots/logs/process-input-traced_node22.log @@ -79,6 +79,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -97,7 +98,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -244,6 +244,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -257,7 +258,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -402,6 +402,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -415,7 +416,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -560,6 +560,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -573,7 +574,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -717,6 +717,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -731,7 +732,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -853,6 +853,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -867,7 +868,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -989,6 +989,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -1003,7 +1004,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1124,6 +1124,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -1138,7 +1139,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -1258,6 +1258,7 @@ START "service": "integration-tests-js-XXXX-process-input-traced_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -1272,7 +1273,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/status-code-500s_node18.log b/integration_tests/snapshots/logs/status-code-500s_node18.log index ea151942..7476d1b1 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node18.log +++ b/integration_tests/snapshots/logs/status-code-500s_node18.log @@ -85,6 +85,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -101,7 +102,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -189,6 +189,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -202,7 +203,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -290,6 +290,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -303,7 +304,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -391,6 +391,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -404,7 +405,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -491,6 +491,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -504,7 +505,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -591,6 +591,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -604,7 +605,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -691,6 +691,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -704,7 +705,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -790,6 +790,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -803,7 +804,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -888,6 +888,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node18", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node18", "function_version": "$LATEST", "request_id":"XXXX", @@ -901,7 +902,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/status-code-500s_node20.log b/integration_tests/snapshots/logs/status-code-500s_node20.log index dad2a923..913972aa 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node20.log +++ b/integration_tests/snapshots/logs/status-code-500s_node20.log @@ -85,6 +85,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -101,7 +102,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -189,6 +189,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -202,7 +203,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -290,6 +290,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -303,7 +304,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -391,6 +391,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -404,7 +405,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -491,6 +491,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -504,7 +505,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -591,6 +591,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -604,7 +605,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -691,6 +691,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -704,7 +705,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -790,6 +790,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -803,7 +804,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -888,6 +888,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node20", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node20", "function_version": "$LATEST", "request_id":"XXXX", @@ -901,7 +902,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/integration_tests/snapshots/logs/status-code-500s_node22.log b/integration_tests/snapshots/logs/status-code-500s_node22.log index 51768009..5a2badea 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node22.log +++ b/integration_tests/snapshots/logs/status-code-500s_node22.log @@ -85,6 +85,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "true", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -101,7 +102,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 1, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -189,6 +189,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -202,7 +203,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -290,6 +290,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -303,7 +304,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -391,6 +391,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -404,7 +405,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -491,6 +491,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -504,7 +505,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -591,6 +591,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -604,7 +605,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -691,6 +691,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -704,7 +705,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -790,6 +790,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -803,7 +804,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 @@ -888,6 +888,7 @@ START "service": "integration-tests-js-XXXX-status-code-500s_node22", "version": "1.0.0", "runtime-id":"XXXX", + "cold_start": "false", "function_arn":"XXXX_node22", "function_version": "$LATEST", "request_id":"XXXX", @@ -901,7 +902,6 @@ START "language": "javascript" }, "metrics": { - "cold_start": 0, "_dd.measured": 1, "process_id":XXXX, "_sampling_priority_v1": 1 diff --git a/src/trace/listener.spec.ts b/src/trace/listener.spec.ts index 8745a55b..2b3f538d 100644 --- a/src/trace/listener.spec.ts +++ b/src/trace/listener.spec.ts @@ -67,6 +67,7 @@ jest.mock("./trace-context-service", () => { }); describe("TraceListener", () => { + let oldEnv: any; const defaultConfig = { autoPatchHTTP: true, captureLambdaPayload: false, @@ -99,6 +100,13 @@ describe("TraceListener", () => { mockSpanContext = undefined; mockSpanContextWrapper = undefined; mockTraceSource = undefined; + oldEnv = process.env; + process.env = { ...oldEnv }; + delete process.env.DD_SERVICE; + }); + + afterEach(() => { + process.env = oldEnv; }); it("wraps dd-trace span around invocation", async () => { @@ -115,7 +123,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "$LATEST", request_id: "1234", @@ -155,7 +163,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "$LATEST", request_id: "1234", @@ -188,7 +196,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "$LATEST", request_id: "1234", @@ -229,7 +237,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "$LATEST", request_id: "1234", @@ -260,7 +268,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "alias", request_id: "1234", @@ -289,7 +297,7 @@ describe("TraceListener", () => { resource: "my-Lambda", service: "my-Lambda", tags: { - cold_start: true, + cold_start: "true", function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", function_version: "1", request_id: "1234", @@ -333,4 +341,128 @@ describe("TraceListener", () => { "eyJ4LWRhdGFkb2ctcGFyZW50LWlkIjoiNzk3NjQzMTkzNjgwMzg4MjUxIiwieC1kYXRhZG9nLXRyYWNlLWlkIjoiNDExMDkxMTU4MjI5NzQwNTU1MSIsIngtZGF0YWRvZy1zYW1wbGluZy1wcmlvcml0eSI6MSwieC1kYXRhZG9nLXBhcmVudC1zcGFuLWZpbmlzaC10aW1lIjoxNjYxMTg5OTM2OTgxMDAwMDAwLCJ4LWRhdGFkb2ctYXV0aG9yaXppbmctcmVxdWVzdGlkIjoicmFuZG9tSWQifQ==", ); }); + it("sets service name from DD_SERVICE environment variable", async () => { + process.env.DD_SERVICE = "my-custom-service"; + const listener = new TraceListener(defaultConfig); + await listener.onStartInvocation({}, context as any); + const unwrappedFunc = () => {}; + const wrappedFunc = listener.onWrap(unwrappedFunc); + wrappedFunc(); + await listener.onCompleteInvocation(); + + expect(mockWrap).toHaveBeenCalledWith( + "aws.lambda", + { + resource: "my-Lambda", + service: "my-custom-service", + tags: { + cold_start: "true", + function_arn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", + function_version: "$LATEST", + request_id: "1234", + resource_names: "my-Lambda", + functionname: "my-lambda", + datadog_lambda: datadogLambdaVersion, + dd_trace: ddtraceVersion, + }, + type: "serverless", + }, + unwrappedFunc, + ); + }); + + describe("DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED tests for aws.lambda service name", () => { + const lambdaContext = { + invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789101:function:my-lambda", + awsRequestId: "1234", + functionName: "my-Lambda", + }; + + beforeEach(() => { + mockWrap.mockClear(); + mockExtract.mockClear(); + mockSpanContext = undefined; + mockSpanContextWrapper = undefined; + mockTraceSource = undefined; + process.env = { ...oldEnv }; // Restore original environment variables + delete process.env.DD_SERVICE; // Ensure DD_SERVICE doesn't interfere + delete process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED; + }); + + afterEach(() => { + process.env = oldEnv; + }); + + it("uses 'aws.lambda' when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is 'false'", async () => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "false"; + const listener = new TraceListener(defaultConfig); + await listener.onStartInvocation({}, lambdaContext as any); + const unwrappedFunc = () => {}; + const wrappedFunc = listener.onWrap(unwrappedFunc); + wrappedFunc(); + await listener.onCompleteInvocation(); + + expect(mockWrap).toHaveBeenCalledWith( + "aws.lambda", + expect.objectContaining({ + service: "aws.lambda", + }), + unwrappedFunc, + ); + }); + + it("uses 'aws.lambda' when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is '0'", async () => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "0"; + const listener = new TraceListener(defaultConfig); + await listener.onStartInvocation({}, lambdaContext as any); + const unwrappedFunc = () => {}; + const wrappedFunc = listener.onWrap(unwrappedFunc); + wrappedFunc(); + await listener.onCompleteInvocation(); + + expect(mockWrap).toHaveBeenCalledWith( + "aws.lambda", + expect.objectContaining({ + service: "aws.lambda", + }), + unwrappedFunc, + ); + }); + + it("uses function name when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is not set", async () => { + delete process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED; + const listener = new TraceListener(defaultConfig); + await listener.onStartInvocation({}, lambdaContext as any); + const unwrappedFunc = () => {}; + const wrappedFunc = listener.onWrap(unwrappedFunc); + wrappedFunc(); + await listener.onCompleteInvocation(); + + expect(mockWrap).toHaveBeenCalledWith( + "aws.lambda", + expect.objectContaining({ + service: lambdaContext.functionName, + }), + unwrappedFunc, + ); + }); + + it("uses function name when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is 'true'", async () => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "true"; + const listener = new TraceListener(defaultConfig); + await listener.onStartInvocation({}, lambdaContext as any); + const unwrappedFunc = () => {}; + const wrappedFunc = listener.onWrap(unwrappedFunc); + wrappedFunc(); + await listener.onCompleteInvocation(); + + expect(mockWrap).toHaveBeenCalledWith( + "aws.lambda", + expect.objectContaining({ + service: lambdaContext.functionName, + }), + unwrappedFunc, + ); + }); + }); }); diff --git a/src/trace/listener.ts b/src/trace/listener.ts index 873a45db..bc2cb647 100644 --- a/src/trace/listener.ts +++ b/src/trace/listener.ts @@ -7,7 +7,7 @@ import { ColdStartTracerConfig, ColdStartTracer } from "./cold-start-tracer"; import { logDebug, tagObject } from "../utils"; import { didFunctionColdStart, isProactiveInitialization } from "../utils/cold-start"; import { datadogLambdaVersion } from "../constants"; -import { ddtraceVersion, parentSpanFinishTimeHeader } from "./constants"; +import { ddtraceVersion, parentSpanFinishTimeHeader, DD_SERVICE_ENV_VAR } from "./constants"; import { patchConsole } from "./patch-console"; import { SpanContext, TraceOptions, TracerWrapper } from "./tracer-wrapper"; import { SpanInferrer } from "./span-inferrer"; @@ -286,7 +286,7 @@ export class TraceListener { const functionArn = (this.context.invokedFunctionArn ?? "").toLowerCase(); const tk = functionArn.split(":"); options.tags = { - cold_start: didFunctionColdStart(), + cold_start: String(didFunctionColdStart()).toLowerCase(), function_arn: tk.length > 7 ? tk.slice(0, 7).join(":") : functionArn, function_version: tk.length > 7 ? tk[7] : "$LATEST", request_id: this.context.awsRequestId, @@ -319,11 +319,27 @@ export class TraceListener { options.childOf = this.lambdaSpanParentContext; } options.type = "serverless"; - options.service = "aws.lambda"; + if (this.context) { options.resource = this.context.functionName; - options.service = this.context.functionName; } + + const resolvedServiceName = (() => { + const envService = process.env[DD_SERVICE_ENV_VAR]; + if (envService && envService.trim().length > 0) { + return envService.trim(); + } + if ( + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED === "false" || + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED === "0" + ) { + return "aws.lambda"; + } + return this.context ? this.context.functionName : "aws.lambda"; + })(); + + options.service = resolvedServiceName; + return this.tracerWrapper.wrap("aws.lambda", options, func); } } diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index 4ed993fd..19eb5709 100644 --- a/src/trace/span-inferrer.spec.ts +++ b/src/trace/span-inferrer.spec.ts @@ -109,6 +109,222 @@ describe("SpanInferrer", () => { expect(serviceName).toBe("fallback"); }); + describe("when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is set to 'true'", () => { + beforeEach(() => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "true"; + }); + + it("uses instance-level service name for SNS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(snsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("ExampleTopic"); + }); + + it("uses instance-level service name for SQS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(sqsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("MyQueue"); + }); + + it("uses instance-level service name for DDB events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(ddbEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("ExampleTableWithStream"); + }); + + it("uses instance-level service name for Kinesis events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(kinesisEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("EXAMPLE"); + }); + + it("uses instance-level service name for EventBridge events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(eventBridgeEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("my.event"); + }); + + it("uses instance-level service name for API Gateway events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(apiGatewayV1, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("id.execute-api.us-east-1.amazonaws.com"); + }); + + it("uses instance-level service name for Lambda Function URL events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(functionUrlEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("a8hyhsshac.lambda-url.eu-south-1.amazonaws.com"); + }); + + it("uses instance-level service name for S3 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(s3Event, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("example-bucket"); + }); + }); + + describe("when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is set to 'false'", () => { + beforeEach(() => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "false"; + }); + + it("uses generic service name for SNS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(snsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("sns"); + }); + + it("uses generic service name for SQS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(sqsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("sqs"); + }); + + it("uses generic service name for DDB events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(ddbEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("aws.dynamodb"); + }); + + it("uses generic service name for Kinesis events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(kinesisEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("kinesis"); + }); + + it("uses generic service name for EventBridge events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(eventBridgeEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("eventbridge"); + }); + + it("uses generic service name for API Gateway events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(apiGatewayV1, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("id.execute-api.us-east-1.amazonaws.com"); + }); + + it("uses generic service name for Lambda Function URL events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(functionUrlEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("a8hyhsshac.lambda-url.eu-south-1.amazonaws.com"); + }); + + it("uses generic service name for S3 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(s3Event, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("s3"); + }); + }); + + describe("when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is set to '0'", () => { + beforeEach(() => { + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED = "0"; + }); + + it("uses generic service name for SNS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(snsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("sns"); + }); + + it("uses generic service name for SQS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(sqsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("sqs"); + }); + + it("uses generic service name for DDB events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(ddbEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("aws.dynamodb"); + }); + + it("uses generic service name for Kinesis events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(kinesisEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("kinesis"); + }); + + it("uses generic service name for EventBridge events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(eventBridgeEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("eventbridge"); + }); + + it("uses generic service name for API Gateway events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(apiGatewayV1, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("id.execute-api.us-east-1.amazonaws.com"); + }); + + it("uses generic service name for Lambda Function URL events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(functionUrlEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("a8hyhsshac.lambda-url.eu-south-1.amazonaws.com"); + }); + + it("uses generic service name for S3 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(s3Event, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("s3"); + }); + }); + + describe("when DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED is not set", () => { + beforeEach(() => { + delete process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED; + }); + + it("uses instance-level service name for SNS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(snsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("ExampleTopic"); + }); + + it("uses instance-level service name for SQS events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(sqsEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("MyQueue"); + }); + + it("uses instance-level service name for DDB events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(ddbEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("ExampleTableWithStream"); + }); + + it("uses instance-level service name for Kinesis events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(kinesisEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("EXAMPLE"); + }); + + it("uses instance-level service name for EventBridge events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(eventBridgeEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("my.event"); + }); + + it("uses instance-level service name for API Gateway events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(apiGatewayV1, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("id.execute-api.us-east-1.amazonaws.com"); + }); + + it("uses instance-level service name for Lambda Function URL events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(functionUrlEvent, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("a8hyhsshac.lambda-url.eu-south-1.amazonaws.com"); + }); + + it("uses instance-level service name for S3 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(s3Event, {} as any, {} as SpanContext); + expect(getStartSpanServiceTag(1)).toBe("example-bucket"); + }); + }); + it("extracts service name from event when service mapping has incorrect delimiters", () => { process.env.DD_SERVICE_MAPPING = "key1-value1,key2=value2"; const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 2ef63b9a..34466006 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -82,11 +82,19 @@ export class SpanInferrer { } static determineServiceName(specificKey: string, genericKey: string, extractedKey: string, fallback: string): string { - return ( - this.serviceMapping[specificKey] || - this.serviceMapping[genericKey] || - (extractedKey?.trim() ? extractedKey : fallback) - ); + const mappedService = this.serviceMapping[specificKey] || this.serviceMapping[genericKey]; + if (mappedService) { + return mappedService; + } + + if ( + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED === "false" || + process.env.DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED === "0" + ) { + return fallback; + } + + return extractedKey?.trim() ? extractedKey : fallback; } createInferredSpanForApiGateway( @@ -109,7 +117,7 @@ export class SpanInferrer { } const resourceName = [method || domain, resourcePath].join(" "); const apiId = event.requestContext.apiId || ""; - const serviceName = SpanInferrer.determineServiceName(apiId, "lambda_api_gateway", domain, "aws.apigateway"); + const serviceName = SpanInferrer.determineServiceName(apiId, "lambda_api_gateway", domain, domain); options.tags = { operation_name: "aws.apigateway", @@ -208,7 +216,7 @@ export class SpanInferrer { } const resourceName = [method || domain, path].join(" "); const apiId: string = event.requestContext.apiId || ""; - const serviceName: string = SpanInferrer.determineServiceName(apiId, "lambda_url", domain, "aws.lambda_url"); + const serviceName: string = SpanInferrer.determineServiceName(apiId, "lambda_url", domain, domain); options.tags = { operation_name: "aws.lambda.url", @@ -305,7 +313,7 @@ export class SpanInferrer { const topicName = TopicArn?.split(":").pop() || ""; const resourceName = topicName; - const serviceName = SpanInferrer.determineServiceName(topicName, "lambda_sns", topicName, "aws.sns"); + const serviceName = SpanInferrer.determineServiceName(topicName, "lambda_sns", topicName, "sns"); options.tags = { operation_name: "aws.sns", resource_names: resourceName, @@ -357,7 +365,7 @@ export class SpanInferrer { } = referenceRecord; const queueName = eventSourceARN?.split(":").pop() || ""; const resourceName = queueName; - const serviceName = SpanInferrer.determineServiceName(queueName, "lambda_sqs", queueName, "aws.sqs"); + const serviceName = SpanInferrer.determineServiceName(queueName, "lambda_sqs", queueName, "sqs"); options.tags = { operation_name: "aws.sqs", resource_names: resourceName, @@ -424,7 +432,7 @@ export class SpanInferrer { } = referenceRecord; const streamName = (eventSourceARN?.split(":").pop() || "").replace(/^stream\//, ""); const shardId = eventID.split(":").pop(); - const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", streamName, "aws.kinesis"); + const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", streamName, "kinesis"); options.tags = { operation_name: "aws.kinesis", resource_names: streamName, @@ -473,7 +481,7 @@ export class SpanInferrer { eventTime, eventName, } = referenceRecord; - const serviceName = SpanInferrer.determineServiceName(bucketName, "lambda_s3", bucketName, "aws.s3"); + const serviceName = SpanInferrer.determineServiceName(bucketName, "lambda_s3", bucketName, "s3"); options.tags = { operation_name: "aws.s3", resource_names: bucketName, @@ -512,7 +520,7 @@ export class SpanInferrer { ): SpanWrapper { const options: SpanOptions = {}; const { time, source } = event as EventBridgeEvent; - const serviceName = SpanInferrer.determineServiceName(source, "lambda_eventbridge", source, "aws.eventbridge"); + const serviceName = SpanInferrer.determineServiceName(source, "lambda_eventbridge", source, "eventbridge"); options.tags = { operation_name: "aws.eventbridge", resource_names: source,