From 4823b23c42e2d4ea2c10e006eb24875a9a5342fe Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 14 Feb 2025 13:37:57 +0000 Subject: [PATCH 1/2] fix(browser): Ensure that `performance.measure` spans have a positive duration --- .../browser-utils/src/metrics/browserMetrics.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/browser-utils/src/metrics/browserMetrics.ts b/packages/browser-utils/src/metrics/browserMetrics.ts index 794faa197ad5..62201a72ceab 100644 --- a/packages/browser-utils/src/metrics/browserMetrics.ts +++ b/packages/browser-utils/src/metrics/browserMetrics.ts @@ -425,7 +425,7 @@ export function _addMeasureSpans( startTime: number, duration: number, timeOrigin: number, -): number { +): void { const navEntry = getNavigationEntry(false); const requestTime = msToSec(navEntry ? navEntry.requestStart : 0); // Because performance.measure accepts arbitrary timestamps it can produce @@ -450,13 +450,14 @@ export function _addMeasureSpans( attributes['sentry.browser.measure_start_time'] = measureStartTimestamp; } - startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, { - name: entry.name as string, - op: entry.entryType as string, - attributes, - }); - - return measureStartTimestamp; + // Measurements from third parties can be off, which would create invalid spans, dropping transactions in the process. + if (measureStartTimestamp <= measureEndTimestamp) { + startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, { + name: entry.name as string, + op: entry.entryType as string, + attributes, + }); + } } /** Instrument navigation entries */ From 15cc7e914c8796f7ed1cee4e209c1d91f78d073d Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 14 Feb 2025 13:42:58 +0000 Subject: [PATCH 2/2] Add test --- .../test/browser/browserMetrics.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/browser-utils/test/browser/browserMetrics.test.ts b/packages/browser-utils/test/browser/browserMetrics.test.ts index 98a3bb375c00..27d489eae140 100644 --- a/packages/browser-utils/test/browser/browserMetrics.test.ts +++ b/packages/browser-utils/test/browser/browserMetrics.test.ts @@ -92,6 +92,29 @@ describe('_addMeasureSpans', () => { }), ); }); + + it('drops measurement spans with negative duration', () => { + const spans: Span[] = []; + + getClient()?.on('spanEnd', span => { + spans.push(span); + }); + + const entry = { + entryType: 'measure', + name: 'measure-1', + duration: 10, + startTime: 12, + } as PerformanceEntry; + + const timeOrigin = 100; + const startTime = 23; + const duration = -50; + + _addMeasureSpans(span, entry, startTime, duration, timeOrigin); + + expect(spans).toHaveLength(0); + }); }); describe('_addResourceSpans', () => {