Skip to content

fix(cloudflare): Do not add back channel integrations the user removed - #25585

Merged
isaacs merged 3 commits into
developfrom
isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed
Oct 26, 2026
Merged

isaacs merged 3 commits into
developfrom
isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed

Conversation

@isaacs

@isaacs isaacs commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

The @sentry/cloudflare/vite plugin registers an integration factory for
each instrumented package when the package first runs. A package that
runs after init(), for example a driver loaded with a dynamic
import(), emits orchestrion.module-injected, and the SDK then added
its integration without checking the user's options. So an integrations
function that filtered the integration out, defaultIntegrations: false,
or a custom defaultIntegrations list did not keep it out. For the AI
integrations, that can turn prompt and response capture back on, and
whether it happened depended on module load order.

The handler now applies the rules that init() applies to the defaults:

  • If defaultIntegrations is set, the SDK defaults are off, so the
    handler adds nothing.
  • If integrations is a function, the handler passes the late
    integration through it and installs the result with the same name, if
    there is one. This calls the function again, once for each late
    module. If the function throws, the handler skips the integration, so
    the module load that emitted the event still works.
  • If integrations is an array, nothing changes. An array cannot remove
    a default, and addIntegration already skips a name the user
    configured.

The Nuxt and SvelteKit Cloudflare SDKs always pass a defaultIntegrations
list, which they build from the Cloudflare defaults. Under the first rule
they lost every late integration, so the nuxt-4-cloudflare and
sveltekit-cloudflare-pages E2E tests got no mysql spans. These SDKs
now set the internal option _extendsDefaultIntegrations when they build
the list, so the handler still adds late integrations for them. A list
the user passes still turns them off. We kept this option over moving the
handler into a default integration, because a user who builds a list from
getDefaultIntegrations() and filters it would then still get the
filtered integration back.

Fixes #25576
Fixes JS-3974

@linear-code

linear-code Bot commented Oct 20, 2026

Copy link
Copy Markdown

JS-3974

@isaacs
isaacs added this pull request to stack #25589 October 20, 2026 22:30
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

size-limit report 📦

Compared: d66dbfd (PR test merge using develop at ad71ef6)

Against: ad71ef6 (develop) · base run #63604

✅ Baseline matches: this diff contains only this PR's changes.

Path Size % Change Change
@sentry/browser 29.98 kB - -
@sentry/browser - with treeshaking flags 28.13 kB - -
@sentry/browser - with treeshaking flags tracing without tracing 28.03 kB - -
@sentry/browser (incl. Tracing) 52.17 kB - -
@sentry/browser (incl. Tracing + Span Streaming) 52.18 kB - -
@sentry/browser (incl. Tracing, Profiling) 55.12 kB - -
@sentry/browser (incl. Tracing, Replay) 91.97 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 80.86 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 96.7 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 109.64 kB - -
@sentry/browser (incl. Feedback) 47.51 kB - -
@sentry/browser (incl. sendFeedback) 35.05 kB - -
@sentry/browser (incl. FeedbackAsync) 40.15 kB - -
@sentry/browser (incl. Metrics) 31.01 kB - -
@sentry/browser (incl. Logs) 31.28 kB - -
@sentry/browser (incl. Metrics & Logs) 31.94 kB - -
@sentry/react 31.81 kB - -
@sentry/react (incl. Tracing) 54.5 kB - -
@sentry/vue 38.14 kB - -
@sentry/vue (incl. Tracing) 55.11 kB - -
@sentry/svelte 30.01 kB - -
@sentry/remix (Remix 3 client bundle) 57.19 kB - -
CDN Bundle 31.76 kB - -
CDN Bundle (incl. Tracing) 52.71 kB - -
CDN Bundle (incl. Logs, Metrics) 33.95 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 54.66 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) 74.93 kB - -
CDN Bundle (incl. Tracing, Replay) 90.41 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 92.33 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 96.55 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 98.5 kB - -
CDN Bundle - uncompressed 93.51 kB - -
CDN Bundle (incl. Tracing) - uncompressed 156.36 kB - -
CDN Bundle (incl. Logs, Metrics) - uncompressed 100.06 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 162.33 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 230.28 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 276.71 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 282.66 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 290.41 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 296.35 kB - -
@sentry/nextjs (client) 57.38 kB - -
@sentry/sveltekit (client) 52.55 kB - -
@sentry/core/server 43.62 kB - -
@sentry/core/browser 13.81 kB - -
@sentry/node 153.93 kB - -
@sentry/node/import (ESM hook with diagnostics-channel injection) 81.58 kB - -
@sentry/node - without tracing 95.47 kB - -
@sentry/node - without channel injection 134.59 kB - -
@sentry/aws-serverless 103.61 kB - -
@sentry/cloudflare (withSentry) - minified 197.26 kB +0.18% +343 B 🔺
@sentry/cloudflare (withSentry) 490.08 kB +0.14% +685 B 🔺
@sentry/nextjs/cloudflare (withSentry) - minified 217.85 kB +0.16% +343 B 🔺

View base workflow run

@isaacs

isaacs commented Oct 21, 2026

Copy link
Copy Markdown
Member Author

Bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit abb4fe2. Configure here.

@isaacs
isaacs marked this pull request as ready for review October 21, 2026 00:44
@isaacs
isaacs requested a review from a team as a code owner October 21, 2026 00:44
@isaacs
isaacs requested review from JPeer264 and mydea and removed request for a team October 21, 2026 00:44
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 17f3007 to 1ec6d31 Compare October 21, 2026 01:07
@isaacs
isaacs requested a review from a team as a code owner October 21, 2026 01:13
@isaacs
isaacs requested review from s1gr1d and removed request for a team October 21, 2026 01:13
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 1ec6d31 to 5097841 Compare October 21, 2026 01:13
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch 4 times, most recently from f20e973 to e725255 Compare October 21, 2026 14:16
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Optional E2E tests

All optional checks were successful. 32 successful. See the run.

Successful checks
Check Status
✅ CI: Optional E2E Tests / E2E cloudflare-think (ai v6) Test (optional) Successful in 1m Details
✅ CI: Optional E2E Tests / E2E cloudflare-workers-send-to-sentry Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nextjs-orpc Test (optional) Successful in 3m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (canary, webpack) Test (optional) Successful in 8m Details
✅ CI: Optional E2E Tests / E2E nextjs-14 (latest) Test (optional) Successful in 7m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (canary, turbopack) Test (optional) Successful in 5m Details
✅ CI: Optional E2E Tests / E2E cloudflare-pi-durable Test (optional) Successful in 5m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (vinext, bun) Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (vinext) Test (optional) Successful in 3m Details
✅ CI: Optional E2E Tests / E2E nextjs-16-tunnel (cloudflare) Test (optional) Successful in 4m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (deno) Test (optional) Successful in 5m Details
✅ CI: Optional E2E Tests / E2E nuxt-4 (canary) Test (optional) Successful in 5m Details
✅ CI: Optional E2E Tests / E2E nuxt-5 Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E supabase-nextjs Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nuxt-5-sourcemaps (client source maps kept) Test (optional) Successful in 37s Details
✅ CI: Optional E2E Tests / E2E cloudflare-think Test (optional) Successful in 1m Details
✅ CI: Optional E2E Tests / E2E gen-ai-libraries (cloudflare) Test (optional) Successful in 44s Details
✅ CI: Optional E2E Tests / E2E nuxt-3 (canary) Test (optional) Successful in 1m Details
✅ CI: Optional E2E Tests / E2E nextjs-14 (canary) Test (optional) Successful in 9m Details
✅ CI: Optional E2E Tests / E2E cloudflare-pi-durable (latest) Test (optional) Successful in 57s Details
✅ CI: Optional E2E Tests / E2E nuxt-4-static (canary) Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nextjs-15 (turbo) Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nextjs-16-standalone (canary, turbopack) Test (optional) Successful in 3m Details
✅ CI: Optional E2E Tests / E2E cloudflare-mastra Test (optional) Successful in 3m Details
✅ CI: Optional E2E Tests / E2E tanstackstart-react-cloudflare Test (optional) Successful in 4m Details
✅ CI: Optional E2E Tests / E2E cloudflare-flue-send-to-sentry Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E gen-ai-libraries Test (optional) Successful in 6m Details
✅ CI: Optional E2E Tests / E2E nextjs-15 (latest) Test (optional) Successful in 5m Details
✅ CI: Optional E2E Tests / E2E nextjs-16 (cloudflare, latest) Test (optional) Successful in 9m Details
✅ CI: Optional E2E Tests / E2E nuxt-5-sourcemaps Test (optional) Successful in 2m Details
✅ CI: Optional E2E Tests / E2E nuxt-5-sourcemaps (static / nuxt generate) Test (optional) Successful in 37s Details
✅ CI: Optional E2E Tests / E2E cloudflare-agent Test (optional) Successful in 2m Details

@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from e725255 to f9f181b Compare October 21, 2026 16:45
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from f9f181b to b7a2eb0 Compare October 21, 2026 16:59
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from b7a2eb0 to adf4a7b Compare October 21, 2026 17:28
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from adf4a7b to e239a55 Compare October 21, 2026 18:27
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from e239a55 to ee5be05 Compare October 21, 2026 18:37
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch 2 times, most recently from 1a01a04 to 25b2065 Compare October 22, 2026 15:37
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch 4 times, most recently from 96ccc02 to f0b2510 Compare October 23, 2026 20:54

@JPeer264 JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, I would still vote to prefix the new option with _

Comment thread CHANGELOG.md Outdated
Comment thread packages/cloudflare/src/client.ts Outdated
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from f0b2510 to 9a7d759 Compare October 26, 2026 15:59
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 9a7d759 to 4d7312d Compare October 26, 2026 16:12
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 4d7312d to 9764b52 Compare October 26, 2026 16:23
Base automatically changed from isaacschlueter/js-3973-cloudflare-export-channel-integrations to develop October 26, 2026 18:17
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 9764b52 to 84563e6 Compare October 26, 2026 18:17
isaacs and others added 3 commits October 26, 2026 11:18
The `@sentry/cloudflare/vite` plugin stores an integration factory for
each instrumented package when the package first runs. At `init()`, the
SDK adds the stored factories to the defaults. A package that runs after
`init()`, for example a driver loaded with a dynamic `import()`, emits
`orchestrion.module-injected`, and the SDK then called
`client.addIntegration(factory())`.

That handler did not check the user's options, so it ignored each way
to opt out: an `integrations` function that filtered the integration
out, `defaultIntegrations: false`, and a custom `defaultIntegrations`
list. The user got the integration back. For the AI integrations, that
can turn prompt and response capture back on. Whether it happened
depended on module load order.

The handler now applies the rules that `init()` applies to the defaults:

- If the user set `defaultIntegrations`, the SDK defaults are off, so
  the handler adds nothing.
- If `integrations` is a function, the handler passes the late
  integration through it with `getIntegrationsToSetup` and installs the
  result with the same name, if there is one. This calls the function
  again, once for each late module. If the function throws, the handler
  skips the integration, so the module load that emitted the event
  still works.
- If `integrations` is an array, nothing changes. An array cannot
  remove a default, and `addIntegration` already skips a name the user
  configured.

Fixes #25576
Fixes JS-3974

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…he defaults

The Nuxt and SvelteKit Cloudflare SDKs build `defaultIntegrations` from
the Cloudflare defaults and pass the list to the SDK. Since the SDK
treats any `defaultIntegrations` list as an opt-out, it did not add the
channel integration of a module that loads after `init()`, such as the
`mysql` driver in a route chunk. The `nuxt-4-cloudflare` and
`sveltekit-cloudflare-pages` E2E tests then got no db spans and timed
out.

The new internal option `extendsDefaultIntegrations` tells the SDK that
the list extends the defaults, so it adds late integrations again. The
user's `integrations` function still filters them. Nuxt and SvelteKit
set the option only when they build the list. A list that the user
passes still turns off late integrations.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@isaacs
isaacs force-pushed the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch from 84563e6 to 7f836ed Compare October 26, 2026 18:19
@isaacs
isaacs merged commit 908fa35 into develop Oct 26, 2026
216 checks passed
@isaacs
isaacs deleted the isaacschlueter/js-3974-cloudflare-adds-back-channel-integrations-the-user-removed branch October 26, 2026 23:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cloudflare adds back channel integrations the user removed, when the module loads after  init()

2 participants