Skip to content

Commit 90fe64b

Browse files
ida613BridgeAR
andauthored
Baggage update (#5815)
Use span._baggageItems only for legacy ot-baggage to avoid breaking changes. Use storage('baggage') for otel-compatible baggage exclusively. --------- Co-authored-by: Ruben Bridgewater <ruben@bridgewater.de>
1 parent 9c58aef commit 90fe64b

File tree

4 files changed

+46
-48
lines changed

4 files changed

+46
-48
lines changed

packages/dd-trace/src/baggage.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function getBaggageItem (key) {
1313
}
1414

1515
function getAllBaggageItems () {
16-
return storage('baggage').getStore()
16+
return storage('baggage').getStore() ?? {}
1717
}
1818

1919
function removeBaggageItem (keyToRemove) {
@@ -23,7 +23,7 @@ function removeBaggageItem (keyToRemove) {
2323
}
2424

2525
function removeAllBaggageItems () {
26-
storage('baggage').enterWith({})
26+
storage('baggage').enterWith()
2727
return storage('baggage').getStore()
2828
}
2929

packages/dd-trace/src/opentracing/propagation/text_map.js

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class TextMapPropagator {
136136
let itemCounter = 0
137137
let byteCounter = 0
138138

139-
const baggageItems = spanContext ? spanContext._baggageItems : getAllBaggageItems()
139+
const baggageItems = getAllBaggageItems()
140140
if (!baggageItems) return
141141
for (const [key, value] of Object.entries(baggageItems)) {
142142
const item = `${this._encodeOtelBaggageKey(String(key).trim())}=${encodeURIComponent(String(value).trim())},`
@@ -628,33 +628,26 @@ class TextMapPropagator {
628628
_extractBaggageItems (carrier, spanContext) {
629629
if (!this._hasPropagationStyle('extract', 'baggage')) return
630630
if (!carrier || !carrier.baggage) return
631-
if (!spanContext) removeAllBaggageItems()
632631
const baggages = carrier.baggage.split(',')
633632
const keysToSpanTag = this._config.baggageTagKeys === '*'
634633
? undefined
635634
: new Set(this._config.baggageTagKeys.split(','))
636635
for (const keyValue of baggages) {
637636
if (!keyValue.includes('=')) {
638-
if (spanContext) spanContext._baggageItems = {}
637+
removeAllBaggageItems()
639638
return
640639
}
641640
let [key, value] = keyValue.split('=')
642641
key = this._decodeOtelBaggageKey(key.trim())
643642
value = decodeURIComponent(value.trim())
644643
if (!key || !value) {
645-
if (spanContext) spanContext._baggageItems = {}
644+
removeAllBaggageItems()
646645
return
647646
}
648-
// the current code assumes precedence of ot-baggage- (legacy opentracing baggage) over baggage
649-
if (spanContext) {
650-
if (Object.hasOwn(spanContext._baggageItems, key)) continue
651-
spanContext._baggageItems[key] = value
652-
if (this._config.baggageTagKeys === '*' || keysToSpanTag.has(key)) {
653-
spanContext._trace.tags['baggage.' + key] = value
654-
}
655-
} else {
656-
setBaggageItem(key, value)
647+
if (spanContext && (this._config.baggageTagKeys === '*' || keysToSpanTag.has(key))) {
648+
spanContext._trace.tags['baggage.' + key] = value
657649
}
650+
setBaggageItem(key, value)
658651
}
659652
}
660653

packages/dd-trace/test/opentracing/propagation/text_map.spec.js

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('TextMapPropagator', () => {
8585
expect(carrier).to.have.property('x-datadog-trace-id', '123')
8686
expect(carrier).to.have.property('x-datadog-parent-id', '456')
8787
expect(carrier).to.have.property('ot-baggage-foo', 'bar')
88-
expect(carrier).to.have.property('baggage', 'foo=bar')
88+
expect(carrier.baggage).to.be.undefined
8989
})
9090

9191
it('should handle non-string values', () => {
@@ -104,55 +104,35 @@ describe('TextMapPropagator', () => {
104104
expect(carrier['ot-baggage-bool']).to.equal('true')
105105
expect(carrier['ot-baggage-array']).to.equal('foo,bar')
106106
expect(carrier['ot-baggage-object']).to.equal('[object Object]')
107-
expect(carrier.baggage).to.be.equal('number=1.23,bool=true,array=foo%2Cbar,object=%5Bobject%20Object%5D')
107+
expect(carrier.baggage).to.be.undefined
108108
})
109109

110110
it('should handle special characters in baggage', () => {
111111
const carrier = {}
112-
const baggageItems = {
113-
'",;\\()/:<=>?@[]{}🐶é我': '",;\\🐶é我'
114-
}
115-
const spanContext = createContext({ baggageItems })
116-
117-
propagator.inject(spanContext, carrier)
112+
setBaggageItem('",;\\()/:<=>?@[]{}🐶é我', '",;\\🐶é我')
113+
propagator.inject(undefined, carrier)
118114
// eslint-disable-next-line @stylistic/max-len
119115
expect(carrier.baggage).to.be.equal('%22%2C%3B%5C%28%29%2F%3A%3C%3D%3E%3F%40%5B%5D%7B%7D%F0%9F%90%B6%C3%A9%E6%88%91=%22%2C%3B%5C%F0%9F%90%B6%C3%A9%E6%88%91')
120116
})
121117

122118
it('should drop excess baggage items when there are too many pairs', () => {
123119
const carrier = {}
124-
const baggageItems = {}
125120
for (let i = 0; i < config.baggageMaxItems + 1; i++) {
126-
baggageItems[`key-${i}`] = i
121+
setBaggageItem(`key-${i}`, i)
127122
}
128-
const spanContext = createContext({ baggageItems })
129-
130-
propagator.inject(spanContext, carrier)
123+
propagator.inject(undefined, carrier)
131124
expect(carrier.baggage.split(',').length).to.equal(config.baggageMaxItems)
132125
})
133126

134127
it('should drop excess baggage items when the resulting baggage header contains many bytes', () => {
135128
const carrier = {}
136-
const baggageItems = {
137-
raccoon: 'chunky',
138-
foo: Buffer.alloc(config.baggageMaxBytes).toString()
139-
}
140-
const spanContext = createContext({ baggageItems })
129+
setBaggageItem('raccoon', 'chunky')
130+
setBaggageItem('foo', Buffer.alloc(config.baggageMaxBytes).toString())
141131

142-
propagator.inject(spanContext, carrier)
132+
propagator.inject(undefined, carrier)
143133
expect(carrier.baggage).to.equal('raccoon=chunky')
144134
})
145135

146-
it('should inject baggage items when spanContext is null', () => {
147-
const carrier = {}
148-
const spanContext = null
149-
removeAllBaggageItems()
150-
setBaggageItem('spring', 'blossom')
151-
152-
propagator.inject(spanContext, carrier)
153-
expect(carrier.baggage).to.equal('spring=blossom')
154-
})
155-
156136
it('should inject an existing sampling priority', () => {
157137
const carrier = {}
158138
const spanContext = createContext({
@@ -419,6 +399,26 @@ describe('TextMapPropagator', () => {
419399
expect(spanContext.toSpanId()).to.equal(carrier['x-datadog-parent-id'])
420400
expect(spanContext._baggageItems.foo).to.equal(carrier['ot-baggage-foo'])
421401
expect(spanContext._baggageItems).to.deep.equal({ foo: 'bar' })
402+
expect(getAllBaggageItems()).to.deep.equal({ foo: 'bar' })
403+
expect(spanContext._isRemote).to.equal(true)
404+
})
405+
406+
it('should extract opentracing baggage when baggage is not a propagation style ', () => {
407+
config = new Config({
408+
tracePropagationStyle: {
409+
extract: ['datadog', 'tracecontext'],
410+
inject: ['datadog', 'tracecontext']
411+
}
412+
})
413+
propagator = new TextMapPropagator(config)
414+
const carrier = textMap
415+
const spanContext = propagator.extract(carrier)
416+
417+
expect(spanContext.toTraceId()).to.equal(carrier['x-datadog-trace-id'])
418+
expect(spanContext.toSpanId()).to.equal(carrier['x-datadog-parent-id'])
419+
expect(spanContext._baggageItems.foo).to.equal(carrier['ot-baggage-foo'])
420+
expect(spanContext._baggageItems).to.deep.equal({ foo: 'bar' })
421+
expect(getAllBaggageItems()).to.deep.equal({})
422422
expect(spanContext._isRemote).to.equal(true)
423423
})
424424

@@ -431,7 +431,8 @@ describe('TextMapPropagator', () => {
431431
baggage: '%22%2C%3B%5C%28%29%2F%3A%3C%3D%3E%3F%40%5B%5D%7B%7D=%22%2C%3B%5C'
432432
}
433433
const spanContext = propagator.extract(carrier)
434-
expect(spanContext._baggageItems).to.deep.equal({ '",;\\()/:<=>?@[]{}': '",;\\' })
434+
expect(spanContext._baggageItems).to.deep.equal({})
435+
expect(getAllBaggageItems()).to.deep.equal({ '",;\\()/:<=>?@[]{}': '",;\\' })
435436
})
436437

437438
it('should not extract baggage when the header is malformed', () => {
@@ -442,6 +443,7 @@ describe('TextMapPropagator', () => {
442443
}
443444
const spanContextA = propagator.extract(carrierA)
444445
expect(spanContextA._baggageItems).to.deep.equal({})
446+
expect(getAllBaggageItems()).to.deep.equal({})
445447

446448
const carrierB = {
447449
'x-datadog-trace-id': '123',
@@ -450,6 +452,7 @@ describe('TextMapPropagator', () => {
450452
}
451453
const spanContextB = propagator.extract(carrierB)
452454
expect(spanContextB._baggageItems).to.deep.equal({})
455+
expect(getAllBaggageItems()).to.deep.equal({})
453456

454457
const carrierC = {
455458
'x-datadog-trace-id': '123',
@@ -458,6 +461,7 @@ describe('TextMapPropagator', () => {
458461
}
459462
const spanContextC = propagator.extract(carrierC)
460463
expect(spanContextC._baggageItems).to.deep.equal({})
464+
expect(getAllBaggageItems()).to.deep.equal({})
461465

462466
const carrierD = {
463467
'x-datadog-trace-id': '123',
@@ -466,6 +470,7 @@ describe('TextMapPropagator', () => {
466470
}
467471
const spanContextD = propagator.extract(carrierD)
468472
expect(spanContextD._baggageItems).to.deep.equal({})
473+
expect(getAllBaggageItems()).to.deep.equal({})
469474
})
470475

471476
it('should add baggage items to span tags', () => {
@@ -581,7 +586,7 @@ describe('TextMapPropagator', () => {
581586
baggage: 'foo=bar'
582587
}
583588
const spanContext = propagator.extract(carrier)
584-
expect(spanContext).to.be.null
589+
expect(spanContext).to.equal(null)
585590
expect(getBaggageItem('foo')).to.equal('bar')
586591
expect(getAllBaggageItems()).to.deep.equal({ foo: 'bar' })
587592
})

packages/dd-trace/test/proxy.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ describe('TracerProxy', () => {
661661
})
662662

663663
it('should return empty object when no items exist', () => {
664-
expect(proxy.getAllBaggageItems()).to.be.undefined
664+
expect(proxy.getAllBaggageItems()).to.deep.equal({})
665665
})
666666
})
667667

@@ -685,7 +685,7 @@ describe('TracerProxy', () => {
685685
proxy.setBaggageItem('key1', 'value1')
686686
proxy.setBaggageItem('key2', 'value2')
687687
const baggage = proxy.removeAllBaggageItems()
688-
expect(baggage).to.deep.equal({})
688+
expect(baggage).to.be.undefined
689689
})
690690
})
691691
})

0 commit comments

Comments
 (0)