Skip to content

Commit 07e2e43

Browse files
authored
feat(replay): Ensure min/max duration when flushing (#8596)
This PR adds a safeguard to ensure we do not flush (=send) a replay that is either too short or too long. We allow to configure a `minReplayDuration`, which defaults to 5s and maxes out at 15s. Whenever we try to flush and the duration is shorter than this, we'll just skip flushing. Additionally, we also skip flushing if the replay is longer than MAX_SESSION_LIFE + 5s (=60min + 5s). This _should not_ happen, technically, but apparently it still does. So while we figure out the root cause of this, we can at least avoid sending stuff in that case.
1 parent 96fdbf4 commit 07e2e43

File tree

54 files changed

+231
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+231
-6
lines changed

packages/browser-integration-tests/scripts/detectFlakyTests.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import * as path from 'path';
33
import * as childProcess from 'child_process';
44
import { promisify } from 'util';
55

6-
const exec = promisify(childProcess.exec);
7-
86
async function run(): Promise<void> {
97
let testPaths: string[] = [];
108

packages/browser-integration-tests/suites/replay/bufferMode/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ window.Sentry = Sentry;
55
window.Replay = new Replay({
66
flushMinDelay: 200,
77
flushMaxDelay: 200,
8+
minReplayDuration: 0,
89
});
910

1011
Sentry.init({

packages/browser-integration-tests/suites/replay/compression/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: true,
89
});
910

packages/browser-integration-tests/suites/replay/customEvents/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
blockAllMedia: false,
910
});

packages/browser-integration-tests/suites/replay/dsc/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ window.Sentry = Sentry;
55
window.Replay = new Sentry.Replay({
66
flushMinDelay: 200,
77
flushMaxDelay: 200,
8+
minReplayDuration: 0,
89
useCompression: false,
910
});
1011

packages/browser-integration-tests/suites/replay/errors/droppedError/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/errors/errorModeCustomTransport/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/errors/errorNotSent/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/errors/errorsInSession/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/errors/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/fetch/captureRequestBody/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo', 'http://sentry-test.io/foo'],
910
networkCaptureBodies: true,

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/fetch/captureRequestHeaders/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkRequestHeaders: ['X-Test-Header'],

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/fetch/captureResponseBody/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkCaptureBodies: true,

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/fetch/captureResponseHeaders/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkResponseHeaders: ['X-Test-Header'],

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/fetch/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/xhr/captureRequestBody/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo', 'http://sentry-test.io/foo'],
910
networkCaptureBodies: true,

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/xhr/captureRequestHeaders/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkRequestHeaders: ['X-Test-Header'],

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/xhr/captureResponseBody/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkCaptureBodies: true,

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/xhr/captureResponseHeaders/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78

89
networkDetailAllowUrls: ['http://localhost:7654/foo'],
910
networkResponseHeaders: ['X-Test-Header'],

packages/browser-integration-tests/suites/replay/extendNetworkBreadcrumbs/xhr/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/fileInput/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
maskAllInputs: false,
910
});

packages/browser-integration-tests/suites/replay/flushing/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
});
910

packages/browser-integration-tests/suites/replay/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/keyboardEvents/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/largeMutations/defaultOptions/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/largeMutations/mutationLimit/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
mutationLimit: 250,
89
});
910

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
window.Replay = new Sentry.Replay({
5+
flushMinDelay: 200,
6+
flushMaxDelay: 200,
7+
minReplayDuration: 2000,
8+
});
9+
10+
Sentry.init({
11+
dsn: 'https://[email protected]/1337',
12+
sampleRate: 0,
13+
replaysSessionSampleRate: 1.0,
14+
replaysOnErrorSampleRate: 0.0,
15+
debug: true,
16+
17+
integrations: [window.Replay],
18+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
</head>
6+
<body>
7+
<button onclick="console.log('Test log 1')" id="button1">Click me</button>
8+
<button onclick="console.log('Test log 2')" id="button2">Click me</button>
9+
</body>
10+
</html>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { expect } from '@playwright/test';
2+
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import { getExpectedReplayEvent } from '../../../utils/replayEventTemplates';
5+
import { getReplayEvent, shouldSkipReplayTest, waitForReplayRequest } from '../../../utils/replayHelpers';
6+
7+
const MIN_DURATION = 2000;
8+
9+
sentryTest('doest not send replay before min. duration', async ({ getLocalTestPath, page }) => {
10+
if (shouldSkipReplayTest()) {
11+
sentryTest.skip();
12+
}
13+
14+
let counter = 0;
15+
const reqPromise0 = waitForReplayRequest(page, () => {
16+
counter++;
17+
return true;
18+
});
19+
20+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
21+
return route.fulfill({
22+
status: 200,
23+
contentType: 'application/json',
24+
body: JSON.stringify({ id: 'test-id' }),
25+
});
26+
});
27+
28+
const url = await getLocalTestPath({ testDir: __dirname });
29+
30+
await page.goto(url);
31+
32+
// This triggers a page blur, which should trigger a flush
33+
// However, as we are only here too short, this should not actually _send_ anything
34+
await page.evaluate(`Object.defineProperty(document, 'visibilityState', {
35+
configurable: true,
36+
get: function () {
37+
return 'hidden';
38+
},
39+
});
40+
document.dispatchEvent(new Event('visibilitychange'));`);
41+
expect(counter).toBe(0);
42+
43+
// Now wait for 2s until min duration is reached, and try again
44+
await new Promise(resolve => setTimeout(resolve, MIN_DURATION + 100));
45+
await page.evaluate(`Object.defineProperty(document, 'visibilityState', {
46+
configurable: true,
47+
get: function () {
48+
return 'visible';
49+
},
50+
});
51+
document.dispatchEvent(new Event('visibilitychange'));`);
52+
await page.evaluate(`Object.defineProperty(document, 'visibilityState', {
53+
configurable: true,
54+
get: function () {
55+
return 'hidden';
56+
},
57+
});
58+
document.dispatchEvent(new Event('visibilitychange'));`);
59+
60+
const replayEvent0 = getReplayEvent(await reqPromise0);
61+
expect(replayEvent0).toEqual(getExpectedReplayEvent({}));
62+
expect(counter).toBe(1);
63+
});

packages/browser-integration-tests/suites/replay/multiple-pages/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/privacyBlock/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
blockAllMedia: false,
910
block: ['link[rel="icon"]', 'video', '.nested-hide'],

packages/browser-integration-tests/suites/replay/privacyDefault/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
});
910

packages/browser-integration-tests/suites/replay/privacyInput/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
maskAllInputs: false,
910
});

packages/browser-integration-tests/suites/replay/privacyInputMaskAll/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
maskAllInputs: true,
910
});

packages/browser-integration-tests/suites/replay/replayShim/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ window.Sentry = Sentry;
66
window.Replay = new Sentry.Replay({
77
flushMinDelay: 200,
88
flushMaxDelay: 200,
9+
minReplayDuration: 0,
910
});
1011

1112
Sentry.init({

packages/browser-integration-tests/suites/replay/requests/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
useCompression: false,
89
});
910

packages/browser-integration-tests/suites/replay/sampling/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/sessionExpiry/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/sessionInactive/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

packages/browser-integration-tests/suites/replay/sessionMaxAge/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
55
flushMinDelay: 200,
66
flushMaxDelay: 200,
7+
minReplayDuration: 0,
78
});
89

910
Sentry.init({

0 commit comments

Comments
 (0)