Skip to content

Commit da07971

Browse files
committed
fix bug in baggage merging
1 parent 469be3d commit da07971

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

packages/node-core/src/utils/baggage.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,23 @@ export function mergeBaggageHeaders<Existing extends string | string[] | number
2424
return existing;
2525
}
2626

27-
// Start with existing entries, but Sentry entries from new baggage will overwrite
28-
const mergedBaggageEntries = { ...existingBaggageEntries };
27+
const newSentryBaggageEntries = Object.entries(newBaggageEntries).filter(([key]) =>
28+
key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX),
29+
);
30+
31+
const oldBaggageEntriesWithoutSentry = existingBaggageEntries
32+
? Object.entries(existingBaggageEntries).filter(([key]) => !key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))
33+
: [];
34+
35+
// If new baggage contains at least one sentry- value, we remove all old sentry- values
36+
// otherwise, we keep old sentry- values. If we don't remove old sentry- values, we end
37+
// up with an inconsistent dynamic sampling context propagation.
38+
const mergedBaggageEntries = newSentryBaggageEntries.length
39+
? Object.fromEntries(oldBaggageEntriesWithoutSentry)
40+
: existingBaggageEntries
41+
? Object.fromEntries(Object.entries(existingBaggageEntries))
42+
: {};
43+
2944
Object.entries(newBaggageEntries).forEach(([key, value]) => {
3045
// Sentry-specific keys always take precedence from new baggage
3146
// Non-Sentry keys only added if not already present

packages/node-core/test/utils/baggage.test.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ describe('mergeBaggageHeaders', () => {
6969
expect(entries).toContain('third=party');
7070
expect(entries).toContain('sentry-environment=myEnv');
7171
expect(entries).toContain('sentry-release=2.1.0');
72-
expect(entries).toContain('sentry-sample_rate=0.54');
7372
expect(entries).not.toContain('sentry-environment=staging');
7473
expect(entries).not.toContain('sentry-release=9.9.9');
7574
});
@@ -133,8 +132,7 @@ describe('mergeBaggageHeaders', () => {
133132
const existing = 'custom-key=value';
134133
const newBaggage = 'sentry-environment=production';
135134
const result = mergeBaggageHeaders(existing, newBaggage);
136-
expect(result).toContain('custom-key=value');
137-
expect(result).toContain('sentry-environment=production');
135+
expect(result).toBe('custom-key=value,sentry-environment=production');
138136
});
139137

140138
it('overwrites existing Sentry entries when keys conflict', () => {
@@ -153,4 +151,11 @@ describe('mergeBaggageHeaders', () => {
153151
expect(result).toContain('sentry-trace_id=123');
154152
expect(result).not.toContain('sentry-environment=staging');
155153
});
154+
155+
it('removes all sentry- values from old baggage and only adds new ones (if at least one new sentry- value is present)', () => {
156+
const existing = 'sentry-trace_id=old,sentry-sampled=false,non-sentry=keep';
157+
const newBaggage = 'sentry-trace_id=new,sentry-environment=new';
158+
const result = mergeBaggageHeaders(existing, newBaggage);
159+
expect(result).toBe('non-sentry=keep,sentry-trace_id=new,sentry-environment=new');
160+
});
156161
});

0 commit comments

Comments
 (0)