Skip to content

Commit 9933ae9

Browse files
authored
[SVLS-4780] upstream Java sns and sqs refactor (#538)
* upstream Java sns and sqs refactor
1 parent 6c0447d commit 9933ae9

File tree

8 files changed

+193
-80
lines changed

8 files changed

+193
-80
lines changed

src/trace/context/extractors/sns-sqs.spec.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ describe("SNSSQSEventTraceExtractor", () => {
2020
describe("extract", () => {
2121
beforeEach(() => {
2222
mockSpanContext = null;
23+
spyTracerWrapper.mockClear();
2324
});
2425

2526
afterEach(() => {
@@ -42,7 +43,7 @@ describe("SNSSQSEventTraceExtractor", () => {
4243
messageId: "64812b68-4d9b-4dca-b3fb-9b18f255ee51",
4344
receiptHandle:
4445
"AQEBER6aRkfG8092GvkL7FRwCwbQ7LLDW9Tlk/CembqHe+suS2kfFxXiukomvaIN61QoyQMoRgWuV52SDkiQno2u+5hP64BDbmw+e/KR9ayvIfHJ3M6RfyQLaWNWm3hDFBCKTnBMVIxtdx0N9epZZewyokjKcrNYtmCghFgTCvZzsQkowi5rnoHAVHJ3je1c3bDnQ1KLrZFgajDnootYXDwEPuMq5FIxrf4EzTe0S7S+rnRm+GaQfeBLBVAY6dASL9usV3/AFRqDtaI7GKI+0F2NCgLlqj49VlPRz4ldhkGknYlKTZTluAqALWLJS62/J1GQo53Cs3nneJcmu5ajB2zzmhhRXoXINEkLhCD5ujZfcsw9H4xqW69Or4ECvlqx14bUU2rtMIW0QM2p7pEeXnyocymQv6m1te113eYWTVmaJ4I=",
45-
body: '{\n "Type" : "Notification",\n "MessageId" : "0a0ab23e-4861-5447-82b7-e8094ff3e332",\n "TopicArn" : "arn:aws:sns:eu-west-1:601427279990:js-library-test-dev-demoTopic-15WGUVRCBMPAA",\n "Message" : "{\\"hello\\":\\"harv\\",\\"nice of you to join us\\":\\"david\\",\\"anotherThing\\":{\\"foo\\":\\"bar\\",\\"blah\\":null,\\"harv\\":123},\\"vals\\":[{\\"thingOne\\":1},{\\"thingTwo\\":2}],\\"ajTimestamp\\":1639777617957}",\n "Timestamp" : "2021-12-17T21:46:58.040Z",\n "SignatureVersion" : "1",\n "Signature" : "FR35/7E8C3LHEVk/rC4XxXlXwV/5mNkFNPgDhHSnJ2I6hIoSrTROAm7h5xm1PuBkAeFDvq0zofw91ouk9zZyvhdrMLFIIgrjEyNayRmEffmoEAkzLFUsgtQX7MmTl644r4NuWiM0Oiz7jueRvIcKXcZr7Nc6GJcWV1ymec8oOmuHNMisnPMxI07LIQVYSyAfv6P9r2jEWMVIukRoCzwTnRk4bUUYhPSGHI7OC3AsxxXBbv8snqTrLM/4z2rXCf6jHCKNxWeLlm9/45PphCkEyx5BWS4/71KaoMWUWy8+6CCsy+uF3XTCVmvSEYLyEwTSzOY+vCUjazrRW93498i70g==",\n "SigningCertUrl" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-7ff5318490ec183fbaddaa2a969abfda.pem",\n "UnsubscribeUrl" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:601427279990:js-library-test-dev-demoTopic-15WGUVRCBMPAA:1290f550-9a8a-4e8f-a900-8f5f96dcddda",\n "MessageAttributes" : {\n "_datadog" : {"Type":"String","Value":"{\\"x-datadog-trace-id\\":\\"2776434475358637757\\",\\"x-datadog-parent-id\\":\\"4493917105238181843\\",\\"x-datadog-sampled\\":\\"1\\",\\"x-datadog-sampling-priority\\":\\"1\\"}"}\n }\n}',
46+
body: '{\n "Type" : "Notification",\n "MessageId" : "0a0ab23e-4861-5447-82b7-e8094ff3e332",\n "TopicArn" : "arn:aws:sns:eu-west-1:601427279990:js-library-test-dev-demoTopic-15WGUVRCBMPAA",\n "Message" : "{\\"hello\\":\\"harv\\",\\"nice of you to join us\\":\\"david\\",\\"anotherThing\\":{\\"foo\\":\\"bar\\",\\"blah\\":null,\\"harv\\":123},\\"vals\\":[{\\"thingOne\\":1},{\\"thingTwo\\":2}],\\"ajTimestamp\\":1639777617957}",\n "Timestamp" : "2021-12-17T21:46:58.040Z",\n "SignatureVersion" : "1",\n "Signature" : "FR35/7E8C3LHEVk/rC4XxXlXwV/5mNkFNPgDhHSnJ2I6hIoSrTROAm7h5xm1PuBkAeFDvq0zofw91ouk9zZyvhdrMLFIIgrjEyNayRmEffmoEAkzLFUsgtQX7MmTl644r4NuWiM0Oiz7jueRvIcKXcZr7Nc6GJcWV1ymec8oOmuHNMisnPMxI07LIQVYSyAfv6P9r2jEWMVIukRoCzwTnRk4bUUYhPSGHI7OC3AsxxXBbv8snqTrLM/4z2rXCf6jHCKNxWeLlm9/45PphCkEyx5BWS4/71KaoMWUWy8+6CCsy+uF3XTCVmvSEYLyEwTSzOY+vCUjazrRW93498i70g==",\n "SigningCertUrl" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-************************33ab7e69.pem",\n "UnsubscribeUrl" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:601427279990:js-library-test-dev-demoTopic-15WGUVRCBMPAA:1290f550-9a8a-4e8f-a900-8f5f96dcddda",\n "MessageAttributes" : {\n "_datadog" : {"Type":"String","Value":"{\\"x-datadog-trace-id\\":\\"2776434475358637757\\",\\"x-datadog-parent-id\\":\\"4493917105238181843\\",\\"x-datadog-sampled\\":\\"1\\",\\"x-datadog-sampling-priority\\":\\"1\\"}"}\n }\n}',
4647
attributes: {
4748
ApproximateReceiveCount: "1",
4849
SentTimestamp: "1639777618130",
@@ -171,5 +172,45 @@ describe("SNSSQSEventTraceExtractor", () => {
171172
const traceContext = extractor.extract(payload);
172173
expect(traceContext).toBeNull();
173174
});
175+
it("extracts trace context from AWSTraceHeader with valid payload", () => {
176+
const tracerWrapper = new TracerWrapper();
177+
const payload = {
178+
Records: [
179+
{
180+
messageId: "40304cba-041c-4284-808e-8d8692c6cba1",
181+
receiptHandle:
182+
"AQEBisC4xIjrp5W72r64fIf86ilRqadl6sbkmqbx41BI7P5ov0dJSNaNG97dnmOqSMD+MhXTvvC7HL2i+3viGrC8iNacZXSr9zzZvpFLFYO6jphDRTNJdkEZqSbKUoN5c/Nri5FjA4X52q4pCvW1esADJ2ZcMQQuQ19gsKAEQ0VGkHpH+BeceQtoFc3XT7uJboykfUA6iWT4TyNdJS+O4119ZBdN3U1jZ3PUn8mmTSi+SkTiXPBD9ywu6X8VzkGahueT+P7tJQTZ27mbPKhfrt3kvbFD6z7lqBNQyAPoqHzAThGC3VbZOxth3iqf7kjsFccmSJsxvsBzcVpF6nmobf6dpxwnZTEIrlNpQGrBgoePIHrpWfC6UG6aRTc4zWc30VY6hcg09WjCNGI81KwDfNMDAdJknOhsbY3HtvRQkQncbXgsYXgDDJG3PdIUoI2YScLeWEBMwE/HPCWk0X3K6McczRIHw3PfLaS2eVpjzNlq9I4=",
183+
body: '{\n "Type" : "Notification",\n "MessageId" : "d968a20b-73c3-5389-ae7a-fcb844faf1c7",\n "TopicArn" : "arn:aws:sns:us-west-2:425362996713:DdTraceXLambda-snssqschecksNestedStacksnssqschecksNestedStackResource58F786C6-11NORKTA1JFML-snsProducerJavaForPythonNonRawsnssqsproducerjavaforpythonnonrawtopicDDBAB6EA-ZBb8uCZzkS0S",\n "Message" : "hello from DdTraceXLambda-snssqschec-snssqsproducerjavaforpyt-z0t7yDk3zWt1",\n "Timestamp" : "2024-05-06T19:52:25.181Z",\n "SignatureVersion" : "1",\n "Signature" : "pZIIa0Ae49vUPVSZcR4XCt9K2gMWYBjIJCZbQJo6URKLJOcC4yJNXVzOQAb80tG10lgOq+gMahLaTcuJ5+yFr3LtK/8nl7mdeP7aH6V2VoRubmJuc7P2WUixhubve577MfFMjp1LrkQaa5D/ken6yOjjgxRy32GazYAUEeQ9duldSAuu3omfsljWnZSHoeHkpbVkCrp/KyNGDQKrf+pFxxuxb9yqUzbHa8H80zS9fwOEsBuSqlbyK2Mj68wneqSeuRcZ30l5xyJ82vVjyXEukNcSkt5OcZOYFGqxotIY7MKTr2nrkiFOJAiRsOK34eQyk7eVdWRRfyoxCHVpnImT1Q==",\n "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-************************33ab7e69",\n "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:425362996713:DdTraceXLambda-snssqschecksNestedStacksnssqschecksNestedStackResource58F786C6-11NORKTA1JFML-snsProducerJavaForPythonNonRawsnssqsproducerjavaforpythonnonrawtopicDDBAB6EA-ZBb8uCZzkS0S:d44c53e8-538c-472f-89e1-89c131d9cd26",\n "MessageAttributes" : {\n "JOEYTEST" : {"Type":"String","Value":"test"},\n "JOEYTEST2" : {"Type":"String","Value":"test2"}\n }\n}',
184+
attributes: {
185+
ApproximateReceiveCount: "1",
186+
AWSTraceHeader: "Root=1-663934f8-0000000045c5da17458c9910;Parent=18f37c8f541d052f;Sampled=1",
187+
SentTimestamp: "1715025145210",
188+
SenderId: "AIDAIYLAVTDLUXBIEIX46",
189+
ApproximateFirstReceiveTimestamp: "1715025145220",
190+
},
191+
messageAttributes: {},
192+
md5OfBody: "************************33ab7e69",
193+
eventSource: "aws:sqs",
194+
eventSourceARN:
195+
"arn:aws:sqs:us-west-2:425362996713:DdTraceXLambda-snssqschecksNested-snsProducerJavaForPythonNonRawsns-1vws7QPqW8e6",
196+
awsRegion: "us-west-2",
197+
},
198+
],
199+
};
200+
201+
const extractor = new SNSSQSEventTraceExtractor(tracerWrapper);
202+
203+
const traceContext = extractor.extract(payload);
204+
expect(traceContext).not.toBeNull();
205+
206+
// Should not use ddtracer extractor. Because 1. it's an unnecessary extra step and
207+
// 2. More importantly, DD_TRACE_PROPAGATION_STYLE could cause extraction fail
208+
expect(spyTracerWrapper).not.toHaveBeenCalled();
209+
210+
expect(traceContext?.toTraceId()).toBe("5027664352514971920");
211+
expect(traceContext?.toSpanId()).toBe("1797917631284315439");
212+
expect(traceContext?.sampleMode()).toBe("1");
213+
expect(traceContext?.source).toBe("event");
214+
});
174215
});
175216
});

src/trace/context/extractors/sns-sqs.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,46 @@ import { EventTraceExtractor } from "../extractor";
33
import { TracerWrapper } from "../../tracer-wrapper";
44
import { logDebug } from "../../../utils";
55
import { SpanContextWrapper } from "../../span-context-wrapper";
6+
import { XrayService } from "../../xray-service";
67

78
export class SNSSQSEventTraceExtractor implements EventTraceExtractor {
89
constructor(private tracerWrapper: TracerWrapper) {}
910

1011
extract(event: SQSEvent): SpanContextWrapper | null {
11-
const body = event?.Records?.[0]?.body;
12-
if (body === undefined) return null;
13-
1412
try {
15-
const parsedBody = JSON.parse(body) as SNSMessage;
16-
const messageAttribute = parsedBody?.MessageAttributes?._datadog;
17-
if (messageAttribute.Value === undefined) return null;
13+
// First try to extract trace context from message attributes
14+
if (event?.Records?.[0]?.body) {
15+
const parsedBody = JSON.parse(event?.Records?.[0]?.body) as SNSMessage;
16+
const messageAttribute = parsedBody?.MessageAttributes?._datadog;
17+
if (messageAttribute?.Value) {
18+
let headers;
19+
if (messageAttribute.Type === "String") {
20+
headers = JSON.parse(messageAttribute.Value);
21+
} else {
22+
const decodedValue = Buffer.from(messageAttribute.Value, "base64").toString("ascii");
23+
headers = JSON.parse(decodedValue);
24+
}
1825

19-
let headers;
20-
if (messageAttribute.Type === "String") {
21-
headers = JSON.parse(messageAttribute.Value);
22-
} else {
23-
const decodedValue = Buffer.from(messageAttribute.Value, "base64").toString("ascii");
24-
headers = JSON.parse(decodedValue);
26+
const traceContext = this.tracerWrapper.extract(headers);
27+
if (traceContext) {
28+
logDebug("Extracted trace context from SNS-SQS event");
29+
return traceContext;
30+
} else {
31+
logDebug("Failed to extract trace context from SNS-SQS event");
32+
}
33+
}
34+
}
35+
// Then try to extract trace context from attributes.AWSTraceHeader. (Upstream Java apps can
36+
// pass down Datadog trace context in the attributes.AWSTraceHeader in SQS case)
37+
if (event?.Records?.[0]?.attributes?.AWSTraceHeader !== undefined) {
38+
const traceContext = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader);
39+
if (traceContext) {
40+
logDebug("Extracted trace context from SNS-SQS event attributes.AWSTraceHeader");
41+
return traceContext;
42+
} else {
43+
logDebug("No Datadog trace context found from SNS-SQS event attributes.AWSTraceHeader");
44+
}
2545
}
26-
27-
const traceContext = this.tracerWrapper.extract(headers);
28-
if (traceContext === null) return null;
29-
30-
logDebug("Extracted trace context from SNS-SQS event", { traceContext, event });
31-
return traceContext;
3246
} catch (error) {
3347
if (error instanceof Error) {
3448
logDebug("Unable to extract trace context from SNS-SQS event", error);

src/trace/context/extractors/sns.spec.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ describe("SNSEventTraceExtractor", () => {
2121
describe("extract", () => {
2222
beforeEach(() => {
2323
mockSpanContext = null;
24+
spyTracerWrapper.mockClear();
2425
});
2526

2627
afterEach(() => {
@@ -55,7 +56,7 @@ describe("SNSEventTraceExtractor", () => {
5556
Signature:
5657
"mzp2Ou0fASw4LYRxY6SSww7qFfofn4luCJBRaTjLpQ5uhwhsAUKdyLz9VPD+/dlRbi1ImsWtIZ7A+wxj1oV7Z2Gyu/N4RpGalae37+jTluDS7AhjgcD7Bs4bgQtFkCfMFEwbhICQfukLLzbwbgczZ4NTPn6zj5o28c5NBKSJMYSnLz82ohw77GgnZ/m26E32ZQNW4+VCEMINg9Ne2rHstwPWRXPr5xGTrx8jH8CNUZnVpFVfhU8o+OSeAdpzm2l99grHIo7qPhekERxANz6QHynMlhdzD3UNSgc3oZkamZban/NEKd4MKJzgNQdNOYVj3Kw6eF2ZweEoBQ5sSFK5fQ==",
5758
SigningCertUrl:
58-
"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-7ff5318490ec183fbaddaa2a969abfda.pem",
59+
"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-************************33ab7e69.pem",
5960
UnsubscribeUrl:
6061
"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:601427279990:aj-js-library-test-dev-solo-topic:1bd19208-a99a-46d9-8398-f90f8699c641",
6162
MessageAttributes: {
@@ -203,5 +204,57 @@ describe("SNSEventTraceExtractor", () => {
203204
const traceContext = extractor.extract(payload);
204205
expect(traceContext).toBeNull();
205206
});
207+
208+
it("extracts trace context from AWSTraceHeader when no tracecontext found from payload", () => {
209+
const tracerWrapper = new TracerWrapper();
210+
const payload: SNSEvent = {
211+
Records: [
212+
{
213+
EventSource: "aws:sns",
214+
EventVersion: "1.0",
215+
EventSubscriptionArn:
216+
"arn:aws:sns:us-west-2:425362996713:DdTraceXLambda-snsjavachecksNestedStacksnsjavachecksNestedStackResource569D7DFD-VGBRIQ3RKOFR-snsJavaProducer2snsjavaproducerforPythontopic2EDA1CA9-A4bHj7LHgBQh:f3864261-c160-443d-b21e-8effb1899456",
217+
Sns: {
218+
Type: "Notification",
219+
MessageId: "f0cae95c-225d-5718-896c-b7ef1e3a7108",
220+
TopicArn:
221+
"arn:aws:sns:us-west-2:425362996713:DdTraceXLambda-snsjavachecksNestedStacksnsjavachecksNestedStackResource569D7DFD-VGBRIQ3RKOFR-snsJavaProducer2snsjavaproducerforPythontopic2EDA1CA9-A4bHj7LHgBQh",
222+
Subject: "",
223+
Message: "hello from DdTraceXLambda-snsjavache-snsjavaproducerforPython-f1dKTIyh8pN6",
224+
Timestamp: "2024-05-06T20:14:31.519Z",
225+
SignatureVersion: "1",
226+
Signature:
227+
"gkBg+e7h+DSrgXzehe+rWCJmH0UWXwsaAz/dnngWivJmYKbdH0pNHNpM0ttFko2OItYzDEE+DdEm9dfSF7MYzl36UaFpijr1VI6YIwRcYAy6wpwwV23uX1XD7PrIoE/4/bonL6WJQLhdKiO3SD4eKd1RoIk4e1SjDzfMUtz6/4UaXC56wwQ/mj9QwglZ867xM0icLJjyT2LWIrIkHjyXFNFrQUn973sRcgfZDs92kOfacF0/Zqm6I/pHzoDeoQU4MapuX8jWSA45bPjxtWXglpez0z7Yne4eLujPSSEwzJRyPJeRaxdyL1NFF43X0SAZ5C7gWgeExN7GJKs1zW2sFA==",
228+
SigningCertUrl:
229+
"https://sns.us-west-2.amazonaws.com/SimpleNotificationService-************************33ab7e69",
230+
UnsubscribeUrl:
231+
"https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:425362996713:DdTraceXLambda-snsjavachecksNestedStacksnsjavachecksNestedStackResource569D7DFD-VGBRIQ3RKOFR-snsJavaProducer2snsjavaproducerforPythontopic2EDA1CA9-A4bHj7LHgBQh:f3864261-c160-443d-b21e-8effb1899456",
232+
MessageAttributes: {
233+
test: {
234+
Type: "String",
235+
Value: "test",
236+
},
237+
},
238+
},
239+
},
240+
],
241+
};
242+
243+
const extractor = new SNSEventTraceExtractor(tracerWrapper);
244+
process.env["_X_AMZN_TRACE_ID"] =
245+
"Root=1-66393a26-0000000017acacbad335fb99;Parent=12f5e70cc905dfb7;Sampled=1;Lineage=48e79d5f:0";
246+
const traceContext = extractor.extract(payload);
247+
process.env["_X_AMZN_TRACE_ID"] = "";
248+
expect(traceContext).not.toBeNull();
249+
250+
// Should not use ddtracer extractor. Because 1. it's an unnecessary extra step and
251+
// 2. More importantly, DD_TRACE_PROPAGATION_STYLE could cause extraction fail
252+
expect(spyTracerWrapper).not.toHaveBeenCalled();
253+
254+
expect(traceContext?.toTraceId()).toBe("1705928277274000281");
255+
expect(traceContext?.toSpanId()).toBe("1366252104075042743");
256+
expect(traceContext?.sampleMode()).toBe("1");
257+
expect(traceContext?.source).toBe("event");
258+
});
206259
});
207260
});

src/trace/context/extractors/sns.ts

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,44 @@ import { TracerWrapper } from "../../tracer-wrapper";
33
import { logDebug } from "../../../utils";
44
import { EventTraceExtractor } from "../extractor";
55
import { SpanContextWrapper } from "../../span-context-wrapper";
6+
import { XrayService, AMZN_TRACE_ID_ENV_VAR } from "../../xray-service";
67

78
export class SNSEventTraceExtractor implements EventTraceExtractor {
89
constructor(private tracerWrapper: TracerWrapper) {}
910

1011
extract(event: SNSEvent): SpanContextWrapper | null {
11-
const messageAttribute = event?.Records?.[0]?.Sns?.MessageAttributes?._datadog;
12-
if (messageAttribute?.Value === undefined) return null;
13-
1412
try {
15-
let headers;
16-
if (messageAttribute.Type === "String") {
17-
headers = JSON.parse(messageAttribute.Value);
18-
} else {
19-
// Try decoding base64 values
20-
const decodedValue = Buffer.from(messageAttribute.Value, "base64").toString("ascii");
21-
headers = JSON.parse(decodedValue);
22-
}
23-
24-
const traceContext = this.tracerWrapper.extract(headers);
25-
if (traceContext === null) return null;
13+
// First try to extract trace context from message attributes
14+
const messageAttribute = event?.Records?.[0]?.Sns?.MessageAttributes?._datadog;
15+
if (messageAttribute?.Value) {
16+
let headers;
17+
if (messageAttribute.Type === "String") {
18+
headers = JSON.parse(messageAttribute.Value);
19+
} else {
20+
// Try decoding base64 values
21+
const decodedValue = Buffer.from(messageAttribute.Value, "base64").toString("ascii");
22+
headers = JSON.parse(decodedValue);
23+
}
2624

27-
logDebug(`Extracted trace context from SNS event`, { traceContext, event });
28-
return traceContext;
25+
const traceContext = this.tracerWrapper.extract(headers);
26+
if (traceContext) {
27+
logDebug("Extracted trace context from SNS event");
28+
return traceContext;
29+
} else {
30+
logDebug("Failed to extract trace context from SNS event");
31+
}
32+
}
33+
// Then try to extract trace context from _X_AMZN_TRACE_ID header (Upstream Java apps can
34+
// pass down Datadog trace id (parent id wrong) in the env in SNS case)
35+
if (process.env[AMZN_TRACE_ID_ENV_VAR]) {
36+
const traceContext = XrayService.extraceDDContextFromAWSTraceHeader(process.env[AMZN_TRACE_ID_ENV_VAR]);
37+
if (traceContext) {
38+
logDebug("Extracted Datadog trace context from _X_AMZN_TRACE_ID");
39+
return traceContext;
40+
} else {
41+
logDebug("No Datadog trace context found from _X_AMZN_TRACE_ID");
42+
}
43+
}
2944
} catch (error) {
3045
if (error instanceof Error) {
3146
logDebug("Unable to extract trace context from SNS event", error);

src/trace/context/extractors/sqs.spec.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ describe("SQSEventTraceExtractor", () => {
2121
describe("extract", () => {
2222
beforeEach(() => {
2323
mockSpanContext = null;
24+
spyTracerWrapper.mockClear();
2425
});
2526

2627
afterEach(() => {
@@ -128,13 +129,6 @@ describe("SQSEventTraceExtractor", () => {
128129
});
129130

130131
it("extracts trace context from AWSTraceHeader with valid payload", () => {
131-
mockSpanContext = {
132-
toTraceId: () => "625397077193750208",
133-
toSpanId: () => "6538302989251745223",
134-
_sampling: {
135-
priority: "1",
136-
},
137-
};
138132
const tracerWrapper = new TracerWrapper();
139133
const payload: SQSEvent = {
140134
Records: [
@@ -163,11 +157,9 @@ describe("SQSEventTraceExtractor", () => {
163157
const traceContext = extractor.extract(payload);
164158
expect(traceContext).not.toBeNull();
165159

166-
expect(spyTracerWrapper).toHaveBeenCalledWith({
167-
"x-datadog-parent-id": "6538302989251745223",
168-
"x-datadog-sampling-priority": "1",
169-
"x-datadog-trace-id": "625397077193750208",
170-
});
160+
// Should not use ddtracer extractor. Because 1. it's an unnecessary extra step and
161+
// 2. More importantly, DD_TRACE_PROPAGATION_STYLE could cause extraction fail
162+
expect(spyTracerWrapper).not.toHaveBeenCalled();
171163

172164
expect(traceContext?.toTraceId()).toBe("625397077193750208");
173165
expect(traceContext?.toSpanId()).toBe("6538302989251745223");

0 commit comments

Comments
 (0)