UNPKG

@opentelemetry/core

Version:

OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.

1 lines • 5.39 kB
{"version":3,"file":"W3CTraceContextPropagator.mjs","names":["TraceState"],"sources":["../../src/trace/W3CTraceContextPropagator.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Context,\n SpanContext,\n TextMapGetter,\n TextMapPropagator,\n TextMapSetter,\n} from '@opentelemetry/api';\nimport { isSpanContextValid, trace, TraceFlags } from '@opentelemetry/api';\nimport { isTracingSuppressed } from './suppress-tracing';\nimport { TraceState } from './TraceState';\n\nexport const TRACE_PARENT_HEADER = 'traceparent';\nexport const TRACE_STATE_HEADER = 'tracestate';\n\nconst VERSION = '00';\nconst VERSION_PART = '(?!ff)[\\\\da-f]{2}';\nconst TRACE_ID_PART = '(?![0]{32})[\\\\da-f]{32}';\nconst PARENT_ID_PART = '(?![0]{16})[\\\\da-f]{16}';\nconst FLAGS_PART = '[\\\\da-f]{2}';\nconst TRACE_PARENT_REGEX = new RegExp(\n `^\\\\s?(${VERSION_PART})-(${TRACE_ID_PART})-(${PARENT_ID_PART})-(${FLAGS_PART})(-.*)?\\\\s?$`\n);\n\n/**\n * Parses information from the [traceparent] span tag and converts it into {@link SpanContext}\n * @param traceParent - A meta property that comes from server.\n * It should be dynamically generated server side to have the server's request trace Id,\n * a parent span Id that was set on the server's request span,\n * and the trace flags to indicate the server's sampling decision\n * (01 = sampled, 00 = not sampled).\n * for example: '{version}-{traceId}-{spanId}-{sampleDecision}'\n * For more information see {@link https://www.w3.org/TR/trace-context/}\n */\nexport function parseTraceParent(traceParent: string): SpanContext | null {\n const match = TRACE_PARENT_REGEX.exec(traceParent);\n if (!match) return null;\n\n // According to the specification the implementation should be compatible\n // with future versions. If there are more parts, we only reject it if it's using version 00\n // See https://www.w3.org/TR/trace-context/#versioning-of-traceparent\n if (match[1] === '00' && match[5]) return null;\n\n return {\n traceId: match[2],\n spanId: match[3],\n traceFlags: parseInt(match[4], 16),\n };\n}\n\n/**\n * Propagates {@link SpanContext} through Trace Context format propagation.\n *\n * Based on the Trace Context specification:\n * https://www.w3.org/TR/trace-context/\n */\nexport class W3CTraceContextPropagator implements TextMapPropagator {\n inject(context: Context, carrier: unknown, setter: TextMapSetter): void {\n const spanContext = trace.getSpanContext(context);\n if (\n !spanContext ||\n isTracingSuppressed(context) ||\n !isSpanContextValid(spanContext)\n )\n return;\n\n const traceParent = `${VERSION}-${spanContext.traceId}-${\n spanContext.spanId\n }-0${Number(spanContext.traceFlags || TraceFlags.NONE).toString(16)}`;\n\n setter.set(carrier, TRACE_PARENT_HEADER, traceParent);\n if (spanContext.traceState) {\n setter.set(\n carrier,\n TRACE_STATE_HEADER,\n spanContext.traceState.serialize()\n );\n }\n }\n\n extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {\n const traceParentHeader = getter.get(carrier, TRACE_PARENT_HEADER);\n if (!traceParentHeader) return context;\n const traceParent = Array.isArray(traceParentHeader)\n ? traceParentHeader[0]\n : traceParentHeader;\n if (typeof traceParent !== 'string') return context;\n const spanContext = parseTraceParent(traceParent);\n if (!spanContext) return context;\n\n spanContext.isRemote = true;\n\n const traceStateHeader = getter.get(carrier, TRACE_STATE_HEADER);\n if (traceStateHeader) {\n // If more than one `tracestate` header is found, we merge them into a\n // single header.\n const state = Array.isArray(traceStateHeader)\n ? traceStateHeader.join(',')\n : traceStateHeader;\n spanContext.traceState = new TraceState(\n typeof state === 'string' ? state : undefined\n );\n }\n return trace.setSpanContext(context, spanContext);\n }\n\n fields(): string[] {\n return [TRACE_PARENT_HEADER, TRACE_STATE_HEADER];\n }\n}\n"],"mappings":";;;;AAgBA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAElC,MAAM,UAAU;AAKhB,MAAM,qBAAqB,IAAI,OAC7B,uGACF;;;;;;;;;;;AAYA,SAAgB,iBAAiB,aAAyC;CACxE,MAAM,QAAQ,mBAAmB,KAAK,WAAW;CACjD,IAAI,CAAC,OAAO,OAAO;CAKnB,IAAI,MAAM,OAAO,QAAQ,MAAM,IAAI,OAAO;CAE1C,OAAO;EACL,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,YAAY,SAAS,MAAM,IAAI,EAAE;CACnC;AACF;;;;;;;AAQA,IAAa,4BAAb,MAAoE;CAClE,OAAO,SAAkB,SAAkB,QAA6B;EACtE,MAAM,cAAc,MAAM,eAAe,OAAO;EAChD,IACE,CAAC,eACD,oBAAoB,OAAO,KAC3B,CAAC,mBAAmB,WAAW,GAE/B;EAEF,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,QAAQ,GACpD,YAAY,OACb,IAAI,OAAO,YAAY,cAAc,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE;EAElE,OAAO,IAAI,SAAS,qBAAqB,WAAW;EACpD,IAAI,YAAY,YACd,OAAO,IACL,SACA,oBACA,YAAY,WAAW,UAAU,CACnC;CAEJ;CAEA,QAAQ,SAAkB,SAAkB,QAAgC;EAC1E,MAAM,oBAAoB,OAAO,IAAI,SAAS,mBAAmB;EACjE,IAAI,CAAC,mBAAmB,OAAO;EAC/B,MAAM,cAAc,MAAM,QAAQ,iBAAiB,IAC/C,kBAAkB,KAClB;EACJ,IAAI,OAAO,gBAAgB,UAAU,OAAO;EAC5C,MAAM,cAAc,iBAAiB,WAAW;EAChD,IAAI,CAAC,aAAa,OAAO;EAEzB,YAAY,WAAW;EAEvB,MAAM,mBAAmB,OAAO,IAAI,SAAS,kBAAkB;EAC/D,IAAI,kBAAkB;GAGpB,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,IACxC,iBAAiB,KAAK,GAAG,IACzB;GACJ,YAAY,aAAa,IAAIA,aAC3B,OAAO,UAAU,WAAW,QAAQ,KAAA,CACtC;EACF;EACA,OAAO,MAAM,eAAe,SAAS,WAAW;CAClD;CAEA,SAAmB;EACjB,OAAO,CAAC,qBAAqB,kBAAkB;CACjD;AACF"}