Skip to content

Commit 00d7309

Browse files
committed
fixes
1 parent 5184c05 commit 00d7309

File tree

3 files changed

+62
-14
lines changed

3 files changed

+62
-14
lines changed

src/trace/context/extractors/sqs.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ export class SQSEventTraceExtractor implements EventTraceExtractor {
1010

1111
extract(event: SQSEvent): SpanContextWrapper | null {
1212
try {
13-
var prepared_headers;
13+
let preparedHeaders;
1414
const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue;
1515
if (headers !== undefined) {
16-
prepared_headers = JSON.parse(headers);
16+
preparedHeaders = JSON.parse(headers);
1717
} else {
1818
if (event?.Records?.[0]?.attributes?.AWSTraceHeader) {
19-
prepared_headers = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader);
19+
preparedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader);
2020
}
2121
}
2222

23-
if (!prepared_headers) return null;
24-
const traceContext = this.tracerWrapper.extract(prepared_headers);
23+
if (!preparedHeaders) return null;
24+
const traceContext = this.tracerWrapper.extract(preparedHeaders);
2525
if (traceContext === null) {
26-
logDebug("Unable to extract the injected trace context from event");
26+
logDebug(`Failed to extract trace context from prepared headers: ${preparedHeaders}`);
2727
return null;
2828
}
2929
logDebug(`Extracted trace context from SQS event`, { traceContext, event });

src/trace/xray-service.spec.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import {
2+
DATADOG_SAMPLING_PRIORITY_HEADER,
3+
DATADOG_TRACE_ID_HEADER,
4+
DATADOG_PARENT_ID_HEADER,
5+
} from "./context/extractor";
16
import { SampleMode } from "./trace-context-service";
27
import { XrayService } from "./xray-service";
38

@@ -340,4 +345,46 @@ describe("XrayService", () => {
340345
expect(traceId).toBeUndefined();
341346
});
342347
});
348+
349+
describe("parseAWSTraceHeader", () => {
350+
it("parses AWS trace header correctly", () => {
351+
const awsTraceHeader = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1";
352+
const xrayHeaders = XrayService.parseAWSTraceHeader(awsTraceHeader);
353+
expect(xrayHeaders).toEqual({
354+
parentId: "94ae789b969f1cc5",
355+
sampled: "1",
356+
traceId: "1-5e272390-8c398be037738dc042009320",
357+
});
358+
});
359+
it.each(["Root=1-5e272390-8c398be037738dc042009320", "Root=1-65f2f78c-0000000008addb5405b376c0;Parent;Sampled"])(
360+
"returns undefined when AWS trace header is malformatted",
361+
(awsTraceHeader) => {
362+
const xrayHeaders = XrayService.parseAWSTraceHeader(awsTraceHeader);
363+
expect(xrayHeaders).toBeUndefined();
364+
},
365+
);
366+
});
367+
describe("extraceDDContextFromAWSTraceHeader", () => {
368+
it("extracts Datadog trace context from AWS trace header", () => {
369+
const awsTraceId = "Root=1-65f2f78c-0000000008addb5405b376c0;Parent=5abcb7ed643995c7;Sampled=1";
370+
const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId);
371+
372+
expect(ddTraceContext).toEqual({
373+
[DATADOG_TRACE_ID_HEADER]: "625397077193750208",
374+
[DATADOG_PARENT_ID_HEADER]: "6538302989251745223",
375+
[DATADOG_SAMPLING_PRIORITY_HEADER]: "1",
376+
});
377+
});
378+
379+
it("returns null when AWS trace header is NOT injected by dd-trace", () => {
380+
const awsTraceId = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1";
381+
const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId);
382+
expect(ddTraceContext).toBeNull();
383+
});
384+
it("returns null when AWS trace header cannot be parsed", () => {
385+
const awsTraceId = "Root=1-5e272390-8c398be037738dc042009320;;";
386+
const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId);
387+
expect(ddTraceContext).toBeNull();
388+
});
389+
});
343390
});

src/trace/xray-service.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,24 +197,25 @@ export class XrayService {
197197

198198
// We want to turn the last 63 bits into a decimal number in a string representation
199199
try {
200-
return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10);
200+
return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10); // mod by 2^63 will leave us with the last 63 bits
201201
} catch (_) {
202+
logDebug(`Faied to convert trace id ${lastPart}`);
202203
return undefined;
203204
}
204205
}
205206

206207
public static extraceDDContextFromAWSTraceHeader(amznTraceId: string): DatadogTraceHeaders | null {
207-
var aws_context = XrayService.parseAWSTraceHeader(amznTraceId);
208-
if (!aws_context) {
208+
const awsContext = XrayService.parseAWSTraceHeader(amznTraceId);
209+
if (!awsContext) {
209210
return null;
210211
}
211-
const trace_id_parts = aws_context.traceId.split("-");
212-
if (trace_id_parts && trace_id_parts.length > 2 && trace_id_parts[2].startsWith("00000000")) {
212+
const traceIdParts = awsContext.traceId.split("-");
213+
if (traceIdParts && traceIdParts.length > 2 && traceIdParts[2].startsWith("00000000")) {
213214
// This AWSTraceHeader contains Datadog injected trace context
214215
return {
215-
[DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(trace_id_parts[2].substring(8)),
216-
[DATADOG_PARENT_ID_HEADER]: hexStrToDecimalStr(aws_context.parentId),
217-
[DATADOG_SAMPLING_PRIORITY_HEADER]: aws_context.sampled,
216+
[DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(traceIdParts[2].substring(8)),
217+
[DATADOG_PARENT_ID_HEADER]: hexStrToDecimalStr(awsContext.parentId),
218+
[DATADOG_SAMPLING_PRIORITY_HEADER]: awsContext.sampled,
218219
};
219220
}
220221
return null;

0 commit comments

Comments
 (0)