feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base - #22755

Merged
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing
Jul 28, 2026
Merged

feat(node)!: Remove import-in-the-middle ESM loader and deprecated instrumentation base#22755
andreiborza merged 9 commits into
developfrom
ab/remove-iitm-plumbing

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 28, 2026

Copy link
Copy Markdown
Member

What

Final cleanup PR. Once the vendored OpenTelemetry instrumentations are gone, @sentry/node has no import-in-the-middle module patchers left, so this removes the remaining iitm plumbing:

  • Remove the registerEsmLoaderHooks option from NodeOptions and drop the import-in-the-middle dependency.
  • Delete the shared InstrumentationNodeModuleFile helper, esmLoader.ts, and the ESM-loader detection util.
  • Remove the deprecated SentryHttpInstrumentation and SentryNodeFetchInstrumentation classes. The live diagnostics-channel-based instrumentHttpOutgoingRequests / instrumentUndici functions are kept.
  • Delete the now-obsolete esm/import-in-the-middle integration-test suite and add the changelog entry.

Why

These were the last pieces tying @sentry/node to import-in-the-middle. All performance integrations are channel-based via @sentry/server-utils (default since #22501), so the ESM loader hook served nothing.

Depends on the per-integration removal PRs. This branch deletes InstrumentationNodeModuleFile, which the vendored instrumentations still import on develop, so CI here stays red until those PRs merge. It should be merged last.

Closes: #22346

…strumentation base
With all vendored OpenTelemetry instrumentations removed, `@sentry/node` no
longer has any import-in-the-middle module patchers. This removes the remaining
iitm plumbing:
- Remove the `registerEsmLoaderHooks` option and drop the `import-in-the-middle`
dependency; the SDK no longer registers ESM loader hooks.
- Delete the shared `InstrumentationNodeModuleFile` helper and the ESM loader.
- Remove the deprecated `SentryHttpInstrumentation` and
`SentryNodeFetchInstrumentation` classes (the diagnostics-channel-based
`instrumentHttpOutgoingRequests` / `instrumentUndici` functions are kept).
Closes: #22346
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadpackages/node/src/types.ts
andreiborzaand others added 2 commits July 28, 2026 13:23
Add the `registerEsmLoaderHooks` option removal to the v11 migration guide, and
fold `SentryNodeFetchInstrumentation` into the existing `SentryHttpInstrumentation`
removal entry.
"@sentry/opentelemetry": "10.67.0",
"@sentry/server-utils": "10.67.0",
"@sentry/bundler-plugins": "10.67.0",
"import-in-the-middle": "^3.0.0"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Image

@andreiborza

Copy link
Copy Markdown
MemberAuthor

Removing @opentelemetry/instrumentation is a bigger task, split into: #22759

@github-actions

github-actionsBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.84 kB--
@sentry/browser - with treeshaking flags28.05 kB--
@sentry/browser (incl. Tracing)47.41 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.42 kB--
@sentry/browser (incl. Tracing, Profiling)52.15 kB--
@sentry/browser (incl. Tracing, Replay)86.74 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.15 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.47 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.11 kB--
@sentry/browser (incl. Feedback)47.15 kB--
@sentry/browser (incl. sendFeedback)34.68 kB--
@sentry/browser (incl. FeedbackAsync)39.77 kB--
@sentry/browser (incl. Metrics)30.91 kB--
@sentry/browser (incl. Logs)31.14 kB--
@sentry/browser (incl. Metrics & Logs)31.82 kB--
@sentry/react31.63 kB--
@sentry/react (incl. Tracing)49.63 kB--
@sentry/vue34.76 kB--
@sentry/vue (incl. Tracing)49.36 kB--
@sentry/svelte29.87 kB--
CDN Bundle31.89 kB--
CDN Bundle (incl. Tracing)47.76 kB--
CDN Bundle (incl. Logs, Metrics)33.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.14 kB--
CDN Bundle (incl. Replay, Logs, Metrics)72.79 kB--
CDN Bundle (incl. Tracing, Replay)85.39 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.67 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.16 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.46 kB--
CDN Bundle - uncompressed95.09 kB--
CDN Bundle (incl. Tracing) - uncompressed143.22 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed99.8 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.2 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.56 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed262.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.45 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.19 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280.14 kB--
@sentry/nextjs (client)52.23 kB--
@sentry/sveltekit (client)47.83 kB--
@sentry/core/server79.77 kB--
@sentry/core/browser51.6 kB--
@sentry/node121.06 kB-1.08%-1.31 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)166 B--
@sentry/node - without tracing84.48 kB-1.49%-1.27 kB 🔽
@sentry/aws-serverless92.7 kB-1.15%-1.07 kB 🔽
@sentry/cloudflare (withSentry) - minified197.51 kB--
@sentry/cloudflare (withSentry)485.76 kB--

View base workflow run

Both packages inject `import 'import-in-the-middle/hook.mjs'` into their built
server output and previously relied on the package being present transitively
through `@sentry/node`. Now that `@sentry/node` no longer depends on it, they
must declare it directly, otherwise the built server fails to start with
`ERR_MODULE_NOT_FOUND` for `import-in-the-middle/hook.mjs`.
Comment threadpackages/nuxt/package.json Outdated
Both packages injected `import 'import-in-the-middle/hook.mjs'` into their built
server entry so bundlers would include the file for `@sentry/node`'s esmLoader to
`module.register()` at runtime. With the esmLoader removed, nothing registers the
hook anymore (the file is inert on import), so the injection only forced a now-dead
dependency into the output and broke server startup with `ERR_MODULE_NOT_FOUND`.
Drops the injection (and the solidstart `additionalImports` plumbing that existed
solely for it).
@andreiborza
andreiborza marked this pull request as ready for review July 28, 2026 14:13
@andreiborza
andreiborza requested review from a team as code ownersJuly 28, 2026 14:13
@andreiborza
andreiborza requested review from a team, JPeer264, chargome, isaacs, mydea, nicohrubec and s1gr1d and removed request for a teamJuly 28, 2026 14:13
Comment threadCHANGELOG.md Outdated
Comment on lines +16 to +19
- feat(node)!: Remove `import-in-the-middle`-based instrumentations from `@sentry/node`. All performance integrations are now channel-based via `@sentry/server-utils`. As part of this:
- The `registerEsmLoaderHooks` option was removed from `NodeOptions`. The SDK no longer registers `import-in-the-middle` ESM loader hooks, and `import-in-the-middle` is no longer a dependency.
- `knexIntegration` and `dataloaderIntegration` are now channel-only and no longer fall back to OpenTelemetry instrumentation on runtimes without diagnostics-channel injection.
- Support for Fastify `<3.21.0` was dropped.

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.

Was this intentional?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What is this? The entire changelog entry you mean or dropping fastify?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Tbh I think the changelog entry is useless anyway, I'll remove

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Gone in c030493

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

steve-carrell-magic

…mbing
# Conflicts:
#	packages/node/src/utils/detection.ts

@cursorcursorBot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4ed3550. Configure here.

Comment threadpackages/node/src/sdk/index.ts
@andreiborza
andreiborza merged commit e26cf53 into developJul 28, 2026
185 checks passed
@andreiborza
andreiborza deleted the ab/remove-iitm-plumbing branch July 28, 2026 15:18
Sign up for freeto 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.

Remove iitm-based instrumentations from @sentry/node

2 participants

@andreiborza@chargome