feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

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

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils - #22702

Merged
andreiborza merged 16 commits into
developfrom
fn/propagator
Aug 3, 2026
Merged

feat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utils#22702
andreiborza merged 16 commits into
developfrom
fn/propagator

Conversation

@mydea

@mydeamydea commented Jul 27, 2026

Copy link
Copy Markdown
Member

Simplifies the OpenTelemetry SentryPropagator down to a thin TextMapPropagator that delegates all trace-data serialization to core's getTraceData(), and removes the custom OTel-specific tracing/propagation overrides (continueTrace, startNewTrace, getTraceData, getTraceContextForScope) in favor of core's implementations. The net effect is that OTel-powered SDKs (Node, Next.js, SvelteKit, etc.) now share the same propagation and trace-continuation code paths as the rest of the SDK instead of maintaining a parallel OTel-only variant.

What changed

  • SentryPropagator no longer extends W3CBaggagePropagator. It now implements TextMapPropagator directly. inject() reads headers from getTraceData() and only operates on the active context — if called with a non-active context it warns and skips.
    • Injecting with a non-active context was supported before, but we intentionally drop it. The main remaining consumers of this propagator (Next.js and SvelteKit) don't need it, so rather than carry the complexity of handling arbitrary non-active contexts, we focus the propagator on the main use case and skip the edge cases that would drastically increase its complexity.
  • URL / tracePropagationTargets filtering and propagateTraceparent are no longer the propagator's concern — outgoing-request filtering already lives in the Node HTTP layer (inject-trace-propagation-headers.ts), so the duplicated logic, the _urlMatchesTargetsMap LRU cache, and the sentry.url trace-state (SENTRY_TRACE_STATE_URL) are removed.
  • Removed the OTel-specific getTraceData, continueTrace, and startNewTrace overrides from the async context strategy. Core's implementations are now used directly. To make this work, continueTrace/startNewTrace in core were reworked to route through withActiveSpan(null, …), and OTel's non-recording (TwP) spans fall back to the scope's propagation-context trace id.
  • Removed getTraceContextForScope (and NodeClient._getTraceInfoFromScope); scope→trace-context resolution now goes through the shared core path.
  • _startSpan now runs the callback with the started span set active on the unsuppressed context, fixing event trace-context attaching to a stale ancestor span across startNewTrace/continueTrace boundaries.

Aligning Node and Browser behavior

Previously, the OTel/Node path and the browser (core) path had subtly diverging propagation behavior because they ran through different implementations of getTraceData, continueTrace, and startNewTrace. The OTel variants derived trace data from the OTel context/span graph, while the browser used core's scope- and span-based logic — so edge cases (TwP sampling, DSC freezing, which trace id a fresh root span lands on) could resolve differently between the two.

By deleting the OTel-specific overrides and routing everything through core, Node and Browser now produce trace headers and continue/start traces via a single common code path. There is one source of truth for how a sentry-trace/baggage pair is derived from the current scope and span, which removes a class of Node-vs-Browser discrepancies and makes future changes apply uniformly to both.

Test adjustments

Because this aligns Node's propagation/trace-continuation behavior with the common core path, a number of Node integration tests had to be updated to match the new (now shared) behavior — primarily expectations around trace ids for parallel/root spans and outgoing-request propagation (parallel-root-spans, parallel-spans-in-scope, fetch-sampled-no-active-span, etc.). These changes reflect the corrected/unified behavior, not regressions.

Breaking changes

  • getTraceContextForScope is no longer exported from @sentry/opentelemetry.
  • The sentry.url trace-state and the getInjectionData / OTel-specific getTraceData internals of the propagator are removed.
  • The SentryPropagator no longer injects when called with a non-active context.

Closes#22281

@github-actions

github-actionsBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser29.91 kB--
@sentry/browser - with treeshaking flags28.11 kB--
@sentry/browser (incl. Tracing)47.35 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.36 kB--
@sentry/browser (incl. Tracing, Profiling)52.13 kB--
@sentry/browser (incl. Tracing, Replay)86.69 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags76.13 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)91.41 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)104.05 kB--
@sentry/browser (incl. Feedback)47.22 kB--
@sentry/browser (incl. sendFeedback)34.76 kB--
@sentry/browser (incl. FeedbackAsync)39.86 kB--
@sentry/browser (incl. Metrics)30.99 kB--
@sentry/browser (incl. Logs)31.22 kB--
@sentry/browser (incl. Metrics & Logs)31.89 kB--
@sentry/react31.73 kB--
@sentry/react (incl. Tracing)49.61 kB--
@sentry/vue34.98 kB--
@sentry/vue (incl. Tracing)49.34 kB--
@sentry/svelte29.94 kB--
CDN Bundle32 kB+0.06%+16 B 🔺
CDN Bundle (incl. Tracing)47.72 kB--
CDN Bundle (incl. Logs, Metrics)33.55 kB+0.02%+4 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)49.08 kB+0.01%+3 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)72.89 kB-0.01%-5 B 🔽
CDN Bundle (incl. Tracing, Replay)85.35 kB+0.01%+3 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.65 kB+0.01%+2 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)91.14 kB+0.01%+4 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.45 kB+0.01%+4 B 🔺
CDN Bundle - uncompressed95.5 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing) - uncompressed143.08 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.21 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed147.06 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed224.97 kB+0.01%+5 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed262.34 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed266.3 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed276.04 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed280 kB--
@sentry/nextjs (client)52.2 kB--
@sentry/sveltekit (client)47.8 kB--
@sentry/core/server80 kB+0.01%+5 B 🔺
@sentry/core/browser51.96 kB+0.01%+3 B 🔺
@sentry/node120.88 kB-0.83%-1 kB 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing84.26 kB-1.3%-1.11 kB 🔽
@sentry/aws-serverless92.92 kB-1.16%-1.09 kB 🔽
@sentry/cloudflare (withSentry) - minified199.28 kB--
@sentry/cloudflare (withSentry)490.8 kB+0.01%+23 B 🔺

View base workflow run

Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/node/src/sdk/initOtel.ts
Comment threadpackages/nextjs/src/server/index.ts Outdated
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/asyncContextStrategy.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from c4a4b13 to 93d6542CompareJuly 29, 2026 11:15
@mydea
mydea changed the base branch from develop to fn/continue-start-trace-testsJuly 29, 2026 11:15
Comment threadpackages/opentelemetry/src/index.ts
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from afdbe2c to 7aa618cCompareJuly 29, 2026 14:13
scope.setPropagationContext({
traceId: generateTraceId(),
sampleRand: safeMathRandom(),
return withActiveSpan(null, () => {

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.

just switching this up, it should not make concrete difference but seems more resilient, as it makes us more independent of what withActiveSpan does under the hood!

}

/** Custom implementation for OTEL, so we can handle scope-span linking. */
protected _getTraceInfoFromScope(

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.

it seems this was not used anywhere anymore!

Base automatically changed from fn/continue-start-trace-tests to developJuly 30, 2026 07:49
@mydeamydea changed the title feat(opentelemetry)!: Remove SentryPropagatorfeat(opentelemetry)!: Simplify propagation and remove custom OTel tracing utilsJul 30, 2026
@mydea
mydea marked this pull request as ready for review July 30, 2026 07:54
Comment threadpackages/opentelemetry/src/propagator.ts
@mydea
mydea requested review from a team as code ownersJuly 30, 2026 07:54
@mydea
mydea requested a review from a team as a code ownerJuly 31, 2026 10:19
@mydea
mydea requested review from logaretm and msonnb and removed request for a teamJuly 31, 2026 10:19
@mydea
mydea changed the base branch from fn/bun-http-integration to fn/streamline-acs-isolation-scopeJuly 31, 2026 10:20
mydea added 2 commits July 31, 2026 13:25
remove getTraceData & fixes
fix traceparent propagation
@mydea
mydeaforce-pushed the fn/propagator branch 2 times, most recently from cf12656 to 5d24bc4CompareJuly 31, 2026 11:26
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Base automatically changed from fn/streamline-acs-isolation-scope to developAugust 3, 2026 09:35
andreiborzaand others added 2 commits August 3, 2026 11:49
# Conflicts:
#	packages/core/src/monitor.ts
#	packages/core/test/integrations/redis/redis-common.test.ts
#	packages/node/test/integrations/tracing/redis/redis-common.test.ts
#	packages/opentelemetry/src/asyncContextStrategy.ts
#	packages/server-utils/src/async-context.ts
#	packages/server-utils/test/async-context.test.ts
#	packages/server-utils/test/redis/redis-common.test.ts
#	packages/vercel-edge/test/middlewareTraceIsolation.test.ts
Co-authored-by: Sigrid <32902192+s1gr1d@users.noreply.github.com>
Comment threadpackages/opentelemetry/src/propagator.ts

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

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 61517d1. Configure here.

Comment threadpackages/server-utils/src/index.ts
Comment threadpackages/opentelemetry/src/propagator.ts
Comment threadpackages/core/src/tracing/trace.ts
@andreiborza
andreiborza merged commit cabe3dc into developAug 3, 2026
266 checks passed
@andreiborza
andreiborza deleted the fn/propagator branch August 3, 2026 11:53
@andreiborzaandreiborza mentioned this pull request Aug 5, 2026
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.

Remove W3CBaggagePropagator from @opentelemetry/core

3 participants

@mydea@s1gr1d@andreiborza