feat(node): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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 > 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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264
, '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): Only setup orchestrion channel listeners when needed - #22312

Closed
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels
Closed

feat(node): Only setup orchestrion channel listeners when needed#22312
mydea wants to merge 10 commits into
developfrom
fn/lazy-load-channels

Conversation

@mydea

@mydeamydea commented Jul 16, 2026

Copy link
Copy Markdown
Member

This PR implements a way to lazy-load orchestrion instrumentation (runtime code) only when something was actually wrapped.

  • in setupOnce we look at the list of instrumented modules, and only run the instrumentation if something was already orchestrion-wrapped
  • in setup we add a listener to a client hook event which is emitted whenever something is runtime-wrapped by orchestrion. There we check if a module was wrapped that we need, and if so, we add the instrumentation, listening to the respective channels.
  • We keep a symbol on the callback function itself to keep track of if this was run or not, ensuring we only register stuff once.

Other Runtimes (Deno, Bun)

In Deno and Bun we do not have the concrete list of build-time instrumented things (yet). However, the limits of channel registrations also do not really apply there - so this PR just registers everything immediately there. We can revisit this later.

Next.js

This needs adjustments for turbopack...

Closes#22302


const BUNDLER_MARKER_BANNER =
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=true;';
';(globalThis.__SENTRY_ORCHESTRION__=(globalThis.__SENTRY_ORCHESTRION__||{})).bundler=[];';

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.

cc @isaacs do we actually need this? Can we properly inject this with the correct modules somehow?

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/runtime/register.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
@github-actions

github-actionsBot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.75 kB--
@sentry/browser - with treeshaking flags26.18 kB--
@sentry/browser (incl. Tracing)46.56 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.37 kB--
@sentry/browser (incl. Tracing, Profiling)51.36 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.2 kB--
@sentry/browser (incl. Feedback)44.93 kB--
@sentry/browser (incl. sendFeedback)32.55 kB--
@sentry/browser (incl. FeedbackAsync)37.69 kB--
@sentry/browser (incl. Metrics)28.83 kB--
@sentry/browser (incl. Logs)29.05 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.84 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.52 kB--
@sentry/svelte27.78 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.53 kB--
CDN Bundle (incl. Logs, Metrics)31.73 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.98 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.34 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.84 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.11 kB--
CDN Bundle - uncompressed89.88 kB--
CDN Bundle (incl. Tracing) - uncompressed146.73 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.59 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.71 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.32 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.94 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.9 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.64 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.6 kB--
@sentry/nextjs (client)51.36 kB--
@sentry/sveltekit (client)46.99 kB--
@sentry/core/server78.65 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.21 kB-0.01%-1 B 🔽
@sentry/node125.66 kB--
@sentry/node (incl. diagnostics channel injection)149.67 kB+0.16%+237 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node/light51.32 kB--
@sentry/node - without tracing74.92 kB-0.01%-1 B 🔽
@sentry/aws-serverless84.15 kB--
@sentry/cloudflare (withSentry) - minified184 kB--
@sentry/cloudflare (withSentry)455.41 kB--

View base workflow run

Comment threadpackages/server-utils/src/integrations/tracing-channel/express/index.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts Outdated
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
Comment threadpackages/server-utils/src/orchestrion/detect.ts
Comment threadpackages/bun/src/plugin.ts
Comment threadpackages/server-utils/src/orchestrion/instrumentation.ts
*/
export function getOrchestrionInjectedModules(): string[] {
const { runtime, bundler } = GLOBAL_OBJ.__SENTRY_ORCHESTRION__ ?? {};
return [...(runtime ?? []), ...(bundler ?? [])];

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.

q: Do we care about potential duplicates? Probably not, as this is for now used anyways just for modules.includes(name)

export const fastifyIntegration = defineIntegration((options: Partial<FastifyIntegrationOptions> = {}) =>
_fastifyIntegration(options),
);
export const fastifyIntegration = defineIntegration(_fastifyIntegration);

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.

q: Just for my understanding, not to miss anything. The Fastify changes are unrelated theoretically right?

Ok to land here, since they are small changes 🤏

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.

yeah just noticed this unnecessary wrapper here :)

@@ -0,0 +1,78 @@
import * as diagnosticsChannel from 'node:diagnostics_channel';

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.

q: The PR description states it was meant only for Express. Was Kafka and GraphQL intended to be in here too?

Implementation looks fine though

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.

PR description is inclomplete, I actually moved everything now :)

const subscribers: Partial<TracingChannelSubscribers<ConsumerRunChannelContext>> = {
start(ctx) {
const config = ctx.arguments[0];
if (!config || typeof config !== 'object') {

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.

l: We could use the new isObjectLike helper

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.

I did not change this here, just moved it - we can/should update this in a follow up I'd say :)

Comment threadpackages/server-utils/src/orchestrion/config/anthropic-ai.ts Outdated
@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from acd44ec to cd1e0f9CompareJuly 17, 2026 07:54
Comment threadpackages/server-utils/src/orchestrion/instrumentation.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 9b33e48. Configure here.

@mydea
mydeaforce-pushed the fn/lazy-load-channels branch from 33bf341 to 95a95a5CompareJuly 20, 2026 08:11
@mydea

Copy link
Copy Markdown
MemberAuthor

@mydeamydea closed this Jul 20, 2026
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.

Work around node's hard limit of 1024 diagnostics channels

3 participants

@mydea@timfish@JPeer264