From 5184c051d5caa532141cc3e1737da06912f0f16a Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 14 Mar 2024 14:01:09 -0400 Subject: [PATCH 1/9] extrace trace context from AWSTraceHeader in SQS java upstream case --- package.json | 1 - src/trace/context/extractors/sqs.spec.ts | 48 ++++++++++++++++ src/trace/context/extractors/sqs.ts | 21 +++++-- src/trace/xray-service.ts | 73 ++++++++++++++++-------- 4 files changed, 113 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 56916873..46979721 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "typescript": "^4.3.2" }, "dependencies": { - "bignumber.js": "^9.0.1", "dc-polyfill": "^0.1.3", "hot-shots": "8.5.0", "promise-retry": "^2.0.1", diff --git a/src/trace/context/extractors/sqs.spec.ts b/src/trace/context/extractors/sqs.spec.ts index dae99007..ce74cdfc 100644 --- a/src/trace/context/extractors/sqs.spec.ts +++ b/src/trace/context/extractors/sqs.spec.ts @@ -126,5 +126,53 @@ describe("SQSEventTraceExtractor", () => { const traceContext = extractor.extract(payload); expect(traceContext).toBeNull(); }); + + it("extracts trace context from AWSTraceHeader with valid payload", () => { + mockSpanContext = { + toTraceId: () => "625397077193750208", + toSpanId: () => "6538302989251745223", + _sampling: { + priority: "1", + }, + }; + const tracerWrapper = new TracerWrapper(); + const payload: SQSEvent = { + Records: [ + { + body: "Hello world", + attributes: { + ApproximateReceiveCount: "1", + SentTimestamp: "1605544528092", + SenderId: "AROAYYB64AB3JHSRKO6XR:sqs-trace-dev-producer", + ApproximateFirstReceiveTimestamp: "1605544528094", + AWSTraceHeader: "Root=1-65f2f78c-0000000008addb5405b376c0;Parent=5abcb7ed643995c7;Sampled=1", + }, + messageAttributes: {}, + eventSource: "aws:sqs", + eventSourceARN: "arn:aws:sqs:eu-west-1:601427279990:metal-queue", + awsRegion: "eu-west-1", + messageId: "foo", + md5OfBody: "x", + receiptHandle: "x", + }, + ], + }; + + const extractor = new SQSEventTraceExtractor(tracerWrapper); + + const traceContext = extractor.extract(payload); + expect(traceContext).not.toBeNull(); + + expect(spyTracerWrapper).toHaveBeenCalledWith({ + "x-datadog-parent-id": "6538302989251745223", + "x-datadog-sampling-priority": "1", + "x-datadog-trace-id": "625397077193750208", + }); + + expect(traceContext?.toTraceId()).toBe("625397077193750208"); + expect(traceContext?.toSpanId()).toBe("6538302989251745223"); + expect(traceContext?.sampleMode()).toBe("1"); + expect(traceContext?.source).toBe("event"); + }); }); }); diff --git a/src/trace/context/extractors/sqs.ts b/src/trace/context/extractors/sqs.ts index fd89e7eb..97307ef6 100644 --- a/src/trace/context/extractors/sqs.ts +++ b/src/trace/context/extractors/sqs.ts @@ -3,18 +3,29 @@ import { EventTraceExtractor } from "../extractor"; import { TracerWrapper } from "../../tracer-wrapper"; import { logDebug } from "../../../utils"; import { SpanContextWrapper } from "../../span-context-wrapper"; +import { XrayService } from "../../xray-service"; export class SQSEventTraceExtractor implements EventTraceExtractor { constructor(private tracerWrapper: TracerWrapper) {} extract(event: SQSEvent): SpanContextWrapper | null { - const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue; - if (headers === undefined) return null; - try { - const traceContext = this.tracerWrapper.extract(JSON.parse(headers)); - if (traceContext === null) return null; + var prepared_headers; + const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue; + if (headers !== undefined) { + prepared_headers = JSON.parse(headers); + } else { + if (event?.Records?.[0]?.attributes?.AWSTraceHeader) { + prepared_headers = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); + } + } + if (!prepared_headers) return null; + const traceContext = this.tracerWrapper.extract(prepared_headers); + if (traceContext === null) { + logDebug("Unable to extract the injected trace context from event"); + return null; + } logDebug(`Extracted trace context from SQS event`, { traceContext, event }); return traceContext; } catch (error) { diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index dd47ae84..0ea8b5b4 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -1,10 +1,15 @@ import { randomBytes } from "crypto"; import { logDebug } from "../utils"; import { SampleMode, TraceContext, TraceSource } from "./trace-context-service"; -import BigNumber from "bignumber.js"; import { Socket, createSocket } from "dgram"; import { SpanContextWrapper } from "./span-context-wrapper"; import { StepFunctionContext } from "./step-function-service"; +import { + DATADOG_TRACE_ID_HEADER, + DATADOG_PARENT_ID_HEADER, + DATADOG_SAMPLING_PRIORITY_HEADER, + DatadogTraceHeaders, +} from "./context/extractor"; const AMZN_TRACE_ID_ENV_VAR = "_X_AMZN_TRACE_ID"; const AWS_XRAY_DAEMON_ADDRESS_ENV_VAR = "AWS_XRAY_DAEMON_ADDRESS"; @@ -70,16 +75,8 @@ export class XrayService { }); } - private parseTraceContextHeader(): XrayTraceHeader | undefined { - const header = process.env[AMZN_TRACE_ID_ENV_VAR]; - if (header === undefined) { - logDebug("Couldn't read Xray trace header from env"); - return; - } - - // Example: Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1 - logDebug(`Reading Xray trace context from env var ${header}`); - const [root, parent, _sampled] = header.split(";"); + public static parseAWSTraceHeader(awsTraceHeader: string): XrayTraceHeader | undefined { + const [root, parent, _sampled] = awsTraceHeader.split(";"); if (parent === undefined || _sampled === undefined) return; const [, traceId] = root.split("="); @@ -94,6 +91,18 @@ export class XrayService { }; } + private parseTraceContextHeader(): XrayTraceHeader | undefined { + const header = process.env[AMZN_TRACE_ID_ENV_VAR]; + if (header === undefined) { + logDebug("Couldn't read Xray trace header from env"); + return; + } + + // Example: Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1 + logDebug(`Reading Xray trace context from env var ${header}`); + return XrayService.parseAWSTraceHeader(header); + } + private convertToSampleMode(xraySampled: number): SampleMode { return xraySampled === 1 ? SampleMode.USER_KEEP : SampleMode.USER_REJECT; } @@ -172,11 +181,11 @@ export class XrayService { private convertToParentId(xrayParentId: string): string | undefined { if (xrayParentId.length !== 16) return; - - const hex = new BigNumber(xrayParentId, 16); - if (hex.isNaN()) return; - - return hex.toString(10); + try { + return BigInt("0x" + xrayParentId).toString(10); + } catch (_) { + return undefined; + } } private convertToTraceId(xrayTraceId: string): string | undefined { @@ -187,13 +196,29 @@ export class XrayService { if (lastPart.length !== 24) return; // We want to turn the last 63 bits into a decimal number in a string representation - // Unfortunately, all numbers in javascript are represented by float64 bit numbers, which - // means we can't parse 64 bit integers accurately. - const hex = new BigNumber(lastPart, 16); - if (hex.isNaN()) return; - - // Toggle off the 64th bit - const last63Bits = hex.mod(new BigNumber("8000000000000000", 16)); - return last63Bits.toString(10); + try { + return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10); + } catch (_) { + return undefined; + } + } + + public static extraceDDContextFromAWSTraceHeader(amznTraceId: string): DatadogTraceHeaders | null { + var aws_context = XrayService.parseAWSTraceHeader(amznTraceId); + if (!aws_context) { + return null; + } + const trace_id_parts = aws_context.traceId.split("-"); + if (trace_id_parts && trace_id_parts.length > 2 && trace_id_parts[2].startsWith("00000000")) { + // This AWSTraceHeader contains Datadog injected trace context + return { + [DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(trace_id_parts[2].substring(8)), + [DATADOG_PARENT_ID_HEADER]: hexStrToDecimalStr(aws_context.parentId), + [DATADOG_SAMPLING_PRIORITY_HEADER]: aws_context.sampled, + }; + } + return null; } } + +const hexStrToDecimalStr = (hexString: string): string => BigInt("0x" + hexString).toString(10); From 00d7309be4694768c9e3b493d850864202b617ef Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:37:23 -0400 Subject: [PATCH 2/9] fixes --- src/trace/context/extractors/sqs.ts | 12 ++++---- src/trace/xray-service.spec.ts | 47 +++++++++++++++++++++++++++++ src/trace/xray-service.ts | 17 ++++++----- 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/src/trace/context/extractors/sqs.ts b/src/trace/context/extractors/sqs.ts index 97307ef6..ec68c5f4 100644 --- a/src/trace/context/extractors/sqs.ts +++ b/src/trace/context/extractors/sqs.ts @@ -10,20 +10,20 @@ export class SQSEventTraceExtractor implements EventTraceExtractor { extract(event: SQSEvent): SpanContextWrapper | null { try { - var prepared_headers; + let preparedHeaders; const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue; if (headers !== undefined) { - prepared_headers = JSON.parse(headers); + preparedHeaders = JSON.parse(headers); } else { if (event?.Records?.[0]?.attributes?.AWSTraceHeader) { - prepared_headers = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); + preparedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); } } - if (!prepared_headers) return null; - const traceContext = this.tracerWrapper.extract(prepared_headers); + if (!preparedHeaders) return null; + const traceContext = this.tracerWrapper.extract(preparedHeaders); if (traceContext === null) { - logDebug("Unable to extract the injected trace context from event"); + logDebug(`Failed to extract trace context from prepared headers: ${preparedHeaders}`); return null; } logDebug(`Extracted trace context from SQS event`, { traceContext, event }); diff --git a/src/trace/xray-service.spec.ts b/src/trace/xray-service.spec.ts index ad75b29e..3d7428df 100644 --- a/src/trace/xray-service.spec.ts +++ b/src/trace/xray-service.spec.ts @@ -1,3 +1,8 @@ +import { + DATADOG_SAMPLING_PRIORITY_HEADER, + DATADOG_TRACE_ID_HEADER, + DATADOG_PARENT_ID_HEADER, +} from "./context/extractor"; import { SampleMode } from "./trace-context-service"; import { XrayService } from "./xray-service"; @@ -340,4 +345,46 @@ describe("XrayService", () => { expect(traceId).toBeUndefined(); }); }); + + describe("parseAWSTraceHeader", () => { + it("parses AWS trace header correctly", () => { + const awsTraceHeader = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1"; + const xrayHeaders = XrayService.parseAWSTraceHeader(awsTraceHeader); + expect(xrayHeaders).toEqual({ + parentId: "94ae789b969f1cc5", + sampled: "1", + traceId: "1-5e272390-8c398be037738dc042009320", + }); + }); + it.each(["Root=1-5e272390-8c398be037738dc042009320", "Root=1-65f2f78c-0000000008addb5405b376c0;Parent;Sampled"])( + "returns undefined when AWS trace header is malformatted", + (awsTraceHeader) => { + const xrayHeaders = XrayService.parseAWSTraceHeader(awsTraceHeader); + expect(xrayHeaders).toBeUndefined(); + }, + ); + }); + describe("extraceDDContextFromAWSTraceHeader", () => { + it("extracts Datadog trace context from AWS trace header", () => { + const awsTraceId = "Root=1-65f2f78c-0000000008addb5405b376c0;Parent=5abcb7ed643995c7;Sampled=1"; + const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId); + + expect(ddTraceContext).toEqual({ + [DATADOG_TRACE_ID_HEADER]: "625397077193750208", + [DATADOG_PARENT_ID_HEADER]: "6538302989251745223", + [DATADOG_SAMPLING_PRIORITY_HEADER]: "1", + }); + }); + + it("returns null when AWS trace header is NOT injected by dd-trace", () => { + const awsTraceId = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1"; + const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId); + expect(ddTraceContext).toBeNull(); + }); + it("returns null when AWS trace header cannot be parsed", () => { + const awsTraceId = "Root=1-5e272390-8c398be037738dc042009320;;"; + const ddTraceContext = XrayService.extraceDDContextFromAWSTraceHeader(awsTraceId); + expect(ddTraceContext).toBeNull(); + }); + }); }); diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index 0ea8b5b4..a2e89e5b 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -197,24 +197,25 @@ export class XrayService { // We want to turn the last 63 bits into a decimal number in a string representation try { - return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10); + return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10); // mod by 2^63 will leave us with the last 63 bits } catch (_) { + logDebug(`Faied to convert trace id ${lastPart}`); return undefined; } } public static extraceDDContextFromAWSTraceHeader(amznTraceId: string): DatadogTraceHeaders | null { - var aws_context = XrayService.parseAWSTraceHeader(amznTraceId); - if (!aws_context) { + const awsContext = XrayService.parseAWSTraceHeader(amznTraceId); + if (!awsContext) { return null; } - const trace_id_parts = aws_context.traceId.split("-"); - if (trace_id_parts && trace_id_parts.length > 2 && trace_id_parts[2].startsWith("00000000")) { + const traceIdParts = awsContext.traceId.split("-"); + if (traceIdParts && traceIdParts.length > 2 && traceIdParts[2].startsWith("00000000")) { // This AWSTraceHeader contains Datadog injected trace context return { - [DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(trace_id_parts[2].substring(8)), - [DATADOG_PARENT_ID_HEADER]: hexStrToDecimalStr(aws_context.parentId), - [DATADOG_SAMPLING_PRIORITY_HEADER]: aws_context.sampled, + [DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(traceIdParts[2].substring(8)), + [DATADOG_PARENT_ID_HEADER]: hexStrToDecimalStr(awsContext.parentId), + [DATADOG_SAMPLING_PRIORITY_HEADER]: awsContext.sampled, }; } return null; From 240e9b522a3990b43f691354363a365dd747c9e9 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:49:40 -0400 Subject: [PATCH 3/9] fix --- src/trace/xray-service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index a2e89e5b..649d08a5 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -184,6 +184,7 @@ export class XrayService { try { return BigInt("0x" + xrayParentId).toString(10); } catch (_) { + logDebug(`Faied to convert xray parent id ${xrayParentId}`); return undefined; } } From f8293b9604c820b08e3d734e0ae3f27fd0ebdf2e Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:51:16 -0400 Subject: [PATCH 4/9] fix --- src/trace/xray-service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index 649d08a5..6adf9493 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -75,6 +75,7 @@ export class XrayService { }); } + // Example: Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1 public static parseAWSTraceHeader(awsTraceHeader: string): XrayTraceHeader | undefined { const [root, parent, _sampled] = awsTraceHeader.split(";"); if (parent === undefined || _sampled === undefined) return; From b3345e462857c5b63b3d6f33195fec286fb7f4eb Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:11:38 -0400 Subject: [PATCH 5/9] Update src/trace/xray-service.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jordan gonzález <30836115+duncanista@users.noreply.github.com> --- src/trace/xray-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index 6adf9493..b2fe7106 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -201,7 +201,7 @@ export class XrayService { try { return (BigInt("0x" + lastPart) % BigInt("0x8000000000000000")).toString(10); // mod by 2^63 will leave us with the last 63 bits } catch (_) { - logDebug(`Faied to convert trace id ${lastPart}`); + logDebug(`Failed to convert Xray Trace Id ${lastPart}`); return undefined; } } From e0289c2fb3274d8a70de9c495f3bae138065def7 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:11:50 -0400 Subject: [PATCH 6/9] Update src/trace/xray-service.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jordan gonzález <30836115+duncanista@users.noreply.github.com> --- src/trace/xray-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index b2fe7106..2214864e 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -185,7 +185,7 @@ export class XrayService { try { return BigInt("0x" + xrayParentId).toString(10); } catch (_) { - logDebug(`Faied to convert xray parent id ${xrayParentId}`); + logDebug(`Failed to convert Xray Parent Id ${xrayParentId}`); return undefined; } } From 84e86bf97ec177126e2fc9d648202dd1dceea23b Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:15:19 -0400 Subject: [PATCH 7/9] Update src/trace/xray-service.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jordan gonzález <30836115+duncanista@users.noreply.github.com> --- src/trace/xray-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index 2214864e..a864714c 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -208,7 +208,7 @@ export class XrayService { public static extraceDDContextFromAWSTraceHeader(amznTraceId: string): DatadogTraceHeaders | null { const awsContext = XrayService.parseAWSTraceHeader(amznTraceId); - if (!awsContext) { + if (awsContext === undefined) { return null; } const traceIdParts = awsContext.traceId.split("-"); From 5a7cf603cc4ccaa8bdbc444895952c0e0ea98fe9 Mon Sep 17 00:00:00 2001 From: Joey Zhao <5253430+joeyzhao2018@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:21:37 -0400 Subject: [PATCH 8/9] Updates --- src/trace/context/extractors/sqs.ts | 12 ++++++------ src/trace/xray-service.ts | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/trace/context/extractors/sqs.ts b/src/trace/context/extractors/sqs.ts index ec68c5f4..d84a1cec 100644 --- a/src/trace/context/extractors/sqs.ts +++ b/src/trace/context/extractors/sqs.ts @@ -10,20 +10,20 @@ export class SQSEventTraceExtractor implements EventTraceExtractor { extract(event: SQSEvent): SpanContextWrapper | null { try { - let preparedHeaders; + let parsedHeaders; const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue; if (headers !== undefined) { - preparedHeaders = JSON.parse(headers); + parsedHeaders = JSON.parse(headers); } else { if (event?.Records?.[0]?.attributes?.AWSTraceHeader) { - preparedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); + parsedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); } } - if (!preparedHeaders) return null; - const traceContext = this.tracerWrapper.extract(preparedHeaders); + if (!parsedHeaders) return null; + const traceContext = this.tracerWrapper.extract(parsedHeaders); if (traceContext === null) { - logDebug(`Failed to extract trace context from prepared headers: ${preparedHeaders}`); + logDebug(`Failed to extract trace context from prepared headers: ${parsedHeaders}`); return null; } logDebug(`Extracted trace context from SQS event`, { traceContext, event }); diff --git a/src/trace/xray-service.ts b/src/trace/xray-service.ts index a864714c..f0308487 100644 --- a/src/trace/xray-service.ts +++ b/src/trace/xray-service.ts @@ -13,7 +13,7 @@ import { const AMZN_TRACE_ID_ENV_VAR = "_X_AMZN_TRACE_ID"; const AWS_XRAY_DAEMON_ADDRESS_ENV_VAR = "AWS_XRAY_DAEMON_ADDRESS"; - +const DD_TRACE_JAVA_TRACE_ID_PADDING = "00000000"; interface XrayTraceHeader { traceId: string; parentId: string; @@ -212,7 +212,7 @@ export class XrayService { return null; } const traceIdParts = awsContext.traceId.split("-"); - if (traceIdParts && traceIdParts.length > 2 && traceIdParts[2].startsWith("00000000")) { + if (traceIdParts && traceIdParts.length > 2 && traceIdParts[2].startsWith(DD_TRACE_JAVA_TRACE_ID_PADDING)) { // This AWSTraceHeader contains Datadog injected trace context return { [DATADOG_TRACE_ID_HEADER]: hexStrToDecimalStr(traceIdParts[2].substring(8)), From d32051c811edb3edafe03aa42427af6977a781df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jordan=20gonz=C3=A1lez?= <30836115+duncanista@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:45:12 -0400 Subject: [PATCH 9/9] move nested `if` in `else` to `else-if` --- src/trace/context/extractors/sqs.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/trace/context/extractors/sqs.ts b/src/trace/context/extractors/sqs.ts index d84a1cec..bf7d5a3b 100644 --- a/src/trace/context/extractors/sqs.ts +++ b/src/trace/context/extractors/sqs.ts @@ -14,19 +14,18 @@ export class SQSEventTraceExtractor implements EventTraceExtractor { const headers = event?.Records?.[0]?.messageAttributes?._datadog?.stringValue; if (headers !== undefined) { parsedHeaders = JSON.parse(headers); - } else { - if (event?.Records?.[0]?.attributes?.AWSTraceHeader) { - parsedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); - } + } else if (event?.Records?.[0]?.attributes?.AWSTraceHeader !== undefined) { + parsedHeaders = XrayService.extraceDDContextFromAWSTraceHeader(event.Records[0].attributes.AWSTraceHeader); } - if (!parsedHeaders) return null; + const traceContext = this.tracerWrapper.extract(parsedHeaders); if (traceContext === null) { - logDebug(`Failed to extract trace context from prepared headers: ${parsedHeaders}`); + logDebug("Failed to extract trace context from parsed headers", { parsedHeaders, event }); return null; } - logDebug(`Extracted trace context from SQS event`, { traceContext, event }); + + logDebug("Extracted trace context from SQS event", { traceContext, event }); return traceContext; } catch (error) { if (error instanceof Error) {