From b0cc392056b4290ccbea2f60a6c642738515d4a7 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Fri, 17 Jan 2020 17:19:45 -0500 Subject: [PATCH 1/2] chore: simplify and speed up trace context parsing --- .../context/propagation/HttpTraceContext.ts | 35 ++++--------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts index b003572f2b..d083ee1eac 100644 --- a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts @@ -14,15 +14,12 @@ * limitations under the License. */ -import { SpanContext, HttpTextFormat, TraceFlags } from '@opentelemetry/types'; +import { HttpTextFormat, SpanContext, TraceFlags } from '@opentelemetry/types'; import { TraceState } from '../../trace/TraceState'; export const TRACE_PARENT_HEADER = 'traceparent'; export const TRACE_STATE_HEADER = 'tracestate'; -const VALID_TRACE_PARENT_REGEX = /^[\da-f]{2}-[\da-f]{32}-[\da-f]{16}-[\da-f]{2}$/; -const VALID_TRACEID_REGEX = /^[0-9a-f]{32}$/i; -const VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i; -const INVALID_ID_REGEX = /^0+$/i; +const VALID_TRACE_PARENT_REGEX = /^00-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})$/; const VERSION = '00'; /** @@ -37,33 +34,15 @@ const VERSION = '00'; */ export function parseTraceParent(traceParent: string): SpanContext | null { const match = traceParent.match(VALID_TRACE_PARENT_REGEX); - if (!match) return null; - const parts = traceParent.split('-'); - const [version, traceId, spanId, option] = parts; - // tslint:disable-next-line:ban Needed to parse hexadecimal. - const traceFlags = parseInt(option, 16); - if ( - !isValidVersion(version) || - !isValidTraceId(traceId) || - !isValidSpanId(spanId) + !match || + match[1] === '00000000000000000000000000000000' || + match[2] === '0000000000000000' ) { return null; } - return { traceId, spanId, traceFlags }; -} - -function isValidVersion(version: string): boolean { - return version === VERSION; -} - -function isValidTraceId(traceId: string): boolean { - return VALID_TRACEID_REGEX.test(traceId) && !INVALID_ID_REGEX.test(traceId); -} - -function isValidSpanId(spanId: string): boolean { - return VALID_SPANID_REGEX.test(spanId) && !INVALID_ID_REGEX.test(spanId); + return { traceId: match[1], spanId: match[2], traceFlags: parseInt(match[3], 16) }; } /** @@ -80,7 +59,7 @@ export class HttpTraceContext implements HttpTextFormat { ) { const traceParent = `${VERSION}-${spanContext.traceId}-${ spanContext.spanId - }-0${Number(spanContext.traceFlags || TraceFlags.UNSAMPLED).toString(16)}`; + }-0${Number(spanContext.traceFlags || TraceFlags.UNSAMPLED).toString(16)}`; carrier[TRACE_PARENT_HEADER] = traceParent; if (spanContext.traceState) { From 359eeaf03b0c8172f0a63494b6ffaf34654abc5e Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Fri, 17 Jan 2020 17:51:33 -0500 Subject: [PATCH 2/2] chore: lint --- .../src/context/propagation/HttpTraceContext.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts index d083ee1eac..9e42f991c2 100644 --- a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts @@ -42,7 +42,11 @@ export function parseTraceParent(traceParent: string): SpanContext | null { return null; } - return { traceId: match[1], spanId: match[2], traceFlags: parseInt(match[3], 16) }; + return { + traceId: match[1], + spanId: match[2], + traceFlags: parseInt(match[3], 16), + }; } /** @@ -59,7 +63,7 @@ export class HttpTraceContext implements HttpTextFormat { ) { const traceParent = `${VERSION}-${spanContext.traceId}-${ spanContext.spanId - }-0${Number(spanContext.traceFlags || TraceFlags.UNSAMPLED).toString(16)}`; + }-0${Number(spanContext.traceFlags || TraceFlags.UNSAMPLED).toString(16)}`; carrier[TRACE_PARENT_HEADER] = traceParent; if (spanContext.traceState) {