Skip to content

Commit 278acdf

Browse files
authored
Merge branch 'develop' into timfish/fix/remove-errors-side-effect
2 parents 9184779 + 0dec883 commit 278acdf

File tree

122 files changed

+1065
-851
lines changed

Some content is hidden

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

122 files changed

+1065
-851
lines changed

.craft.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ targets:
4646
- name: npm
4747
id: '@sentry/profiling-node'
4848
includeNames: /^sentry-profiling-node-\d.*\.tgz$/
49+
- name: npm
50+
id: '@sentry/node-native'
51+
includeNames: /^sentry-node-native-\d.*\.tgz$/
4952

5053
## 3 Browser-based Packages
5154
- name: npm

CHANGELOG.md

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

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

7+
## 9.37.0
8+
9+
### Important Changes
10+
11+
- **feat(nuxt): Parametrize SSR routes ([#16843](https://github.com/getsentry/sentry-javascript/pull/16843))**
12+
13+
When requesting dynamic or catch-all routes in Nuxt, those will now be shown as parameterized routes in Sentry.
14+
For example, `/users/123` will be shown as `/users/:userId()` in Sentry. This will make it easier to identify patterns and make grouping easier.
15+
16+
### Other Changes
17+
18+
- feat(astro): Deprecate passing runtime config to astro integration ([#16839](https://github.com/getsentry/sentry-javascript/pull/16839))
19+
- feat(browser): Add `beforeStartNavigationSpan` lifecycle hook ([#16863](https://github.com/getsentry/sentry-javascript/pull/16863))
20+
- feat(browser): Detect redirects when emitting navigation spans ([#16324](https://github.com/getsentry/sentry-javascript/pull/16324))
21+
- feat(cloudflare): Add option to opt out of capturing errors in `wrapRequestHandler` ([#16852](https://github.com/getsentry/sentry-javascript/pull/16852))
22+
- feat(feedback): Return the eventId into the onSubmitSuccess callback ([#16835](https://github.com/getsentry/sentry-javascript/pull/16835))
23+
- feat(vercel-edge): Do not vendor in all OpenTelemetry dependencies ([#16841](https://github.com/getsentry/sentry-javascript/pull/16841))
24+
- fix(browser): Ensure standalone CLS and LCP spans have traceId of pageload span ([#16864](https://github.com/getsentry/sentry-javascript/pull/16864))
25+
- fix(nextjs): Use value injection loader on `instrumentation-client.ts|js` ([#16855](https://github.com/getsentry/sentry-javascript/pull/16855))
26+
- fix(sveltekit): Avoid capturing `redirect()` calls as errors in Cloudflare ([#16853](https://github.com/getsentry/sentry-javascript/pull/16853))
27+
- docs(nextjs): Update `deleteSourcemapsAfterUpload` jsdoc default value ([#16867](https://github.com/getsentry/sentry-javascript/pull/16867))
28+
29+
Work in this release was contributed by @zachkirsch. Thank you for your contribution!
30+
731
## 9.36.0
832

933
### Important Changes

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.36.0",
3+
"version": "9.37.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.36.0",
46+
"@sentry/browser": "9.37.0",
4747
"@supabase/supabase-js": "2.49.3",
4848
"axios": "1.8.2",
4949
"babel-loader": "^8.2.2",

dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-cls-standalone-spans/test.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ sentryTest('captures a "GOOD" CLS vital with its source as a standalone span', a
6565
'sentry.exclusive_time': 0,
6666
'sentry.op': 'ui.webvital.cls',
6767
'sentry.origin': 'auto.http.browser.cls',
68+
'sentry.report_event': 'pagehide',
6869
transaction: expect.stringContaining('index.html'),
6970
'user_agent.original': expect.stringContaining('Chrome'),
7071
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
@@ -134,6 +135,7 @@ sentryTest('captures a "MEH" CLS vital with its source as a standalone span', as
134135
'sentry.exclusive_time': 0,
135136
'sentry.op': 'ui.webvital.cls',
136137
'sentry.origin': 'auto.http.browser.cls',
138+
'sentry.report_event': 'pagehide',
137139
transaction: expect.stringContaining('index.html'),
138140
'user_agent.original': expect.stringContaining('Chrome'),
139141
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
@@ -201,6 +203,7 @@ sentryTest('captures a "POOR" CLS vital with its source as a standalone span.',
201203
'sentry.exclusive_time': 0,
202204
'sentry.op': 'ui.webvital.cls',
203205
'sentry.origin': 'auto.http.browser.cls',
206+
'sentry.report_event': 'pagehide',
204207
transaction: expect.stringContaining('index.html'),
205208
'user_agent.original': expect.stringContaining('Chrome'),
206209
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
@@ -269,6 +272,7 @@ sentryTest(
269272
'sentry.exclusive_time': 0,
270273
'sentry.op': 'ui.webvital.cls',
271274
'sentry.origin': 'auto.http.browser.cls',
275+
'sentry.report_event': 'pagehide',
272276
transaction: expect.stringContaining('index.html'),
273277
'user_agent.original': expect.stringContaining('Chrome'),
274278
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
@@ -342,16 +346,18 @@ sentryTest(
342346
// Ensure the CLS span is connected to the pageload span and trace
343347
expect(spanEnvelopeItem.data?.['sentry.pageload.span_id']).toBe(pageloadSpanId);
344348
expect(spanEnvelopeItem.trace_id).toEqual(pageloadTraceId);
349+
350+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('pagehide');
345351
},
346352
);
347353

348354
sentryTest('sends CLS of the initial page when soft-navigating to a new page', async ({ getLocalTestUrl, page }) => {
349355
const url = await getLocalTestUrl({ testDir: __dirname });
350356

351-
const eventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
357+
const pageloadEventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
352358

353-
expect(eventData.type).toBe('transaction');
354-
expect(eventData.contexts?.trace?.op).toBe('pageload');
359+
expect(pageloadEventData.type).toBe('transaction');
360+
expect(pageloadEventData.contexts?.trace?.op).toBe('pageload');
355361

356362
const spanEnvelopePromise = getMultipleSentryEnvelopeRequests<SpanEnvelope>(
357363
page,
@@ -364,12 +370,18 @@ sentryTest('sends CLS of the initial page when soft-navigating to a new page', a
364370

365371
await page.goto(`${url}#soft-navigation`);
366372

373+
const pageloadTraceId = pageloadEventData.contexts?.trace?.trace_id;
374+
expect(pageloadTraceId).toMatch(/[a-f0-9]{32}/);
375+
367376
const spanEnvelope = (await spanEnvelopePromise)[0];
368377
const spanEnvelopeItem = spanEnvelope[1][0][1];
369378
// Flakey value dependent on timings -> we check for a range
370379
expect(spanEnvelopeItem.measurements?.cls?.value).toBeGreaterThan(0.05);
371380
expect(spanEnvelopeItem.measurements?.cls?.value).toBeLessThan(0.15);
372-
expect(spanEnvelopeItem.data?.['sentry.pageload.span_id']).toMatch(/[a-f0-9]{16}/);
381+
expect(spanEnvelopeItem.data?.['sentry.pageload.span_id']).toBe(pageloadEventData.contexts?.trace?.span_id);
382+
expect(spanEnvelopeItem.trace_id).toEqual(pageloadTraceId);
383+
384+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('navigation');
373385
});
374386

375387
sentryTest("doesn't send further CLS after the first navigation", async ({ getLocalTestUrl, page }) => {
@@ -394,6 +406,7 @@ sentryTest("doesn't send further CLS after the first navigation", async ({ getLo
394406
const spanEnvelope = (await spanEnvelopePromise)[0];
395407
const spanEnvelopeItem = spanEnvelope[1][0][1];
396408
expect(spanEnvelopeItem.measurements?.cls?.value).toBeGreaterThan(0);
409+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('navigation');
397410

398411
getMultipleSentryEnvelopeRequests<SpanEnvelope>(page, 1, { envelopeType: 'span' }, () => {
399412
throw new Error('Unexpected span - This should not happen!');
@@ -438,6 +451,7 @@ sentryTest("doesn't send further CLS after the first page hide", async ({ getLoc
438451
const spanEnvelope = (await spanEnvelopePromise)[0];
439452
const spanEnvelopeItem = spanEnvelope[1][0][1];
440453
expect(spanEnvelopeItem.measurements?.cls?.value).toBeGreaterThan(0);
454+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('pagehide');
441455

442456
getMultipleSentryEnvelopeRequests<SpanEnvelope>(page, 1, { envelopeType: 'span' }, () => {
443457
throw new Error('Unexpected span - This should not happen!');

dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp-standalone-spans/test.ts

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { expect } from '@playwright/test';
33
import type { Event as SentryEvent, EventEnvelope, SpanEnvelope } from '@sentry/core';
44
import { sentryTest } from '../../../../utils/fixtures';
55
import {
6+
envelopeRequestParser,
67
getFirstSentryEnvelopeRequest,
78
getMultipleSentryEnvelopeRequests,
89
properFullEnvelopeRequestParser,
910
shouldSkipTracingTest,
11+
waitForTransactionRequest,
1012
} from '../../../../utils/helpers';
1113

1214
sentryTest.beforeEach(async ({ browserName, page }) => {
@@ -31,6 +33,8 @@ sentryTest('captures LCP vital as a standalone span', async ({ getLocalTestUrl,
3133
properFullEnvelopeRequestParser,
3234
);
3335

36+
const pageloadEnvelopePromise = waitForTransactionRequest(page, e => e.contexts?.trace?.op === 'pageload');
37+
3438
page.route('**', route => route.continue());
3539
page.route('**/my/image.png', async (route: Route) => {
3640
return route.fulfill({
@@ -47,15 +51,20 @@ sentryTest('captures LCP vital as a standalone span', async ({ getLocalTestUrl,
4751
await hidePage(page);
4852

4953
const spanEnvelope = (await spanEnvelopePromise)[0];
54+
const pageloadTransactionEvent = envelopeRequestParser(await pageloadEnvelopePromise);
5055

5156
const spanEnvelopeHeaders = spanEnvelope[0];
5257
const spanEnvelopeItem = spanEnvelope[1][0][1];
5358

59+
const pageloadTraceId = pageloadTransactionEvent.contexts?.trace?.trace_id;
60+
expect(pageloadTraceId).toMatch(/[a-f0-9]{32}/);
61+
5462
expect(spanEnvelopeItem).toEqual({
5563
data: {
5664
'sentry.exclusive_time': 0,
5765
'sentry.op': 'ui.webvital.lcp',
5866
'sentry.origin': 'auto.http.browser.lcp',
67+
'sentry.report_event': 'pagehide',
5968
transaction: expect.stringContaining('index.html'),
6069
'user_agent.original': expect.stringContaining('Chrome'),
6170
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
@@ -80,7 +89,7 @@ sentryTest('captures LCP vital as a standalone span', async ({ getLocalTestUrl,
8089
segment_id: expect.stringMatching(/[a-f0-9]{16}/),
8190
start_timestamp: expect.any(Number),
8291
timestamp: spanEnvelopeItem.start_timestamp, // LCP is a point-in-time metric
83-
trace_id: expect.stringMatching(/[a-f0-9]{32}/),
92+
trace_id: pageloadTraceId,
8493
});
8594

8695
// LCP value should be greater than 0
@@ -95,7 +104,6 @@ sentryTest('captures LCP vital as a standalone span', async ({ getLocalTestUrl,
95104
sampled: 'true',
96105
trace_id: spanEnvelopeItem.trace_id,
97106
sample_rand: expect.any(String),
98-
// no transaction, because span source is URL
99107
},
100108
});
101109
});
@@ -152,10 +160,10 @@ sentryTest('sends LCP of the initial page when soft-navigating to a new page', a
152160

153161
const url = await getLocalTestUrl({ testDir: __dirname });
154162

155-
const eventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
163+
const pageloadEventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
156164

157-
expect(eventData.type).toBe('transaction');
158-
expect(eventData.contexts?.trace?.op).toBe('pageload');
165+
expect(pageloadEventData.type).toBe('transaction');
166+
expect(pageloadEventData.contexts?.trace?.op).toBe('pageload');
159167

160168
const spanEnvelopePromise = getMultipleSentryEnvelopeRequests<SpanEnvelope>(
161169
page,
@@ -173,7 +181,9 @@ sentryTest('sends LCP of the initial page when soft-navigating to a new page', a
173181
const spanEnvelopeItem = spanEnvelope[1][0][1];
174182

175183
expect(spanEnvelopeItem.measurements?.lcp?.value).toBeGreaterThan(0);
176-
expect(spanEnvelopeItem.data?.['sentry.pageload.span_id']).toMatch(/[a-f0-9]{16}/);
184+
expect(spanEnvelopeItem.data?.['sentry.pageload.span_id']).toBe(pageloadEventData.contexts?.trace?.span_id);
185+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('navigation');
186+
expect(spanEnvelopeItem.trace_id).toBe(pageloadEventData.contexts?.trace?.trace_id);
177187
});
178188

179189
sentryTest("doesn't send further LCP after the first navigation", async ({ getLocalTestUrl, page }) => {
@@ -186,10 +196,10 @@ sentryTest("doesn't send further LCP after the first navigation", async ({ getLo
186196

187197
const url = await getLocalTestUrl({ testDir: __dirname });
188198

189-
const eventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
199+
const pageloadEventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
190200

191-
expect(eventData.type).toBe('transaction');
192-
expect(eventData.contexts?.trace?.op).toBe('pageload');
201+
expect(pageloadEventData.type).toBe('transaction');
202+
expect(pageloadEventData.contexts?.trace?.op).toBe('pageload');
193203

194204
const spanEnvelopePromise = getMultipleSentryEnvelopeRequests<SpanEnvelope>(
195205
page,
@@ -206,6 +216,8 @@ sentryTest("doesn't send further LCP after the first navigation", async ({ getLo
206216
const spanEnvelope = (await spanEnvelopePromise)[0];
207217
const spanEnvelopeItem = spanEnvelope[1][0][1];
208218
expect(spanEnvelopeItem.measurements?.lcp?.value).toBeGreaterThan(0);
219+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('navigation');
220+
expect(spanEnvelopeItem.trace_id).toBe(pageloadEventData.contexts?.trace?.trace_id);
209221

210222
getMultipleSentryEnvelopeRequests<SpanEnvelope>(page, 1, { envelopeType: 'span' }, () => {
211223
throw new Error('Unexpected span - This should not happen!');
@@ -238,10 +250,10 @@ sentryTest("doesn't send further LCP after the first page hide", async ({ getLoc
238250

239251
const url = await getLocalTestUrl({ testDir: __dirname });
240252

241-
const eventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
253+
const pageloadEventData = await getFirstSentryEnvelopeRequest<SentryEvent>(page, url);
242254

243-
expect(eventData.type).toBe('transaction');
244-
expect(eventData.contexts?.trace?.op).toBe('pageload');
255+
expect(pageloadEventData.type).toBe('transaction');
256+
expect(pageloadEventData.contexts?.trace?.op).toBe('pageload');
245257

246258
const spanEnvelopePromise = getMultipleSentryEnvelopeRequests<SpanEnvelope>(
247259
page,
@@ -258,6 +270,8 @@ sentryTest("doesn't send further LCP after the first page hide", async ({ getLoc
258270
const spanEnvelope = (await spanEnvelopePromise)[0];
259271
const spanEnvelopeItem = spanEnvelope[1][0][1];
260272
expect(spanEnvelopeItem.measurements?.lcp?.value).toBeGreaterThan(0);
273+
expect(spanEnvelopeItem.data?.['sentry.report_event']).toBe('pagehide');
274+
expect(spanEnvelopeItem.trace_id).toBe(pageloadEventData.contexts?.trace?.trace_id);
261275

262276
getMultipleSentryEnvelopeRequests<SpanEnvelope>(page, 1, { envelopeType: 'span' }, () => {
263277
throw new Error('Unexpected span - This should not happen!');

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.36.0",
3+
"version": "9.37.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.36.0",
4+
"version": "9.37.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.36.0",
3+
"version": "9.37.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.36.0",
4+
"version": "9.37.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.36.0",
3+
"version": "9.37.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.36.0",
38-
"@sentry/node-core": "9.36.0",
37+
"@sentry/core": "9.37.0",
38+
"@sentry/node-core": "9.37.0",
3939
"body-parser": "^1.20.3",
4040
"cors": "^2.8.5",
4141
"cron": "^3.1.6",

0 commit comments

Comments
 (0)