Skip to content

Commit ab24ed9

Browse files
authored
Merge branch 'v9' into timfish/feat/cloudflare-integration-tests
2 parents 79240d6 + 2398fc0 commit ab24ed9

File tree

59 files changed

+298
-193
lines changed

Some content is hidden

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

59 files changed

+298
-193
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44

55
- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott
66

7+
## 9.43.0
8+
9+
- feat(v9/core): add MCP server instrumentation ([#17196](https://github.com/getsentry/sentry-javascript/pull/17196))
10+
- feat(v9/meta): Unify detection of serverless environments and add Cloud Run ([#17204](https://github.com/getsentry/sentry-javascript/pull/17204))
11+
- fix(v9/node): Add mechanism to `fastifyIntegration` error handler ([#17211](https://github.com/getsentry/sentry-javascript/pull/17211))
12+
- fix(v9/replay): Fix re-sampled sessions after a click ([#17195](https://github.com/getsentry/sentry-javascript/pull/17195))
13+
714
## 9.42.1
815

916
- fix(v9/astro): Revert Astro v5 storing route data to `globalThis` ([#17185](https://github.com/getsentry/sentry-javascript/pull/17185))

dev-packages/browser-integration-tests/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/browser-integration-tests",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"main": "index.js",
55
"license": "MIT",
66
"engines": {
@@ -43,7 +43,7 @@
4343
"@babel/preset-typescript": "^7.16.7",
4444
"@playwright/test": "~1.53.2",
4545
"@sentry-internal/rrweb": "2.34.0",
46-
"@sentry/browser": "9.42.1",
46+
"@sentry/browser": "9.43.0",
4747
"@supabase/supabase-js": "2.49.3",
4848
"axios": "1.8.2",
4949
"babel-loader": "^8.2.2",
Lines changed: 105 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { expect } from '@playwright/test';
2+
import type { replayIntegration as actualReplayIntegration } from '@sentry-internal/replay';
23
import { sentryTest } from '../../../utils/fixtures';
34
import { getExpectedReplayEvent } from '../../../utils/replayEventTemplates';
45
import {
@@ -13,55 +14,122 @@ import {
1314
// Session should expire after 2s - keep in sync with init.js
1415
const SESSION_TIMEOUT = 2000;
1516

16-
sentryTest('handles an expired session', async ({ browserName, forceFlushReplay, getLocalTestUrl, page }) => {
17-
if (shouldSkipReplayTest() || browserName !== 'chromium') {
18-
sentryTest.skip();
19-
}
17+
sentryTest(
18+
'handles an expired session that re-samples to session',
19+
async ({ browserName, forceFlushReplay, getLocalTestUrl, page }) => {
20+
if (shouldSkipReplayTest() || browserName !== 'chromium') {
21+
sentryTest.skip();
22+
}
2023

21-
const reqPromise0 = waitForReplayRequest(page, 0);
22-
const reqPromise1 = waitForReplayRequest(page, 1);
24+
const reqPromise0 = waitForReplayRequest(page, 0);
25+
const reqPromise1 = waitForReplayRequest(page, 1);
2326

24-
const url = await getLocalTestUrl({ testDir: __dirname });
27+
const url = await getLocalTestUrl({ testDir: __dirname });
2528

26-
await page.goto(url);
27-
const req0 = await reqPromise0;
29+
await page.goto(url);
30+
const req0 = await reqPromise0;
2831

29-
const replayEvent0 = getReplayEvent(req0);
30-
expect(replayEvent0).toEqual(getExpectedReplayEvent({}));
32+
const replayEvent0 = getReplayEvent(req0);
33+
expect(replayEvent0).toEqual(getExpectedReplayEvent({}));
3134

32-
const fullSnapshots0 = getFullRecordingSnapshots(req0);
33-
expect(fullSnapshots0.length).toEqual(1);
34-
const stringifiedSnapshot = normalize(fullSnapshots0[0]);
35-
expect(stringifiedSnapshot).toMatchSnapshot('snapshot-0.json');
35+
const fullSnapshots0 = getFullRecordingSnapshots(req0);
36+
expect(fullSnapshots0.length).toEqual(1);
37+
const stringifiedSnapshot = normalize(fullSnapshots0[0]);
38+
expect(stringifiedSnapshot).toMatchSnapshot('snapshot-0.json');
3639

37-
// We wait for another segment 0
38-
const reqPromise2 = waitForReplayRequest(page, 0);
40+
// We wait for another segment 0
41+
const reqPromise2 = waitForReplayRequest(page, 0);
3942

40-
await page.locator('#button1').click();
41-
await forceFlushReplay();
42-
const req1 = await reqPromise1;
43+
await page.locator('#button1').click();
44+
await forceFlushReplay();
45+
const req1 = await reqPromise1;
4346

44-
const replayEvent1 = getReplayEvent(req1);
45-
expect(replayEvent1).toEqual(getExpectedReplayEvent({ segment_id: 1, urls: [] }));
47+
const replayEvent1 = getReplayEvent(req1);
48+
expect(replayEvent1).toEqual(getExpectedReplayEvent({ segment_id: 1, urls: [] }));
4649

47-
const replay = await getReplaySnapshot(page);
48-
const oldSessionId = replay.session?.id;
50+
const replay = await getReplaySnapshot(page);
51+
const oldSessionId = replay.session?.id;
4952

50-
await new Promise(resolve => setTimeout(resolve, SESSION_TIMEOUT));
53+
await new Promise(resolve => setTimeout(resolve, SESSION_TIMEOUT));
5154

52-
await page.locator('#button2').click();
53-
await forceFlushReplay();
54-
const req2 = await reqPromise2;
55+
await page.locator('#button2').click();
56+
await forceFlushReplay();
57+
const req2 = await reqPromise2;
5558

56-
const replay2 = await getReplaySnapshot(page);
59+
const replay2 = await getReplaySnapshot(page);
5760

58-
expect(replay2.session?.id).not.toEqual(oldSessionId);
61+
expect(replay2.session?.id).not.toEqual(oldSessionId);
5962

60-
const replayEvent2 = getReplayEvent(req2);
61-
expect(replayEvent2).toEqual(getExpectedReplayEvent({}));
63+
const replayEvent2 = getReplayEvent(req2);
64+
expect(replayEvent2).toEqual(getExpectedReplayEvent({}));
6265

63-
const fullSnapshots2 = getFullRecordingSnapshots(req2);
64-
expect(fullSnapshots2.length).toEqual(1);
65-
const stringifiedSnapshot2 = normalize(fullSnapshots2[0]);
66-
expect(stringifiedSnapshot2).toMatchSnapshot('snapshot-2.json');
67-
});
66+
const fullSnapshots2 = getFullRecordingSnapshots(req2);
67+
expect(fullSnapshots2.length).toEqual(1);
68+
const stringifiedSnapshot2 = normalize(fullSnapshots2[0]);
69+
expect(stringifiedSnapshot2).toMatchSnapshot('snapshot-2.json');
70+
},
71+
);
72+
73+
sentryTest(
74+
'handles an expired session that re-samples to buffer',
75+
async ({ browserName, forceFlushReplay, getLocalTestUrl, page }) => {
76+
if (shouldSkipReplayTest() || browserName !== 'chromium') {
77+
sentryTest.skip();
78+
}
79+
80+
const reqPromise0 = waitForReplayRequest(page, 0);
81+
const reqPromise1 = waitForReplayRequest(page, 1);
82+
83+
const url = await getLocalTestUrl({ testDir: __dirname });
84+
85+
await page.goto(url);
86+
const req0 = await reqPromise0;
87+
88+
const replayEvent0 = getReplayEvent(req0);
89+
expect(replayEvent0).toEqual(getExpectedReplayEvent({}));
90+
91+
const fullSnapshots0 = getFullRecordingSnapshots(req0);
92+
expect(fullSnapshots0.length).toEqual(1);
93+
const stringifiedSnapshot = normalize(fullSnapshots0[0]);
94+
expect(stringifiedSnapshot).toMatchSnapshot('snapshot-0.json');
95+
96+
await page.locator('#button1').click();
97+
await forceFlushReplay();
98+
const req1 = await reqPromise1;
99+
100+
const replayEvent1 = getReplayEvent(req1);
101+
expect(replayEvent1).toEqual(getExpectedReplayEvent({ segment_id: 1, urls: [] }));
102+
103+
const replay = await getReplaySnapshot(page);
104+
const oldSessionId = replay.session?.id;
105+
106+
await new Promise(resolve => setTimeout(resolve, SESSION_TIMEOUT));
107+
await page.evaluate(() => {
108+
const replayIntegration = (window as unknown as Window & { Replay: ReturnType<typeof actualReplayIntegration> })
109+
.Replay;
110+
replayIntegration['_replay'].getOptions().errorSampleRate = 1.0;
111+
replayIntegration['_replay'].getOptions().sessionSampleRate = 0.0;
112+
});
113+
114+
let wasReplayFlushed = false;
115+
page.on('request', request => {
116+
if (request.url().includes('/api/1337/envelope/')) {
117+
wasReplayFlushed = true;
118+
}
119+
});
120+
await page.locator('#button2').click();
121+
await forceFlushReplay();
122+
123+
// This timeout is not ideal, but not sure of a better way to ensure replay is not flushed
124+
await new Promise(resolve => setTimeout(resolve, SESSION_TIMEOUT));
125+
126+
expect(wasReplayFlushed).toBe(false);
127+
128+
const currentSessionId = await page.evaluate(() => {
129+
// @ts-expect-error - Replay is not typed
130+
return window.Replay._replay.session?.id;
131+
});
132+
133+
expect(currentSessionId).not.toEqual(oldSessionId);
134+
},
135+
);

dev-packages/bundle-analyzer-scenarios/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/bundle-analyzer-scenarios",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"description": "Scenarios to test bundle analysis with",
55
"repository": "git://github.com/getsentry/sentry-javascript.git",
66
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/dev-packages/bundle-analyzer-scenarios",

dev-packages/clear-cache-gh-action/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@sentry-internal/clear-cache-gh-action",
33
"description": "An internal Github Action to clear GitHub caches.",
4-
"version": "9.42.1",
4+
"version": "9.43.0",
55
"license": "MIT",
66
"engines": {
77
"node": ">=18"

dev-packages/e2e-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/e2e-tests",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"license": "MIT",
55
"private": true,
66
"scripts": {

dev-packages/external-contributor-gh-action/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@sentry-internal/external-contributor-gh-action",
33
"description": "An internal Github Action to add external contributors to the CHANGELOG.md file.",
4-
"version": "9.42.1",
4+
"version": "9.43.0",
55
"license": "MIT",
66
"engines": {
77
"node": ">=18"

dev-packages/node-core-integration-tests/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/node-core-integration-tests",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"license": "MIT",
55
"engines": {
66
"node": ">=18"
@@ -34,8 +34,8 @@
3434
"@opentelemetry/resources": "^1.30.1",
3535
"@opentelemetry/sdk-trace-base": "^1.30.1",
3636
"@opentelemetry/semantic-conventions": "^1.34.0",
37-
"@sentry/core": "9.42.1",
38-
"@sentry/node-core": "9.42.1",
37+
"@sentry/core": "9.43.0",
38+
"@sentry/node-core": "9.43.0",
3939
"body-parser": "^1.20.3",
4040
"cors": "^2.8.5",
4141
"cron": "^3.1.6",

dev-packages/node-integration-tests/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/node-integration-tests",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"license": "MIT",
55
"engines": {
66
"node": ">=18"
@@ -30,9 +30,9 @@
3030
"@nestjs/common": "11.1.3",
3131
"@nestjs/core": "11.1.3",
3232
"@nestjs/platform-express": "11.1.3",
33-
"@sentry/aws-serverless": "9.42.1",
34-
"@sentry/core": "9.42.1",
35-
"@sentry/node": "9.42.1",
33+
"@sentry/aws-serverless": "9.43.0",
34+
"@sentry/core": "9.43.0",
35+
"@sentry/node": "9.43.0",
3636
"@types/mongodb": "^3.6.20",
3737
"@types/mysql": "^2.15.21",
3838
"@types/pg": "^8.6.5",

dev-packages/opentelemetry-v2-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry-internal/opentelemetry-v2-tests",
3-
"version": "9.42.1",
3+
"version": "9.43.0",
44
"private": true,
55
"description": "Tests for @sentry/opentelemetry with OpenTelemetry v2",
66
"engines": {

0 commit comments

Comments
 (0)