Skip to content

Commit 0fbe39a

Browse files
authored
feat(browser): Do not include metrics in base CDN bundle (#12230)
Metrics are only included when performance is included, reducing the base bundle size. We always expose a shim so there is no API breakage, it just does nothing. I noticed this while working on #12226.
1 parent 8dca102 commit 0fbe39a

File tree

21 files changed

+156
-26
lines changed

21 files changed

+156
-26
lines changed

dev-packages/browser-integration-tests/suites/metrics/test.ts renamed to dev-packages/browser-integration-tests/suites/metrics/metricsEvent/test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import { expect } from '@playwright/test';
22

3-
import { sentryTest } from '../../utils/fixtures';
4-
import { getFirstSentryEnvelopeRequest, properEnvelopeRequestParser } from '../../utils/helpers';
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import {
5+
getFirstSentryEnvelopeRequest,
6+
properEnvelopeRequestParser,
7+
shouldSkipMetricsTest,
8+
} from '../../../utils/helpers';
59

610
sentryTest('collects metrics', async ({ getLocalTestUrl, page }) => {
11+
if (shouldSkipMetricsTest()) {
12+
sentryTest.skip();
13+
}
14+
715
const url = await getLocalTestUrl({ testDir: __dirname });
816

917
const statsdBuffer = await getFirstSentryEnvelopeRequest<Uint8Array>(page, url, properEnvelopeRequestParser);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://public@dsn.ingest.sentry.io/1337',
7+
});
8+
9+
// This should not fail
10+
Sentry.metrics.increment('increment');
11+
Sentry.metrics.distribution('distribution', 42);
12+
Sentry.metrics.gauge('gauge', 5);
13+
Sentry.metrics.set('set', 'nope');
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { expect } from '@playwright/test';
2+
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import { shouldSkipMetricsTest } from '../../../utils/helpers';
5+
6+
sentryTest('exports shim metrics integration for non-tracing bundles', async ({ getLocalTestPath, page }) => {
7+
// Skip in tracing tests
8+
if (!shouldSkipMetricsTest()) {
9+
sentryTest.skip();
10+
}
11+
12+
const consoleMessages: string[] = [];
13+
page.on('console', msg => consoleMessages.push(msg.text()));
14+
15+
let requestCount = 0;
16+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
17+
requestCount++;
18+
return route.fulfill({
19+
status: 200,
20+
contentType: 'application/json',
21+
body: JSON.stringify({ id: 'test-id' }),
22+
});
23+
});
24+
25+
const url = await getLocalTestPath({ testDir: __dirname });
26+
27+
await page.goto(url);
28+
29+
expect(requestCount).toBe(0);
30+
expect(consoleMessages).toEqual([
31+
'You are using metrics even though this bundle does not include tracing.',
32+
'You are using metrics even though this bundle does not include tracing.',
33+
'You are using metrics even though this bundle does not include tracing.',
34+
'You are using metrics even though this bundle does not include tracing.',
35+
]);
36+
});

dev-packages/browser-integration-tests/utils/helpers.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export function shouldSkipTracingTest(): boolean {
241241
}
242242

243243
/**
244-
* We can only test replay tests in certain bundles/packages:
244+
* We can only test feedback tests in certain bundles/packages:
245245
* - NPM (ESM, CJS)
246246
* - CDN bundles that contain the Replay integration
247247
*
@@ -252,6 +252,18 @@ export function shouldSkipFeedbackTest(): boolean {
252252
return bundle != null && !bundle.includes('feedback') && !bundle.includes('esm') && !bundle.includes('cjs');
253253
}
254254

255+
/**
256+
* We can only test metrics tests in certain bundles/packages:
257+
* - NPM (ESM, CJS)
258+
* - CDN bundles that include tracing
259+
*
260+
* @returns `true` if we should skip the metrics test
261+
*/
262+
export function shouldSkipMetricsTest(): boolean {
263+
const bundle = process.env.PW_BUNDLE as string | undefined;
264+
return bundle != null && !bundle.includes('tracing') && !bundle.includes('esm') && !bundle.includes('cjs');
265+
}
266+
255267
/**
256268
* Waits until a number of requests matching urlRgx at the given URL arrive.
257269
* If the timout option is configured, this function will abort waiting, even if it hasn't reveived the configured

packages/browser/src/exports.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ export {
6868
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
6969
} from '@sentry/core';
7070

71-
export * from './metrics';
72-
7371
export { WINDOW } from './helpers';
7472
export { BrowserClient } from './client';
7573
export { makeFetchTransport } from './transports/fetch';

packages/browser/src/index.bundle.feedback.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { browserTracingIntegrationShim, replayIntegrationShim } from '@sentry-internal/integration-shims';
1+
import { browserTracingIntegrationShim, metricsShim, replayIntegrationShim } from '@sentry-internal/integration-shims';
22
import { feedbackAsyncIntegration } from './feedbackAsync';
33

44
export * from './index.bundle.base';
@@ -10,6 +10,7 @@ export {
1010
feedbackAsyncIntegration as feedbackAsyncIntegration,
1111
feedbackAsyncIntegration as feedbackIntegration,
1212
replayIntegrationShim as replayIntegration,
13+
metricsShim as metrics,
1314
};
1415

1516
export { captureFeedback } from '@sentry/core';

packages/browser/src/index.bundle.replay.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { browserTracingIntegrationShim, feedbackIntegrationShim } from '@sentry-internal/integration-shims';
1+
import {
2+
browserTracingIntegrationShim,
3+
feedbackIntegrationShim,
4+
metricsShim,
5+
} from '@sentry-internal/integration-shims';
26

37
export * from './index.bundle.base';
48

@@ -8,4 +12,5 @@ export {
812
browserTracingIntegrationShim as browserTracingIntegration,
913
feedbackIntegrationShim as feedbackAsyncIntegration,
1014
feedbackIntegrationShim as feedbackIntegration,
15+
metricsShim as metrics,
1116
};

packages/browser/src/index.bundle.tracing.replay.feedback.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ registerSpanErrorInstrumentation();
44

55
export * from './index.bundle.base';
66

7+
export * from './metrics';
8+
79
export {
810
getActiveSpan,
911
getRootSpan,

packages/browser/src/index.bundle.tracing.replay.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ registerSpanErrorInstrumentation();
44

55
export * from './index.bundle.base';
66

7+
export * from './metrics';
8+
79
export {
810
getActiveSpan,
911
getRootSpan,

0 commit comments

Comments
 (0)