Skip to content

meta: Update changelog for 9.2.0 #15454

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 33 commits into from
Feb 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b433821
test(node): Run Prisma docker containers via test runner (#15402)
timfish Feb 13, 2025
50f89f1
feat(feedback): Disable Feedback submit & cancel buttons while submit…
ryan953 Feb 13, 2025
7d4e1e9
test(node): Extend timeouts for Prisma tests (#15413)
timfish Feb 14, 2025
e991a5f
Merge pull request #15401 from getsentry/master
github-actions[bot] Feb 14, 2025
f67fa79
fix(browser): Ensure that `performance.measure` spans have a positive…
lforst Feb 14, 2025
7931097
fix(nestjs): Pin dependency on @opentelemetry/instrumentation (#15419)
chargome Feb 14, 2025
f92f39b
chore(docs): Remove references to typedocs (#15412)
chargome Feb 15, 2025
5e6b852
feat(opentelemetry): Add `addLink(s)` to span (#15387)
s1gr1d Feb 17, 2025
6e6f85b
fix(core): Ensure `http.client` span descriptions don't contain query…
Lms24 Feb 17, 2025
abb37a3
chore(deps): bump esbuild from 0.20.0 to 0.25.0 in /dev-packages/e2e-…
dependabot[bot] Feb 17, 2025
6363e75
feat(opentelemetry): Add `links` to span options (#15403)
s1gr1d Feb 17, 2025
5aca7ca
fix(core): Filter out unactionable Facebook Mobile browser error (#15…
Lms24 Feb 17, 2025
136370c
fix(core): Add Google `gmo` error to Inbound Filters (#15432)
s1gr1d Feb 17, 2025
da8ba8d
profiling: bump chunk interval to 60s (#15361)
JonasBa Feb 18, 2025
8fc56d8
feat(deps): Bump @sentry/webpack-plugin from 2.22.7 to 3.1.2 (#15328)
dependabot[bot] Feb 18, 2025
eaffd72
fix(nuxt): Use `SentryNuxtServerOptions` type for server init (#15441)
s1gr1d Feb 19, 2025
d42d04f
feat(nuxt): Add `enableNitroErrorHandler` to server options (#15444)
s1gr1d Feb 19, 2025
adca0f5
fix(nuxt): Only use filename with file extension from command (#15445)
s1gr1d Feb 19, 2025
a0be1a5
feat(replay): Expose rrweb recordCrossOriginIframes under _experiment…
dgavranic Feb 19, 2025
6c69710
fix(sveltekit): Avoid loading vite config to determine source maps se…
Lms24 Feb 20, 2025
d804dd4
chore(profiling-node): Remove duplicate types (#15427)
timfish Feb 20, 2025
1aa5bbe
feat(node): Support Express v5 (#15380)
timfish Feb 20, 2025
e5520aa
chore(docs): Update Remix docs to use recent integrations (#15346)
6farer Feb 20, 2025
e08c640
fix(bun): Includes correct sdk metadata (#15459)
timfish Feb 20, 2025
9789f32
chore: Add external contributor to CHANGELOG.md (#15460)
HazAT Feb 20, 2025
e01a428
test(node): Add `pg-native` integration tests (#15206)
onurtemizkan Feb 20, 2025
8f9f42c
feat(sveltekit): Add Support for Cloudflare (#14672)
SG60 Feb 21, 2025
08569e6
Revert "test(node): Add `pg-native` integration tests" (#15464)
AbhiPrasad Feb 21, 2025
bac7387
feat(nextjs): Add experimental flag to not strip origin information f…
lforst Feb 24, 2025
63ea300
feat(core): Add `addLink(s)` to Sentry span (#15452)
s1gr1d Feb 24, 2025
14667ee
feat(core): Add links to span options (#15453)
s1gr1d Feb 24, 2025
48065f8
meta: Update changelog for 9.2.0
Lms24 Feb 20, 2025
12425e2
start CI please
Lms24 Feb 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'browserTracingIntegration', 'replayIntegration'),
gzip: true,
limit: '68 KB',
limit: '70 KB',
modifyWebpackConfig: function (config) {
const webpack = require('webpack');
const TerserPlugin = require('terser-webpack-plugin');
Expand Down Expand Up @@ -210,7 +210,7 @@ module.exports = [
import: createImport('init'),
ignore: ['next/router', 'next/constants'],
gzip: true,
limit: '40 KB',
limit: '41 KB',
},
// SvelteKit SDK (ESM)
{
Expand Down
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,46 @@

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

## 9.2.0

### Important Changes

- **feat(node): Support Express v5 ([#15380](https://github.com/getsentry/sentry-javascript/pull/15380))**

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.

- **feat(sveltekit): Add Support for Cloudflare ([#14672](https://github.com/getsentry/sentry-javascript/pull/14672))**

This release adds support for deploying SvelteKit applications to Cloudflare Pages.
A docs update with updated instructions will follow shortly.
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.

Thank you @SG60 for contributing this feature!

### Other Changes

- feat(core): Add `addLink(s)` to Sentry span ([#15452](https://github.com/getsentry/sentry-javascript/pull/15452))
- feat(core): Add links to span options ([#15453](https://github.com/getsentry/sentry-javascript/pull/15453))
- feat(deps): Bump @sentry/webpack-plugin from 2.22.7 to 3.1.2 ([#15328](https://github.com/getsentry/sentry-javascript/pull/15328))
- feat(feedback): Disable Feedback submit & cancel buttons while submitting ([#15408](https://github.com/getsentry/sentry-javascript/pull/15408))
- feat(nextjs): Add experimental flag to not strip origin information from different origin stack frames ([#15418](https://github.com/getsentry/sentry-javascript/pull/15418))
- feat(nuxt): Add `enableNitroErrorHandler` to server options ([#15444](https://github.com/getsentry/sentry-javascript/pull/15444))
- feat(opentelemetry): Add `addLink(s)` to span ([#15387](https://github.com/getsentry/sentry-javascript/pull/15387))
- feat(opentelemetry): Add `links` to span options ([#15403](https://github.com/getsentry/sentry-javascript/pull/15403))
- feat(replay): Expose rrweb recordCrossOriginIframes under \_experiments ([#14916](https://github.com/getsentry/sentry-javascript/pull/14916))
- fix(browser): Ensure that `performance.measure` spans have a positive duration ([#15415](https://github.com/getsentry/sentry-javascript/pull/15415))
- fix(bun): Includes correct sdk metadata ([#15459](https://github.com/getsentry/sentry-javascript/pull/15459))
- fix(core): Add Google `gmo` error to Inbound Filters ([#15432](https://github.com/getsentry/sentry-javascript/pull/15432))
- fix(core): Ensure `http.client` span descriptions don't contain query params or fragments ([#15404](https://github.com/getsentry/sentry-javascript/pull/15404))
- fix(core): Filter out unactionable Facebook Mobile browser error ([#15430](https://github.com/getsentry/sentry-javascript/pull/15430))
- fix(nestjs): Pin dependency on `@opentelemetry/instrumentation` ([#15419](https://github.com/getsentry/sentry-javascript/pull/15419))
- fix(nuxt): Only use filename with file extension from command ([#15445](https://github.com/getsentry/sentry-javascript/pull/15445))
- fix(nuxt): Use `SentryNuxtServerOptions` type for server init ([#15441](https://github.com/getsentry/sentry-javascript/pull/15441))
- fix(sveltekit): Avoid loading vite config to determine source maps setting ([#15440](https://github.com/getsentry/sentry-javascript/pull/15440))
- ref(profiling-node): Bump chunk interval to 60s ([#15361](https://github.com/getsentry/sentry-javascript/pull/15361))

Work in this release was contributed by @6farer, @dgavranic and @SG60. Thank you for your contributions!

## 9.1.0

- feat(browser): Add `graphqlClientIntegration` ([#13783](https://github.com/getsentry/sentry-javascript/pull/13783))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;

Sentry.init({
dsn: 'https://[email protected]/1337',
integrations: [],
tracesSampleRate: 1,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// REGULAR ---
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
rootSpan1.end();

Sentry.startSpan({ name: 'rootSpan2' }, rootSpan2 => {
rootSpan2.addLink({
context: rootSpan1.spanContext(),
attributes: { 'sentry.link.type': 'previous_trace' },
});
});

// NESTED ---
Sentry.startSpan({ name: 'rootSpan3' }, async rootSpan3 => {
Sentry.startSpan({ name: 'childSpan3.1' }, async childSpan1 => {
childSpan1.addLink({
context: rootSpan1.spanContext(),
attributes: { 'sentry.link.type': 'previous_trace' },
});

childSpan1.end();
});

Sentry.startSpan({ name: 'childSpan3.2' }, async childSpan2 => {
childSpan2.addLink({ context: rootSpan3.spanContext() });

childSpan2.end();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { expect } from '@playwright/test';
import type { SpanJSON, TransactionEvent } from '@sentry/core';
import { sentryTest } from '../../../utils/fixtures';
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../utils/helpers';

sentryTest('should link spans with addLink() in trace context', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');

const url = await getLocalTestUrl({ testDir: __dirname });
await page.goto(url);

const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);

const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;

expect(rootSpan1.transaction).toBe('rootSpan1');
expect(rootSpan1.spans).toEqual([]);

expect(rootSpan2.transaction).toBe('rootSpan2');
expect(rootSpan2.spans).toEqual([]);

expect(rootSpan2.contexts?.trace?.links?.length).toBe(1);
expect(rootSpan2.contexts?.trace?.links?.[0]).toMatchObject({
attributes: { 'sentry.link.type': 'previous_trace' },
sampled: true,
span_id: rootSpan1_spanId,
trace_id: rootSpan1_traceId,
});
});

sentryTest('should link spans with addLink() in nested startSpan() calls', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
const rootSpan3Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan3');

const url = await getLocalTestUrl({ testDir: __dirname });
await page.goto(url);

const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
const rootSpan3 = envelopeRequestParser<TransactionEvent>(await rootSpan3Promise);

const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;

const [childSpan_3_1, childSpan_3_2] = rootSpan3.spans as [SpanJSON, SpanJSON];
const rootSpan3_traceId = rootSpan3.contexts?.trace?.trace_id as string;
const rootSpan3_spanId = rootSpan3.contexts?.trace?.span_id as string;

expect(rootSpan3.transaction).toBe('rootSpan3');

expect(childSpan_3_1.description).toBe('childSpan3.1');
expect(childSpan_3_1.links?.length).toBe(1);
expect(childSpan_3_1.links?.[0]).toMatchObject({
attributes: { 'sentry.link.type': 'previous_trace' },
sampled: true,
span_id: rootSpan1_spanId,
trace_id: rootSpan1_traceId,
});

expect(childSpan_3_2.description).toBe('childSpan3.2');
expect(childSpan_3_2.links?.[0]).toMatchObject({
sampled: true,
span_id: rootSpan3_spanId,
trace_id: rootSpan3_traceId,
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;

Sentry.init({
dsn: 'https://[email protected]/1337',
integrations: [],
tracesSampleRate: 1,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// REGULAR ---
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
rootSpan1.end();

const rootSpan2 = Sentry.startInactiveSpan({ name: 'rootSpan2' });
rootSpan2.end();

Sentry.startSpan({ name: 'rootSpan3' }, rootSpan3 => {
rootSpan3.addLinks([
{ context: rootSpan1.spanContext() },
{
context: rootSpan2.spanContext(),
attributes: { 'sentry.link.type': 'previous_trace' },
},
]);
});

// NESTED ---
Sentry.startSpan({ name: 'rootSpan4' }, async rootSpan4 => {
Sentry.startSpan({ name: 'childSpan4.1' }, async childSpan1 => {
Sentry.startSpan({ name: 'childSpan4.2' }, async childSpan2 => {
childSpan2.addLinks([
{ context: rootSpan4.spanContext() },
{
context: rootSpan2.spanContext(),
attributes: { 'sentry.link.type': 'previous_trace' },
},
]);

childSpan2.end();
});

childSpan1.end();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { expect } from '@playwright/test';
import type { SpanJSON, TransactionEvent } from '@sentry/core';
import { sentryTest } from '../../../utils/fixtures';
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../utils/helpers';

sentryTest('should link spans with addLinks() in trace context', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const rootSpan1Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan1');
const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');
const rootSpan3Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan3');

const url = await getLocalTestUrl({ testDir: __dirname });
await page.goto(url);

const rootSpan1 = envelopeRequestParser<TransactionEvent>(await rootSpan1Promise);
const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);
const rootSpan3 = envelopeRequestParser<TransactionEvent>(await rootSpan3Promise);

const rootSpan1_traceId = rootSpan1.contexts?.trace?.trace_id as string;
const rootSpan1_spanId = rootSpan1.contexts?.trace?.span_id as string;

expect(rootSpan1.transaction).toBe('rootSpan1');
expect(rootSpan1.spans).toEqual([]);

const rootSpan2_traceId = rootSpan2.contexts?.trace?.trace_id as string;
const rootSpan2_spanId = rootSpan2.contexts?.trace?.span_id as string;

expect(rootSpan2.transaction).toBe('rootSpan2');
expect(rootSpan2.spans).toEqual([]);

expect(rootSpan3.transaction).toBe('rootSpan3');
expect(rootSpan3.spans).toEqual([]);
expect(rootSpan3.contexts?.trace?.links?.length).toBe(2);
expect(rootSpan3.contexts?.trace?.links).toEqual([
{
sampled: true,
span_id: rootSpan1_spanId,
trace_id: rootSpan1_traceId,
},
{
attributes: { 'sentry.link.type': 'previous_trace' },
sampled: true,
span_id: rootSpan2_spanId,
trace_id: rootSpan2_traceId,
},
]);
});

sentryTest('should link spans with addLinks() in nested startSpan() calls', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

const rootSpan2Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan2');
const rootSpan4Promise = waitForTransactionRequest(page, event => event.transaction === 'rootSpan4');

const url = await getLocalTestUrl({ testDir: __dirname });
await page.goto(url);

const rootSpan2 = envelopeRequestParser<TransactionEvent>(await rootSpan2Promise);
const rootSpan4 = envelopeRequestParser<TransactionEvent>(await rootSpan4Promise);

const rootSpan2_traceId = rootSpan2.contexts?.trace?.trace_id as string;
const rootSpan2_spanId = rootSpan2.contexts?.trace?.span_id as string;

const [childSpan_4_1, childSpan_4_2] = rootSpan4.spans as [SpanJSON, SpanJSON];
const rootSpan4_traceId = rootSpan4.contexts?.trace?.trace_id as string;
const rootSpan4_spanId = rootSpan4.contexts?.trace?.span_id as string;

expect(rootSpan4.transaction).toBe('rootSpan4');

expect(childSpan_4_1.description).toBe('childSpan4.1');
expect(childSpan_4_1.links).toBe(undefined);

expect(childSpan_4_2.description).toBe('childSpan4.2');
expect(childSpan_4_2.links?.length).toBe(2);
expect(childSpan_4_2.links).toEqual([
{
sampled: true,
span_id: rootSpan4_spanId,
trace_id: rootSpan4_traceId,
},
{
attributes: { 'sentry.link.type': 'previous_trace' },
sampled: true,
span_id: rootSpan2_spanId,
trace_id: rootSpan2_traceId,
},
]);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;

Sentry.init({
dsn: 'https://[email protected]/1337',
integrations: [],
tracesSampleRate: 1,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const rootSpan1 = Sentry.startInactiveSpan({ name: 'rootSpan1' });
rootSpan1.end();

const rootSpan2 = Sentry.startInactiveSpan({ name: 'rootSpan2' });
rootSpan2.end();

Sentry.startSpan(
{
name: 'rootSpan3',
links: [
{ context: rootSpan1.spanContext() },
{ context: rootSpan2.spanContext(), attributes: { 'sentry.link.type': 'previous_trace' } },
],
},
async () => {
Sentry.startSpan({ name: 'childSpan3.1' }, async childSpan1 => {
childSpan1.end();
});
},
);
Loading
Loading