UNPKG

@opentelemetry/core

Version:

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

1 lines • 4.06 kB
{"version":3,"file":"composite.mjs","names":[],"sources":["../../src/propagation/composite.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Context,\n TextMapGetter,\n TextMapPropagator,\n TextMapSetter,\n} from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\n\n/** Configuration object for composite propagator */\nexport interface CompositePropagatorConfig {\n /**\n * List of propagators to run. Propagators run in the\n * list order. If a propagator later in the list writes the same context\n * key as a propagator earlier in the list, the later on will \"win\".\n */\n propagators?: TextMapPropagator[];\n}\n\n/** Combines multiple propagators into a single propagator. */\nexport class CompositePropagator implements TextMapPropagator {\n private readonly _propagators: TextMapPropagator[];\n private readonly _fields: string[];\n\n /**\n * Construct a composite propagator from a list of propagators.\n *\n * @param [config] Configuration object for composite propagator\n */\n constructor(config: CompositePropagatorConfig = {}) {\n this._propagators = config.propagators ?? [];\n\n const fields = new Set<string>();\n for (const propagator of this._propagators) {\n // older propagators may not have fields function, null check to be sure\n const propagatorFields =\n typeof propagator.fields === 'function' ? propagator.fields() : [];\n for (const field of propagatorFields) {\n fields.add(field);\n }\n }\n this._fields = Array.from(fields);\n }\n\n /**\n * Run each of the configured propagators with the given context and carrier.\n * Propagators are run in the order they are configured, so if multiple\n * propagators write the same carrier key, the propagator later in the list\n * will \"win\".\n *\n * @param context Context to inject\n * @param carrier Carrier into which context will be injected\n */\n inject(context: Context, carrier: unknown, setter: TextMapSetter): void {\n for (const propagator of this._propagators) {\n try {\n propagator.inject(context, carrier, setter);\n } catch (err) {\n diag.warn(\n `Failed to inject with ${propagator.constructor.name}. Err: ${err.message}`\n );\n }\n }\n }\n\n /**\n * Run each of the configured propagators with the given context and carrier.\n * Propagators are run in the order they are configured, so if multiple\n * propagators write the same context key, the propagator later in the list\n * will \"win\".\n *\n * @param context Context to add values to\n * @param carrier Carrier from which to extract context\n */\n extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {\n return this._propagators.reduce((ctx, propagator) => {\n try {\n return propagator.extract(ctx, carrier, getter);\n } catch (err) {\n diag.warn(\n `Failed to extract with ${propagator.constructor.name}. Err: ${err.message}`\n );\n }\n return ctx;\n }, context);\n }\n\n fields(): string[] {\n // return a new array so our fields cannot be modified\n return this._fields.slice();\n }\n}\n"],"mappings":";;;AAwBA,IAAa,sBAAb,MAA8D;CAC5D;CACA;;;;;;CAOA,YAAY,SAAoC,CAAC,GAAG;EAClD,KAAK,eAAe,OAAO,eAAe,CAAC;EAE3C,MAAM,yBAAS,IAAI,IAAY;EAC/B,KAAK,MAAM,cAAc,KAAK,cAAc;GAE1C,MAAM,mBACJ,OAAO,WAAW,WAAW,aAAa,WAAW,OAAO,IAAI,CAAC;GACnE,KAAK,MAAM,SAAS,kBAClB,OAAO,IAAI,KAAK;EAEpB;EACA,KAAK,UAAU,MAAM,KAAK,MAAM;CAClC;;;;;;;;;;CAWA,OAAO,SAAkB,SAAkB,QAA6B;EACtE,KAAK,MAAM,cAAc,KAAK,cAC5B,IAAI;GACF,WAAW,OAAO,SAAS,SAAS,MAAM;EAC5C,SAAS,KAAK;GACZ,KAAK,KACH,yBAAyB,WAAW,YAAY,KAAK,SAAS,IAAI,SACpE;EACF;CAEJ;;;;;;;;;;CAWA,QAAQ,SAAkB,SAAkB,QAAgC;EAC1E,OAAO,KAAK,aAAa,QAAQ,KAAK,eAAe;GACnD,IAAI;IACF,OAAO,WAAW,QAAQ,KAAK,SAAS,MAAM;GAChD,SAAS,KAAK;IACZ,KAAK,KACH,0BAA0B,WAAW,YAAY,KAAK,SAAS,IAAI,SACrE;GACF;GACA,OAAO;EACT,GAAG,OAAO;CACZ;CAEA,SAAmB;EAEjB,OAAO,KAAK,QAAQ,MAAM;CAC5B;AACF"}