Skip to content
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

meta: Update changelog for 9.2.0 #15454

Draft
wants to merge 28 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 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
b45cab5
meta: Update changelog for 9.2.0
Lms24 Feb 20, 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: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,10 @@ jobs:
with:
dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }}

- name: Build `libpq`
run: yarn libpq:build
working-directory: dev-packages/node-integration-tests

- name: Overwrite typescript version
if: matrix.typescript == '3.8'
run: node ./scripts/use-ts-3_8.js
Expand Down
2 changes: 1 addition & 1 deletion .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
37 changes: 37 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,43 @@

- "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(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(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,11 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;

Sentry.init({
dsn: 'https://public@dsn.ingest.sentry.io/1337',
integrations: [Sentry.browserTracingIntegration({ instrumentPageLoad: false, instrumentNavigation: false })],
tracePropagationTargets: ['http://sentry-test-site.example'],
tracesSampleRate: 1,
autoSessionTracking: false,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
function withRootSpan(cb) {
return Sentry.startSpan({ name: 'rootSpan' }, cb);
}

document.getElementById('btnQuery').addEventListener('click', async () => {
await withRootSpan(() => fetch('http://sentry-test-site.example/0?id=123;page=5'));
});

document.getElementById('btnFragment').addEventListener('click', async () => {
await withRootSpan(() => fetch('http://sentry-test-site.example/1#fragment'));
});

document.getElementById('btnQueryFragment').addEventListener('click', async () => {
await withRootSpan(() => fetch('http://sentry-test-site.example/2?id=1#fragment'));
});

document.getElementById('btnQueryFragmentSameOrigin').addEventListener('click', async () => {
await withRootSpan(() => fetch('/api/users?id=1#fragment'));
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<button id="btnQuery">Request with query</button>
<button id="btnFragment">Request with fragment</button>
<button id="btnQueryFragment">Request with query and fragment</button>
<button id="btnQueryFragmentSameOrigin">Request with query and fragment</button>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import { expect } from '@playwright/test';
import { sentryTest } from '../../../../utils/fixtures';
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../utils/helpers';

sentryTest('strips query params in fetch request spans', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' }));

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

await page.goto(url);

const txnPromise = waitForTransactionRequest(page);
await page.locator('#btnQuery').click();
const transactionEvent = envelopeRequestParser(await txnPromise);

expect(transactionEvent.transaction).toEqual('rootSpan');

const requestSpan = transactionEvent.spans?.find(({ op }) => op === 'http.client');

expect(requestSpan).toMatchObject({
description: 'GET http://sentry-test-site.example/0',
parent_span_id: transactionEvent.contexts?.trace?.span_id,
span_id: expect.stringMatching(/[a-f0-9]{16}/),
start_timestamp: expect.any(Number),
timestamp: expect.any(Number),
trace_id: transactionEvent.contexts?.trace?.trace_id,
data: expect.objectContaining({
'http.method': 'GET',
'http.url': 'http://sentry-test-site.example/0?id=123;page=5',
'http.query': '?id=123;page=5',
'http.response.status_code': 200,
'http.response_content_length': 2,
'sentry.op': 'http.client',
'sentry.origin': 'auto.http.browser',
type: 'fetch',
'server.address': 'sentry-test-site.example',
url: 'http://sentry-test-site.example/0?id=123;page=5',
}),
});

expect(requestSpan?.data).not.toHaveProperty('http.fragment');
});

sentryTest('strips hash fragment in fetch request spans', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' }));

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

await page.goto(url);

const txnPromise = waitForTransactionRequest(page);
await page.locator('#btnFragment').click();
const transactionEvent = envelopeRequestParser(await txnPromise);

expect(transactionEvent.transaction).toEqual('rootSpan');

const requestSpan = transactionEvent.spans?.find(({ op }) => op === 'http.client');

expect(requestSpan).toMatchObject({
description: 'GET http://sentry-test-site.example/1',
parent_span_id: transactionEvent.contexts?.trace?.span_id,
span_id: expect.stringMatching(/[a-f0-9]{16}/),
start_timestamp: expect.any(Number),
timestamp: expect.any(Number),
trace_id: transactionEvent.contexts?.trace?.trace_id,
data: expect.objectContaining({
'http.method': 'GET',
'http.url': 'http://sentry-test-site.example/1#fragment',
'http.fragment': '#fragment',
'http.response.status_code': 200,
'http.response_content_length': 2,
'sentry.op': 'http.client',
'sentry.origin': 'auto.http.browser',
type: 'fetch',
'server.address': 'sentry-test-site.example',
url: 'http://sentry-test-site.example/1#fragment',
}),
});

expect(requestSpan?.data).not.toHaveProperty('http.query');
});

sentryTest('strips hash fragment and query params in fetch request spans', async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' }));

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

await page.goto(url);

const txnPromise = waitForTransactionRequest(page);
await page.locator('#btnQueryFragment').click();
const transactionEvent = envelopeRequestParser(await txnPromise);

expect(transactionEvent.transaction).toEqual('rootSpan');

const requestSpan = transactionEvent.spans?.find(({ op }) => op === 'http.client');

expect(requestSpan).toMatchObject({
description: 'GET http://sentry-test-site.example/2',
parent_span_id: transactionEvent.contexts?.trace?.span_id,
span_id: expect.stringMatching(/[a-f0-9]{16}/),
start_timestamp: expect.any(Number),
timestamp: expect.any(Number),
trace_id: transactionEvent.contexts?.trace?.trace_id,
data: expect.objectContaining({
'http.method': 'GET',
'http.url': 'http://sentry-test-site.example/2?id=1#fragment',
'http.query': '?id=1',
'http.fragment': '#fragment',
'http.response.status_code': 200,
'http.response_content_length': 2,
'sentry.op': 'http.client',
'sentry.origin': 'auto.http.browser',
type: 'fetch',
'server.address': 'sentry-test-site.example',
url: 'http://sentry-test-site.example/2?id=1#fragment',
}),
});
});

sentryTest(
'strips hash fragment and query params in same-origin fetch request spans',
async ({ getLocalTestUrl, page }) => {
if (shouldSkipTracingTest()) {
sentryTest.skip();
}

await page.route('**/*', route => route.fulfill({ body: 'ok' }));

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

await page.goto(url);

const txnPromise = waitForTransactionRequest(page);
await page.locator('#btnQueryFragmentSameOrigin').click();
const transactionEvent = envelopeRequestParser(await txnPromise);

expect(transactionEvent.transaction).toEqual('rootSpan');

const requestSpan = transactionEvent.spans?.find(({ op }) => op === 'http.client');

expect(requestSpan).toMatchObject({
description: 'GET /api/users',
parent_span_id: transactionEvent.contexts?.trace?.span_id,
span_id: expect.stringMatching(/[a-f0-9]{16}/),
start_timestamp: expect.any(Number),
timestamp: expect.any(Number),
trace_id: transactionEvent.contexts?.trace?.trace_id,
data: expect.objectContaining({
'http.method': 'GET',
'http.url': 'http://sentry-test.io/api/users?id=1#fragment',
'http.query': '?id=1',
'http.fragment': '#fragment',
'http.response.status_code': 200,
'http.response_content_length': 2,
'sentry.op': 'http.client',
'sentry.origin': 'auto.http.browser',
type: 'fetch',
'server.address': 'sentry-test.io',
url: '/api/users?id=1#fragment',
}),
});
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;

Sentry.init({
dsn: 'https://public@dsn.ingest.sentry.io/1337',
integrations: [Sentry.browserTracingIntegration({ instrumentPageLoad: false, instrumentNavigation: false })],
tracePropagationTargets: ['http://sentry-test-site.example'],
tracesSampleRate: 1,
autoSessionTracking: false,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
function withRootSpan(cb) {
return Sentry.startSpan({ name: 'rootSpan' }, cb);
}

function makeXHRRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}

document.getElementById('btnQuery').addEventListener('click', async () => {
await withRootSpan(() => makeXHRRequest('http://sentry-test-site.example/0?id=123;page=5'));
});

document.getElementById('btnFragment').addEventListener('click', async () => {
await withRootSpan(() => makeXHRRequest('http://sentry-test-site.example/1#fragment'));
});

document.getElementById('btnQueryFragment').addEventListener('click', async () => {
await withRootSpan(() => makeXHRRequest('http://sentry-test-site.example/2?id=1#fragment'));
});

document.getElementById('btnQueryFragmentSameOrigin').addEventListener('click', async () => {
await withRootSpan(() => makeXHRRequest('/api/users?id=1#fragment'));
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<button id="btnQuery">Request with query</button>
<button id="btnFragment">Request with fragment</button>
<button id="btnQueryFragment">Request with query and fragment</button>
<button id="btnQueryFragmentSameOrigin">Same origin request with query and fragment</button>
</body>
</html>
Loading
Loading