From 772a7a35a3b96b401bca8654f768d53aae4a7161 Mon Sep 17 00:00:00 2001 From: Marc Bachmann Date: Sat, 16 Jan 2021 16:33:45 +0100 Subject: [PATCH] chore(http-instrumentation): reduce complexity of traceparent header parsing --- .../context/propagation/HttpTraceContext.ts | 40 +++++-------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts index 5957b2228d8..a96cfc6ec33 100644 --- a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts @@ -30,12 +30,7 @@ export const TRACE_PARENT_HEADER = 'traceparent'; export const TRACE_STATE_HEADER = 'tracestate'; const VERSION = '00'; -const VERSION_PART_COUNT = 4; // Version 00 only allows the specific 4 fields. - -const VERSION_REGEX = /^(?!ff)[\da-f]{2}$/; -const TRACE_ID_REGEX = /^(?![0]{32})[\da-f]{32}$/; -const PARENT_ID_REGEX = /^(?![0]{16})[\da-f]{16}$/; -const FLAGS_REGEX = /^[\da-f]{2}$/; +const TRACE_PARENT_REGEX = /^\s?((?!ff)[\da-f]{2})-((?![0]{32})[\da-f]{32})-((?![0]{16})[\da-f]{16})-([\da-f]{2})\s?$/; /** * Parses information from the [traceparent] span tag and converts it into {@link SpanContext} @@ -48,33 +43,18 @@ const FLAGS_REGEX = /^[\da-f]{2}$/; * For more information see {@link https://www.w3.org/TR/trace-context/} */ export function parseTraceParent(traceParent: string): SpanContext | null { - const trimmed = traceParent.trim(); - const traceParentParts = trimmed.split('-'); - - // Current version must be structured correctly. - // For future versions, we can grab just the parts we do support. - if ( - traceParentParts[0] === VERSION && - traceParentParts.length !== VERSION_PART_COUNT - ) { - return null; - } + const match = TRACE_PARENT_REGEX.exec(traceParent); + if (!match) return null; - const [version, traceId, parentId, flags] = traceParentParts; - const isValidParent = - VERSION_REGEX.test(version) && - TRACE_ID_REGEX.test(traceId) && - PARENT_ID_REGEX.test(parentId) && - FLAGS_REGEX.test(flags); - - if (!isValidParent) { - return null; - } + // According to the specification the implementation should be compatible + // with future versions. If there are more parts, we only reject it if it's using version 00 + // See https://www.w3.org/TR/trace-context/#versioning-of-traceparent + if (match[1] === '00' && match[5]) return null; return { - traceId: traceId, - spanId: parentId, - traceFlags: parseInt(flags, 16), + traceId: match[2], + spanId: match[3], + traceFlags: parseInt(match[4], 16), }; }