or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

context.mdindex.mdplatform.mdpropagation.mdtiming.mdtrace-state.mdutilities.mdvalidation.md

propagation.mddocs/

0

# Context Propagation

1

2

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

3

4

## Capabilities

5

6

### W3C Trace Context Propagator

7

8

W3C Trace Context specification-compliant propagator for distributed tracing context sharing via HTTP headers.

9

10

```typescript { .api }

11

/**

12

* Propagates SpanContext through W3C Trace Context format

13

* Based on https://www.w3.org/TR/trace-context/

14

*/

15

class W3CTraceContextPropagator implements TextMapPropagator {

16

/**

17

* Inject trace context into carrier using traceparent and tracestate headers

18

* @param context - OpenTelemetry context containing span information

19

* @param carrier - Object to inject headers into (typically HTTP headers)

20

* @param setter - Function to set header values in the carrier

21

*/

22

inject(context: Context, carrier: unknown, setter: TextMapSetter): void;

23

24

/**

25

* Extract trace context from carrier headers

26

* @param context - OpenTelemetry context to enhance with extracted span context

27

* @param carrier - Object containing headers (typically HTTP request headers)

28

* @param getter - Function to retrieve header values from the carrier

29

* @returns Context with extracted span context

30

*/

31

extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;

32

33

/**

34

* Get list of header fields used by this propagator

35

* @returns Array of header field names

36

*/

37

fields(): string[];

38

}

39

40

const TRACE_PARENT_HEADER: string;

41

const TRACE_STATE_HEADER: string;

42

43

/**

44

* Parse traceparent header value into SpanContext

45

* @param traceParent - Traceparent header value in format: version-traceId-spanId-flags

46

* @returns SpanContext object or null if parsing fails

47

*/

48

function parseTraceParent(traceParent: string): SpanContext | null;

49

```

50

51

**Usage Examples:**

52

53

```typescript

54

import { W3CTraceContextPropagator, TRACE_PARENT_HEADER } from "@opentelemetry/core";

55

import { trace } from "@opentelemetry/api";

56

57

const propagator = new W3CTraceContextPropagator();

58

const headers: Record<string, string> = {};

59

60

// Inject current trace context into HTTP headers

61

const span = trace.getActiveSpan();

62

if (span) {

63

const context = trace.setSpan(trace.context.active(), span);

64

propagator.inject(context, headers, {

65

set: (carrier, key, value) => carrier[key] = value

66

});

67

68

console.log(headers[TRACE_PARENT_HEADER]); // e.g., "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"

69

}

70

71

// Extract trace context from incoming HTTP headers

72

const incomingHeaders = {

73

"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",

74

"tracestate": "congo=t61rcWkgMzE"

75

};

76

77

const extractedContext = propagator.extract(trace.context.active(), incomingHeaders, {

78

get: (carrier, key) => carrier[key]

79

});

80

81

const spanContext = trace.getSpanContext(extractedContext);

82

console.log(spanContext?.traceId); // "4bf92f3577b34da6a3ce929d0e0e4736"

83

```

84

85

### W3C Baggage Propagator

86

87

W3C Baggage specification-compliant propagator for sharing key-value pairs across distributed services.

88

89

```typescript { .api }

90

/**

91

* Propagates Baggage through W3C Baggage format

92

* Based on https://w3c.github.io/baggage/

93

*/

94

class W3CBaggagePropagator implements TextMapPropagator {

95

/**

96

* Inject baggage into carrier using baggage header

97

* @param context - OpenTelemetry context containing baggage

98

* @param carrier - Object to inject headers into

99

* @param setter - Function to set header values in the carrier

100

*/

101

inject(context: Context, carrier: unknown, setter: TextMapSetter): void;

102

103

/**

104

* Extract baggage from carrier headers

105

* @param context - OpenTelemetry context to enhance with extracted baggage

106

* @param carrier - Object containing headers

107

* @param getter - Function to retrieve header values from the carrier

108

* @returns Context with extracted baggage

109

*/

110

extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;

111

112

/**

113

* Get list of header fields used by this propagator

114

* @returns Array of header field names

115

*/

116

fields(): string[];

117

}

118

119

/**

120

* Parse baggage header string into key-value pairs

121

* @param value - Baggage header value

122

* @returns Record of key-value pairs

123

*/

124

function parseKeyPairsIntoRecord(value?: string): Record<string, string>;

125

```

126

127

**Usage Examples:**

128

129

```typescript

130

import { W3CBaggagePropagator } from "@opentelemetry/core";

131

import { propagation } from "@opentelemetry/api";

132

133

const baggagePropagator = new W3CBaggagePropagator();

134

const headers: Record<string, string> = {};

135

136

// Create baggage and inject into headers

137

const baggage = propagation.createBaggage({

138

"user.id": { value: "12345" },

139

"session.id": { value: "abcdef" }

140

});

141

142

const contextWithBaggage = propagation.setBaggage(propagation.active(), baggage);

143

baggagePropagator.inject(contextWithBaggage, headers, {

144

set: (carrier, key, value) => carrier[key] = value

145

});

146

147

console.log(headers.baggage); // "user.id=12345,session.id=abcdef"

148

149

// Extract baggage from incoming headers

150

const incomingHeaders = {

151

"baggage": "user.id=12345,session.id=abcdef,theme=dark"

152

};

153

154

const extractedContext = baggagePropagator.extract(propagation.active(), incomingHeaders, {

155

get: (carrier, key) => carrier[key]

156

});

157

158

const extractedBaggage = propagation.getBaggage(extractedContext);

159

console.log(extractedBaggage?.getEntry("user.id")?.value); // "12345"

160

```

161

162

### Composite Propagator

163

164

Combines multiple propagators into a single propagator for unified context injection and extraction.

165

166

```typescript { .api }

167

/**

168

* Configuration object for composite propagator

169

*/

170

interface CompositePropagatorConfig {

171

/**

172

* List of propagators to run. Propagators run in list order.

173

* If a propagator later in the list writes the same context key

174

* as a propagator earlier in the list, the later one will "win".

175

*/

176

propagators?: TextMapPropagator[];

177

}

178

179

/**

180

* Combines multiple propagators into a single propagator

181

*/

182

class CompositePropagator implements TextMapPropagator {

183

/**

184

* Construct a composite propagator from a list of propagators

185

* @param config - Configuration object for composite propagator

186

*/

187

constructor(config?: CompositePropagatorConfig);

188

189

/**

190

* Run each of the configured propagators with the given context and carrier.

191

* Propagators are run in the order they are configured.

192

* @param context - Context to inject

193

* @param carrier - Carrier into which context will be injected

194

* @param setter - Function to set values in carrier

195

*/

196

inject(context: Context, carrier: unknown, setter: TextMapSetter): void;

197

198

/**

199

* Run each of the configured propagators with the given context and carrier.

200

* Propagators are run in the order they are configured.

201

* @param context - Context to add values to

202

* @param carrier - Carrier from which to extract context

203

* @param getter - Function to get values from carrier

204

* @returns Enhanced context with extracted values

205

*/

206

extract(context: Context, carrier: unknown, getter: TextMapGetter): Context;

207

208

/**

209

* Get combined list of header fields from all configured propagators

210

* @returns Array of header field names

211

*/

212

fields(): string[];

213

}

214

```

215

216

**Usage Examples:**

217

218

```typescript

219

import {

220

CompositePropagator,

221

W3CTraceContextPropagator,

222

W3CBaggagePropagator

223

} from "@opentelemetry/core";

224

225

// Create composite propagator with multiple propagators

226

const compositePropagator = new CompositePropagator({

227

propagators: [

228

new W3CTraceContextPropagator(),

229

new W3CBaggagePropagator(),

230

],

231

});

232

233

// Use composite propagator for both trace context and baggage

234

const headers: Record<string, string> = {};

235

236

compositePropagator.inject(currentContext, headers, {

237

set: (carrier, key, value) => carrier[key] = value

238

});

239

240

// Headers now contain both traceparent and baggage

241

console.log(headers.traceparent); // "00-..."

242

console.log(headers.baggage); // "key1=value1,key2=value2"

243

244

// Extract from headers containing multiple propagation formats

245

const incomingHeaders = {

246

"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",

247

"baggage": "user.id=12345,session.id=abcdef"

248

};

249

250

const extractedContext = compositePropagator.extract(

251

propagation.active(),

252

incomingHeaders,

253

{ get: (carrier, key) => carrier[key] }

254

);

255

256

// Context now contains both span context and baggage

257

const spanContext = trace.getSpanContext(extractedContext);

258

const baggage = propagation.getBaggage(extractedContext);

259

```