ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretmlogaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

Copy link
Copy Markdown

JS-2628

@github-actions

github-actionsBot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

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

PathSize% ChangeChange
@sentry/browser27.76 kB--
@sentry/browser - with treeshaking flags26.2 kB--
@sentry/browser (incl. Tracing)46.28 kB-0.68%-314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming)48.07 kB-0.68%-328 B 🔽
@sentry/browser (incl. Tracing, Profiling)51.1 kB-0.57%-289 B 🔽
@sentry/browser (incl. Tracing, Replay)85.56 kB-0.32%-274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.2 kB-0.36%-271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas)90.26 kB-0.33%-292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback)102.92 kB-0.29%-291 B 🔽
@sentry/browser (incl. Feedback)44.95 kB--
@sentry/browser (incl. sendFeedback)32.56 kB--
@sentry/browser (incl. FeedbackAsync)37.62 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.06 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.55 kB--
@sentry/react (incl. Tracing)48.59 kB-0.58%-283 B 🔽
@sentry/vue33.18 kB--
@sentry/vue (incl. Tracing)48.24 kB-0.66%-320 B 🔽
@sentry/svelte27.78 kB--
CDN Bundle30.1 kB--
CDN Bundle (incl. Tracing)48.15 kB-0.69%-334 B 🔽
CDN Bundle (incl. Logs, Metrics)31.68 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.47 kB-0.63%-309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics)70.94 kB--
CDN Bundle (incl. Tracing, Replay)85.71 kB-0.33%-278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.02 kB-0.34%-293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback)91.5 kB-0.34%-307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.78 kB-0.31%-287 B 🔽
CDN Bundle - uncompressed89.72 kB--
CDN Bundle (incl. Tracing) - uncompressed144.82 kB-1.22%-1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed94.43 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed148.8 kB-1.19%-1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.19 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.06 kB-0.67%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.02 kB-0.66%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.76 kB-0.64%-1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.71 kB-0.63%-1.78 kB 🔽
@sentry/nextjs (client)51.09 kB-0.57%-288 B 🔽
@sentry/sveltekit (client)46.7 kB-0.65%-301 B 🔽
@sentry/core/server80.13 kB--
@sentry/core/browser51.97 kB--
@sentry/node124.21 kB--
@sentry/node (incl. diagnostics channel injection)149.66 kB+0.01%+1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB--
@sentry/node - without tracing74.38 kB+0.01%+1 B 🔺
@sentry/aws-serverless83.86 kB--
@sentry/cloudflare (withSentry) - minified196.59 kB--
@sentry/cloudflare (withSentry)483.84 kB--

View base workflow run

@logaretm
logaretmforce-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99bCompareJune 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to developJune 3, 2026 19:49
@logaretmlogaretm closed this Jun 4, 2026
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbacCompareJune 4, 2026 14:17
@logaretmlogaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code ownerJune 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a teamJune 4, 2026 20:14
Comment threadpackages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

Copy link
Copy Markdown
MemberAuthor

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73eCompareJune 10, 2026 15:07
logaretmand others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.
Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.
This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretmforce-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6bCompareJuly 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment threadpackages/browser-utils/src/metrics/browserMetrics.ts
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/src/metrics/cls.ts Outdated
Comment threadpackages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydeaJuly 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450
Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into developJul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@Lms24@msonnb