From ddf3d3bde1116512f9382082823ec9e19deab44c Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Tue, 5 May 2020 15:11:24 -0400 Subject: [PATCH 1/2] fix: left pad short b3 trace identifiers --- .../src/context/propagation/B3Propagator.ts | 17 ++++++++++++++--- .../test/context/B3Propagator.test.ts | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts index 9a6f38f67d..ec7f6728db 100644 --- a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts +++ b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts @@ -72,16 +72,27 @@ export class B3Propagator implements HttpTextPropagator { const traceIdHeader = getter(carrier, X_B3_TRACE_ID); const spanIdHeader = getter(carrier, X_B3_SPAN_ID); const sampledHeader = getter(carrier, X_B3_SAMPLED); - const traceId = Array.isArray(traceIdHeader) + + const traceIdHeaderValue = Array.isArray(traceIdHeader) ? traceIdHeader[0] : traceIdHeader; - const spanId = Array.isArray(spanIdHeader) ? spanIdHeader[0] : spanIdHeader; + const spanIdHeaderValue = Array.isArray(spanIdHeader) + ? spanIdHeader[0] + : spanIdHeader; + const options = Array.isArray(sampledHeader) ? sampledHeader[0] : sampledHeader; - if (typeof traceId !== 'string' || typeof spanId !== 'string') + if ( + typeof traceIdHeaderValue !== 'string' || + typeof spanIdHeaderValue !== 'string' + ) { return context; + } + + const traceId = traceIdHeaderValue.padStart(32, '0'); + const spanId = spanIdHeaderValue.padStart(16, '0'); if (isValidTraceId(traceId) && isValidSpanId(spanId)) { return setExtractedSpanContext(context, { diff --git a/packages/opentelemetry-core/test/context/B3Propagator.test.ts b/packages/opentelemetry-core/test/context/B3Propagator.test.ts index f403bc72a0..0a2aa5d060 100644 --- a/packages/opentelemetry-core/test/context/B3Propagator.test.ts +++ b/packages/opentelemetry-core/test/context/B3Propagator.test.ts @@ -289,5 +289,21 @@ describe('B3Propagator', () => { assert.ok(ctx2 === Context.ROOT_CONTEXT); assert.ok(ctx3 === Context.ROOT_CONTEXT); }); + + it('should left-pad short ids with 0', () => { + carrier[X_B3_TRACE_ID] = 'dd8448eb211c80319c'; + carrier[X_B3_SPAN_ID] = '9203331'; + carrier[X_B3_SAMPLED] = '1'; + const extractedSpanContext = getExtractedSpanContext( + b3Propagator.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + + assert.deepStrictEqual(extractedSpanContext, { + spanId: '0000000009203331', + traceId: '00000000000000dd8448eb211c80319c', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); }); }); From af805a94947850d8d544128eae11a2d2c1f0f4e6 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Tue, 5 May 2020 16:15:14 -0400 Subject: [PATCH 2/2] chore: validate b3 trace ids 64 or 128 bit --- .../src/context/propagation/B3Propagator.ts | 12 +++--------- .../test/context/B3Propagator.test.ts | 10 +++++----- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts index ec7f6728db..27689c5de9 100644 --- a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts +++ b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts @@ -26,7 +26,7 @@ import { getParentSpanContext, setExtractedSpanContext } from '../context'; export const X_B3_TRACE_ID = 'x-b3-traceid'; export const X_B3_SPAN_ID = 'x-b3-spanid'; export const X_B3_SAMPLED = 'x-b3-sampled'; -const VALID_TRACEID_REGEX = /^[0-9a-f]{32}$/i; +const VALID_TRACEID_REGEX = /^([0-9a-f]{16}){1,2}$/i; const VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i; const INVALID_ID_REGEX = /^0+$/i; @@ -76,23 +76,17 @@ export class B3Propagator implements HttpTextPropagator { const traceIdHeaderValue = Array.isArray(traceIdHeader) ? traceIdHeader[0] : traceIdHeader; - const spanIdHeaderValue = Array.isArray(spanIdHeader) - ? spanIdHeader[0] - : spanIdHeader; + const spanId = Array.isArray(spanIdHeader) ? spanIdHeader[0] : spanIdHeader; const options = Array.isArray(sampledHeader) ? sampledHeader[0] : sampledHeader; - if ( - typeof traceIdHeaderValue !== 'string' || - typeof spanIdHeaderValue !== 'string' - ) { + if (typeof traceIdHeaderValue !== 'string' || typeof spanId !== 'string') { return context; } const traceId = traceIdHeaderValue.padStart(32, '0'); - const spanId = spanIdHeaderValue.padStart(16, '0'); if (isValidTraceId(traceId) && isValidSpanId(spanId)) { return setExtractedSpanContext(context, { diff --git a/packages/opentelemetry-core/test/context/B3Propagator.test.ts b/packages/opentelemetry-core/test/context/B3Propagator.test.ts index 0a2aa5d060..7b779c3b94 100644 --- a/packages/opentelemetry-core/test/context/B3Propagator.test.ts +++ b/packages/opentelemetry-core/test/context/B3Propagator.test.ts @@ -290,17 +290,17 @@ describe('B3Propagator', () => { assert.ok(ctx3 === Context.ROOT_CONTEXT); }); - it('should left-pad short ids with 0', () => { - carrier[X_B3_TRACE_ID] = 'dd8448eb211c80319c'; - carrier[X_B3_SPAN_ID] = '9203331'; + it('should left-pad 64 bit trace ids with 0', () => { + carrier[X_B3_TRACE_ID] = '8448eb211c80319c'; + carrier[X_B3_SPAN_ID] = 'b7ad6b7169203331'; carrier[X_B3_SAMPLED] = '1'; const extractedSpanContext = getExtractedSpanContext( b3Propagator.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) ); assert.deepStrictEqual(extractedSpanContext, { - spanId: '0000000009203331', - traceId: '00000000000000dd8448eb211c80319c', + spanId: 'b7ad6b7169203331', + traceId: '00000000000000008448eb211c80319c', isRemote: true, traceFlags: TraceFlags.SAMPLED, });