From a557b04b57cb726b7a519181392749650958d305 Mon Sep 17 00:00:00 2001 From: srjames90 Date: Wed, 1 Jul 2020 14:46:44 -0700 Subject: [PATCH] fix(opentelemetry-core): modify regex to allow future versions (#1269) Co-authored-by: Daniel Dyla --- .../context/propagation/HttpTraceContext.ts | 2 +- .../test/context/HttpTraceContext.test.ts | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts index 6d5513bdf29..2c732e6cd74 100644 --- a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts @@ -27,7 +27,7 @@ import { getParentSpanContext, setExtractedSpanContext } from '../context'; export const TRACE_PARENT_HEADER = 'traceparent'; export const TRACE_STATE_HEADER = 'tracestate'; -const VALID_TRACE_PARENT_REGEX = /^00-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})$/; +const VALID_TRACE_PARENT_REGEX = /^(?!ff)[\da-f]{2}-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})(-|$)/; const VERSION = '00'; /** diff --git a/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts b/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts index aa28e5583e7..a4602e7da8c 100644 --- a/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts +++ b/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts @@ -98,6 +98,36 @@ describe('HttpTraceContext', () => { }); }); + it('should extract context of a sampled span from carrier using a future version', () => { + carrier[TRACE_PARENT_HEADER] = + 'cc-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01'; + const extractedSpanContext = getExtractedSpanContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + + assert.deepStrictEqual(extractedSpanContext, { + spanId: 'b7ad6b7169203331', + traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); + + it('should extract context of a sampled span from carrier using a future version and future fields', () => { + carrier[TRACE_PARENT_HEADER] = + 'cc-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01-what-the-future-will-be-like'; + const extractedSpanContext = getExtractedSpanContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + + assert.deepStrictEqual(extractedSpanContext, { + spanId: 'b7ad6b7169203331', + traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); + it('returns null if traceparent header is missing', () => { assert.deepStrictEqual( getExtractedSpanContext( @@ -173,8 +203,6 @@ describe('HttpTraceContext', () => { const testCases: Record = { invalidParts_tooShort: '00-ffffffffffffffffffffffffffffffff', - invalidParts_tooLong: - '00-ffffffffffffffffffffffffffffffff-ffffffffffffffff-00-01', invalidVersion_notHex: '0x-ffffffffffffffffffffffffffffffff-ffffffffffffffff-00', @@ -201,6 +229,10 @@ describe('HttpTraceContext', () => { '00-ffffffffffffffffffffffffffffffff-ffffffff-01', invalidSpanId_tooLong: '00-ffffffffffffffffffffffffffffffff-ffffffffffffffff0000-01', + invalidFutureVersion: + 'ff-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', + invalidFutureFieldAfterFlag: + 'cc-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01.what-the-future-will-not-be-like', }; Object.getOwnPropertyNames(testCases).forEach(testCase => {