From 013bb4d2026a4e281503271ca8ee4e0402fbc5f4 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Fri, 26 May 2023 14:29:05 -0400 Subject: [PATCH 1/2] feat(replay): Do not trigger user activity on "keydown" This is causing some low-value replays. If you search sentry for replays with duration < 5 seconds, you will see that most of them are re-newed sessions from idle that only have a "keydown" breadcrumb. I suspect users are alt-tabbing out of an idle Sentry page. Removing for now until we have a better way to detect when a session is truly resumed via keydown event. --- packages/replay/src/coreHandlers/handleKeyboardEvent.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/replay/src/coreHandlers/handleKeyboardEvent.ts b/packages/replay/src/coreHandlers/handleKeyboardEvent.ts index e50f5e6e3ab5..9eff3837d949 100644 --- a/packages/replay/src/coreHandlers/handleKeyboardEvent.ts +++ b/packages/replay/src/coreHandlers/handleKeyboardEvent.ts @@ -12,8 +12,9 @@ export function handleKeyboardEvent(replay: ReplayContainer, event: KeyboardEven return; } - replay.triggerUserActivity(); - + // NOTE: Do not consider this "user activity" because it can lead to + // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new + // session with a single "keydown" breadcrumb is created) const breadcrumb = getKeyboardBreadcrumb(event); if (!breadcrumb) { From 3a3eb8906ae15e9f36a93f5c35c42c9f44630081 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Tue, 30 May 2023 18:44:47 -0400 Subject: [PATCH 2/2] update activity without restarting recording --- .../replay/src/coreHandlers/handleKeyboardEvent.ts | 4 +++- packages/replay/src/replay.ts | 12 ++++++++++++ packages/replay/src/types.ts | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/replay/src/coreHandlers/handleKeyboardEvent.ts b/packages/replay/src/coreHandlers/handleKeyboardEvent.ts index fbfce40bf214..0f7560f39584 100644 --- a/packages/replay/src/coreHandlers/handleKeyboardEvent.ts +++ b/packages/replay/src/coreHandlers/handleKeyboardEvent.ts @@ -12,9 +12,11 @@ export function handleKeyboardEvent(replay: ReplayContainer, event: KeyboardEven return; } - // NOTE: Do not consider this "user activity" because it can lead to + // Update user activity, but do not restart recording as it can create // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new // session with a single "keydown" breadcrumb is created) + replay.updateUserActivity(); + const breadcrumb = getKeyboardBreadcrumb(event); if (!breadcrumb) { diff --git a/packages/replay/src/replay.ts b/packages/replay/src/replay.ts index 53f263b5fa3f..cbab2f8b55fb 100644 --- a/packages/replay/src/replay.ts +++ b/packages/replay/src/replay.ts @@ -480,6 +480,18 @@ export class ReplayContainer implements ReplayContainerInterface { this._updateSessionActivity(); } + /** + * Updates the user activity timestamp *without* resuming + * recording. Some user events (e.g. keydown) can be create + * low-value replays that only contain the keypress as a + * breadcrumb. Instead this would require other events to + * create a new replay after a session has expired. + */ + public updateUserActivity(): void { + this._updateUserActivity(); + this._updateSessionActivity(); + } + /** * Only flush if `this.recordingMode === 'session'` */ diff --git a/packages/replay/src/types.ts b/packages/replay/src/types.ts index 3d1d8616bb79..01efb4afc40c 100644 --- a/packages/replay/src/types.ts +++ b/packages/replay/src/types.ts @@ -542,6 +542,7 @@ export interface ReplayContainer { flushImmediate(): Promise; cancelFlush(): void; triggerUserActivity(): void; + updateUserActivity(): void; addUpdate(cb: AddUpdateCallback): void; getOptions(): ReplayPluginOptions; getSessionId(): string | undefined;