From 8d320b63ae8efdb0beb524d96c28a1aad45b4c2c Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Mon, 8 Jul 2024 14:47:00 +0000 Subject: [PATCH 1/4] fix: Apply stack frame metadata before event processors --- packages/core/src/baseclient.ts | 5 +++ packages/core/src/integrations/metadata.ts | 44 +++++++++---------- .../integrations/third-party-errors-filter.ts | 14 ++++-- packages/core/src/utils/prepareEvent.ts | 4 ++ .../third-party-errors-filter.test.ts | 12 ++--- packages/core/test/lib/prepareEvent.test.ts | 20 +++++++-- packages/types/src/client.ts | 11 +++++ 7 files changed, 76 insertions(+), 34 deletions(-) diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index 150f92388875..1ad35e291013 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -455,6 +455,8 @@ export abstract class BaseClient implements Client { public on(hook: 'close', callback: () => void): () => void; + public on(hook: 'applyFrameMetadata', callback: (event: Event) => void): () => void; + /** @inheritdoc */ public on(hook: string, callback: unknown): () => void { // Note that the code below, with nullish coalescing assignment, @@ -541,6 +543,9 @@ export abstract class BaseClient implements Client { /** @inheritdoc */ public emit(hook: 'close'): void; + /** @inheritdoc */ + public emit(hook: 'applyFrameMetadata', event: Event): void; + /** @inheritdoc */ public emit(hook: string, ...rest: unknown[]): void { const callbacks = this._hooks[hook]; diff --git a/packages/core/src/integrations/metadata.ts b/packages/core/src/integrations/metadata.ts index 917d8a12beb8..48fa23d6b6ab 100644 --- a/packages/core/src/integrations/metadata.ts +++ b/packages/core/src/integrations/metadata.ts @@ -1,14 +1,21 @@ -import type { EventItem, IntegrationFn } from '@sentry/types'; +import type { EventItem } from '@sentry/types'; import { forEachEnvelopeItem } from '@sentry/utils'; import { defineIntegration } from '../integration'; import { addMetadataToStackFrames, stripMetadataFromStackFrames } from '../metadata'; -const INTEGRATION_NAME = 'ModuleMetadata'; - -const _moduleMetadataIntegration = (() => { +/** + * Adds module metadata to stack frames. + * + * Metadata can be injected by the Sentry bundler plugins using the `moduleMetadata` config option. + * + * When this integration is added, the metadata passed to the bundler plugin is added to the stack frames of all events + * under the `module_metadata` property. This can be used to help in tagging or routing of events from different teams + * our sources + */ +export const moduleMetadataIntegration = defineIntegration(() => { return { - name: INTEGRATION_NAME, + name: 'ModuleMetadata', setup(client) { // We need to strip metadata from stack frames before sending them to Sentry since these are client side only. client.on('beforeEnvelope', envelope => { @@ -23,23 +30,16 @@ const _moduleMetadataIntegration = (() => { } }); }); - }, - processEvent(event, _hint, client) { - const stackParser = client.getOptions().stackParser; - addMetadataToStackFrames(stackParser, event); - return event; + client.on('applyFrameMetadata', event => { + // Only apply stack frame metadata to error events + if (event.type !== undefined) { + return; + } + + const stackParser = client.getOptions().stackParser; + addMetadataToStackFrames(stackParser, event); + }); }, }; -}) satisfies IntegrationFn; - -/** - * Adds module metadata to stack frames. - * - * Metadata can be injected by the Sentry bundler plugins using the `_experiments.moduleMetadata` config option. - * - * When this integration is added, the metadata passed to the bundler plugin is added to the stack frames of all events - * under the `module_metadata` property. This can be used to help in tagging or routing of events from different teams - * our sources - */ -export const moduleMetadataIntegration = defineIntegration(_moduleMetadataIntegration); +}); diff --git a/packages/core/src/integrations/third-party-errors-filter.ts b/packages/core/src/integrations/third-party-errors-filter.ts index 70e7317f58c3..1f1887604866 100644 --- a/packages/core/src/integrations/third-party-errors-filter.ts +++ b/packages/core/src/integrations/third-party-errors-filter.ts @@ -53,11 +53,19 @@ export const thirdPartyErrorFilterIntegration = defineIntegration((options: Opti } }); }); + + client.on('applyFrameMetadata', event => { + // Only apply stack frame metadata to error events + if (event.type !== undefined) { + return; + } + + const stackParser = client.getOptions().stackParser; + addMetadataToStackFrames(stackParser, event); + }); }, - processEvent(event, _hint, client) { - const stackParser = client.getOptions().stackParser; - addMetadataToStackFrames(stackParser, event); + processEvent(event) { const frameKeys = getBundleKeysForAllFramesWithFilenames(event); if (frameKeys) { diff --git a/packages/core/src/utils/prepareEvent.ts b/packages/core/src/utils/prepareEvent.ts index 71fef195dd31..f7f209a49089 100644 --- a/packages/core/src/utils/prepareEvent.ts +++ b/packages/core/src/utils/prepareEvent.ts @@ -60,6 +60,10 @@ export function prepareEvent( applyClientOptions(prepared, options); applyIntegrationsMetadata(prepared, integrations); + if (client) { + client.emit('applyFrameMetadata', event); + } + // Only put debug IDs onto frames for error events. if (event.type === undefined) { applyDebugIds(prepared, options.stackParser); diff --git a/packages/core/test/lib/integrations/third-party-errors-filter.test.ts b/packages/core/test/lib/integrations/third-party-errors-filter.test.ts index d0fd02045080..b11b93498b02 100644 --- a/packages/core/test/lib/integrations/third-party-errors-filter.test.ts +++ b/packages/core/test/lib/integrations/third-party-errors-filter.test.ts @@ -1,12 +1,14 @@ import type { Client, Event } from '@sentry/types'; import { GLOBAL_OBJ, createStackParser, nodeStackLineParser } from '@sentry/utils'; import { thirdPartyErrorFilterIntegration } from '../../../src/integrations/third-party-errors-filter'; +import { addMetadataToStackFrames } from '../../../src/metadata'; function clone(data: T): T { return JSON.parse(JSON.stringify(data)); } const stack = new Error().stack || ''; +const stackParser = createStackParser(nodeStackLineParser()); const eventWithThirdAndFirstPartyFrames: Event = { exception: { @@ -90,11 +92,7 @@ const eventWithOnlyThirdPartyFrames: Event = { }; // This only needs the stackParser -const MOCK_CLIENT = { - getOptions: () => ({ - stackParser: createStackParser(nodeStackLineParser()), - }), -} as unknown as Client; +const MOCK_CLIENT = {} as unknown as Client; describe('ThirdPartyErrorFilter', () => { beforeEach(() => { @@ -103,6 +101,10 @@ describe('ThirdPartyErrorFilter', () => { '_sentryBundlerPluginAppKey:some-key': true, '_sentryBundlerPluginAppKey:some-other-key': true, }; + + addMetadataToStackFrames(stackParser, eventWithThirdAndFirstPartyFrames); + addMetadataToStackFrames(stackParser, eventWithOnlyFirstPartyFrames); + addMetadataToStackFrames(stackParser, eventWithOnlyThirdPartyFrames); }); describe('drop-error-if-contains-third-party-frames', () => { diff --git a/packages/core/test/lib/prepareEvent.test.ts b/packages/core/test/lib/prepareEvent.test.ts index 11c1ceca991c..0698aa15e447 100644 --- a/packages/core/test/lib/prepareEvent.test.ts +++ b/packages/core/test/lib/prepareEvent.test.ts @@ -205,10 +205,13 @@ describe('prepareEvent', () => { const options = {} as ClientOptions; const client = { + emit() { + // noop + }, getEventProcessors() { return [eventProcessor]; }, - } as Client; + } as unknown as Client; const processedEvent = await prepareEvent( options, event, @@ -393,10 +396,13 @@ describe('prepareEvent', () => { const options = {} as ClientOptions; const client = { + emit() { + // noop + }, getEventProcessors() { return [] as EventProcessor[]; }, - } as Client; + } as unknown as Client; const processedEvent = await prepareEvent( options, @@ -430,10 +436,13 @@ describe('prepareEvent', () => { const options = {} as ClientOptions; const client = { + emit() { + // noop + }, getEventProcessors() { return [] as EventProcessor[]; }, - } as Client; + } as unknown as Client; const captureContext = new Scope(); captureContext.setTags({ foo: 'bar' }); @@ -470,10 +479,13 @@ describe('prepareEvent', () => { const options = {} as ClientOptions; const client = { + emit() { + // noop + }, getEventProcessors() { return [] as EventProcessor[]; }, - } as Client; + } as unknown as Client; const captureContextScope = new Scope(); captureContextScope.setTags({ foo: 'bar' }); diff --git a/packages/types/src/client.ts b/packages/types/src/client.ts index eed9279352eb..94f28f9157aa 100644 --- a/packages/types/src/client.ts +++ b/packages/types/src/client.ts @@ -222,6 +222,12 @@ export interface Client { */ on(hook: 'beforeEnvelope', callback: (envelope: Envelope) => void): () => void; + /** + * Register a callback that runs when stack frame metadata should be applied to an event. + * @returns A function that, when executed, removes the registered callback. + */ + on(hook: 'applyFrameMetadata', callback: (event: Event) => void): () => void; + /** * Register a callback for before sending an event. * This is called right before an event is sent and should not be used to mutate the event. @@ -326,6 +332,11 @@ export interface Client { */ emit(hook: 'beforeEnvelope', envelope: Envelope): void; + /* + * Fire a hook indicating that stack frame metadata should be applied to the event passed to the hook. + */ + emit(hook: 'applyFrameMetadata', event: Event): void; + /** * Fire a hook event before sending an event. * This is called right before an event is sent and should not be used to mutate the event. From 9e66686299228f6fd9be81e386deadae5175fcd1 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 9 Jul 2024 09:19:21 +0000 Subject: [PATCH 2/4] Add tests --- .../moduleMetadata/appliesMetadata/init.js | 28 ++++++++++++++ .../moduleMetadata/appliesMetadata/subject.js | 22 +++++++++++ .../moduleMetadata/appliesMetadata/test.ts | 12 ++++++ .../appliesMetadataWithRewriteFrames/init.js | 38 +++++++++++++++++++ .../subject.js | 22 +++++++++++ .../appliesMetadataWithRewriteFrames/test.ts | 15 ++++++++ 6 files changed, 137 insertions(+) create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/init.js create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/subject.js create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/init.js create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/subject.js create mode 100644 dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/init.js b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/init.js new file mode 100644 index 000000000000..7484c4a339e9 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/init.js @@ -0,0 +1,28 @@ +import * as Sentry from '@sentry/browser'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [Sentry.moduleMetadataIntegration()], + beforeSend(event) { + const moduleMetadataEntries = []; + + if (event.type === undefined) { + try { + event.exception.values.forEach(value => { + value.stacktrace.frames.forEach(frame => { + moduleMetadataEntries.push(frame.module_metadata); + }); + }); + } catch (e) { + // noop + } + } + + event.extra = { + ...event.extra, + module_metadata_entries: moduleMetadataEntries, + }; + + return event; + }, +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/subject.js b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/subject.js new file mode 100644 index 000000000000..a9adc99a645d --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/subject.js @@ -0,0 +1,22 @@ +var _sentryModuleMetadataGlobal = + typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : {}; + +_sentryModuleMetadataGlobal._sentryModuleMetadata = _sentryModuleMetadataGlobal._sentryModuleMetadata || {}; + +_sentryModuleMetadataGlobal._sentryModuleMetadata[new Error().stack] = Object.assign( + {}, + _sentryModuleMetadataGlobal._sentryModuleMetadata[new Error().stack], + { + foo: 'bar', + }, +); + +setTimeout(() => { + throw new Error('I am a module metadata Error'); +}, 0); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts new file mode 100644 index 000000000000..82929ffdceb4 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts @@ -0,0 +1,12 @@ +import { expect } from '@playwright/test'; +import type { Event } from '@sentry/types'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; + +sentryTest('should provide module_metadata on stack frames in beforeSend', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const errorEvent = await getFirstSentryEnvelopeRequest(page, url); + expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'bar' }]); +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/init.js b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/init.js new file mode 100644 index 000000000000..885b1d2da2c1 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/init.js @@ -0,0 +1,38 @@ +import * as Sentry from '@sentry/browser'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [ + Sentry.moduleMetadataIntegration(), + Sentry.rewriteFramesIntegration({ + iteratee: frame => { + return { + ...frame, + filename: 'bloop', // something that should completely mess with module metadata association + }; + }, + }), + ], + beforeSend(event) { + const moduleMetadataEntries = []; + + if (event.type === undefined) { + try { + event.exception.values.forEach(value => { + value.stacktrace.frames.forEach(frame => { + moduleMetadataEntries.push(frame.module_metadata); + }); + }); + } catch (e) { + // noop + } + } + + event.extra = { + ...event.extra, + module_metadata_entries: moduleMetadataEntries, + }; + + return event; + }, +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/subject.js b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/subject.js new file mode 100644 index 000000000000..1294723753fc --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/subject.js @@ -0,0 +1,22 @@ +var _sentryModuleMetadataGlobal = + typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : {}; + +_sentryModuleMetadataGlobal._sentryModuleMetadata = _sentryModuleMetadataGlobal._sentryModuleMetadata || {}; + +_sentryModuleMetadataGlobal._sentryModuleMetadata[new Error().stack] = Object.assign( + {}, + _sentryModuleMetadataGlobal._sentryModuleMetadata[new Error().stack], + { + foo: 'baz', + }, +); + +setTimeout(() => { + throw new Error('I am a module metadata Error'); +}, 0); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts new file mode 100644 index 000000000000..e3fdb7415c68 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts @@ -0,0 +1,15 @@ +import { expect } from '@playwright/test'; +import type { Event } from '@sentry/types'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; + +sentryTest( + 'should provide module_metadata on stack frames in beforeSend even though an event processor (rewriteFramesIntegration) modified the filename', + async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const errorEvent = await getFirstSentryEnvelopeRequest(page, url); + expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'baz' }]); + }, +); From 3718368ade86b2499dd107de2459a84555419284 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 9 Jul 2024 09:44:45 +0000 Subject: [PATCH 3/4] fix tests --- .../moduleMetadata/appliesMetadata/test.ts | 5 +++-- .../appliesMetadataWithRewriteFrames/test.ts | 5 +++-- packages/node/test/sdk/scope.test.ts | 11 +++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts index 82929ffdceb4..258d61ab5af1 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts @@ -2,11 +2,12 @@ import { expect } from '@playwright/test'; import type { Event } from '@sentry/types'; import { sentryTest } from '../../../../utils/fixtures'; -import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; +import { getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; sentryTest('should provide module_metadata on stack frames in beforeSend', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const errorEvent = await getFirstSentryEnvelopeRequest(page, url); + const envelopes = await getMultipleSentryEnvelopeRequests(page, 3, { url, timeout: 10000 }); + const errorEvent = envelopes.find(event => !event.type)!; expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'bar' }]); }); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts index e3fdb7415c68..a890bcf4c83d 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts @@ -2,14 +2,15 @@ import { expect } from '@playwright/test'; import type { Event } from '@sentry/types'; import { sentryTest } from '../../../../utils/fixtures'; -import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; +import { getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; sentryTest( 'should provide module_metadata on stack frames in beforeSend even though an event processor (rewriteFramesIntegration) modified the filename', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const errorEvent = await getFirstSentryEnvelopeRequest(page, url); + const envelopes = await getMultipleSentryEnvelopeRequests(page, 3, { url, timeout: 10000 }); + const errorEvent = envelopes.find(event => !event.type)!; expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'baz' }]); }, ); diff --git a/packages/node/test/sdk/scope.test.ts b/packages/node/test/sdk/scope.test.ts index 09f21aac067d..5e84e412f912 100644 --- a/packages/node/test/sdk/scope.test.ts +++ b/packages/node/test/sdk/scope.test.ts @@ -88,7 +88,11 @@ describe('Unit | Scope', () => { it('allows to set & get a client', () => { const scope = new Scope(); expect(scope.getClient()).toBeUndefined(); - const client = {} as Client; + const client = { + emit() { + // noop + }, + } as unknown as Client; scope.setClient(client); expect(scope.getClient()).toBe(client); }); @@ -108,7 +112,10 @@ describe('Unit | Scope', () => { getEventProcessors() { return [eventProcessor]; }, - } as Client; + emit() { + // noop + }, + } as unknown as Client; const processedEvent = await prepareEvent( options, event, From 503cf427f8d4dfafec042b648a39862c1614c7e2 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 9 Jul 2024 10:07:43 +0000 Subject: [PATCH 4/4] Fix tests --- .../moduleMetadata/appliesMetadata/test.ts | 10 +++++++--- .../appliesMetadataWithRewriteFrames/test.ts | 12 ++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts index 258d61ab5af1..d6414e154a23 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadata/test.ts @@ -2,12 +2,16 @@ import { expect } from '@playwright/test'; import type { Event } from '@sentry/types'; import { sentryTest } from '../../../../utils/fixtures'; -import { getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; +import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; sentryTest('should provide module_metadata on stack frames in beforeSend', async ({ getLocalTestPath, page }) => { + // moduleMetadataIntegration is not included in any CDN bundles + if (process.env.PW_BUNDLE?.startsWith('bundle')) { + sentryTest.skip(); + } + const url = await getLocalTestPath({ testDir: __dirname }); - const envelopes = await getMultipleSentryEnvelopeRequests(page, 3, { url, timeout: 10000 }); - const errorEvent = envelopes.find(event => !event.type)!; + const errorEvent = await getFirstSentryEnvelopeRequest(page, url); expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'bar' }]); }); diff --git a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts index a890bcf4c83d..6996ef1ded6d 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/moduleMetadata/appliesMetadataWithRewriteFrames/test.ts @@ -2,15 +2,19 @@ import { expect } from '@playwright/test'; import type { Event } from '@sentry/types'; import { sentryTest } from '../../../../utils/fixtures'; -import { getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; +import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers'; sentryTest( 'should provide module_metadata on stack frames in beforeSend even though an event processor (rewriteFramesIntegration) modified the filename', async ({ getLocalTestPath, page }) => { + // moduleMetadataIntegration is not included in any CDN bundles + if (process.env.PW_BUNDLE?.startsWith('bundle')) { + sentryTest.skip(); + } + const url = await getLocalTestPath({ testDir: __dirname }); - const envelopes = await getMultipleSentryEnvelopeRequests(page, 3, { url, timeout: 10000 }); - const errorEvent = envelopes.find(event => !event.type)!; - expect(errorEvent.extra?.['module_metadata_entries']).toEqual([{ foo: 'baz' }]); + const errorEvent = await getFirstSentryEnvelopeRequest(page, url); + expect(errorEvent?.extra?.['module_metadata_entries']).toEqual([{ foo: 'baz' }]); }, );