diff --git a/src/trace/context.spec.ts b/src/trace/context.spec.ts index e415a9331..fece383b5 100644 --- a/src/trace/context.spec.ts +++ b/src/trace/context.spec.ts @@ -393,7 +393,7 @@ describe("readTraceFromSQSEvent", () => { }); describe("readTraceFromLambdaContext", () => { - it("can read from lambda context source", () => { + it("can read from lambda context source, legacy style", () => { const result = readTraceFromLambdaContext({ clientContext: { custom: { @@ -413,6 +413,24 @@ describe("readTraceFromLambdaContext", () => { source: Source.Event, }); }); + it("can read from lambda context source, new style", () => { + const result = readTraceFromLambdaContext({ + clientContext: { + custom: { + "x-datadog-trace-id": "666", + "x-datadog-parent-id": "777", + "x-datadog-sampled": "1", + "x-datadog-sampling-priority": "1", + }, + }, + }); + expect(result).toEqual({ + parentID: "777", + sampleMode: SampleMode.AUTO_KEEP, + traceID: "666", + source: Source.Event, + }); + }); it("can handle no `custom` key", () => { const result = readTraceFromLambdaContext({ clientContext: { @@ -421,6 +439,14 @@ describe("readTraceFromLambdaContext", () => { }); expect(result).toBeUndefined(); }); + it("can handle a string `custom` key", () => { + const result = readTraceFromLambdaContext({ + clientContext: { + custom: "bar", + }, + }); + expect(result).toBeUndefined(); + }); it("can handle no context", () => { const result = readTraceFromLambdaContext(undefined); expect(result).toBeUndefined(); diff --git a/src/trace/context.ts b/src/trace/context.ts index 918fa1810..c38df2138 100644 --- a/src/trace/context.ts +++ b/src/trace/context.ts @@ -223,9 +223,28 @@ export function readTraceFromLambdaContext(context: any): TraceContext | undefin return; } - const traceData = context.clientContext?.custom?._datadog; + const custom = context.clientContext?.custom; - if (!traceData || typeof traceData !== "object") { + if (!custom || typeof custom !== "object") { + return; + } + let traceData = null; + + if ( + custom.hasOwnProperty("_datadog") && + typeof custom._datadog === "object" && + custom._datadog.hasOwnProperty(traceIDHeader) && + custom._datadog.hasOwnProperty(parentIDHeader) && + custom._datadog.hasOwnProperty(samplingPriorityHeader) + ) { + traceData = custom._datadog; + } else if ( + custom.hasOwnProperty(traceIDHeader) && + custom.hasOwnProperty(parentIDHeader) && + custom.hasOwnProperty(samplingPriorityHeader) + ) { + traceData = custom; + } else { return; }