Skip to content

Commit 79c52f8

Browse files
authored
Merge pull request #24562 from getsentry/changelog-11.0.0-rc.1
meta(changelog): Update changelog for 11.0.0-rc.1
2 parents 560b8ee + f2dfbe1 commit 79c52f8

332 files changed

Lines changed: 9105 additions & 3843 deletions

File tree

Some content is hidden

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

‎.github/workflows/build.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,10 +1040,7 @@ jobs:
10401040
use-installer: true
10411041
token: ${{ secrets.GITHUB_TOKEN }}
10421042
- name: Set up Deno
1043-
if:
1044-
matrix.test-application == 'deno' || matrix.test-application == 'deno-static' || matrix.test-application ==
1045-
'deno-redis' || matrix.test-application == 'hono-4' || matrix.test-application == 'deno-mysql' ||
1046-
matrix.test-application == 'deno-pg'
1043+
if: matrix.test-application == 'deno' || matrix.test-application == 'hono-4'
10471044
uses: denoland/setup-deno@v2.0.5
10481045
with:
10491046
deno-version: ${{ matrix.deno-version || 'v2.8.3' }}
@@ -1150,6 +1147,9 @@ jobs:
11501147
E2E_TEST_SENTRY_ORG_SLUG: 'sentry-javascript-sdks'
11511148
E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests'
11521149
E2E_OPENROUTER_API_KEY: ${{ secrets.E2E_OPENROUTER_API_KEY }}
1150+
# Used by test apps that deploy a real Cloudflare Worker, e.g. cloudflare-workers-send-to-sentry
1151+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
1152+
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
11531153
strategy:
11541154
fail-fast: false
11551155
matrix: ${{ fromJson(needs.job_build.outputs.e2e-matrix-optional) }}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: 'Automation: Cleanup E2E workers'
2+
on:
3+
pull_request:
4+
types:
5+
- closed
6+
7+
jobs:
8+
cleanup:
9+
# The optional E2E job deploys only for PRs from this repository, so forks never have a worker to delete.
10+
if: github.event.pull_request.head.repo.full_name == github.repository
11+
runs-on: ubuntu-latest
12+
permissions: {}
13+
timeout-minutes: 5
14+
env:
15+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
16+
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
17+
strategy:
18+
matrix:
19+
# Name prefix of every E2E app that deploys a real worker, see the app's global-setup.mjs
20+
worker-prefix:
21+
- e2e-send-to-sentry
22+
steps:
23+
- name: Set up Node
24+
uses: actions/setup-node@v7
25+
with:
26+
node-version: 24
27+
28+
- name: Delete worker
29+
run: |
30+
WORKER="${{ matrix.worker-prefix }}-pr-${{ github.event.pull_request.number }}"
31+
32+
if ! output=$(npx --yes wrangler@4 delete --name "$WORKER" --force 2>&1); then
33+
echo "$output"
34+
# 10007 means the worker does not exist, i.e. the PR never ran the optional E2E job.
35+
echo "$output" | grep -q 'code: 10007' || exit 1
36+
fi

‎CHANGELOG.md‎

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

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

7+
## 11.0.0-rc.1
8+
9+
### Important Changes
10+
11+
- **feat(browser)!: Report `browser.navigation.type` exactly as web-vitals does ([#24479](https://github.com/getsentry/sentry-javascript/pull/24479))**
12+
13+
The `browser.navigation.type` attribute now reports the same values as the `web-vitals` library.
14+
15+
- **feat(core): consolidate fetch integrations ([#24346](https://github.com/getsentry/sentry-javascript/pull/24346))**
16+
17+
The global-`fetch` integrations in `@sentry/bun`, `@sentry/cloudflare`, `@sentry/deno` and `@sentry/vercel-edge` now share one implementation. All four gain a `tracePropagation` option (default `true`) to stop injecting `sentry-trace` and `baggage` without also turning off spans. In `@sentry/deno`, fetch breadcrumbs are now recorded by `fetchIntegration` instead of `breadcrumbsIntegration`, matching the other runtime SDKs.
18+
19+
- **feat(node): Add Groq and Together AI integrations ([#24454](https://github.com/getsentry/sentry-javascript/pull/24454))**
20+
21+
Adds instrumentation for the Groq and Together AI SDKs, enabled by default.
22+
23+
- **ref(bundler-plugins)!: Require webpack 5.1 and remove the `webpack5` entry point ([#24455](https://github.com/getsentry/sentry-javascript/pull/24455))**
24+
25+
The Sentry webpack plugin now requires webpack `>=5.1` and is only exported from the package root.
26+
27+
### Other Changes
28+
29+
- feat(cloudflare): Auto-register Flue instrumentation in bundled workers ([#24476](https://github.com/getsentry/sentry-javascript/pull/24476))
30+
- feat(deps): bump devalue from 5.9.0 to 5.9.2 ([#24486](https://github.com/getsentry/sentry-javascript/pull/24486))
31+
- feat(node): Add eveInstrumentation and eveIntegration for eve apps ([#24539](https://github.com/getsentry/sentry-javascript/pull/24539))
32+
- feat(remix): Upload source maps from the Vite plugin ([#24463](https://github.com/getsentry/sentry-javascript/pull/24463))
33+
- fix: Remove by accident exported convention ([#24542](https://github.com/getsentry/sentry-javascript/pull/24542))
34+
- fix(bun): Respect caller-supplied `runtime` option ([#24487](https://github.com/getsentry/sentry-javascript/pull/24487))
35+
- fix(cloudflare): Capture telemetry from untraced Durable Object RPC calls ([#24447](https://github.com/getsentry/sentry-javascript/pull/24447))
36+
- fix(cloudflare): Instrument namespaces returned by jurisdiction() ([#24450](https://github.com/getsentry/sentry-javascript/pull/24450))
37+
- fix(core): Apply the sensitive denylist to cookie headers and configured fetch headers ([#24090](https://github.com/getsentry/sentry-javascript/pull/24090))
38+
- fix(core): correct MCP error and request attribution ([#24493](https://github.com/getsentry/sentry-javascript/pull/24493))
39+
- fix(core): instrument MCP transports before start ([#23978](https://github.com/getsentry/sentry-javascript/pull/23978))
40+
- fix(core): Stop sending client reports for breadcrumbs ([#24537](https://github.com/getsentry/sentry-javascript/pull/24537))
41+
- fix(ember): Add route IDs to pageload and navigation spans ([#24372](https://github.com/getsentry/sentry-javascript/pull/24372))
42+
- fix(hono): Allow @cloudflare/workers-types v5 as peer dependency ([#24494](https://github.com/getsentry/sentry-javascript/pull/24494))
43+
- fix(nextjs): Align tunnel request matching in middleware with tunnel rewrite ([#24499](https://github.com/getsentry/sentry-javascript/pull/24499))
44+
- fix(nextjs): Prevent sourceMappingURL stripping from truncating minified chunks ([#24022](https://github.com/getsentry/sentry-javascript/pull/24022))
45+
- fix(nextjs): Resolve Next.js version relative to the SDK when cwd differs ([#24462](https://github.com/getsentry/sentry-javascript/pull/24462))
46+
- fix(nuxt): Stop importing h3 in the Nitro error hook ([#24283](https://github.com/getsentry/sentry-javascript/pull/24283))
47+
- fix(server-runtime-injection): Keep `require()` of JSON working on Deno ([#24412](https://github.com/getsentry/sentry-javascript/pull/24412))
48+
- perf(bundler-plugins): Use fast component annotation for all Rollup and Vite versions ([#24437](https://github.com/getsentry/sentry-javascript/pull/24437))
49+
50+
<details>
51+
<summary> <strong>Internal Changes</strong> </summary>
52+
53+
- chore(bun): Fix stale comment in `getPerformanceIntegrations` ([#24533](https://github.com/getsentry/sentry-javascript/pull/24533))
54+
- chore(bundler-plugins): move traces sample rate from 1.0 to 0.3 ([#24488](https://github.com/getsentry/sentry-javascript/pull/24488))
55+
- chore(test): De-flake slow and racy tests ([#24452](https://github.com/getsentry/sentry-javascript/pull/24452))
56+
- docs: Update MIGRATION.md ([#24550](https://github.com/getsentry/sentry-javascript/pull/24550))
57+
- test(cloudflare): Add E2E test that deploys a real Worker and sends to Sentry ([#24280](https://github.com/getsentry/sentry-javascript/pull/24280))
58+
- test(e2e): Add a node-flue end-to-end application ([#24377](https://github.com/getsentry/sentry-javascript/pull/24377))
59+
- test(e2e): Add gen-ai-libraries app covering AI libraries via OpenRouter ([#24456](https://github.com/getsentry/sentry-javascript/pull/24456))
60+
- test(e2e): Avoid SAM runtime port collisions in aws-serverless tests ([#24492](https://github.com/getsentry/sentry-javascript/pull/24492))
61+
- test(e2e): consolidate the deno e2e test applications ([#24414](https://github.com/getsentry/sentry-javascript/pull/24414))
62+
- test(node): Run koa integration tests against koa 3 ([#24457](https://github.com/getsentry/sentry-javascript/pull/24457))
63+
- test(remix): Add source map upload e2e test app ([#24464](https://github.com/getsentry/sentry-javascript/pull/24464))
64+
- test(server-utils): Cover the Flue instrumentation ([#24266](https://github.com/getsentry/sentry-javascript/pull/24266))
65+
- test(test-utils): Add Sentry CLI trace helpers as `test-utils/cli` ([#24279](https://github.com/getsentry/sentry-javascript/pull/24279))
66+
67+
</details>
68+
69+
Work in this release was contributed by @chiliec, @ihsraham, @msnelling, and @oesnuj. Thank you for your contributions!
70+
771
## 11.0.0-rc.0
872

973
This is the first release candidate of version 11 of the Sentry JavaScript SDKs.

‎MIGRATION.md‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ We raised the minimum supported versions of several frameworks and libraries:
5454
- **Astro:** dropped Astro 3 (minimum is now 4).
5555
- **React Router (framework mode):** minimum is now 7.15.
5656
- **Fastify:** dropped Fastify 3.0 through 3.20 (minimum is now 3.21).
57+
- **webpack (bundler plugin):** dropped webpack 5.0.x (minimum is now 5.1).
5758

5859
### AWS Lambda Layer Changes
5960

@@ -871,7 +872,7 @@ Attribute availability remains runtime-dependent. For example, browser and Worke
871872

872873
Span attributes now use the shared `@sentry/conventions` package under the hood.
873874
The deprecated `semanticAttributes` re-export was removed. Import span attribute constants from `@sentry/core` directly.
874-
`SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` (`sentry.source`) was removed. Use `SENTRY_SEGMENT_NAME_SOURCE` (`sentry.segment.name.source`) instead.
875+
`SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` (`sentry.source`) was removed. Use the `sentry.segment.name.source` attribute instead and make sure to only set it on segment/root spans.
875876
`sentry.segment.name.source` is only set on the root span. Setting it on a child span is a no-op: `setAttribute` ignores it, and a value passed in a child span's initial attributes is dropped when the span is linked to its parent.
876877

877878
### Span operation (`op`) changes
@@ -1428,6 +1429,8 @@ Affected SDKs: `@sentry/remix`.
14281429
14291430
The plugin now also applies the build-time instrumentation transform. If you added `sentryOrchestrionPlugin()` from `@sentry/server-utils/orchestrion/vite` to your Vite config manually, remove it. Opt out with `sentryRemixVitePlugin({ buildTimeInstrumentation: false })`.
14301431
1432+
It also injects debug IDs and uploads source maps once you pass `org`, `project` and `authToken` — opt out with `sentryRemixVitePlugin({ sourcemaps: { disable: true } })`.
1433+
14311434
### React: Simpler React Router setup via `@sentry/react/react-router`
14321435
14331436
Affected SDKs: `@sentry/react`.
@@ -1816,6 +1819,18 @@ The deprecated `sourceMapsUploadOptions` and other deprecated Vite/build plugin
18161819
18171820
Deploys that the bundler plugins create automatically on Vercel now use the value of `VERCEL_TARGET_ENV` (`production`, `preview`, or a custom environment name) as their environment instead of `vercel-production` / `vercel-preview`. This matches the new default runtime `environment` of `@sentry/nextjs`, and the `production` default of all other SDKs. If your events use a different environment, set `release.deploy.env` to the same value, or set `release.deploy` to `false` to opt out.
18181821
1822+
### Bundler plugins: `@sentry/bundler-plugins/webpack5` was removed
1823+
1824+
The `@sentry/bundler-plugins/webpack5` entry point was removed. It exported the same `sentryWebpackPlugin` as `@sentry/bundler-plugins/webpack`, minus a fallback that only mattered on webpack 4 and 5.0.x. The webpack plugin now requires webpack 5.1 or newer (the first version that exposes `compiler.webpack`), so there is nothing left to distinguish the two entry points.
1825+
1826+
```js
1827+
// before
1828+
import { sentryWebpackPlugin } from '@sentry/bundler-plugins/webpack5';
1829+
1830+
// after
1831+
import { sentryWebpackPlugin } from '@sentry/bundler-plugins/webpack';
1832+
```
1833+
18191834
### Removed `unstable_` bundler plugin options
18201835
18211836
The `unstable_sentry*PluginOptions` escape hatch was removed from every SDK. It existed because the Sentry

‎dev-packages/browser-integration-tests/utils/helpers.ts‎

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -549,18 +549,61 @@ export async function getFirstSentryEnvelopeRequest<T>(
549549
}
550550

551551
export async function hidePage(page: Page): Promise<void> {
552-
// web-vitals defers processing an interaction's event entries into
553-
// `requestIdleCallback(..., { timeout: 1000 })`, and Chromium only reaches idle here once that
554-
// timeout elapses. Hiding the page first forces a report while the metric is still unset, so no
555-
// vital is emitted at all. Idle callbacks run in scheduling order, so waiting for one queued now
556-
// means web-vitals' earlier callback has already run.
552+
// web-vitals processes an interaction's event entries in `requestIdleCallback(..., { timeout:
553+
// 1000 })`, and Chromium only reaches idle here once that timeout elapses. Hiding before that
554+
// callback runs loses the interaction: the forced report web-vitals does on `visibilitychange`
555+
// runs ahead of it, while the callback itself reports unforced, so INP is never emitted at all.
556+
//
557+
// Idle callbacks run in scheduling order, but web-vitals only schedules its callback once the
558+
// Event Timing entry reaches its observer, which is after the click. Queuing one right away
559+
// therefore queues it first and hides the page too early. Waiting for the entry and queuing from
560+
// a task after it keeps web-vitals ahead: its observer is registered first, so it is notified
561+
// first, and the `setTimeout` lands after the microtask it defers that work into.
557562
await page.evaluate(() => {
558563
return new Promise<void>(resolve => {
559-
if (typeof requestIdleCallback !== 'function') {
560-
resolve();
564+
const scheduleIdle = (): void => {
565+
if (typeof requestIdleCallback !== 'function') {
566+
resolve();
567+
return;
568+
}
569+
requestIdleCallback(() => resolve(), { timeout: 1000 });
570+
};
571+
572+
// Callers that never interacted have no Event Timing entry coming, so there is nothing to
573+
// order against and nothing to wait for.
574+
const interactionCount = (performance as Performance & { interactionCount?: number }).interactionCount ?? 0;
575+
if (!interactionCount && !performance.getEntriesByType('first-input').length) {
576+
scheduleIdle();
561577
return;
562578
}
563-
requestIdleCallback(() => resolve(), { timeout: 1000 });
579+
580+
let observer: PerformanceObserver | undefined;
581+
let fallback: ReturnType<typeof setTimeout>;
582+
583+
// An interaction the Event Timing buffer no longer reports would otherwise wait here forever,
584+
// so cap the wait rather than require an entry.
585+
const done = (): void => {
586+
clearTimeout(fallback);
587+
observer?.disconnect();
588+
setTimeout(scheduleIdle, 0);
589+
};
590+
591+
fallback = setTimeout(done, 1000);
592+
593+
try {
594+
// `durationThreshold` is missing from the DOM types, as it is in the SDK's own observer.
595+
const eventOptions: PerformanceObserverInit & { durationThreshold?: number } = {
596+
type: 'event',
597+
buffered: true,
598+
durationThreshold: 0,
599+
};
600+
601+
observer = new PerformanceObserver(done);
602+
observer.observe(eventOptions);
603+
observer.observe({ type: 'first-input', buffered: true });
604+
} catch {
605+
done();
606+
}
564607
});
565608
});
566609

@@ -572,7 +615,6 @@ export async function hidePage(page: Page): Promise<void> {
572615
},
573616
});
574617

575-
// Dispatch the visibilitychange event to notify listeners
576618
document.dispatchEvent(new Event('visibilitychange'));
577619
});
578620
}

‎dev-packages/bundler-plugin-integration-tests/fixtures/esbuild/telemetry.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ test(import.meta.url, ({ runBundler, readOutputFiles, runFileInNode }) => {
66
expect(readOutputFiles()).toMatchInlineSnapshot(`
77
{
88
"sentry-telemetry.json": "[{"sent_at":"TIMESTAMP","sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION"}},[[{"type":"session"},{"sid":"UUID","init":true,"started":"TIMESTAMP","timestamp":"TIMESTAMP","status":"ok","errors":0,"duration":DURATION,"attrs":{"release":"PLUGIN_VERSION","environment":"production"}}]]],
9-
[{"event_id":"UUID","sent_at":"TIMESTAMP","sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION"},"trace":{"environment":"production","release":"PLUGIN_VERSION","public_key":"UUID","trace_id":"UUID","org_id":"1","transaction":"Sentry Bundler Plugin execution","sampled":"true","sample_rand":"SAMPLE_RAND","sample_rate":"1"}},[[{"type":"transaction"},{"contexts":{"trace":{"span_id":"SHORT_UUID","trace_id":"UUID","data":{"sentry.origin":"manual","sentry.segment.name.source":"custom","sentry.sample_rate":1},"status":"ok","origin":"manual"},"runtime":{"name":"node","version":"NODE_VERSION"}},"spans":[],"start_timestamp":START_TIMESTAMP,"timestamp":TIMESTAMP,"transaction":"Sentry Bundler Plugin execution","type":"transaction","transaction_info":{"source":"custom"},"platform":"PLATFORM","event_id":"UUID","environment":"production","release":"PLUGIN_VERSION","tags":{"upload-legacy-sourcemaps":false,"module-metadata":false,"inject-build-information":false,"set-commits":"auto","finalize-release":true,"deploy-options":false,"custom-error-handler":false,"sourcemaps-assets":false,"delete-after-upload":false,"sourcemaps-disabled":false,"react-annotate":false,"node":"NODE_VERSION","platform":"PLATFORM","meta-framework":"none","application-key-set":false,"ci":true,"project":"undefined","bundler":"esbuild","bundler-major-version":"28"},"user":{},"sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION","integrations":[],"packages":[{"name":"npm:@sentry/node","version":"SDK_VERSION"}]}}]]],
9+
[{"event_id":"UUID","sent_at":"TIMESTAMP","sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION"},"trace":{"environment":"production","release":"PLUGIN_VERSION","public_key":"UUID","trace_id":"UUID","org_id":"1","transaction":"Sentry Bundler Plugin execution","sampled":"true","sample_rand":"SAMPLE_RAND","sample_rate":"0.3"}},[[{"type":"transaction"},{"contexts":{"trace":{"span_id":"SHORT_UUID","trace_id":"UUID","data":{"sentry.origin":"manual","sentry.segment.name.source":"custom","sentry.sample_rate":0.3},"status":"ok","origin":"manual"},"runtime":{"name":"node","version":"NODE_VERSION"}},"spans":[],"start_timestamp":START_TIMESTAMP,"timestamp":TIMESTAMP,"transaction":"Sentry Bundler Plugin execution","type":"transaction","transaction_info":{"source":"custom"},"platform":"PLATFORM","event_id":"UUID","environment":"production","release":"PLUGIN_VERSION","tags":{"upload-legacy-sourcemaps":false,"module-metadata":false,"inject-build-information":false,"set-commits":"auto","finalize-release":true,"deploy-options":false,"custom-error-handler":false,"sourcemaps-assets":false,"delete-after-upload":false,"sourcemaps-disabled":false,"react-annotate":false,"node":"NODE_VERSION","platform":"PLATFORM","meta-framework":"none","application-key-set":false,"ci":true,"project":"undefined","bundler":"esbuild","bundler-major-version":"28"},"user":{},"sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION","integrations":[],"packages":[{"name":"npm:@sentry/node","version":"SDK_VERSION"}]}}]]],
1010
[{"sent_at":"TIMESTAMP","sdk":{"name":"sentry.javascript.node","version":"SDK_VERSION"}},[[{"type":"session"},{"sid":"UUID","init":false,"started":"TIMESTAMP","timestamp":"TIMESTAMP","status":"exited","errors":0,"duration":DURATION,"attrs":{"release":"PLUGIN_VERSION","environment":"production"}}]]],
1111
",
1212
"telemetry.js": "(() => {

0 commit comments

Comments
 (0)