Skip to content

Commit 3dd950a

Browse files
committed
fix unintended chagne in merging SDK info + add tests for it
1 parent 1788436 commit 3dd950a

File tree

2 files changed

+152
-11
lines changed

2 files changed

+152
-11
lines changed

packages/core/src/envelope.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,27 @@ import { showSpanDropWarning, spanToJSON } from './utils/spanUtils';
3232
/**
3333
* Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.
3434
* Merge with existing data if any.
35+
*
36+
* @internal, exported only for testing
3537
**/
36-
function enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {
37-
if (!sdkInfo) {
38+
export function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {
39+
if (!newSdkInfo) {
3840
return event;
3941
}
4042

43+
const eventSdkInfo = event.sdk || {};
44+
4145
event.sdk = {
42-
...event.sdk,
43-
...sdkInfo,
44-
integrations: [...(event.sdk?.integrations || []), ...(sdkInfo.integrations || [])],
45-
packages: [...(event.sdk?.packages || []), ...(sdkInfo.packages || [])],
46+
...eventSdkInfo,
47+
name: eventSdkInfo.name || newSdkInfo.name,
48+
version: eventSdkInfo.version || newSdkInfo.version,
49+
integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],
50+
packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],
4651
settings:
47-
event.sdk?.settings || sdkInfo.settings
52+
event.sdk?.settings || newSdkInfo.settings
4853
? {
4954
...event.sdk?.settings,
50-
...sdkInfo.settings,
55+
...newSdkInfo.settings,
5156
}
5257
: undefined,
5358
};
@@ -95,7 +100,7 @@ export function createEventEnvelope(
95100
*/
96101
const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';
97102

98-
enhanceEventWithSdkInfo(event, metadata?.sdk);
103+
_enhanceEventWithSdkInfo(event, metadata?.sdk);
99104

100105
const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);
101106

packages/core/test/lib/envelope.test.ts

Lines changed: 138 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
22
import type { DsnComponents } from '../../build/types/types-hoist/dsn';
33
import type { DynamicSamplingContext } from '../../build/types/types-hoist/envelope';
4-
import type { Client } from '../../src';
4+
import type { Client, SdkInfo } from '../../src';
55
import {
66
getCurrentScope,
77
getIsolationScope,
@@ -10,7 +10,7 @@ import {
1010
setAsyncContextStrategy,
1111
setCurrentClient,
1212
} from '../../src';
13-
import { createEventEnvelope, createSpanEnvelope } from '../../src/envelope';
13+
import { _enhanceEventWithSdkInfo, createEventEnvelope, createSpanEnvelope } from '../../src/envelope';
1414
import type { Event } from '../../src/types-hoist/event';
1515
import { getDefaultTestClientOptions, TestClient } from '../mocks/client';
1616

@@ -261,3 +261,139 @@ describe('createSpanEnvelope', () => {
261261
});
262262
});
263263
});
264+
265+
describe('_enhanceEventWithSdkInfo', () => {
266+
it('does nothing if no new sdk info is provided', () => {
267+
const event: Event = {
268+
sdk: { name: 'original', version: '1.0.0' },
269+
};
270+
const enhancedEvent = _enhanceEventWithSdkInfo(event, undefined);
271+
expect(enhancedEvent.sdk).toEqual({ name: 'original', version: '1.0.0' });
272+
});
273+
274+
/**
275+
* Note LS: I'm not sure if this is intended behaviour, but this is how it was before
276+
* I made implementation changes for the `settings` object. Documenting behaviour for now,
277+
* we can revisit it if it turns out this is not intended.
278+
*/
279+
it('prefers original version and name over newSdkInfo', () => {
280+
const event: Event = {
281+
sdk: {
282+
name: 'original',
283+
version: '1.0.0',
284+
integrations: ['integration1', 'integration2'],
285+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
286+
},
287+
};
288+
const newSdkInfo: SdkInfo = { name: 'newName', version: '2.0.0' };
289+
290+
const enhancedEvent = _enhanceEventWithSdkInfo(event, newSdkInfo);
291+
292+
expect(enhancedEvent.sdk).toEqual({
293+
name: 'original',
294+
version: '1.0.0',
295+
integrations: ['integration1', 'integration2'],
296+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
297+
});
298+
});
299+
300+
describe('integrations and packages', () => {
301+
it('merges integrations and packages of original and newSdkInfo', () => {
302+
const event: Event = {
303+
sdk: {
304+
name: 'original',
305+
version: '1.0.0',
306+
integrations: ['integration1', 'integration2'],
307+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
308+
},
309+
};
310+
311+
const newSdkInfo: SdkInfo = {
312+
name: 'newName',
313+
version: '2.0.0',
314+
integrations: ['integration3', 'integration4'],
315+
packages: [{ name: '@sentry/node', version: '11.0.0' }],
316+
};
317+
318+
const enhancedEvent = _enhanceEventWithSdkInfo(event, newSdkInfo);
319+
320+
expect(enhancedEvent.sdk).toEqual({
321+
name: 'original',
322+
version: '1.0.0',
323+
integrations: ['integration1', 'integration2', 'integration3', 'integration4'],
324+
packages: [
325+
{ name: '@sentry/browser', version: '10.0.0' },
326+
{ name: '@sentry/node', version: '11.0.0' },
327+
],
328+
});
329+
});
330+
331+
it('creates empty integrations and packages arrays if no original or newSdkInfo are provided', () => {
332+
const event: Event = {
333+
sdk: {
334+
name: 'original',
335+
version: '1.0.0',
336+
},
337+
};
338+
339+
const newSdkInfo: SdkInfo = {};
340+
341+
const enhancedEvent = _enhanceEventWithSdkInfo(event, newSdkInfo);
342+
expect(enhancedEvent.sdk).toEqual({
343+
name: 'original',
344+
version: '1.0.0',
345+
integrations: [],
346+
packages: [],
347+
});
348+
});
349+
});
350+
351+
describe('settings', () => {
352+
it('prefers newSdkInfo settings over original settings', () => {
353+
const event: Event = {
354+
sdk: {
355+
name: 'original',
356+
version: '1.0.0',
357+
integrations: ['integration1', 'integration2'],
358+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
359+
settings: { infer_ip: 'auto' },
360+
},
361+
};
362+
const newSdkInfo: SdkInfo = {
363+
settings: { infer_ip: 'never' },
364+
};
365+
366+
const enhancedEvent = _enhanceEventWithSdkInfo(event, newSdkInfo);
367+
368+
expect(enhancedEvent.sdk).toEqual({
369+
name: 'original',
370+
version: '1.0.0',
371+
integrations: ['integration1', 'integration2'],
372+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
373+
settings: { infer_ip: 'never' },
374+
});
375+
});
376+
377+
it("doesn't create a `settings` object if no settings are provided", () => {
378+
const event: Event = {
379+
sdk: {
380+
name: 'original',
381+
version: '1.0.0',
382+
},
383+
};
384+
385+
const newSdkInfo: SdkInfo = {
386+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
387+
};
388+
389+
const enhancedEvent = _enhanceEventWithSdkInfo(event, newSdkInfo);
390+
expect(enhancedEvent.sdk).toEqual({
391+
name: 'original',
392+
version: '1.0.0',
393+
packages: [{ name: '@sentry/browser', version: '10.0.0' }],
394+
integrations: [],
395+
settings: undefined, // undefined is fine because JSON.stringify omits undefined values anyways
396+
});
397+
});
398+
});
399+
});

0 commit comments

Comments
 (0)