diff --git a/packages/opentelemetry-propagator-jaeger/src/JaegerHttpTraceFormat.ts b/packages/opentelemetry-propagator-jaeger/src/JaegerHttpTraceFormat.ts index 811c6d9d41..e6d8a4740b 100644 --- a/packages/opentelemetry-propagator-jaeger/src/JaegerHttpTraceFormat.ts +++ b/packages/opentelemetry-propagator-jaeger/src/JaegerHttpTraceFormat.ts @@ -86,7 +86,7 @@ export class JaegerHttpTraceFormat implements HttpTextFormat { * @return {SpanContext} - returns a span context represented by the serializedString. **/ function deserializeSpanContext(serializedString: string): SpanContext | null { - let headers = serializedString.split(':'); + const headers = decodeURIComponent(serializedString).split(':'); if (headers.length !== 4) { return null; } diff --git a/packages/opentelemetry-propagator-jaeger/test/JaegerHttpTraceFormat.test.ts b/packages/opentelemetry-propagator-jaeger/test/JaegerHttpTraceFormat.test.ts index a81dc92ffa..02d50f536d 100644 --- a/packages/opentelemetry-propagator-jaeger/test/JaegerHttpTraceFormat.test.ts +++ b/packages/opentelemetry-propagator-jaeger/test/JaegerHttpTraceFormat.test.ts @@ -88,6 +88,19 @@ describe('JaegerHttpTraceFormat', () => { }); }); + it('should extract context of a sampled span from UTF-8 encoded carrier', () => { + carrier[UBER_TRACE_ID_HEADER] = + 'ac1f3dc3c2c0b06e%3A5ac292c4a11a163e%3Ac086aaa825821068%3A1'; + const extractedSpanContext = jaegerHttpTraceFormat.extract('', carrier); + + assert.deepStrictEqual(extractedSpanContext, { + spanId: '5ac292c4a11a163e', + traceId: 'ac1f3dc3c2c0b06e', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); + it('should use custom header if provided', () => { carrier[customHeader] = 'd4cda95b652f4a1592b449d5929fda1b:6e0c63257de34c92:0:01';