Skip to content

Commit 2d12742

Browse files
committed
feat(@opentelemetry/propagator-jaeger): support custom baggage prefix
1 parent 10cd916 commit 2d12742

File tree

3 files changed

+85
-10
lines changed

3 files changed

+85
-10
lines changed

packages/opentelemetry-propagator-jaeger/src/JaegerPropagator.ts

+14-10
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import {
2525
TraceFlags,
2626
} from '@opentelemetry/api';
2727
import { isTracingSuppressed } from '@opentelemetry/core';
28+
import { JaegerPropagatorBackwardCompatibleConfig } from './types';
2829

2930
export const UBER_TRACE_ID_HEADER = 'uber-trace-id';
3031
export const UBER_BAGGAGE_HEADER_PREFIX = 'uberctx';
31-
const UBER_BAGGAGE_HEADER_REGEX = /^uberctx-(.+)/i;
3232

3333
/**
3434
* Propagates {@link SpanContext} through Trace Context format propagation.
@@ -47,12 +47,16 @@ const UBER_BAGGAGE_HEADER_REGEX = /^uberctx-(.+)/i;
4747
*/
4848
export class JaegerPropagator implements TextMapPropagator {
4949
private readonly _jaegerTraceHeader: string;
50-
51-
/**
52-
* @param {string} [customTraceHeader="uber-trace-id"] - HTTP header to inject\extract trace from.
53-
**/
54-
constructor(customTraceHeader?: string) {
55-
this._jaegerTraceHeader = customTraceHeader || UBER_TRACE_ID_HEADER;
50+
private readonly _jaegerBaggageHeaderPrefix: string;
51+
52+
constructor(config?: JaegerPropagatorBackwardCompatibleConfig) {
53+
if (typeof config === 'string') {
54+
this._jaegerTraceHeader = config;
55+
this._jaegerBaggageHeaderPrefix = UBER_BAGGAGE_HEADER_PREFIX;
56+
} else {
57+
this._jaegerTraceHeader = config?.customTraceHeader || UBER_TRACE_ID_HEADER;
58+
this._jaegerBaggageHeaderPrefix = config?.customBaggageHeaderPrefix || UBER_BAGGAGE_HEADER_PREFIX;
59+
}
5660
}
5761

5862
inject(context: Context, carrier: unknown, setter: TextMapSetter): void {
@@ -74,7 +78,7 @@ export class JaegerPropagator implements TextMapPropagator {
7478
for (const [key, entry] of baggage.getAllEntries()) {
7579
setter.set(
7680
carrier,
77-
`${UBER_BAGGAGE_HEADER_PREFIX}-${key}`,
81+
`${this._jaegerBaggageHeaderPrefix}-${key}`,
7882
encodeURIComponent(entry.value)
7983
);
8084
}
@@ -88,11 +92,11 @@ export class JaegerPropagator implements TextMapPropagator {
8892
: uberTraceIdHeader;
8993
const baggageValues = getter
9094
.keys(carrier)
91-
.filter(key => UBER_BAGGAGE_HEADER_REGEX.test(key))
95+
.filter(key => key.startsWith(`${this._jaegerBaggageHeaderPrefix}-`))
9296
.map(key => {
9397
const value = getter.get(carrier, key);
9498
return {
95-
key: key.substring(UBER_BAGGAGE_HEADER_PREFIX.length + 1),
99+
key: key.substring(this._jaegerBaggageHeaderPrefix.length + 1),
96100
value: Array.isArray(value) ? value[0] : value,
97101
};
98102
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
export type CustomTraceHeader = string;
18+
19+
export type CustomBaggageHeaderPrefix = string;
20+
21+
export interface JaegerPropagatorConfig {
22+
customTraceHeader?: CustomTraceHeader,
23+
customBaggageHeaderPrefix?: CustomBaggageHeaderPrefix,
24+
}
25+
26+
export type JaegerPropagatorBackwardCompatibleConfig = CustomTraceHeader | JaegerPropagatorConfig;

packages/opentelemetry-propagator-jaeger/test/JaegerPropagator.test.ts

+45
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ import {
3434
describe('JaegerPropagator', () => {
3535
const jaegerPropagator = new JaegerPropagator();
3636
const customHeader = 'new-header';
37+
const customBaggageHeaderPrefix = 'custom-baggage-header-prefix';
3738
const customJaegerPropagator = new JaegerPropagator(customHeader);
39+
const customJaegerPropagatorWithConfig = new JaegerPropagator({
40+
customTraceHeader: customHeader,
41+
customBaggageHeaderPrefix,
42+
});
3843
let carrier: { [key: string]: unknown };
3944

4045
beforeEach(() => {
@@ -114,6 +119,28 @@ describe('JaegerPropagator', () => {
114119
encodeURIComponent('%id%')
115120
);
116121
});
122+
123+
it('should propagate baggage with custom prefix with url encoded values', () => {
124+
const baggage = propagation.createBaggage({
125+
test: {
126+
value: '1',
127+
},
128+
myuser: {
129+
value: '%id%',
130+
},
131+
});
132+
133+
customJaegerPropagatorWithConfig.inject(
134+
propagation.setBaggage(ROOT_CONTEXT, baggage),
135+
carrier,
136+
defaultTextMapSetter
137+
);
138+
assert.strictEqual(carrier[`${customBaggageHeaderPrefix}-test`], '1');
139+
assert.strictEqual(
140+
carrier[`${customBaggageHeaderPrefix}-myuser`],
141+
encodeURIComponent('%id%')
142+
);
143+
});
117144
});
118145

119146
describe('.extract()', () => {
@@ -215,6 +242,21 @@ describe('JaegerPropagator', () => {
215242
assert(secondEntry.value === '%id%');
216243
});
217244

245+
it('should extract baggage with custom prefix from carrier', () => {
246+
carrier[`${customBaggageHeaderPrefix}-test`] = 'value';
247+
carrier[`${customBaggageHeaderPrefix}-myuser`] = '%25id%25';
248+
const extractedBaggage = propagation.getBaggage(
249+
customJaegerPropagatorWithConfig.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter)
250+
);
251+
252+
const firstEntry = extractedBaggage?.getEntry('test');
253+
assert(typeof firstEntry !== 'undefined');
254+
assert(firstEntry.value === 'value');
255+
const secondEntry = extractedBaggage?.getEntry('myuser');
256+
assert(typeof secondEntry !== 'undefined');
257+
assert(secondEntry.value === '%id%');
258+
});
259+
218260
it('should extract baggage from carrier and not override current one', () => {
219261
carrier[`${UBER_BAGGAGE_HEADER_PREFIX}-test`] = 'value';
220262
carrier[`${UBER_BAGGAGE_HEADER_PREFIX}-myuser`] = '%25id%25';
@@ -266,6 +308,9 @@ describe('JaegerPropagator', () => {
266308
it('returns the customized header if customized', () => {
267309
assert.deepStrictEqual(customJaegerPropagator.fields(), [customHeader]);
268310
});
311+
it('returns the customized header if customized with config', () => {
312+
assert.deepStrictEqual(customJaegerPropagatorWithConfig.fields(), [customHeader]);
313+
});
269314
});
270315

271316
it('should fail gracefully on bad responses from getter', () => {

0 commit comments

Comments
 (0)