Skip to content

test(e2e): Port the React Router lazy routes E2E app to span streaming - #23846

Draft
andreiborza wants to merge 2 commits into
ab/js-3482/instrumentation-apifrom
ab/js-3482/lazy-routes
Draft

test(e2e): Port the React Router lazy routes E2E app to span streaming#23846
andreiborza wants to merge 2 commits into
ab/js-3482/instrumentation-apifrom
ab/js-3482/lazy-routes

Conversation

@andreiborza

@andreiborza andreiborza commented Sep 1, 2026

Copy link
Copy Markdown
Member

What

Ports react-router-7-lazy-routes to span streaming, the last app in the group.

Why

Span streaming is the default now, so the E2E suite has to exercise it. The span-leaking and GQL attribution specs group streamed spans by trace instead of reading a transaction's spans array, and they match fetch spans on url.full, since a streamed http.client span carries only the domain in its name.

Closes: #23798

@linear-code

linear-code Bot commented Sep 1, 2026

Copy link
Copy Markdown

JS-3482

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size % Change Change
@sentry/browser 28.57 kB - -
@sentry/browser - with treeshaking flags 26.94 kB - -
@sentry/browser - with treeshaking flags tracing without tracing 26.83 kB - -
@sentry/browser (incl. Tracing) 48.87 kB - -
@sentry/browser (incl. Tracing + Span Streaming) 48.88 kB - -
@sentry/browser (incl. Tracing, Profiling) 51.8 kB - -
@sentry/browser (incl. Tracing, Replay) 88.36 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 77.76 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 93.05 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 106.02 kB - -
@sentry/browser (incl. Feedback) 46.06 kB - -
@sentry/browser (incl. sendFeedback) 33.64 kB - -
@sentry/browser (incl. FeedbackAsync) 38.74 kB - -
@sentry/browser (incl. Metrics) 29.52 kB - -
@sentry/browser (incl. Logs) 29.81 kB - -
@sentry/browser (incl. Metrics & Logs) 30.45 kB - -
@sentry/react 30.32 kB - -
@sentry/react (incl. Tracing) 51.08 kB - -
@sentry/vue 35.74 kB - -
@sentry/vue (incl. Tracing) 51.14 kB - -
@sentry/svelte 28.6 kB - -
CDN Bundle 30.36 kB - -
CDN Bundle (incl. Tracing) 49.52 kB - -
CDN Bundle (incl. Logs, Metrics) 32.59 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 51.43 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) 73.19 kB - -
CDN Bundle (incl. Tracing, Replay) 87.01 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 88.88 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 92.94 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 94.84 kB - -
CDN Bundle - uncompressed 89.97 kB - -
CDN Bundle (incl. Tracing) - uncompressed 147.58 kB - -
CDN Bundle (incl. Logs, Metrics) - uncompressed 96.27 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 153.27 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 225.43 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 267.07 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 272.75 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 280.77 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 286.44 kB - -
@sentry/nextjs (client) 53.7 kB - -
@sentry/sveltekit (client) 49.3 kB - -
@sentry/core/server 40.74 kB - -
@sentry/core/browser 13.42 kB - -
@sentry/node 123.87 kB +0.02% +20 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection) 81.4 kB - -
@sentry/node - without tracing 88.2 kB +0.03% +22 B 🔺
@sentry/node - without channel injection 103.3 kB +0.02% +16 B 🔺
@sentry/aws-serverless 96.56 kB +0.03% +24 B 🔺
@sentry/cloudflare (withSentry) - minified 201.23 kB - -
@sentry/cloudflare (withSentry) 500.94 kB - -

View base workflow run

@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch from 2cc3dfd to 9083cbf Compare September 1, 2026 14:21
@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch from 9083cbf to ea78db3 Compare September 1, 2026 14:56
@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch from ea78db3 to 797611d Compare September 1, 2026 15:43
@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch from 797611d to 2460015 Compare September 1, 2026 15:55
@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch 2 times, most recently from e5246b4 to aa2cbfc Compare September 1, 2026 16:37
Removes the `traceLifecycle: 'static'` pin from `react-router-7-lazy-routes`
and rewrites its specs against streamed span v2.

The span-leaking and GQL attribution specs group streamed spans by trace
instead of reading a transaction's `spans` array, and they match fetch spans on
`url.full`, since a streamed `http.client` span carries only the domain in its
name.
The pageload span was also taken from the first segment in the collection rather
than the one the wait matched.
@andreiborza
andreiborza force-pushed the ab/js-3482/lazy-routes branch from aa2cbfc to cd0da76 Compare September 1, 2026 16:51

@cursor cursor Bot 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 cd0da76. Configure here.


// Verify the trace contains a fetch span. Streamed http.client names are only `<METHOD> <domain>`,
// so the request URL comes from `url.full`.
const fetchSpan = spans.find(span => getSpanOp(span) === 'http.client' && hasUrlPart(span, '/api/slow-data'));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Child fetch spans not awaited

Medium Severity

collectStreamedTrace and collectStreamedSpans stop once the segment arrives, then the tests immediately assert on fetch children. Streamed children can flush after their segment, so the UserA/UserB and /api/slow-data checks can miss spans that the old transaction payload always included.

Additional Locations (2)
Fix in Cursor Fix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cd0da76. Configure here.

// Monitor and add all transaction names sent to Sentry for the navigations
const allTransactionsPromise = waitForTransaction('react-router-7-lazy-routes', async transactionEvent => {
if (transactionEvent?.transaction) {
transactionNamesList.push(transactionEvent.transaction);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Collector records every segment span

Low Severity

The duplicate-name spec now pushes every is_segment span into transactionNamesList and expects exactly five route names. waitForTransaction only ever saw pageload and navigation events, so any extra streamed segment (for example a web vital) makes the strict toEqual fail.

Fix in Cursor Fix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cd0da76. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Port React Router E2E test apps to span streaming

1 participant