Skip to content

Commit e730bc2

Browse files
authored
Merge pull request #15454 from getsentry/prepare-release/9.2.0
meta: Update changelog for 9.2.0
2 parents 82598f5 + 12425e2 commit e730bc2

File tree

217 files changed

+6304
-739
lines changed

Some content is hidden

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

217 files changed

+6304
-739
lines changed

.size-limit.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ module.exports = [
5454
path: 'packages/browser/build/npm/esm/index.js',
5555
import: createImport('init', 'browserTracingIntegration', 'replayIntegration'),
5656
gzip: true,
57-
limit: '68 KB',
57+
limit: '70 KB',
5858
modifyWebpackConfig: function (config) {
5959
const webpack = require('webpack');
6060
const TerserPlugin = require('terser-webpack-plugin');
@@ -210,7 +210,7 @@ module.exports = [
210210
import: createImport('init'),
211211
ignore: ['next/router', 'next/constants'],
212212
gzip: true,
213-
limit: '40 KB',
213+
limit: '41 KB',
214214
},
215215
// SvelteKit SDK (ESM)
216216
{

CHANGELOG.md

+40
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,46 @@
1010

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

13+
## 9.2.0
14+
15+
### Important Changes
16+
17+
- **feat(node): Support Express v5 ([#15380](https://github.com/getsentry/sentry-javascript/pull/15380))**
18+
19+
This release adds full tracing support for Express v5, and improves tracing support for Nest.js 11 (which uses Express v5) in the Nest.js SDK.
20+
21+
- **feat(sveltekit): Add Support for Cloudflare ([#14672](https://github.com/getsentry/sentry-javascript/pull/14672))**
22+
23+
This release adds support for deploying SvelteKit applications to Cloudflare Pages.
24+
A docs update with updated instructions will follow shortly.
25+
Until then, you can give this a try by setting up the SvelteKit SDK as usual and then following the instructions outlined in the PR.
26+
27+
Thank you @SG60 for contributing this feature!
28+
29+
### Other Changes
30+
31+
- feat(core): Add `addLink(s)` to Sentry span ([#15452](https://github.com/getsentry/sentry-javascript/pull/15452))
32+
- feat(core): Add links to span options ([#15453](https://github.com/getsentry/sentry-javascript/pull/15453))
33+
- feat(deps): Bump @sentry/webpack-plugin from 2.22.7 to 3.1.2 ([#15328](https://github.com/getsentry/sentry-javascript/pull/15328))
34+
- feat(feedback): Disable Feedback submit & cancel buttons while submitting ([#15408](https://github.com/getsentry/sentry-javascript/pull/15408))
35+
- feat(nextjs): Add experimental flag to not strip origin information from different origin stack frames ([#15418](https://github.com/getsentry/sentry-javascript/pull/15418))
36+
- feat(nuxt): Add `enableNitroErrorHandler` to server options ([#15444](https://github.com/getsentry/sentry-javascript/pull/15444))
37+
- feat(opentelemetry): Add `addLink(s)` to span ([#15387](https://github.com/getsentry/sentry-javascript/pull/15387))
38+
- feat(opentelemetry): Add `links` to span options ([#15403](https://github.com/getsentry/sentry-javascript/pull/15403))
39+
- feat(replay): Expose rrweb recordCrossOriginIframes under \_experiments ([#14916](https://github.com/getsentry/sentry-javascript/pull/14916))
40+
- fix(browser): Ensure that `performance.measure` spans have a positive duration ([#15415](https://github.com/getsentry/sentry-javascript/pull/15415))
41+
- fix(bun): Includes correct sdk metadata ([#15459](https://github.com/getsentry/sentry-javascript/pull/15459))
42+
- fix(core): Add Google `gmo` error to Inbound Filters ([#15432](https://github.com/getsentry/sentry-javascript/pull/15432))
43+
- fix(core): Ensure `http.client` span descriptions don't contain query params or fragments ([#15404](https://github.com/getsentry/sentry-javascript/pull/15404))
44+
- fix(core): Filter out unactionable Facebook Mobile browser error ([#15430](https://github.com/getsentry/sentry-javascript/pull/15430))
45+
- fix(nestjs): Pin dependency on `@opentelemetry/instrumentation` ([#15419](https://github.com/getsentry/sentry-javascript/pull/15419))
46+
- fix(nuxt): Only use filename with file extension from command ([#15445](https://github.com/getsentry/sentry-javascript/pull/15445))
47+
- fix(nuxt): Use `SentryNuxtServerOptions` type for server init ([#15441](https://github.com/getsentry/sentry-javascript/pull/15441))
48+
- fix(sveltekit): Avoid loading vite config to determine source maps setting ([#15440](https://github.com/getsentry/sentry-javascript/pull/15440))
49+
- ref(profiling-node): Bump chunk interval to 60s ([#15361](https://github.com/getsentry/sentry-javascript/pull/15361))
50+
51+
Work in this release was contributed by @6farer, @dgavranic and @SG60. Thank you for your contributions!
52+
1353
## 9.1.0
1454

1555
- feat(browser): Add `graphqlClientIntegration` ([#13783](https://github.com/getsentry/sentry-javascript/pull/13783))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
integrations: [],
8+
tracesSampleRate: 1,
9+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// REGULAR ---
2+
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
3+
rootSpan1.end();
4+
5+
Sentry.startSpan({ name: 'rootSpan2' }, rootSpan2 => {
6+
rootSpan2.addLink({
7+
context: rootSpan1.spanContext(),
8+
attributes: { 'sentry.link.type': 'previous_trace' },
9+
});
10+
});
11+
12+
// NESTED ---
13+
Sentry.startSpan({ name: 'rootSpan3' }, async rootSpan3 => {
14+
Sentry.startSpan({ name: 'childSpan3.1' }, async childSpan1 => {
15+
childSpan1.addLink({
16+
context: rootSpan1.spanContext(),
17+
attributes: { 'sentry.link.type': 'previous_trace' },
18+
});
19+
20+
childSpan1.end();
21+
});
22+
23+
Sentry.startSpan({ name: 'childSpan3.2' }, async childSpan2 => {
24+
childSpan2.addLink({ context: rootSpan3.spanContext() });
25+
26+
childSpan2.end();
27+
});
28+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { expect } from '@playwright/test';
2+
import type { SpanJSON, TransactionEvent } from '@sentry/core';
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../utils/helpers';
5+
6+
sentryTest('should link spans with addLink() in trace context', async ({ getLocalTestUrl, page }) => {
7+
if (shouldSkipTracingTest()) {
8+
sentryTest.skip();
9+
}
10+
11+
const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
12+
const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');
13+
14+
const url = await getLocalTestUrl({ testDir: __dirname });
15+
await page.goto(url);
16+
17+
const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
18+
const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);
19+
20+
const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
21+
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;
22+
23+
expect(rootSpan1.transaction).toBe('rootSpan1');
24+
expect(rootSpan1.spans).toEqual([]);
25+
26+
expect(rootSpan2.transaction).toBe('rootSpan2');
27+
expect(rootSpan2.spans).toEqual([]);
28+
29+
expect(rootSpan2.contexts?.trace?.links?.length).toBe(1);
30+
expect(rootSpan2.contexts?.trace?.links?.[0]).toMatchObject({
31+
attributes: { 'sentry.link.type': 'previous_trace' },
32+
sampled: true,
33+
span_id: rootSpan1_spanId,
34+
trace_id: rootSpan1_traceId,
35+
});
36+
});
37+
38+
sentryTest('should link spans with addLink() in nested startSpan() calls', async ({ getLocalTestUrl, page }) => {
39+
if (shouldSkipTracingTest()) {
40+
sentryTest.skip();
41+
}
42+
43+
const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
44+
const rootSpan3Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan3');
45+
46+
const url = await getLocalTestUrl({ testDir: __dirname });
47+
await page.goto(url);
48+
49+
const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
50+
const rootSpan3 = envelopeRequestParser<TransactionEvent>(await rootSpan3Promise);
51+
52+
const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
53+
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;
54+
55+
const [childSpan_3_1, childSpan_3_2] = rootSpan3.spans as [SpanJSON, SpanJSON];
56+
const rootSpan3_traceId = rootSpan3.contexts?.trace?.trace_id as string;
57+
const rootSpan3_spanId = rootSpan3.contexts?.trace?.span_id as string;
58+
59+
expect(rootSpan3.transaction).toBe('rootSpan3');
60+
61+
expect(childSpan_3_1.description).toBe('childSpan3.1');
62+
expect(childSpan_3_1.links?.length).toBe(1);
63+
expect(childSpan_3_1.links?.[0]).toMatchObject({
64+
attributes: { 'sentry.link.type': 'previous_trace' },
65+
sampled: true,
66+
span_id: rootSpan1_spanId,
67+
trace_id: rootSpan1_traceId,
68+
});
69+
70+
expect(childSpan_3_2.description).toBe('childSpan3.2');
71+
expect(childSpan_3_2.links?.[0]).toMatchObject({
72+
sampled: true,
73+
span_id: rootSpan3_spanId,
74+
trace_id: rootSpan3_traceId,
75+
});
76+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
integrations: [],
8+
tracesSampleRate: 1,
9+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// REGULAR ---
2+
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
3+
rootSpan1.end();
4+
5+
const rootSpan2 = Sentry.startInactiveSpan({ name: 'rootSpan2' });
6+
rootSpan2.end();
7+
8+
Sentry.startSpan({ name: 'rootSpan3' }, rootSpan3 => {
9+
rootSpan3.addLinks([
10+
{ context: rootSpan1.spanContext() },
11+
{
12+
context: rootSpan2.spanContext(),
13+
attributes: { 'sentry.link.type': 'previous_trace' },
14+
},
15+
]);
16+
});
17+
18+
// NESTED ---
19+
Sentry.startSpan({ name: 'rootSpan4' }, async rootSpan4 => {
20+
Sentry.startSpan({ name: 'childSpan4.1' }, async childSpan1 => {
21+
Sentry.startSpan({ name: 'childSpan4.2' }, async childSpan2 => {
22+
childSpan2.addLinks([
23+
{ context: rootSpan4.spanContext() },
24+
{
25+
context: rootSpan2.spanContext(),
26+
attributes: { 'sentry.link.type': 'previous_trace' },
27+
},
28+
]);
29+
30+
childSpan2.end();
31+
});
32+
33+
childSpan1.end();
34+
});
35+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { expect } from '@playwright/test';
2+
import type { SpanJSON, TransactionEvent } from '@sentry/core';
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../utils/helpers';
5+
6+
sentryTest('should link spans with addLinks() in trace context', async ({ getLocalTestUrl, page }) => {
7+
if (shouldSkipTracingTest()) {
8+
sentryTest.skip();
9+
}
10+
11+
const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
12+
const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');
13+
const rootSpan3Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan3');
14+
15+
const url = await getLocalTestUrl({ testDir: __dirname });
16+
await page.goto(url);
17+
18+
const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
19+
const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);
20+
const rootSpan3 = envelopeRequestParser<TransactionEvent>(await rootSpan3Promise);
21+
22+
const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
23+
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;
24+
25+
expect(rootSpan1.transaction).toBe('rootSpan1');
26+
expect(rootSpan1.spans).toEqual([]);
27+
28+
const rootSpan2_traceId = rootSpan2.contexts?.trace?.trace_id as string;
29+
const rootSpan2_spanId = rootSpan2.contexts?.trace?.span_id as string;
30+
31+
expect(rootSpan2.transaction).toBe('rootSpan2');
32+
expect(rootSpan2.spans).toEqual([]);
33+
34+
expect(rootSpan3.transaction).toBe('rootSpan3');
35+
expect(rootSpan3.spans).toEqual([]);
36+
expect(rootSpan3.contexts?.trace?.links?.length).toBe(2);
37+
expect(rootSpan3.contexts?.trace?.links).toEqual([
38+
{
39+
sampled: true,
40+
span_id: rootSpan1_spanId,
41+
trace_id: rootSpan1_traceId,
42+
},
43+
{
44+
attributes: { 'sentry.link.type': 'previous_trace' },
45+
sampled: true,
46+
span_id: rootSpan2_spanId,
47+
trace_id: rootSpan2_traceId,
48+
},
49+
]);
50+
});
51+
52+
sentryTest('should link spans with addLinks() in nested startSpan() calls', async ({ getLocalTestUrl, page }) => {
53+
if (shouldSkipTracingTest()) {
54+
sentryTest.skip();
55+
}
56+
57+
const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');
58+
const rootSpan4Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan4');
59+
60+
const url = await getLocalTestUrl({ testDir: __dirname });
61+
await page.goto(url);
62+
63+
const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);
64+
const rootSpan4 = envelopeRequestParser<TransactionEvent>(await rootSpan4Promise);
65+
66+
const rootSpan2_traceId = rootSpan2.contexts?.trace?.trace_id as string;
67+
const rootSpan2_spanId = rootSpan2.contexts?.trace?.span_id as string;
68+
69+
const [childSpan_4_1, childSpan_4_2] = rootSpan4.spans as [SpanJSON, SpanJSON];
70+
const rootSpan4_traceId = rootSpan4.contexts?.trace?.trace_id as string;
71+
const rootSpan4_spanId = rootSpan4.contexts?.trace?.span_id as string;
72+
73+
expect(rootSpan4.transaction).toBe('rootSpan4');
74+
75+
expect(childSpan_4_1.description).toBe('childSpan4.1');
76+
expect(childSpan_4_1.links).toBe(undefined);
77+
78+
expect(childSpan_4_2.description).toBe('childSpan4.2');
79+
expect(childSpan_4_2.links?.length).toBe(2);
80+
expect(childSpan_4_2.links).toEqual([
81+
{
82+
sampled: true,
83+
span_id: rootSpan4_spanId,
84+
trace_id: rootSpan4_traceId,
85+
},
86+
{
87+
attributes: { 'sentry.link.type': 'previous_trace' },
88+
sampled: true,
89+
span_id: rootSpan2_spanId,
90+
trace_id: rootSpan2_traceId,
91+
},
92+
]);
93+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
integrations: [],
8+
tracesSampleRate: 1,
9+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
2+
rootSpan1.end();
3+
4+
const rootSpan2 = Sentry.startInactiveSpan({ name: 'rootSpan2' });
5+
rootSpan2.end();
6+
7+
Sentry.startSpan(
8+
{
9+
name: 'rootSpan3',
10+
links: [
11+
{ context: rootSpan1.spanContext() },
12+
{ context: rootSpan2.spanContext(), attributes: { 'sentry.link.type': 'previous_trace' } },
13+
],
14+
},
15+
async () => {
16+
Sentry.startSpan({ name: 'childSpan3.1' }, async childSpan1 => {
17+
childSpan1.end();
18+
});
19+
},
20+
);

0 commit comments

Comments
 (0)