Skip to content

Commit e3e008e

Browse files
committed
improve mergeBaggageHeaders performance
1 parent ff6b436 commit e3e008e

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

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

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

27-
const newSentryBaggageEntries = Object.entries(newBaggageEntries).filter(([key]) =>
28-
key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX),
29-
);
27+
// Single pass over new entries to partition sentry vs non-sentry
28+
const newSentryEntries: Record<string, string> = {};
29+
const newNonSentryEntries: Record<string, string> = {};
30+
for (const [key, value] of Object.entries(newBaggageEntries)) {
31+
if (key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) {
32+
newSentryEntries[key] = value;
33+
} else {
34+
newNonSentryEntries[key] = value;
35+
}
36+
}
3037

31-
const existingBaggageEntriesWithoutSentry = existingBaggageEntries
32-
? Object.entries(existingBaggageEntries).filter(([key]) => !key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))
33-
: [];
38+
const hasNewSentryEntries = Object.keys(newSentryEntries).length > 0;
3439

3540
// If new baggage contains at least one sentry- value, we remove all old sentry- values
3641
// otherwise, we keep old sentry- values. If we don't remove old sentry- values, we end
3742
// up with an inconsistent dynamic sampling context propagation.
38-
const mergedBaggageEntries = newSentryBaggageEntries.length
39-
? Object.fromEntries(existingBaggageEntriesWithoutSentry)
40-
: (existingBaggageEntries ?? {});
41-
42-
Object.entries(newBaggageEntries).forEach(([key, value]) => {
43-
// Sentry-specific keys always take precedence from new baggage
44-
// Non-Sentry keys only added if not already present
45-
if (key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX) || !mergedBaggageEntries[key]) {
43+
const mergedBaggageEntries: Record<string, string> = {};
44+
if (existingBaggageEntries) {
45+
for (const [key, value] of Object.entries(existingBaggageEntries)) {
46+
if (hasNewSentryEntries && key.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) {
47+
continue;
48+
}
4649
mergedBaggageEntries[key] = value;
4750
}
48-
});
51+
}
52+
53+
// Sentry entries from new baggage always overwrite; non-sentry only if not already present
54+
Object.assign(mergedBaggageEntries, newSentryEntries);
55+
for (const [key, value] of Object.entries(newNonSentryEntries)) {
56+
if (!mergedBaggageEntries[key]) {
57+
mergedBaggageEntries[key] = value;
58+
}
59+
}
4960

5061
return objectToBaggageHeader(mergedBaggageEntries);
5162
}

0 commit comments

Comments
 (0)