ref(node): Streamline redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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 redis instrumentation - #21582

Merged
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis
Jun 17, 2026
Merged

ref(node): Streamline redis instrumentation#21582
logaretm merged 3 commits into
developfrom
awad/js-2393-streamline-opentelemetryinstrumentation-redis

Conversation

@logaretm

@logaretmlogaretm commented Jun 16, 2026

Copy link
Copy Markdown
Member

Streamlines the vendored redis (node-redis) instrumentation to use Sentry's span APIs instead of the OpenTelemetry tracing APIs.

I also made sure to split up the v5 tests between pre-tracing channels releases >=5.12 and older v5 releases so that we can test all paths in actual tests.

@linear-code

Copy link
Copy Markdown

JS-2393

Comment thread.oxlintrc.base.json
"typescript/no-unsafe-member-access": "off",
"typescript/no-this-alias": "off",
"max-lines": "off",
"no-bitwise": "off"

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.

Not needed after streamline

@github-actions

github-actionsBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.45 kB--
@sentry/browser - with treeshaking flags25.88 kB--
@sentry/browser (incl. Tracing)45.88 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.11 kB--
@sentry/browser (incl. Tracing, Profiling)50.65 kB--
@sentry/browser (incl. Tracing, Replay)85.08 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.68 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.78 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.44 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.17 kB--
@sentry/vue32.56 kB--
@sentry/vue (incl. Tracing)47.74 kB--
@sentry/svelte27.48 kB--
CDN Bundle29.86 kB--
CDN Bundle (incl. Tracing)48.28 kB--
CDN Bundle (incl. Logs, Metrics)31.4 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.58 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.71 kB--
CDN Bundle (incl. Tracing, Replay)85.61 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.04 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.5 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.02 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.33 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.91 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.87 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.61 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.56 kB--
@sentry/nextjs (client)50.58 kB--
@sentry/sveltekit (client)46.27 kB--
@sentry/core/server76.14 kB--
@sentry/core/browser63.29 kB--
@sentry/node-core61.84 kB--
@sentry/node127.72 kB-0.45%-566 B 🔽
@sentry/node - without tracing74.22 kB--
@sentry/aws-serverless85.47 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.48 kB--
@sentry/cloudflare (withSentry)436.52 kB--

View base workflow run

@logaretm
logaretm marked this pull request as ready for review June 16, 2026 19:32
@logaretm
logaretm requested a review from a team as a code ownerJune 16, 2026 19:32
@logaretm
logaretm requested review from JPeer264, andreiborza, mydea and nicohrubec and removed request for a teamJune 16, 2026 19:32
Comment thread.oxlintrc.base.json Outdated
}
attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';
const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {
const span = startInactiveSpan({

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: I was breaking my head if this can be simplified even more, but I think this is quite complex with the .callback being overwritten conditionally 😅

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 will not miss monkey patching man

Streamlines the vendored `redis` (node-redis) instrumentation to use
Sentry's span APIs instead of the OpenTelemetry tracing APIs, following
the ioredis precedent (#21560).
- 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 all three classes.
- 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 dead config the SDK never passes (`dbStatementSerializer`,
`requireParentSpan`, `semconvStability`) and the now-dead `isPipeline`
plumbing; bake the origin into the attributes.
- Drop the blanket eslint-disable and rely on the consolidated path entry.
Also splits the node-redis test version aliases so every code path is
covered: `redis-5` now pins 5.11.0 (vendored monkey-patch, >=5.0.0 <5.12.0)
and the new `redis-5-tracing` pins >=5.12.0 (diagnostics_channel). Adds a
node-redis error-path assertion and a redis-5 cache suite.
…ation
The vendored `redis-instrumentation.test.ts` was a fake, OTel-tracer-coupled
unit test (asserted spans via an in-memory OTel exporter and the removed
`requireParentSpan` config). After the streamline it no longer compiles and
its span-capture assertions don't apply, so it's removed — matching the
ioredis precedent.
To keep coverage of the multi/pipeline deferred-span path it was the only
thing exercising, add a MULTI/EXEC call to the redis-4 and redis-5 scenarios
and assert one span per queued command in the real integration suite.
Drop the OTel context API from the v2-v3 path: translate the command
callback binding to withActiveSpan(getActiveSpan()) and remove the
createClient/create_stream patches that existed only to context.bind the
client/stream event emitters (span creation already happens at command
call time, and callback context is preserved by the command wrapper).
Replace the OTel DiagLogger (_diag) with Sentry's debug logger, and
switch the leaked OTel Span type in index.ts and types.ts to @sentry/core.
SpanKind and the setTracerProvider base-class override are kept as part of
the instrumentation/patching base.
@logaretm
logaretmforce-pushed the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch from 3941fd0 to bedcd11CompareJune 17, 2026 17:24

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

if (err) {
span.setStatus({ code: SPAN_STATUS_ERROR, message: err.message });
}
span.end();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Wrong failed Redis span status

Medium Severity

The new shared endSpan helper sets failed Redis command spans to SPAN_STATUS_ERROR with message: err.message (the Redis error text). New redis-cache integration tests assert status: 'internal_error', and serialized span status comes from that message via getStatusMessage, so the tests and UI status string will not match the expected canonical error status.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit bedcd11. Configure here.

@logaretm
logaretm merged commit fc39574 into developJun 17, 2026
524 of 534 checks passed
@logaretm
logaretm deleted the awad/js-2393-streamline-opentelemetryinstrumentation-redis branch June 17, 2026 18:46
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