From 162906e1d04f52b82005d43d99344e220aae8b08 Mon Sep 17 00:00:00 2001 From: liustve Date: Sat, 1 Mar 2025 00:33:37 +0000 Subject: [PATCH 1/4] fixed issue where sigv4 headers were not cleaned after each export request --- .../src/aws-opentelemetry-configurator.ts | 3 +++ .../src/otlp-aws-span-exporter.ts | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts index 15180552..113f65f4 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts @@ -448,6 +448,7 @@ export class AwsSpanProcessorProvider { return new OTLPHttpTraceExporter(); case 'http/protobuf': if (otlp_exporter_traces_endpoint && isXrayOtlpEndpoint(otlp_exporter_traces_endpoint)) { + diag.debug('Detected XRay OTLP Traces endpoint. Switching exporter to OtlpAwsSpanExporter'); return new OTLPAwsSpanExporter(otlp_exporter_traces_endpoint); } return new OTLPProtoTraceExporter(); @@ -457,6 +458,7 @@ export class AwsSpanProcessorProvider { default: diag.warn(`Unsupported OTLP traces protocol: ${protocol}. Using http/protobuf.`); if (otlp_exporter_traces_endpoint && isXrayOtlpEndpoint(otlp_exporter_traces_endpoint)) { + diag.debug('Detected XRay OTLP Traces endpoint. Switching exporter to OtlpAwsSpanExporter'); return new OTLPAwsSpanExporter(otlp_exporter_traces_endpoint); } return new OTLPProtoTraceExporter(); @@ -672,3 +674,4 @@ function isXrayOtlpEndpoint(otlpEndpoint: string | undefined) { } // END The OpenTelemetry Authors code + diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts index e3b5d591..71964d30 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts @@ -66,7 +66,7 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { path: url.pathname, body: serializedSpans, headers: { - ...oldHeaders, + ...this.removeSigV4Headers(oldHeaders), host: url.hostname, }, }); @@ -93,6 +93,18 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { await super.export(items, resultCallback); } + // Need to ensure old SigV4 headers do not remain when we inject new SigV4 authorization headers. + private removeSigV4Headers(headers: Record) { + const newHeaders: Record = {}; + + for (const key in headers) { + if (!key.toLowerCase().startsWith('x-amz-') && key.toLowerCase() !== 'authorization') { + newHeaders[key] = headers[key]; + } + } + return newHeaders; + } + private initDependencies(): any { if (getNodeVersion() < 16) { diag.error('SigV4 signing requires atleast Node major version 16'); @@ -127,3 +139,4 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { return newConfig; } } + From 6e88d0fe1bd33bbb1af074cdea802a09e2b471b5 Mon Sep 17 00:00:00 2001 From: liustve Date: Sat, 1 Mar 2025 00:38:56 +0000 Subject: [PATCH 2/4] linting fix --- .../src/aws-opentelemetry-configurator.ts | 1 - .../src/otlp-aws-span-exporter.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts index 113f65f4..65266de0 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts @@ -674,4 +674,3 @@ function isXrayOtlpEndpoint(otlpEndpoint: string | undefined) { } // END The OpenTelemetry Authors code - diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts index 71964d30..57b3c2a1 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts @@ -139,4 +139,3 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { return newConfig; } } - From c5a875c2a7c8643fb0c77d63cd0e9619ddeed771 Mon Sep 17 00:00:00 2001 From: liustve Date: Mon, 3 Mar 2025 18:19:26 +0000 Subject: [PATCH 3/4] hardcoded sigv4 headers --- .../src/otlp-aws-span-exporter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts index 57b3c2a1..caae5a42 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts @@ -96,9 +96,10 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { // Need to ensure old SigV4 headers do not remain when we inject new SigV4 authorization headers. private removeSigV4Headers(headers: Record) { const newHeaders: Record = {}; + const sigV4Headers = ['x-amz-date', 'authorization', 'x-amz-content-sha256', 'x-amz-security-token']; for (const key in headers) { - if (!key.toLowerCase().startsWith('x-amz-') && key.toLowerCase() !== 'authorization') { + if (!sigV4Headers.includes(key.toLowerCase())) { newHeaders[key] = headers[key]; } } From 52e114c6d1a67483e719a3fbff7f2d416c308db2 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Mon, 3 Mar 2025 11:34:00 -0800 Subject: [PATCH 4/4] clarifying comment --- .../src/otlp-aws-span-exporter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts index caae5a42..25303ece 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/otlp-aws-span-exporter.ts @@ -93,7 +93,7 @@ export class OTLPAwsSpanExporter extends OTLPProtoTraceExporter { await super.export(items, resultCallback); } - // Need to ensure old SigV4 headers do not remain when we inject new SigV4 authorization headers. + // Removes Sigv4 headers from old headers to avoid accidentally copying them to the new headers private removeSigV4Headers(headers: Record) { const newHeaders: Record = {}; const sigV4Headers = ['x-amz-date', 'authorization', 'x-amz-content-sha256', 'x-amz-security-token'];