Skip to content

Commit 47212de

Browse files
authored
fix: add type checking in propagators (open-telemetry#904)
1 parent c15f360 commit 47212de

File tree

6 files changed

+75
-3
lines changed

6 files changed

+75
-3
lines changed

Diff for: packages/opentelemetry-core/src/context/propagation/B3Propagator.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ export class B3Propagator implements HttpTextPropagator {
6666
const traceIdHeader = getter(carrier, X_B3_TRACE_ID);
6767
const spanIdHeader = getter(carrier, X_B3_SPAN_ID);
6868
const sampledHeader = getter(carrier, X_B3_SAMPLED);
69-
if (!traceIdHeader || !spanIdHeader) return context;
7069
const traceId = Array.isArray(traceIdHeader)
7170
? traceIdHeader[0]
7271
: traceIdHeader;
@@ -75,6 +74,9 @@ export class B3Propagator implements HttpTextPropagator {
7574
? sampledHeader[0]
7675
: sampledHeader;
7776

77+
if (typeof traceId !== 'string' || typeof spanId !== 'string')
78+
return context;
79+
7880
if (isValidTraceId(traceId) && isValidSpanId(spanId)) {
7981
return setExtractedSpanContext(context, {
8082
traceId,

Diff for: packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export class HttpTraceContext implements HttpTextPropagator {
8484
const traceParent = Array.isArray(traceParentHeader)
8585
? traceParentHeader[0]
8686
: traceParentHeader;
87+
if (typeof traceParent !== 'string') return context;
8788
const spanContext = parseTraceParent(traceParent);
8889
if (!spanContext) return context;
8990

@@ -96,7 +97,9 @@ export class HttpTraceContext implements HttpTextPropagator {
9697
const state = Array.isArray(traceStateHeader)
9798
? traceStateHeader.join(',')
9899
: traceStateHeader;
99-
spanContext.traceState = new TraceState(state as string);
100+
spanContext.traceState = new TraceState(
101+
typeof state === 'string' ? state : undefined
102+
);
100103
}
101104
return setExtractedSpanContext(context, spanContext);
102105
}

Diff for: packages/opentelemetry-core/test/context/B3Propagator.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -267,5 +267,27 @@ describe('B3Propagator', () => {
267267
assert.deepStrictEqual(extractedSpanContext, undefined, testCase);
268268
});
269269
});
270+
271+
it('should fail gracefully on bad responses from getter', () => {
272+
const ctx1 = b3Propagator.extract(
273+
Context.ROOT_CONTEXT,
274+
carrier,
275+
(c, k) => 1 // not a number
276+
);
277+
const ctx2 = b3Propagator.extract(
278+
Context.ROOT_CONTEXT,
279+
carrier,
280+
(c, k) => [] // empty array
281+
);
282+
const ctx3 = b3Propagator.extract(
283+
Context.ROOT_CONTEXT,
284+
carrier,
285+
(c, k) => undefined // missing value
286+
);
287+
288+
assert.ok(ctx1 === Context.ROOT_CONTEXT);
289+
assert.ok(ctx2 === Context.ROOT_CONTEXT);
290+
assert.ok(ctx3 === Context.ROOT_CONTEXT);
291+
});
270292
});
271293
});

Diff for: packages/opentelemetry-core/test/context/HttpTraceContext.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,27 @@ describe('HttpTraceContext', () => {
212212
assert.deepStrictEqual(extractedSpanContext, undefined, testCase);
213213
});
214214
});
215+
216+
it('should fail gracefully on bad responses from getter', () => {
217+
const ctx1 = httpTraceContext.extract(
218+
Context.ROOT_CONTEXT,
219+
carrier,
220+
(c, k) => 1 // not a number
221+
);
222+
const ctx2 = httpTraceContext.extract(
223+
Context.ROOT_CONTEXT,
224+
carrier,
225+
(c, k) => [] // empty array
226+
);
227+
const ctx3 = httpTraceContext.extract(
228+
Context.ROOT_CONTEXT,
229+
carrier,
230+
(c, k) => undefined // missing value
231+
);
232+
233+
assert.ok(ctx1 === Context.ROOT_CONTEXT);
234+
assert.ok(ctx2 === Context.ROOT_CONTEXT);
235+
assert.ok(ctx3 === Context.ROOT_CONTEXT);
236+
});
215237
});
216238
});

Diff for: packages/opentelemetry-propagator-jaeger/src/JaegerHttpTracePropagator.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@ export class JaegerHttpTracePropagator implements HttpTextPropagator {
7171

7272
extract(context: Context, carrier: unknown, getter: GetterFunction): Context {
7373
const uberTraceIdHeader = getter(carrier, this._jaegerTraceHeader);
74-
if (!uberTraceIdHeader) return context;
7574
const uberTraceId = Array.isArray(uberTraceIdHeader)
7675
? uberTraceIdHeader[0]
7776
: uberTraceIdHeader;
7877

78+
if (typeof uberTraceId !== 'string') return context;
79+
7980
const spanContext = deserializeSpanContext(uberTraceId);
8081
if (!spanContext) return context;
8182

Diff for: packages/opentelemetry-propagator-jaeger/test/JaegerHttpTracePropagator.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,26 @@ describe('JaegerHttpTracePropagator', () => {
185185
);
186186
});
187187
});
188+
189+
it('should fail gracefully on bad responses from getter', () => {
190+
const ctx1 = jaegerHttpTracePropagator.extract(
191+
Context.ROOT_CONTEXT,
192+
carrier,
193+
(c, k) => 1 // not a number
194+
);
195+
const ctx2 = jaegerHttpTracePropagator.extract(
196+
Context.ROOT_CONTEXT,
197+
carrier,
198+
(c, k) => [] // empty array
199+
);
200+
const ctx3 = jaegerHttpTracePropagator.extract(
201+
Context.ROOT_CONTEXT,
202+
carrier,
203+
(c, k) => undefined // missing value
204+
);
205+
206+
assert.ok(ctx1 === Context.ROOT_CONTEXT);
207+
assert.ok(ctx2 === Context.ROOT_CONTEXT);
208+
assert.ok(ctx3 === Context.ROOT_CONTEXT);
209+
});
188210
});

0 commit comments

Comments
 (0)