OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Context propagation functionality providing W3C-compliant propagators for distributed tracing and baggage propagation with support for compositional propagator patterns.
W3C Trace Context specification-compliant propagator for distributed tracing context sharing via HTTP headers.
/**
* Propagates SpanContext through W3C Trace Context format
* Based on https://www.w3.org/TR/trace-context/
*/
class W3CTraceContextPropagator implements TextMapPropagator {
/**
* Inject trace context into carrier using traceparent and tracestate headers
* @param context - OpenTelemetry context containing span information
* @param carrier - Object to inject headers into (typically HTTP headers)
* @param setter - Function to set header values in the carrier
*/
inject(context: Context, carrier: unknown, setter: TextMapSetter): void;
/**
* Extract trace context from carrier headers
* @param context - OpenTelemetry context to enhance with extracted span context
* @param carrier - Object containing headers (typically HTTP request headers)
* @param getter - Function to retrieve header values from the carrier
* @returns Context with extracted span context
*/
extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;
/**
* Get list of header fields used by this propagator
* @returns Array of header field names
*/
fields(): string[];
}
const TRACE_PARENT_HEADER: string;
const TRACE_STATE_HEADER: string;
/**
* Parse traceparent header value into SpanContext
* @param traceParent - Traceparent header value in format: version-traceId-spanId-flags
* @returns SpanContext object or null if parsing fails
*/
function parseTraceParent(traceParent: string): SpanContext | null;Usage Examples:
import { W3CTraceContextPropagator, TRACE_PARENT_HEADER } from "@opentelemetry/core";
import { trace } from "@opentelemetry/api";
const propagator = new W3CTraceContextPropagator();
const headers: Record<string, string> = {};
// Inject current trace context into HTTP headers
const span = trace.getActiveSpan();
if (span) {
const context = trace.setSpan(trace.context.active(), span);
propagator.inject(context, headers, {
set: (carrier, key, value) => carrier[key] = value
});
console.log(headers[TRACE_PARENT_HEADER]); // e.g., "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
}
// Extract trace context from incoming HTTP headers
const incomingHeaders = {
"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"tracestate": "congo=t61rcWkgMzE"
};
const extractedContext = propagator.extract(trace.context.active(), incomingHeaders, {
get: (carrier, key) => carrier[key]
});
const spanContext = trace.getSpanContext(extractedContext);
console.log(spanContext?.traceId); // "4bf92f3577b34da6a3ce929d0e0e4736"W3C Baggage specification-compliant propagator for sharing key-value pairs across distributed services.
/**
* Propagates Baggage through W3C Baggage format
* Based on https://w3c.github.io/baggage/
*/
class W3CBaggagePropagator implements TextMapPropagator {
/**
* Inject baggage into carrier using baggage header
* @param context - OpenTelemetry context containing baggage
* @param carrier - Object to inject headers into
* @param setter - Function to set header values in the carrier
*/
inject(context: Context, carrier: unknown, setter: TextMapSetter): void;
/**
* Extract baggage from carrier headers
* @param context - OpenTelemetry context to enhance with extracted baggage
* @param carrier - Object containing headers
* @param getter - Function to retrieve header values from the carrier
* @returns Context with extracted baggage
*/
extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;
/**
* Get list of header fields used by this propagator
* @returns Array of header field names
*/
fields(): string[];
}
/**
* Parse baggage header string into key-value pairs
* @param value - Baggage header value
* @returns Record of key-value pairs
*/
function parseKeyPairsIntoRecord(value?: string): Record<string, string>;Usage Examples:
import { W3CBaggagePropagator } from "@opentelemetry/core";
import { propagation } from "@opentelemetry/api";
const baggagePropagator = new W3CBaggagePropagator();
const headers: Record<string, string> = {};
// Create baggage and inject into headers
const baggage = propagation.createBaggage({
"user.id": { value: "12345" },
"session.id": { value: "abcdef" }
});
const contextWithBaggage = propagation.setBaggage(propagation.active(), baggage);
baggagePropagator.inject(contextWithBaggage, headers, {
set: (carrier, key, value) => carrier[key] = value
});
console.log(headers.baggage); // "user.id=12345,session.id=abcdef"
// Extract baggage from incoming headers
const incomingHeaders = {
"baggage": "user.id=12345,session.id=abcdef,theme=dark"
};
const extractedContext = baggagePropagator.extract(propagation.active(), incomingHeaders, {
get: (carrier, key) => carrier[key]
});
const extractedBaggage = propagation.getBaggage(extractedContext);
console.log(extractedBaggage?.getEntry("user.id")?.value); // "12345"Combines multiple propagators into a single propagator for unified context injection and extraction.
/**
* Configuration object for composite propagator
*/
interface CompositePropagatorConfig {
/**
* List of propagators to run. Propagators run in list order.
* If a propagator later in the list writes the same context key
* as a propagator earlier in the list, the later one will "win".
*/
propagators?: TextMapPropagator[];
}
/**
* Combines multiple propagators into a single propagator
*/
class CompositePropagator implements TextMapPropagator {
/**
* Construct a composite propagator from a list of propagators
* @param config - Configuration object for composite propagator
*/
constructor(config?: CompositePropagatorConfig);
/**
* Run each of the configured propagators with the given context and carrier.
* Propagators are run in the order they are configured.
* @param context - Context to inject
* @param carrier - Carrier into which context will be injected
* @param setter - Function to set values in carrier
*/
inject(context: Context, carrier: unknown, setter: TextMapSetter): void;
/**
* Run each of the configured propagators with the given context and carrier.
* Propagators are run in the order they are configured.
* @param context - Context to add values to
* @param carrier - Carrier from which to extract context
* @param getter - Function to get values from carrier
* @returns Enhanced context with extracted values
*/
extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;
/**
* Get combined list of header fields from all configured propagators
* @returns Array of header field names
*/
fields(): string[];
}Usage Examples:
import {
CompositePropagator,
W3CTraceContextPropagator,
W3CBaggagePropagator
} from "@opentelemetry/core";
// Create composite propagator with multiple propagators
const compositePropagator = new CompositePropagator({
propagators: [
new W3CTraceContextPropagator(),
new W3CBaggagePropagator(),
],
});
// Use composite propagator for both trace context and baggage
const headers: Record<string, string> = {};
compositePropagator.inject(currentContext, headers, {
set: (carrier, key, value) => carrier[key] = value
});
// Headers now contain both traceparent and baggage
console.log(headers.traceparent); // "00-..."
console.log(headers.baggage); // "key1=value1,key2=value2"
// Extract from headers containing multiple propagation formats
const incomingHeaders = {
"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"baggage": "user.id=12345,session.id=abcdef"
};
const extractedContext = compositePropagator.extract(
propagation.active(),
incomingHeaders,
{ get: (carrier, key) => carrier[key] }
);
// Context now contains both span context and baggage
const spanContext = trace.getSpanContext(extractedContext);
const baggage = propagation.getBaggage(extractedContext);Install with Tessl CLI
npx tessl i tessl/npm-opentelemetry--core