From 8f2209f8931538de105ed72e4ab7ee6935c98387 Mon Sep 17 00:00:00 2001 From: Jordan Worner Date: Wed, 30 Jun 2021 14:00:55 +0100 Subject: [PATCH] fix(propagator-b3): update extract to check for array (#2285) * fix(propagator-b3): update extract to check for array * fix(propagator-b3): normalize header value Co-authored-by: Daniel Dyla --- .../src/B3Propagator.ts | 5 +++- .../test/B3Propagator.test.ts | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-propagator-b3/src/B3Propagator.ts b/packages/opentelemetry-propagator-b3/src/B3Propagator.ts index 597873e36d..760752d84b 100644 --- a/packages/opentelemetry-propagator-b3/src/B3Propagator.ts +++ b/packages/opentelemetry-propagator-b3/src/B3Propagator.ts @@ -61,7 +61,10 @@ export class B3Propagator implements TextMapPropagator { } extract(context: Context, carrier: unknown, getter: TextMapGetter): Context { - if (getter.get(carrier, B3_CONTEXT_HEADER)) { + const header = getter.get(carrier, B3_CONTEXT_HEADER); + const b3Context = Array.isArray(header) ? header[0] : header; + + if (b3Context) { return this._b3SinglePropagator.extract(context, carrier, getter); } else { return this._b3MultiPropagator.extract(context, carrier, getter); diff --git a/packages/opentelemetry-propagator-b3/test/B3Propagator.test.ts b/packages/opentelemetry-propagator-b3/test/B3Propagator.test.ts index 6efec8336a..6e5a7b4a7c 100644 --- a/packages/opentelemetry-propagator-b3/test/B3Propagator.test.ts +++ b/packages/opentelemetry-propagator-b3/test/B3Propagator.test.ts @@ -152,6 +152,31 @@ describe('B3Propagator', () => { }); }); + it('extracts multi header b3 using array getter', () => { + const context = propagator.extract( + ROOT_CONTEXT, + b3MultiCarrier, + { + get(carrier, key) { + if (carrier == null || carrier[key] === undefined) { + return []; + } + return [carrier[key]]; + }, + + keys: defaultTextMapGetter.keys + } + ); + + const extractedSpanContext = trace.getSpanContext(context); + assert.deepStrictEqual(extractedSpanContext, { + spanId: '6e0c63257de34c92', + traceId: 'd4cda95b652f4a1592b449d5929fda1b', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); + it('extracts single header over multi', () => { const context = propagator.extract( ROOT_CONTEXT,