CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-opentelemetry--core

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

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

propagation.mddocs/

Context Propagation

Context propagation functionality providing W3C-compliant propagators for distributed tracing and baggage propagation with support for compositional propagator patterns.

Capabilities

W3C Trace Context Propagator

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 Propagator

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"

Composite Propagator

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

docs

context.md

index.md

platform.md

propagation.md

timing.md

trace-state.md

utilities.md

validation.md

tile.json