diff --git a/packages/tracing/src/browser/metrics.ts b/packages/tracing/src/browser/metrics.ts index 9764101e7a04..73dec5cee29a 100644 --- a/packages/tracing/src/browser/metrics.ts +++ b/packages/tracing/src/browser/metrics.ts @@ -1,7 +1,7 @@ /* eslint-disable max-lines */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Measurements, SpanContext } from '@sentry/types'; -import { browserPerformanceTimeOrigin, getGlobalObject, htmlTreeAsString, logger } from '@sentry/utils'; +import { browserPerformanceTimeOrigin, getGlobalObject, htmlTreeAsString, isNodeEnv, logger } from '@sentry/utils'; import { Span } from '../span'; import { Transaction } from '../transaction'; @@ -22,7 +22,7 @@ export class MetricsInstrumentation { private _lcpEntry: LargestContentfulPaint | undefined; public constructor() { - if (global && global.performance) { + if (!isNodeEnv() && global?.performance) { if (global.performance.mark) { global.performance.mark('sentry-tracing-init'); } diff --git a/packages/tracing/test/browser/metrics.test.ts b/packages/tracing/test/browser/metrics.test.ts index f267e2e442dc..114a9a480798 100644 --- a/packages/tracing/test/browser/metrics.test.ts +++ b/packages/tracing/test/browser/metrics.test.ts @@ -1,5 +1,9 @@ import { Span, Transaction } from '../../src'; -import { _startChild, addResourceSpans, ResourceEntry } from '../../src/browser/metrics'; +import { _startChild, addResourceSpans, MetricsInstrumentation, ResourceEntry } from '../../src/browser/metrics'; +import { addDOMPropertiesToGlobal } from '../testutils'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any, no-var +declare var global: any; describe('_startChild()', () => { it('creates a span with given properties', () => { @@ -167,3 +171,29 @@ describe('addResourceSpans', () => { ); }); }); + +describe('MetricsInstrumentation', () => { + it('does not initialize trackers when on node', () => { + const trackers = ['_trackCLS', '_trackLCP', '_trackFID'].map(tracker => + jest.spyOn(MetricsInstrumentation.prototype as any, tracker), + ); + + new MetricsInstrumentation(); + + trackers.forEach(tracker => expect(tracker).not.toBeCalled()); + }); + + it('initializes trackers when not on node and `global.performance` is available.', () => { + addDOMPropertiesToGlobal(['performance', 'document', 'addEventListener', 'window']); + const backup = global.process; + global.process = undefined; + + const trackers = ['_trackCLS', '_trackLCP', '_trackFID'].map(tracker => + jest.spyOn(MetricsInstrumentation.prototype as any, tracker), + ); + new MetricsInstrumentation(); + global.process = backup; + + trackers.forEach(tracker => expect(tracker).toBeCalled()); + }); +});