ref(node): Streamline knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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 knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } 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 knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(node): Streamline knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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 knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(node): Streamline knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(node): Streamline knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

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

ref(node): Streamline knex instrumentation - #21561

Merged
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex
Jun 18, 2026
Merged

ref(node): Streamline knex instrumentation#21561
logaretm merged 3 commits into
developfrom
awad/js-2385-streamline-opentelemetryinstrumentation-knex

Conversation

@logaretm

@logaretmlogaretm commented Jun 15, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored knex instrumentation by moving it off the OpenTelemetry tracing APIs onto Sentry's span APIs.

In this integration it was possible to use startSpan directly as all APIs seem to be promise based and there is no risk of lazy thenables as far as I can tell.

@linear-code

Copy link
Copy Markdown

JS-2385

@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from 125fe11 to a32abeaCompareJune 15, 2026 20:55
@logaretm
logaretm marked this pull request as ready for review June 16, 2026 15:12
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 15:12
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 15:12
Comment threadpackages/node/src/integrations/tracing/knex/vendored/instrumentation.ts Outdated

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

if we can easily already replace the context.with would be good to get that in here as well I think, but else lgtm

},
parentContext,
const args = arguments;
return api.context.with(parentContext, () =>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: it would be great if we could already rewrite this with Sentry APIs as well

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.

Nice catch, I did not see that

@logaretm
logaretm requested a review from nicohrubecJune 17, 2026 14:17

@nicohrubecnicohrubec left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

Refactors the vendored knex instrumentation off the OpenTelemetry tracing
APIs onto Sentry's span APIs, mirroring the mongoose (#21481) and mysql2
(#21509) streamlines.
- Replace `tracer.startSpan` + manual `context.with`/`.then`/`.catch` with
`startSpan`. `Runner.query` returns a real, already-executing Promise, so
`startSpan` can safely await it and auto-end the span while keeping it active
so the underlying `pg`/`mysql2` driver spans nest correctly.
- Preserve the build-time `contextSymbol` parent + require-parent-span behavior
(only instrument queries that run within an existing trace).
- Bake the `auto.db.otel.knex` origin into the span attributes and drop the
`spanStart` hook from `index.ts`.
- Drop the env-gated `OTEL_SEMCONV_STABILITY_OPT_IN` dual-emission; only the OLD
semantic conventions (`db.system`, `db.statement`, ...) were ever emitted.
Behavior change: the unsupported stable-semconv opt-in is no longer honored.
- Hardcode `requireParentSpan`/`maxQueryLength` (the integration only ever used
the defaults), delete the now-dead `types.ts`/`constants.ts` and
`otelExceptionFromKnexError`, drop OTel `recordException`, and remove the
blanket `eslint-disable`.
- Extend the `pg` integration suite with a failing query to cover the error
path (`status: internal_error`).
Replace api.context/api.trace parent detection with getActiveSpan +
startSpan({ parentSpan, onlyIfParent }), and inline the postgresql
semconv constant locally.
@logaretm
logaretmforce-pushed the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch from e3cc97a to 63c3a48CompareJune 18, 2026 13:22

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

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 216196d. Configure here.

return startSpan(
{
kind: api.SpanKind.CLIENT,
name: utils.getName(name, operation, table),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Span description no longer SQL

Medium Severity

Knex spans now use utils.getName as the span name, which becomes the exported description. The prior OTEL exporter derived descriptions from db.statement, so UI and tests expecting full SQL (for example select * from "User") no longer match.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

const fullQuery = formatter(query.sql, query.bindings || []);
const message = err.message.replace(`${fullQuery} - `, '');
span.setStatus({ code: SPAN_STATUS_ERROR, message });
throw err;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Error status not normalized

Medium Severity

Failed queries set the span status message to the trimmed Knex/Postgres error text. OTEL export previously mapped non-canonical error messages to internal_error, but native spans keep the raw message, diverging from tests and prior telemetry.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 216196d. Configure here.

@logaretm
logaretm merged commit 05e476e into developJun 18, 2026
337 of 340 checks passed
@logaretm
logaretm deleted the awad/js-2385-streamline-opentelemetryinstrumentation-knex branch June 18, 2026 16:35
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@nicohrubec