Skip to content

meta(changelog): Update changelog for 9.36.0 #16854

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 23 commits into from
Jul 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d7c2aa7
Merge pull request #16813 from getsentry/master
github-actions[bot] Jul 4, 2025
e4cf7e8
chore: Add node-core craft entry (#16821)
andreiborza Jul 7, 2025
48b4129
feat(nextjs): Add flag for suppressing router transition warning (#1…
chargome Jul 7, 2025
8f2f6e7
fix(vue): Make pageload span handling more reliable (#16799)
mydea Jul 7, 2025
96e39c5
test: Run E2E tests in isolated tmp directory (#16783)
mydea Jul 7, 2025
ab6b70f
ci(deps): Bump actions/create-github-app-token from 1.12.0 to 2.0.6 (…
dependabot[bot] Jul 7, 2025
5118f59
doc(sveltekit): Streamline Readme and remove outdated information (#1…
Lms24 Jul 7, 2025
f52ab47
feat(replay): Add `_experiments.ignoreMutations` option (#16816)
mydea Jul 7, 2025
9b26cf9
feat(replay): Export compression worker from `@sentry/replay-internal…
Spice-King Jul 7, 2025
fa6138b
chore: Add external contributor to CHANGELOG.md (#16829)
HazAT Jul 7, 2025
2911b4a
feat(nextjs): Automatically skip middleware requests for tunnel route…
chargome Jul 7, 2025
85f9bd0
fix(browser): Guard against undefined nextHopProtocol (#16806)
AbhiPrasad Jul 7, 2025
36c0f26
feat(node): Deprecate ANR integration (#16832)
AbhiPrasad Jul 8, 2025
ff82f2b
feat(deps): bump @prisma/instrumentation from 6.10.1 to 6.11.1 (#16833)
dependabot[bot] Jul 8, 2025
f342341
ref(router): Align route params with semantic conventions (#16828)
s1gr1d Jul 8, 2025
868d01a
test(nuxt): Add test for distributed client-to-server request (#16788)
s1gr1d Jul 8, 2025
95c4fe3
fix(browser): Avoid 4xx response for succesful `diagnoseSdkConnectivi…
Lms24 Jul 8, 2025
64904f5
fix(cloudflare): calculate retries not attempts (#16834)
stayallive Jul 8, 2025
b746c23
fix(nuxt): Parametrize routes on the server-side (#16785)
s1gr1d Jul 8, 2025
a215bf9
chore: Add external contributor to CHANGELOG.md (#16842)
HazAT Jul 8, 2025
0727988
ref(browser-utils): Align standalone LCP span attribute setting with …
Lms24 Jul 9, 2025
8beaa4e
feat(node-core): Add node-core SDK (#16745)
andreiborza Jul 9, 2025
cab78ae
meta(changelog): Update changelog for 9.36.0
andreiborza Jul 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .craft.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ targets:
- name: npm
id: '@sentry/types'
includeNames: /^sentry-types-\d.*\.tgz$/
## 1.2 Core SDK
## 1.2 Core SDKs
- name: npm
id: '@sentry/core'
includeNames: /^sentry-core-\d.*\.tgz$/
- name: npm
id: '@sentry/node-core'
includeNames: /^sentry-node-core-\d.*\.tgz$/
## 1.3 Browser Utils package
- name: npm
id: '@sentry-internal/browser-utils'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/auto-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
steps:
- name: Get auth token
id: token
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
with:
app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }}
Expand Down
33 changes: 20 additions & 13 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -920,19 +920,23 @@ jobs:
env:
E2E_TEST_PUBLISH_SCRIPT_NODE_VERSION: ${{ steps.versions.outputs.node }}

- name: Copy to temp
run: yarn ci:copy-to-temp ./test-applications/${{ matrix.test-application }} ${{ runner.temp }}/test-application
working-directory: dev-packages/e2e-tests

- name: Build E2E app
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 7
run: pnpm ${{ matrix.build-command || 'test:build' }}

- name: Install Playwright
uses: ./.github/actions/install-playwright
with:
browsers: chromium
cwd: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
cwd: ${{ runner.temp }}/test-application

- name: Run E2E test
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 10
run: pnpm test:assert

Expand All @@ -941,7 +945,7 @@ jobs:
if: failure()
with:
name: playwright-traces-job_e2e_playwright_tests-${{ matrix.test-application}}
path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application}}/test-results
path: ${{ runner.temp }}/test-application/test-results
overwrite: true
retention-days: 7

Expand All @@ -955,7 +959,7 @@ jobs:
if: always()
with:
name: E2E Test Dump (${{ matrix.label || matrix.test-application }})
path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps
path: ${{ runner.temp }}/test-application/event-dumps
overwrite: true
retention-days: 7
if-no-files-found: ignore
Expand Down Expand Up @@ -1037,19 +1041,23 @@ jobs:
env:
E2E_TEST_PUBLISH_SCRIPT_NODE_VERSION: ${{ steps.versions.outputs.node }}

- name: Copy to temp
run: yarn ci:copy-to-temp ./test-applications/${{ matrix.test-application }} ${{ runner.temp }}/test-application
working-directory: dev-packages/e2e-tests

- name: Build E2E app
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 7
run: pnpm ${{ matrix.build-command || 'test:build' }}

- name: Install Playwright
uses: ./.github/actions/install-playwright
with:
browsers: chromium
cwd: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
cwd: ${{ runner.temp }}/test-application

- name: Run E2E test
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 10
run: pnpm ${{ matrix.assert-command || 'test:assert' }}

Expand All @@ -1063,20 +1071,19 @@ jobs:
if: always()
with:
name: E2E Test Dump (${{ matrix.label || matrix.test-application }})
path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps
path: ${{ runner.temp }}/test-application/event-dumps
overwrite: true
retention-days: 7
if-no-files-found: ignore

- name: Deploy Astro to Cloudflare
uses: cloudflare/pages-action@v1
uses: cloudflare/wrangler-action@v3
if: matrix.test-application == 'cloudflare-astro'
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }}
directory: dist
workingDirectory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
command: pages deploy dist --project-name=${{ secrets.CLOUDFLARE_PROJECT_NAME }}
workingDirectory: ${{ runner.temp }}/test-application

job_required_jobs_passed:
name: All required jobs passed or were skipped
Expand Down
10 changes: 7 additions & 3 deletions .github/workflows/canary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -153,19 +153,23 @@ jobs:
env:
E2E_TEST_PUBLISH_SCRIPT_NODE_VERSION: ${{ steps.versions.outputs.node }}

- name: Copy to temp
run: yarn ci:copy-to-temp ./test-applications/${{ matrix.test-application }} ${{ runner.temp }}/test-application
working-directory: dev-packages/e2e-tests

- name: Build E2E app
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 7
run: yarn ${{ matrix.build-command }}

- name: Install Playwright
uses: ./.github/actions/install-playwright
with:
browsers: chromium
cwd: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
cwd: ${{ runner.temp }}/test-application

- name: Run E2E test
working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}
working-directory: ${{ runner.temp }}/test-application
timeout-minutes: 15
run: yarn test:assert

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
steps:
- name: Get auth token
id: token
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
with:
app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }}
Expand Down
52 changes: 52 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,58 @@

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

## 9.36.0

### Important Changes

- **feat(node-core): Add node-core SDK ([#16745](https://github.com/getsentry/sentry-javascript/pull/16745))**

This release adds a new SDK `@sentry/node-core` which ships without any OpenTelemetry instrumententation out of the box. All OpenTelemetry dependencies are peer dependencies and OpenTelemetry has to be set up manually.

Use `@sentry/node-core` when:

- You already have OpenTelemetry set up
- You need custom OpenTelemetry configuration
- You want minimal dependencies
- You need fine-grained control over instrumentation

Use `@sentry/node` when:

- You want an automatic setup
- You're new to OpenTelemetry
- You want sensible defaults
- You prefer convenience over control

* **feat(node): Deprecate ANR integration ([#16832](https://github.com/getsentry/sentry-javascript/pull/16832))**

The ANR integration has been deprecated and will be removed in future versions. Use `eventLoopBlockIntegration` from `@sentry/node-native` instead.

- **feat(replay): Add `_experiments.ignoreMutations` option ([#16816](https://github.com/getsentry/sentry-javascript/pull/16816))**

This replay option allows to configure a selector list of elements to not capture mutations for.

```js
Sentry.replayIntegration({
_experiments: {
ignoreMutations: ['.dragging'],
},
});
```

### Other changes

- feat(deps): bump @prisma/instrumentation from 6.10.1 to 6.11.1 ([#16833](https://github.com/getsentry/sentry-javascript/pull/16833))
- feat(nextjs): Add flag for suppressing router transition warning ([#16823](https://github.com/getsentry/sentry-javascript/pull/16823))
- feat(nextjs): Automatically skip middleware requests for tunnel route ([#16812](https://github.com/getsentry/sentry-javascript/pull/16812))
- feat(replay): Export compression worker from `@sentry/replay-internal` ([#16794](https://github.com/getsentry/sentry-javascript/pull/16794))
- fix(browser): Avoid 4xx response for succesful `diagnoseSdkConnectivity` request ([#16840](https://github.com/getsentry/sentry-javascript/pull/16840))
- fix(browser): Guard against undefined nextHopProtocol ([#16806](https://github.com/getsentry/sentry-javascript/pull/16806))
- fix(cloudflare): calculate retries not attempts ([#16834](https://github.com/getsentry/sentry-javascript/pull/16834))
- fix(nuxt): Parametrize routes on the server-side ([#16785](https://github.com/getsentry/sentry-javascript/pull/16785))
- fix(vue): Make pageload span handling more reliable ([#16799](https://github.com/getsentry/sentry-javascript/pull/16799))

Work in this release was contributed by @Spice-King and @stayallive. Thank you for your contributions!

## 9.35.0

- feat(browser): Add ElementTiming instrumentation and spans ([#16589](https://github.com/getsentry/sentry-javascript/pull/16589))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import * as Sentry from '@sentry/browser';

window.Sentry = Sentry;
window.Replay = Sentry.replayIntegration({
flushMinDelay: 200,
flushMaxDelay: 200,
minReplayDuration: 0,
useCompression: false,
_experiments: {
ignoreMutations: ['.moving'],
},
});

Sentry.init({
dsn: 'https://[email protected]/1337',
sampleRate: 0,
replaysSessionSampleRate: 1.0,
replaysOnErrorSampleRate: 0.0,

integrations: [window.Replay],
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
function moveElement(el, remaining) {
if (!remaining) {
el.classList.remove('moving');

setTimeout(() => {
el.style.transform = `translate(${remaining}0px, 0)`;
el.classList.add('moved');
});
return;
}

el.style.transform = `translate(${remaining}0px, 0)`;

setTimeout(() => {
moveElement(el, remaining - 1);
}, 10);
}

const el = document.querySelector('#mutation-target');
const btn = document.querySelector('#button-move');

btn.addEventListener('click', event => {
el.classList.add('moving');
event.preventDefault();
moveElement(el, 20);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<div id="mutation-target" style="position: relative">This is moved around!</div>

<button id="button-move" type="button">Move</button>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { expect } from '@playwright/test';
import type { mutationData } from '@sentry-internal/rrweb-types';
import { sentryTest } from '../../../utils/fixtures';
import type { RecordingSnapshot } from '../../../utils/replayHelpers';
import { collectReplayRequests, shouldSkipReplayTest, waitForReplayRequest } from '../../../utils/replayHelpers';

sentryTest('allows to ignore mutations via `ignoreMutations` option', async ({ getLocalTestUrl, page }) => {
if (shouldSkipReplayTest()) {
sentryTest.skip();
}

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

const reqPromise0 = waitForReplayRequest(page, 0);

await page.goto(url);
await reqPromise0;

const requestsPromise = collectReplayRequests(page, recordingEvents => {
const events = recordingEvents as (RecordingSnapshot & { data: mutationData })[];
return events.some(event => event.data.attributes?.some(attr => attr.attributes['class'] === 'moved'));
});

page.locator('#button-move').click();

const requests = await requestsPromise;

// All transform mutatinos are ignored and not captured
const transformMutations = requests.replayRecordingSnapshots.filter(
item =>
(item.data as mutationData)?.attributes?.some(
attr => attr.attributes['style'] && attr.attributes['class'] !== 'moved',
),
);

// Should capture the final class mutation
const classMutations = requests.replayRecordingSnapshots.filter(
item => (item.data as mutationData)?.attributes?.some(attr => attr.attributes['class']),
);

expect(transformMutations).toEqual([]);
expect(classMutations).toEqual([
{
data: {
adds: [],
attributes: [
{
attributes: {
class: 'moved',
style: {
transform: 'translate(0px, 0px)',
},
},
id: expect.any(Number),
},
],
removes: [],
source: expect.any(Number),
texts: [],
},
timestamp: 0,
type: 3,
},
]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ sentryTest('captures LCP vital as a standalone span', async ({ getLocalTestUrl,
'user_agent.original': expect.stringContaining('Chrome'),
'sentry.pageload.span_id': expect.stringMatching(/[a-f0-9]{16}/),
'lcp.element': 'body > img',
'lcp.id': '',
'lcp.loadTime': expect.any(Number),
'lcp.renderTime': expect.any(Number),
'lcp.size': expect.any(Number),
Expand Down
21 changes: 21 additions & 0 deletions dev-packages/e2e-tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,24 @@ A standardized frontend test application has the following features:
### Standardized Backend Test Apps

TBD

### Standardized Frontend-to-Backend Test Apps

A standardized Meta-Framework test application has the following features:

- Has a parameterized backend API route `/user/:id` that returns a JSON object with the user ID.
- Has a parameterized frontend page (can be SSR) `/user/:id` that fetches the user data on the client-side from the API route and displays it.

This setup creates the scenario where the frontend page loads, and then immediately makes an API request to the backend API.

The following test cases for connected tracing should be implemented in the test app:

- Capturing a distributed page load trace when a page is loaded
- The HTML meta-tag should include the Sentry trace data and baggage
- The server root span should be the parent of the client pageload span
- All routes (server and client) should be parameterized, e.g. `/user/5` should be captured as `/user/:id` route
- Capturing a distributed trace when requesting the API from the client-side
- There should be three transactions involved: the client pageload, the server "pageload", and the server API request
- The client pageload should include an `http.client` span that is the parent of the server API request span
- All three transactions and the `http.client` span should share the same `trace_id`
- All `transaction` names and the `span` description should be parameterized, e.g. `/user/5` should be captured as `/user/:id` route
19 changes: 19 additions & 0 deletions dev-packages/e2e-tests/ciCopyToTemp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/* eslint-disable no-console */

import { copyToTemp } from './lib/copyToTemp';

async function run(): Promise<void> {
const originalPath = process.argv[2];
const tmpDirPath = process.argv[3];

if (!originalPath || !tmpDirPath) {
throw new Error('Original path and tmp dir path are required');
}

console.log(`Copying ${originalPath} to ${tmpDirPath}...`);

await copyToTemp(originalPath, tmpDirPath);
}

// eslint-disable-next-line @typescript-eslint/no-floating-promises
run();
Loading
Loading