ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@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

ref(node): Streamline pg instrumentation - #21583

Merged
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg
Jun 18, 2026
Merged

ref(node): Streamline pg instrumentation#21583
logaretm merged 7 commits into
developfrom
awad/js-2392-streamline-opentelemetryinstrumentation-pg

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored pg (node-postgres) instrumentation onto Sentry's span APIs.

I found that some spans (pg.connect, pg-pool.connect) still use manual origin, this was the case prior so I kept them as-is but I think they should be changed in the future.

I added a bunch of real tests for various scenarios we were lacking.

@linear-code

Copy link
Copy Markdown

JS-2392

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 207f6ec to 72548f7CompareJune 16, 2026 19:39
@logaretm
logaretm changed the base branch from awad/js-2393-streamline-opentelemetryinstrumentation-redis to developJune 16, 2026 19:39
@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.89 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.12 kB--
@sentry/browser (incl. Tracing, Profiling)50.67 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.69 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.45 kB--
@sentry/browser (incl. Feedback)44.62 kB--
@sentry/browser (incl. sendFeedback)32.25 kB--
@sentry/browser (incl. FeedbackAsync)37.38 kB--
@sentry/browser (incl. Metrics)28.52 kB--
@sentry/browser (incl. Logs)28.76 kB--
@sentry/browser (incl. Metrics & Logs)29.45 kB--
@sentry/react29.25 kB--
@sentry/react (incl. Tracing)48.18 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.76 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.29 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.59 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.62 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.88 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.46 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.71 kB--
CDN Bundle - uncompressed88.8 kB--
CDN Bundle (incl. Tracing) - uncompressed146.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.95 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.91 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.65 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.6 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.16 kB--
@sentry/core/browser63.31 kB--
@sentry/node-core61.87 kB--
@sentry/node124.62 kB-1.68%-2.13 kB 🔽
@sentry/node - without tracing74.26 kB--
@sentry/aws-serverless85.35 kB--
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from 56a88b9 to 936f0c8CompareJune 16, 2026 20:29
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 20:29
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 20:29
@logaretm
logaretm requested review from JPeer264 and mydea and removed request for a teamJune 16, 2026 20:29

@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 2 potential issues.

There are 3 total unresolved issues (including 1 from previous review).

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 321e80d. Configure here.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
const poolName = utils.getPoolName(pgPool.options);

pgPool.on('connect', () => {
this._connectionsCounter = utils.updateCounter(

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.

note: Actually sad that we never took advantage of these metrics.

@logaretmlogaretmJun 18, 2026

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 think our "app metrics" need to be incorporated into these integrations somehow, maybe via a toggle on option on the integration.

Redis have a lot of useful metrics that they emit natively for OTEL, we can emit similar metrics using the same diag channels.

Comment threadpackages/node/src/integrations/tracing/postgres/vendored/instrumentation.ts Outdated
Comment thread.oxlintrc.base.json Outdated
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch 2 times, most recently from a3ac2d3 to c78d8b3CompareJune 18, 2026 14:12
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from c78d8b3 to 54b6140CompareJune 18, 2026 15:20
logaretmand others added 7 commits June 18, 2026 12:36
Streamlines the vendored `pg` (node-postgres) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the redis/ioredis precedent.
- Replace `tracer.startSpan` + `context.with(trace.setSpan(...))` with
`startInactiveSpan`/`withActiveSpan`, `SpanStatusCode.ERROR` with
`SPAN_STATUS_ERROR`, and drop `recordException` (a no-op in Sentry's
pipeline) across the client query, client connect and pool connect paths.
- Drop the OTel metrics (operation duration + pool connection counters):
the SDK wires up no `MeterProvider`, so `this.meter` is the no-op meter
and every `record`/`add` was dead. Also removes the pool event-listener
plumbing and the `db.client.connection.*` semconv.
- Drop the `SemconvStability` dual-emission and keep the OLD semconv
attributes only (the STABLE path was env-gated behind
`OTEL_SEMCONV_STABILITY_OPT_IN` and never enabled by the SDK).
- Remove config the SDK never passes (`requestHook`, `responseHook`,
`enhancedDatabaseReporting`, `addSqlCommenterCommentToQueries`) and
hardcode the always-on `requireParentSpan` behaviour; bake the
`auto.db.otel.postgres` origin into the query span attributes (connect
spans keep their `manual` origin, matching prior output).
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Removes the config-passing `Postgres` unit test (its only pg-specific
behaviour, `ignoreConnectSpans` forwarding, is covered end-to-end) and
expands the real integration suite to cover every code path, matching the
redis/mysql2 precedent:
- error paths: a failing query and a refused connect assert
`status: 'internal_error'`;
- `Pool`: a new scenario covers `pg-pool.connect` spans, callback-style
queries, and connection-string credential masking on `db.connection_string`;
- prepared statements: a named query asserts the `db.postgresql.plan` attribute;
- `requireParentSpan`: a new scenario asserts queries/connects without an
active parent span are not instrumented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace trace.getSpan(context.active()) with getActiveSpan() for the
requireParentSpan check and parent detection, and translate the
context.bind callback binding to a withActiveSpan-based helper. The
connect-result promise no longer needs explicit binding since the SDK's
async context propagates across the caller's await.
Add a scenario that chains a query off connect() with .then() instead of
awaiting it, asserting the query span is still parented to the active
transaction. This pins that the trace context survives the connect
promise continuation after dropping the explicit OTel context.bind.
Vendored OTel instrumentations intentionally emit the old db.*/net.*
semantic conventions, whose local semconv constants carry the upstream
@deprecated JSDoc. The type-aware no-deprecated rule flagged every usage
as an error and failed lint. Downgrade it to a warning for the vendored
tracing paths so the intentional usage is surfaced without breaking CI.
@logaretm
logaretmforce-pushed the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch from 54b6140 to f99bae7CompareJune 18, 2026 16:36
@logaretm
logaretm merged commit 0b0fac7 into developJun 18, 2026
332 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2392-streamline-opentelemetryinstrumentation-pg branch June 18, 2026 17:40
andreiborza added a commit that referenced this pull request Jun 22, 2026
… dep (#21688)
The vendored `addSqlCommenterComment` helper (from
`@opentelemetry/sql-common`) was never wired into any instrumentation.
The `pg` integration explicitly dropped the
`addSqlCommenterCommentToQueries` option in #21583, leaving it dead code
whose only consumer is its own unit test.
It was also the sole user of `W3CTraceContextPropagator`, so we can drop
the direct `@opentelemetry/core` dependency.
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.

2 participants

@logaretm@JPeer264