From 988cd9a36cc25a0321bfbf9dd3b0559a6652e3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Zugmeyer?= Date: Fri, 5 Mar 2021 16:46:19 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20[RUMF-855]=20discard=20negative?= =?UTF-8?q?=20first-input=20delays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rumEventsCollection/view/trackTimings.spec.ts | 13 +++++++++++++ .../domain/rumEventsCollection/view/trackTimings.ts | 8 +++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.spec.ts b/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.spec.ts index 5d5c3f6498..0518f3119b 100644 --- a/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.spec.ts +++ b/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.spec.ts @@ -222,4 +222,17 @@ describe('firstInputTimings', () => { expect(fitCallback).not.toHaveBeenCalled() }) + + it('should not be present if the first-input performance entry is invalid', () => { + const { lifeCycle } = setupBuilder.build() + + lifeCycle.notify(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, { + entryType: 'first-input' as const, + // Invalid, because processingStart should be >= startTime + processingStart: 900 as RelativeTime, + startTime: 1000 as RelativeTime, + }) + + expect(fitCallback).not.toHaveBeenCalled() + }) }) diff --git a/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.ts b/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.ts index 43a667a520..3436c15a91 100644 --- a/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.ts +++ b/packages/rum-core/src/domain/rumEventsCollection/view/trackTimings.ts @@ -137,7 +137,13 @@ export function trackFirstInputTimings( const firstHidden = trackFirstHidden() const { unsubscribe: stop } = lifeCycle.subscribe(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, (entry) => { - if (entry.entryType === 'first-input' && entry.startTime < firstHidden.timeStamp) { + if ( + entry.entryType === 'first-input' && + entry.startTime < firstHidden.timeStamp && + // Discard invalid first-input entries, see + // https://bugs.chromium.org/p/chromium/issues/detail?id=1185815 + entry.startTime <= entry.processingStart + ) { callback({ firstInputDelay: elapsed(entry.startTime, entry.processingStart), firstInputTime: entry.startTime as Duration,