diff --git a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts index 9a6f38f67d..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; @@ -72,16 +72,21 @@ 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 options = Array.isArray(sampledHeader) ? sampledHeader[0] : sampledHeader; - if (typeof traceId !== 'string' || typeof spanId !== 'string') + if (typeof traceIdHeaderValue !== 'string' || typeof spanId !== 'string') { return context; + } + + const traceId = traceIdHeaderValue.padStart(32, '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..7b779c3b94 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 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: 'b7ad6b7169203331', + traceId: '00000000000000008448eb211c80319c', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); }); });