feat(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@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(bun,deno,node): pg orchestrion instrumentation - #21826

Merged
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion
Jul 2, 2026
Merged

feat(bun,deno,node): pg orchestrion instrumentation#21826
isaacs merged 5 commits into
developfrom
isaacs/pg-orchestrion

Conversation

@isaacs

@isaacsisaacs commented Jun 27, 2026

Copy link
Copy Markdown
Member

Add orchestrion instrumentation for Node, Deno, and Bun, covering the pg module.

This basically copies exactly what the mysql integration does, but for postgres.

fix: #20764
fix: JS-2415

@isaacs
isaacs requested a review from a team as a code ownerJune 27, 2026 04:08
@isaacs
isaacs requested review from JPeer264, andreiborza and mydea and removed request for a teamJune 27, 2026 04:08
@linear-code

Copy link
Copy Markdown

JS-2415

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
@isaacs

isaacs commented Jun 27, 2026

Copy link
Copy Markdown
MemberAuthor

🚲 🏠 API surface choice:

In order to opt into orchestrion diagnostics-channel-injection style instrumentations, which swap out the vendored OTel instrumentations, we call Sentry.experimentalUseDiagnosticsChannelInjection().

This initializes the orchestrion integrations, and uses them instead of the OTel ones. However, this means that the only time that the orchestrion integrations are set up and provided with options, is at that moment of calling experimentalUseDiagnosticsChannelInjection(). For the pg integration, this means that the option to decide to skip the connectSpans happens beforeSentry.init() and so has to be passed into that opt-in method like this:

Sentry.experimentalUseDiagnosticsChannelInjection({postgres: {ignoreConnectSpans: true}});

I don't love this! It exposes the implementation detail in a way that we will likely regret. I kind of hate it, actually.

  • Overloads the method, so we can't just make it a no-op when we make orchestrion the default.
  • Makes the orchestrion instrumentation load differently than the OTel one (which a user configures by initializing the integration and passing it in the integrations array, rather than relying on it being in defaultIntegrations.)

It was a simple duct-tape way forward, but it sucks.

Another approach would be, instead of actually initializing these integrations at that moment to swap in for the OTel ones, just mark that we're going to use the orchestrion ones when we do initialize, and then when it comes time to initialize them, choose which implementation to use, with the configurations provided.

I'm going to try spiking that out here.


EDIT: yeah, fixed it. Much nicer. The Sentry.experimentalUseDiagnosticsChannelInjectionI() method is back to being argument-free, and the orchestrion integrations can be provided with options in the exact same way as their otel counterparts.

Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from fbbe3ae to 334614aCompareJune 27, 2026 23:24
@github-actions

github-actionsBot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB-0.01%-1 B 🔽
@sentry/node121.24 kB-0.01%-3 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB-0.01%-1 B 🔽
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 9545bf8 to dfe74f5CompareJune 29, 2026 01:36

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Overall LGTM, got minor suggestions. I'll review once more after the tests are green and the merge conflicts got solved

Comment thread.github/workflows/build.yml
Comment threadpackages/deno/package.json
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from dfe74f5 to 373c014CompareJune 30, 2026 23:45
Comment threadpackages/node/src/sdk/index.ts
Comment threadpackages/server-utils/src/tracing-channel.ts
@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea, @andreiborza — Please review this PR when you get a chance!

@mydeamydea changed the title feat: pg orchestrion instrumentationfeat(bun,deno,node): pg orchestrion instrumentationJul 1, 2026
Comment threadpackages/node/src/integrations/tracing/mysql/index.ts Outdated
Comment threadpackages/node/src/integrations/tracing/postgres/index.ts Outdated
Comment threadpackages/node/src/sdk/experimentalUseDiagnosticsChannelInjection.ts Outdated
Comment threadpackages/deno/src/integrations/postgres.ts Outdated
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from afbbc64 to 62a281fCompareJuly 1, 2026 20:17
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch 2 times, most recently from 668eabf to b2621bdCompareJuly 1, 2026 20:41
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from b2621bd to 58fdc22CompareJuly 1, 2026 22:10

@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 58fdc22. Configure here.

Comment threadpackages/server-utils/src/integrations/tracing-channel/postgres.ts Outdated
isaacs added 5 commits July 1, 2026 17:30
Add orchestrion instrumentation for Node, Deno, and Bun, covering the
`pg` module.
This basically copies exactly what the `mysql` integration does, but for
postgres.
fix: #20764
fix: JS-2415
Make it possible to provide options to orchestrion integrations without
needing to access internal API `@sentry/server-utils/orchestrion`.
An integration test is added verifying that `ignoreConnectSpans` can be
set on the orchestrion `pg` integration.
Move the list of orchestrion integrations, keyed by their public-facing
OTel names, into server-utils.
This allows us to easily provide them in a user-visible way from the
Node SDK, and also avoid forgetting to add them in multiple places as we
add new ones to the set.
@isaacs
isaacsforce-pushed the isaacs/pg-orchestrion branch from 2b34039 to a4e321eCompareJuly 2, 2026 00:31
@isaacs

Copy link
Copy Markdown
MemberAuthor

@mydea@JPeer264 Updated this to remove the overly-complicated factory-fork approach, so this is now in the "export the server-utils/orchestrion integrations in a more ergonomic way" approach to setting options.

Also updated #21828 to do the same thing it was doing, but with this new simpler underlying layer.

@isaacs
isaacs requested a review from mydeaJuly 2, 2026 05:28

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@isaacs
isaacs merged commit 3588b1a into developJul 2, 2026
291 checks passed
@isaacs
isaacs deleted the isaacs/pg-orchestrion branch July 2, 2026 15:02
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.

Rewrite @opentelemetry/instrumentation-pg to orchestrion

3 participants

@isaacs@mydea@JPeer264