diff --git a/integration_tests/snapshots/logs/http-requests_node10_with_plugin.log b/integration_tests/snapshots/logs/http-requests_node10_with_plugin.log index 05d9c64b..5f829def 100644 --- a/integration_tests/snapshots/logs/http-requests_node10_with_plugin.log +++ b/integration_tests/snapshots/logs/http-requests_node10_with_plugin.log @@ -2,7 +2,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node10_with_plugin","resource:integration-plugin-dev-http-requests_node10_with_plugin","cold_start:true","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs10.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev10.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"true","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":1,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"http://127.0.0.1:8124/lambda/hello","error.type":"Error","error.msg":"connect ECONNREFUSED 127.0.0.1:8124","error.stack":"Error: connect ECONNREFUSED 127.0.0.1:8124\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"true","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB Init Duration: XXXX ms XRAY TraceId: XXXX SegmentId: XXXX Sampled: true @@ -11,7 +11,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node10_with_plugin","resource:integration-plugin-dev-http-requests_node10_with_plugin","cold_start:false","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs10.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev10.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"false","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"false","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB XRAY TraceId: XXXX SegmentId: XXXX Sampled: true @@ -20,7 +20,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node10_with_plugin","resource:integration-plugin-dev-http-requests_node10_with_plugin","cold_start:false","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs10.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev10.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"false","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node10_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node10_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node10_with_plugin","cold_start":"false","function_arn":"XXXX_node10_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node10_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB XRAY TraceId: XXXX SegmentId: XXXX Sampled: true diff --git a/integration_tests/snapshots/logs/http-requests_node12_with_plugin.log b/integration_tests/snapshots/logs/http-requests_node12_with_plugin.log index c27a8926..cf54659c 100644 --- a/integration_tests/snapshots/logs/http-requests_node12_with_plugin.log +++ b/integration_tests/snapshots/logs/http-requests_node12_with_plugin.log @@ -2,7 +2,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node12_with_plugin","resource:integration-plugin-dev-http-requests_node12_with_plugin","cold_start:true","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs12.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev12.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"true","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":1,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"http://127.0.0.1:8124/lambda/hello","error.type":"Error","error.msg":"connect ECONNREFUSED 127.0.0.1:8124","error.stack":"Error: connect ECONNREFUSED 127.0.0.1:8124\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)\n at TCPConnectWrap.callbackTrampoline (internal/async_hooks.js:120:14)"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"true","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB Init Duration: XXXX ms XRAY TraceId: XXXX SegmentId: XXXX Sampled: true @@ -11,7 +11,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node12_with_plugin","resource:integration-plugin-dev-http-requests_node12_with_plugin","cold_start:false","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs12.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev12.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"false","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"false","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB XRAY TraceId: XXXX SegmentId: XXXX Sampled: true @@ -20,7 +20,7 @@ START RequestId: XXXX Version: $LATEST {"e":XXXX,"m":"aws.lambda.enhanced.invocations","t":["region:us-east-1","account_id:XXXX","functionname:integration-plugin-dev-http-requests_node12_with_plugin","resource:integration-plugin-dev-http-requests_node12_with_plugin","cold_start:false","memorysize:1024","datadog_lambda:vX.X.X","runtime:nodejs12.x"],"v":1} {"e":XXXX,"m":"serverless.integration_test.execution","t":["function:http-request","dd_lambda_layer:datadog-nodev12.XX.X"],"v":1} XXXX-XX-XX XX:XX:XX.XXX XXXX-XXXX-XXXX-XXXX-XXXX INFO [dd.trace_id=XXXX dd.span_id=XXXX] Snapshot test http requests successfully made to URLs: https://ip-ranges.datadoghq.com,https://ip-ranges.datadoghq.eu -{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"false","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} +{"traces":[[{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.com/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"http.request","resource":"GET","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","span.kind":"client","http.method":"GET","http.url":"https://ip-ranges.datadoghq.eu/","http.status_code":"200"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"integration-plugin-dev-http-requests_node12_with_plugin-http-client","type":"http"},{"trace_id":"XXXX","span_id":"XXXX","parent_id":"XXXX","name":"aws.lambda","resource":"integration-plugin-dev-http-requests_node12_with_plugin","error":0,"meta":{"_dd.origin":"lambda","service":"integration-plugin-dev-http-requests_node12_with_plugin","cold_start":"false","function_arn":"XXXX_node12_with_plugin","function_version":"$LATEST","request_id":"XXXX","resource_names":"integration-plugin-dev-http-requests_node12_with_plugin","datadog_lambda":"XXXX","dd_trace":"XXXX","_dd.parent_source":"xray"},"metrics":{"_sample_rate":1,"_sampling_priority_v1":2},"start":XXXX,"duration":XXXX,"service":"aws.lambda","type":"serverless"}]]} END RequestId: XXXX REPORT RequestId: XXXX Duration: XXXX ms Billed Duration: XXXX ms Memory Size: 1024 MB Max Memory Used: XXXX MB XRAY TraceId: XXXX SegmentId: XXXX Sampled: true diff --git a/src/trace/context.spec.ts b/src/trace/context.spec.ts index e547851f..fcfcc386 100644 --- a/src/trace/context.spec.ts +++ b/src/trace/context.spec.ts @@ -1,3 +1,4 @@ +import { SQSEvent } from "aws-lambda"; import { LogLevel, setLogLevel } from "../utils"; import { SampleMode, @@ -16,6 +17,8 @@ import { readTraceContextFromXray, readTraceFromEvent, readStepFunctionContextFromEvent, + readTraceFromSQSEvent, + readTraceFromHTTPEvent, } from "./context"; let sentSegment: any; @@ -193,6 +196,39 @@ describe("readTraceFromEvent", () => { source: Source.Event, }); }); + it("can read from sqs source", () => { + const result = readTraceFromEvent({ + Records: [ + { + body: "Hello world", + attributes: { + ApproximateReceiveCount: "1", + SentTimestamp: "1605544528092", + SenderId: "AROAYYB64AB3JHSRKO6XR:sqs-trace-dev-producer", + ApproximateFirstReceiveTimestamp: "1605544528094", + }, + messageAttributes: { + _datadog: { + stringValue: + '{"x-datadog-trace-id":"4555236104497098341","x-datadog-parent-id":"3369753143434738315","x-datadog-sampled":"1","x-datadog-sampling-priority":"1"}', + stringListValues: [], + binaryListValues: [], + dataType: "String", + }, + }, + eventSource: "aws:sqs", + eventSourceARN: "arn:aws:sqs:sa-east-1:601427279990:metal-queue", + awsRegion: "sa-east-1", + }, + ], + }); + expect(result).toEqual({ + parentID: "3369753143434738315", + sampleMode: SampleMode.AUTO_KEEP, + traceID: "4555236104497098341", + source: Source.Event, + }); + }); it("can read well formed headers with mixed casing", () => { const result = readTraceFromEvent({ headers: { @@ -249,6 +285,109 @@ describe("readTraceFromEvent", () => { }); }); +describe("readTraceFromHTTPEvent", () => { + it("can read well formed event with headers", () => { + const result = readTraceFromHTTPEvent({ + headers: { + "x-datadog-parent-id": "797643193680388254", + "x-datadog-sampling-priority": "2", + "x-datadog-trace-id": "4110911582297405557", + }, + }); + expect(result).toEqual({ + parentID: "797643193680388254", + sampleMode: SampleMode.USER_KEEP, + traceID: "4110911582297405557", + source: Source.Event, + }); + }); + it("can read well formed headers with mixed casing", () => { + const result = readTraceFromHTTPEvent({ + headers: { + "X-Datadog-Parent-Id": "797643193680388254", + "X-Datadog-Sampling-Priority": "2", + "X-Datadog-Trace-Id": "4110911582297405557", + }, + }); + expect(result).toEqual({ + parentID: "797643193680388254", + sampleMode: SampleMode.USER_KEEP, + traceID: "4110911582297405557", + source: Source.Event, + }); + }); +}); + +describe("readTraceFromSQSEvent", () => { + it("can read from sqs source", () => { + const result = readTraceFromSQSEvent(({ + Records: [ + { + body: "Hello world", + attributes: { + ApproximateReceiveCount: "1", + SentTimestamp: "1605544528092", + SenderId: "AROAYYB64AB3JHSRKO6XR:sqs-trace-dev-producer", + ApproximateFirstReceiveTimestamp: "1605544528094", + }, + messageAttributes: { + _datadog: { + stringValue: + '{"x-datadog-trace-id":"4555236104497098341","x-datadog-parent-id":"3369753143434738315","x-datadog-sampled":"1","x-datadog-sampling-priority":"1"}', + stringListValues: undefined, + binaryListValues: undefined, + dataType: "String", + }, + }, + eventSource: "aws:sqs", + eventSourceARN: "arn:aws:sqs:sa-east-1:601427279990:metal-queue", + awsRegion: "sa-east-1", + messageId: "foo", + md5OfBody: "x", + receiptHandle: "x", + }, + ], + } as unknown) as SQSEvent); + expect(result).toEqual({ + parentID: "3369753143434738315", + sampleMode: SampleMode.AUTO_KEEP, + traceID: "4555236104497098341", + source: Source.Event, + }); + }); + it("can handle malformed JSON", () => { + const result = readTraceFromSQSEvent(({ + Records: [ + { + body: "Hello world", + attributes: { + ApproximateReceiveCount: "1", + SentTimestamp: "1605544528092", + SenderId: "AROAYYB64AB3JHSRKO6XR:sqs-trace-dev-producer", + ApproximateFirstReceiveTimestamp: "1605544528094", + }, + messageAttributes: { + _datadog: { + stringValue: + '{asdasdasd"x-datadog-trace-id":"4555236104497098341","x-datadog-parent-id":"3369753143434738315","x-datadog-sampled":"1","x-datadog-sampling-priority":"1"}', + stringListValues: undefined, + binaryListValues: undefined, + dataType: "String", + }, + }, + eventSource: "aws:sqs", + eventSourceARN: "arn:aws:sqs:sa-east-1:601427279990:metal-queue", + awsRegion: "sa-east-1", + messageId: "foo", + md5OfBody: "x", + receiptHandle: "x", + }, + ], + } as unknown) as SQSEvent); + expect(result).toBeUndefined(); + }); +}); + describe("readStepFunctionContextFromEvent", () => { const stepFunctionEvent = { dd: { @@ -401,6 +540,41 @@ describe("extractTraceContext", () => { source: Source.Event, }); }); + it("returns trace read from SQS metadata as second highest priority", () => { + process.env["_X_AMZN_TRACE_ID"] = "Root=1-5ce31dc2-2c779014b90ce44db5e03875;Parent=0b11cc4230d3e09e;Sampled=1"; + + const result = extractTraceContext({ + Records: [ + { + body: "Hello world", + attributes: { + ApproximateReceiveCount: "1", + SentTimestamp: "1605544528092", + SenderId: "AROAYYB64AB3JHSRKO6XR:sqs-trace-dev-producer", + ApproximateFirstReceiveTimestamp: "1605544528094", + }, + messageAttributes: { + _datadog: { + stringValue: + '{"x-datadog-trace-id":"4555236104497098341","x-datadog-parent-id":"3369753143434738315","x-datadog-sampled":"1","x-datadog-sampling-priority":"1"}', + stringListValues: [], + binaryListValues: [], + dataType: "String", + }, + }, + eventSource: "aws:sqs", + eventSourceARN: "arn:aws:sqs:sa-east-1:601427279990:metal-queue", + awsRegion: "sa-east-1", + }, + ], + }); + expect(result).toEqual({ + parentID: "3369753143434738315", + sampleMode: SampleMode.AUTO_KEEP, + traceID: "4555236104497098341", + source: Source.Event, + }); + }); it("returns trace read from env if no headers present", () => { process.env["_X_AMZN_TRACE_ID"] = "Root=1-5ce31dc2-2c779014b90ce44db5e03875;Parent=0b11cc4230d3e09e;Sampled=1"; diff --git a/src/trace/context.ts b/src/trace/context.ts index c73d6e0b..99247823 100644 --- a/src/trace/context.ts +++ b/src/trace/context.ts @@ -1,6 +1,7 @@ import { BigNumber } from "bignumber.js"; import { randomBytes } from "crypto"; import { createSocket, Socket } from "dgram"; +import { SQSEvent } from "aws-lambda"; import { logDebug, logError } from "../utils"; import { @@ -38,6 +39,10 @@ export interface StepFunctionContext { "step_function.step_name": string; } +function isSQSEvent(event: any): event is SQSEvent { + return Array.isArray(event.Records) && event.Records.length > 0 && event.Records[0].eventSource === "aws:sqs"; +} + /** * Reads the trace context from either an incoming lambda event, or the current xray segment. * @param event An incoming lambda event. This must have incoming trace headers in order to be read. @@ -144,21 +149,51 @@ export function sendXraySubsegment(segment: string) { } } -export function readTraceFromEvent(event: any): TraceContext | undefined { - if (typeof event !== "object") { - return; - } - const headers = event.headers; +export function readTraceFromSQSEvent(event: SQSEvent): TraceContext | undefined { + if ( + event.Records[0].messageAttributes && + event.Records[0].messageAttributes._datadog && + event.Records[0].messageAttributes._datadog.stringValue + ) { + const traceHeaders = event.Records[0].messageAttributes._datadog.stringValue; - // e.g. When lambda is invoked synchronously, headers can be set to null by the caller - if (!headers || typeof headers !== "object") { - return; + try { + const traceData = JSON.parse(traceHeaders); + const traceID = traceData[traceIDHeader]; + if (typeof traceID !== "string") { + return; + } + const parentID = traceData[parentIDHeader]; + if (typeof parentID !== "string") { + return; + } + const sampledHeader = traceData[samplingPriorityHeader]; + if (typeof sampledHeader !== "string") { + return; + } + const sampleMode = parseInt(sampledHeader, 10); + + return { + parentID, + sampleMode, + source: Source.Event, + traceID, + }; + } catch (err) { + logError("Error parsing SQS message trace data", err); + return; + } } + return; +} + +export function readTraceFromHTTPEvent(event: any): TraceContext | undefined { + const headers = event.headers; const lowerCaseHeaders: { [key: string]: string } = {}; for (const key of Object.keys(headers)) { - lowerCaseHeaders[key.toLocaleLowerCase()] = headers[key]; + lowerCaseHeaders[key.toLowerCase()] = headers[key]; } const traceID = lowerCaseHeaders[traceIDHeader]; @@ -183,6 +218,22 @@ export function readTraceFromEvent(event: any): TraceContext | undefined { }; } +export function readTraceFromEvent(event: any): TraceContext | undefined { + if (typeof event !== "object") { + return; + } + + if (typeof event.headers === "object") { + return readTraceFromHTTPEvent(event); + } + + if (isSQSEvent(event)) { + return readTraceFromSQSEvent(event); + } + + return; +} + export function readTraceContextFromXray(): TraceContext | undefined { const header = process.env[xrayTraceEnvVar]; if (header === undefined) {