ref(node): Streamline pg instrumentation#21583
Conversation
207f6ec to
72548f7
Compare
size-limit report 📦
|
56a88b9 to
936f0c8
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
There are 3 total unresolved issues (including 1 from previous review).
❌ 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.
| const poolName = utils.getPoolName(pgPool.options); | ||
|
|
||
| pgPool.on('connect', () => { | ||
| this._connectionsCounter = utils.updateCounter( |
There was a problem hiding this comment.
note: Actually sad that we never took advantage of these metrics.
There was a problem hiding this comment.
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.
a3ac2d3 to
c78d8b3
Compare
c78d8b3 to
54b6140
Compare
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.
54b6140 to
f99bae7
Compare

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.