Skip to content

Surface RSC timings in Request Insights#96053

Draft
timneutkens wants to merge 1 commit into
request-insights/span-namesfrom
codex/request-insights-rsc-timing-poc
Draft

Surface RSC timings in Request Insights#96053
timneutkens wants to merge 1 commit into
request-insights/span-namesfrom
codex/request-insights-rsc-timing-poc

Conversation

@timneutkens

@timneutkens timneutkens commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • tee the development React debug channel and regular Flight stream into a fail-open Request Insights collector
  • reconstruct sanitized RSC component self-time and await spans without changing React
  • attach RSC timings to the aggregate render RSC response span and show them in the default trace
  • cover split and out-of-order Flight rows, sanitization, entry limits, late parenting, and the delayed page integration

This is an internal, protocol-dependent proof of concept limited to dynamic App Router Node-stream rendering without Cache Components.

Verification

  • pnpm --filter=next types
  • pnpm jest packages/next/src/server/lib/trace/request-insights.test.ts packages/next/src/next-devtools/dev-overlay/components/request-insights/trace-viewer.test.ts --runInBand
  • NEXT_TEST_PREFER_OFFLINE=1 pnpm test-dev-webpack test/development/app-dir/request-insights/request-insights.test.ts
  • NEXT_TEST_PREFER_OFFLINE=1 pnpm test-dev-webpack test/development/app-dir/react-performance-track/react-performance-track.test.ts
  • Partial: Turbopack Request Insights suite passes the new delayed RSC timing case and 10/12 overall; two unrelated Server Action browser cases fail because Instant validation boundaries reach the client bundle.
  • Partial: Turbopack React performance-track suite passes 3/7; the remaining browser cases hit the same unrelated Instant validation-boundary bundling error.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 2 regressions, 2 improvements

Metric Canary PR Change Trend
Webpack Build Time 25.717s 26.427s 🔴 +710ms (+3%) ▁▁▁▁▁
Webpack Build Time (cached) 25.692s 26.466s 🔴 +774ms (+3%) ▁▂▁▂▁
node_modules Size 527 MB 518 MB 🟢 9.4 MB (-2%) █████
Webpack Cold (First Request) 3.998s 3.573s 🟢 425ms (-11%) ▁▂▂▄▃
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 812ms 813ms ▂▇▂▁▂
Cold (Ready in log) 780ms 783ms ▁▇▁▁▁
Cold (First Request) 1.309s 1.312s ▁▇▁▁▁
Warm (Listen) 813ms 812ms ▁▇▂▂▁
Warm (Ready in log) 800ms 788ms ▁▇▁▁▁
Warm (First Request) 1.360s 1.311s ▂▇▁▁▂
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 812ms 815ms ▂▂▂▂▂
Cold (Ready in log) 788ms 814ms ▁▂▂▂▁
Cold (First Request) 3.998s 3.573s 🟢 425ms (-11%) ▁▂▂▄▃
Warm (Listen) 814ms 812ms ▂▂▂▂▂
Warm (Ready in log) 796ms 787ms ▁▂▁▂▁
Warm (First Request) 3.465s 3.414s ▁▂▁▄▃

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.091s 5.083s ▁▇▂▂▂
Cached Build 5.159s 5.158s ▁▇▂▁▂
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 25.717s 26.427s 🔴 +710ms (+3%) ▁▁▁▁▁
Cached Build 25.692s 26.466s 🔴 +774ms (+3%) ▁▂▁▂▁
node_modules Size 527 MB 518 MB 🟢 9.4 MB (-2%) █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
03gmyxr7dukvs.js gzip 10.3 kB N/A -
040t1q17lo593.js gzip 8.77 kB N/A -
0bb0vtp8dwsez.js gzip 450 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0l0sr6gau5xjn.js gzip 3.53 kB N/A -
0nst2xc-t0y6v.js gzip 160 B N/A -
0nxqz3q165m2l.js gzip 220 B N/A -
0qr-1tnb7_hg5.js gzip 5.72 kB N/A -
0qtrl0m2m47zb.js gzip 155 B N/A -
0uilzvklme4ea.js gzip 8.76 kB N/A -
0z0y83mfx-l-h.js gzip 10 kB N/A -
1_dj4hrtb4p26.js gzip 7.4 kB N/A -
15ok8ydf274z0.js gzip 10.6 kB N/A -
16cqqcigykfea.js gzip 13.6 kB N/A -
17h18zxt1915l.js gzip 1.46 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1fq1h7dxad4cv.js gzip 9.44 kB N/A -
1fym-adbk_69_.js gzip 13.1 kB N/A -
1gav7nfh4y8ln.js gzip 8.76 kB N/A -
1o34vh44ndvtu.js gzip 13.2 kB N/A -
2-u463-ditelp.js gzip 156 B N/A -
23rhpy3kbs-7u.js gzip 65.6 kB N/A -
2d-6eh148r51x.js gzip 45.2 kB N/A -
2dvqqp3zqpnnq.js gzip 160 B N/A -
2guls-_0xkbp2.js gzip 153 B N/A -
2lcep9_t56iw5.js gzip 166 B N/A -
2rypqffktcxqh.js gzip 8.69 kB N/A -
2uqsizxtehgqf.js gzip 8.79 kB N/A -
2vzktdqwbijqc.js gzip 8.74 kB N/A -
2ydpbosxm0bih.js gzip 156 B N/A -
2zezpu-768ip-.js gzip 155 B N/A -
32874-2qs3sy7.js gzip 155 B N/A -
3a80mp1w6p7__.js gzip 153 B N/A -
3c244akvx_-be.js gzip 8.74 kB N/A -
3dmlemitx3ef3.js gzip 2.29 kB N/A -
3eqn7bfc1f1vc.js gzip 71.1 kB N/A -
3i1ah-rd8gyl6.js gzip 156 B N/A -
3kxmazxf0zw6v.js gzip 156 B N/A -
3za9ke3-tiboq.js gzip 153 B N/A -
4237vdj6eyslt.js gzip 8.7 kB N/A -
turbopack-0q..obj3.js gzip 3.8 kB N/A -
turbopack-10..kg69.js gzip 3.8 kB N/A -
turbopack-13..bkpr.js gzip 3.8 kB N/A -
turbopack-15..07mf.js gzip 3.8 kB N/A -
turbopack-1c..8d9x.js gzip 3.8 kB N/A -
turbopack-1g..5cux.js gzip 3.8 kB N/A -
turbopack-1i..0hfx.js gzip 3.8 kB N/A -
turbopack-1x..y-q4.js gzip 3.79 kB N/A -
turbopack-20..mf5k.js gzip 3.8 kB N/A -
turbopack-2l..5n26.js gzip 3.8 kB N/A -
turbopack-2y..j_7q.js gzip 3.8 kB N/A -
turbopack-31..2tc1.js gzip 3.82 kB N/A -
turbopack-3f..g_b7.js gzip 3.8 kB N/A -
turbopack-3r..ik36.js gzip 3.8 kB N/A -
00tc16j5-eos9.js gzip N/A 1.46 kB -
043nf81t7buaf.js gzip N/A 157 B -
0av7uk7dyhbqs.js gzip N/A 65.6 kB -
0erhoghr_r85x.js gzip N/A 155 B -
0gaw1gmpwuwkn.js gzip N/A 8.8 kB -
0jrji_q1msb1p.js gzip N/A 71 kB -
0z50qk3nhbdq6.js gzip N/A 157 B -
12zyjjmq4oad1.js gzip N/A 5.72 kB -
17viiokr8i37p.js gzip N/A 160 B -
1dkyf626et1pt.js gzip N/A 155 B -
1k9cc4-gpa2cx.js gzip N/A 13.1 kB -
1n59uogejo81s.js gzip N/A 10.3 kB -
1n5xsl058uas8.js gzip N/A 156 B -
1npei3hlexdv3.js gzip N/A 9.99 kB -
1rafe6xn_-rjn.js gzip N/A 169 B -
1ssuiwj_rnpc5.js gzip N/A 8.77 kB -
1wnvw-0jq89aj.js gzip N/A 160 B -
2-phc9obd3nyd.js gzip N/A 8.77 kB -
21tr06sv6r2aa.js gzip N/A 155 B -
24utq57r3l1cw.js gzip N/A 8.7 kB -
29wx3qw2zco54.js gzip N/A 153 B -
2fhjq6ek3srmr.js gzip N/A 8.69 kB -
2g0t7upz_v-hf.js gzip N/A 10.6 kB -
2ia9qqy99aie9.js gzip N/A 13.6 kB -
2n5fp99a5xt9s.js gzip N/A 7.4 kB -
2oza28kdqvoay.js gzip N/A 8.74 kB -
2t0tdi1im2rn9.js gzip N/A 155 B -
2y610aw5qmz9t.js gzip N/A 155 B -
2zh8-mmhujy8o.js gzip N/A 2.29 kB -
30h_m0irj-q6p.js gzip N/A 221 B -
37ejbfx1u9lpo.js gzip N/A 8.75 kB -
38c63ct4i1cy7.js gzip N/A 449 B -
3hd1us4ordyc9.js gzip N/A 13.2 kB -
3ie_w4n_n95-v.js gzip N/A 155 B -
3jimpal3lvz5e.js gzip N/A 9.44 kB -
3rxda-enqm36a.js gzip N/A 45 kB -
3su6a4l8jbfth.js gzip N/A 3.53 kB -
3wb4pe4z4-aim.js gzip N/A 8.77 kB -
turbopack-0_..a57d.js gzip N/A 3.85 kB -
turbopack-02..tn05.js gzip N/A 3.85 kB -
turbopack-17..4j95.js gzip N/A 3.85 kB -
turbopack-1a..d08_.js gzip N/A 3.85 kB -
turbopack-29..759a.js gzip N/A 3.83 kB -
turbopack-2d..jiau.js gzip N/A 3.85 kB -
turbopack-2l..oqoo.js gzip N/A 3.85 kB -
turbopack-2s..h2sz.js gzip N/A 3.85 kB -
turbopack-3_..88bf.js gzip N/A 3.85 kB -
turbopack-3-..c140.js gzip N/A 3.85 kB -
turbopack-34..vpfu.js gzip N/A 3.86 kB -
turbopack-3g..wvqb.js gzip N/A 3.85 kB -
turbopack-3i..rskn.js gzip N/A 3.85 kB -
turbopack-3q..mn0m.js gzip N/A 3.84 kB -
Total 448 kB 448 kB ⚠️ +375 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 780 B 727 B 🟢 53 B (-7%)
Total 780 B 727 B ✅ -53 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 427 B 432 B 🔴 +5 B (+1%)
Total 427 B 432 B ⚠️ +5 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2486.HASH.js gzip 169 B N/A -
3146-HASH.js gzip 64.2 kB N/A -
39fcf99b-HASH.js gzip 62.9 kB N/A -
8443-HASH.js gzip 4.68 kB N/A -
9431-HASH.js gzip 5.62 kB N/A -
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 255 B 253 B
main-HASH.js gzip 39.7 kB 40.1 kB 🔴 +451 B (+1%)
webpack-HASH.js gzip 1.68 kB 1.68 kB
6105-HASH.js gzip N/A 5.63 kB -
764.HASH.js gzip N/A 169 B -
8898-HASH.js gzip N/A 63.4 kB -
9597-HASH.js gzip N/A 4.65 kB -
e1ccab69-HASH.js gzip N/A 62.9 kB -
Total 239 kB 238 kB ✅ -478 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 182 B
css-HASH.js gzip 335 B 335 B
dynamic-HASH.js gzip 1.8 kB 1.8 kB
edge-ssr-HASH.js gzip 255 B 254 B
head-HASH.js gzip 351 B 349 B
hooks-HASH.js gzip 384 B 384 B
image-HASH.js gzip 581 B 580 B
index-HASH.js gzip 259 B 259 B
link-HASH.js gzip 2.49 kB 2.49 kB
routerDirect..HASH.js gzip 319 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 313 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.96 kB 7.95 kB ✅ -8 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 128 kB 128 kB
page.js gzip 285 kB 288 kB 🔴 +2.68 kB (+1%)
Total 413 kB 416 kB ⚠️ +2.82 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 613 B 615 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 45.5 kB 45.8 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 47.1 kB 47.5 kB ⚠️ +389 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 720 B 720 B
Total 720 B 720 B
Build Cache
Canary PR Change
0.pack gzip 4.83 MB 4.81 MB 🟢 17.6 kB (0%)
index.pack gzip 119 kB 120 kB
index.pack.old gzip 120 kB 120 kB
Total 5.07 MB 5.05 MB ✅ -16.8 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 366 kB 368 kB 🔴 +2.23 kB (+1%)
app-page-exp..prod.js gzip 202 kB 203 kB
app-page-tur...dev.js gzip 365 kB 368 kB 🔴 +2.23 kB (+1%)
app-page-tur..prod.js gzip 202 kB 203 kB
app-page-tur...dev.js gzip 362 kB 364 kB 🔴 +2.38 kB (+1%)
app-page-tur..prod.js gzip 200 kB 201 kB
app-page.run...dev.js gzip 362 kB 365 kB 🔴 +2.38 kB (+1%)
app-page.run..prod.js gzip 200 kB 201 kB
app-route-ex...dev.js gzip 81.7 kB 82.8 kB 🔴 +1.02 kB (+1%)
app-route-ex..prod.js gzip 55.6 kB 56.2 kB 🔴 +635 B (+1%)
app-route-tu...dev.js gzip 81.8 kB 82.8 kB 🔴 +1.02 kB (+1%)
app-route-tu..prod.js gzip 55.6 kB 56.2 kB 🔴 +636 B (+1%)
app-route-tu...dev.js gzip 81.4 kB 82.4 kB 🔴 +1.02 kB (+1%)
app-route-tu..prod.js gzip 55.4 kB 56 kB 🔴 +621 B (+1%)
app-route.ru...dev.js gzip 81.3 kB 82.4 kB 🔴 +1.02 kB (+1%)
app-route.ru..prod.js gzip 55.3 kB 56 kB 🔴 +624 B (+1%)
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 45.4 kB 46.1 kB 🔴 +633 B (+1%)
pages-api-tu..prod.js gzip 34.1 kB 34.3 kB
pages-api.ru...dev.js gzip 45.4 kB 46 kB 🔴 +638 B (+1%)
pages-api.ru..prod.js gzip 34.1 kB 34.2 kB
pages-turbo....dev.js gzip 54.9 kB 55.5 kB 🔴 +653 B (+1%)
pages-turbo...prod.js gzip 39.7 kB 40.1 kB
pages.runtim...dev.js gzip 54.8 kB 55.5 kB 🔴 +654 B (+1%)
pages.runtim..prod.js gzip 39.7 kB 40.1 kB
server.runti..prod.js gzip 67.8 kB 68.7 kB 🔴 +881 B (+1%)
use-cache-pr...dev.js gzip 71.6 kB 71.8 kB
use-cache-pr...dev.js gzip 71.6 kB 71.8 kB
use-cache-pr...dev.js gzip 69.9 kB 70.2 kB
use-cache-pr...dev.js gzip 69.9 kB 70.2 kB
Total 3.51 MB 3.53 MB ⚠️ +26.6 kB
📝 Changed Files (29 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • app-route-ex..ntime.dev.js
  • app-route-ex..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route.runtime.dev.js
  • app-route.ru..time.prod.js
  • pages-api-tu..ntime.dev.js
  • pages-api-tu..time.prod.js
  • pages-api.runtime.dev.js
  • pages-api.ru..time.prod.js
  • ... and 9 more
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
app-route-ex..ntime.dev.js

Diff too large to display

app-route-ex..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route.runtime.dev.js

Diff too large to display

app-route.ru..time.prod.js

Diff too large to display

pages-api-tu..ntime.dev.js

Diff too large to display

pages-api-tu..time.prod.js

Diff too large to display

pages-api.runtime.dev.js

Diff too large to display

pages-api.ru..time.prod.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

pages.runtime.dev.js

Diff too large to display

pages.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/2230e489c4639d0b9b9b87e3e59f529ac990afcb/next

Commit: 2230e48

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Failing test suites

Commit: 2230e48 | About building and testing Next.js

pnpm test-dev-experimental-turbo test/e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts (job)

  • otel-parent-span-propagation > should set http.route on handleRequest span for dynamic routes (DD)
  • otel-parent-span-propagation > should set http.route on handleRequest span for static routes (DD)
Expand output

● otel-parent-span-propagation › should set http.route on handleRequest span for dynamic routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /[slug]"
Received: "BaseServer.handleRequest"

  50 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/[slug]')
  51 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/[slug]')
> 52 |       expect(handleRequestSpan!.name).toBe('GET /[slug]')
     |                                       ^
  53 |     })
  54 |   })
  55 |

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:52:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:41:5)

● otel-parent-span-propagation › should set http.route on handleRequest span for static routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /"
Received: "BaseServer.handleRequest"

  68 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/')
  69 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/')
> 70 |       expect(handleRequestSpan!.name).toBe('GET /')
     |                                       ^
  71 |     })
  72 |   })
  73 | })

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:70:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:59:5)

pnpm test-start-experimental-turbo test/e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts (job)

  • otel-parent-span-propagation > should set http.route on handleRequest span for dynamic routes (DD)
  • otel-parent-span-propagation > should set http.route on handleRequest span for static routes (DD)
Expand output

● otel-parent-span-propagation › should set http.route on handleRequest span for dynamic routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /[slug]"
Received: "BaseServer.handleRequest"

  50 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/[slug]')
  51 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/[slug]')
> 52 |       expect(handleRequestSpan!.name).toBe('GET /[slug]')
     |                                       ^
  53 |     })
  54 |   })
  55 |

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:52:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:41:5)

● otel-parent-span-propagation › should set http.route on handleRequest span for static routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /"
Received: "BaseServer.handleRequest"

  68 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/')
  69 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/')
> 70 |       expect(handleRequestSpan!.name).toBe('GET /')
     |                                       ^
  71 |     })
  72 |   })
  73 | })

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:70:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:59:5)

pnpm test-dev test/e2e/opentelemetry/instrumentation/opentelemetry.test.ts (job)

  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch (DD)
  • opentelemetry - default > incoming context propagation > app router > should propagate custom context without span (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch on edge (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch in RSC mode (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle route handlers in app router (DD)
  • opentelemetry - default > incoming context propagation > app router > should record accurate status code for non-200 route handler responses (DD)
  • opentelemetry - default > incoming context propagation > app router > should record status code for failing handler (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle error in RSC (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle error inside Suspense boundary (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getStaticProps when fallback: 'blocking' (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps exceptions (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps returning notFound (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle api routes in pages (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle failing api routes in pages (DD)
  • opentelemetry - default > root context > app router > should trace inline Server Action (DD)
  • opentelemetry - default > root context > app router > should trace exported Server Action (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch (DD)
  • opentelemetry - default > root context > app router > should propagate custom context without span (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch on edge (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch in RSC mode (DD)
  • opentelemetry - default > root context > app router > should handle route handlers in app router (DD)
  • opentelemetry - default > root context > app router > should record accurate status code for non-200 route handler responses (DD)
  • opentelemetry - default > root context > app router > should record status code for failing handler (DD)
  • opentelemetry - default > root context > app router > should handle error in RSC (DD)
  • opentelemetry - default > root context > app router > should handle error inside Suspense boundary (DD)
  • opentelemetry - default > root context > pages > should handle getServerSideProps (DD)
  • opentelemetry - default > root context > pages > should handle getStaticProps when fallback: 'blocking' (DD)
  • opentelemetry - default > root context > pages > should handle getServerSideProps exceptions (DD)
  • opentelemetry - default > root context > pages > should handle getServerSideProps returning notFound (DD)
  • opentelemetry - default > root context > pages > should handle api routes in pages (DD)
  • opentelemetry - default > root context > pages > should handle failing api routes in pages (DD)
  • opentelemetry - middleware default > edge runtime > incoming context propagation > should trace middleware (DD)
  • opentelemetry - middleware default > edge runtime > root context > should trace middleware (DD)
  • opentelemetry - middleware default > nodejs runtime > incoming context propagation > should trace middleware (DD)
  • opentelemetry - middleware default > nodejs runtime > root context > should trace middleware (DD)
  • opentelemetry with custom server > should set attributes correctly on handleRequest span (DD)
  • opentelemetry with disabled fetch tracing > root context > app router with disabled fetch > should handle RSC with disabled fetch (DD)
Expand output

● opentelemetry - default › root context › app router › should trace inline Server Action

expect(received).toEqual(expected) // deep equality

- Expected  -  3
+ Received  + 12

- ObjectContaining {
-   "attributes": ObjectContaining {
+ Object {
+   "attributes": Object {
      "next.server_action.file": "app/app/[param]/server-action/page.tsx",
      "next.server_action.name": "<inline action>",
-     "next.span_category": "application",
+     "next.span.category": "application",
      "next.span_name": "run Server Action <inline action>",
      "next.span_type": "AppRender.executeServerAction",
    },
+   "duration": 295.522,
+   "events": Array [],
+   "id": "be542f547c4bce97",
+   "kind": 0,
+   "links": Array [],
    "name": "AppRender.executeServerAction",
+   "parentId": "0e42db49ae41b653",
+   "runtime": "nodejs",
    "status": Object {
      "code": 0,
    },
+   "timestamp": 1784720170972000,
+   "traceId": "66c9a78dc71bac1f1eb53f7e059009b8",
  }

  130 |                   )
  131 |
> 132 |                 expect(span).toEqual(
      |                              ^
  133 |                   expect.objectContaining({
  134 |                     name: 'AppRender.executeServerAction',
  135 |                     attributes: expect.objectContaining({

  at toEqual (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:132:30)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:123:15)

● opentelemetry - default › root context › app router › should trace exported Server Action

expect(received).toEqual(expected) // deep equality

- Expected  -  3
+ Received  + 12

- ObjectContaining {
-   "attributes": ObjectContaining {
+ Object {
+   "attributes": Object {
      "next.server_action.file": "app/app/[param]/server-action/actions.ts",
      "next.server_action.name": "exportedServerAction",
-     "next.span_category": "application",
+     "next.span.category": "application",
      "next.span_name": "run Server Action exportedServerAction",
      "next.span_type": "AppRender.executeServerAction",
    },
+   "duration": 200.647,
+   "events": Array [],
+   "id": "247c8ffe8b05aab7",
+   "kind": 0,
+   "links": Array [],
    "name": "AppRender.executeServerAction",
+   "parentId": "c366665a41179bd4",
+   "runtime": "nodejs",
    "status": Object {
      "code": 0,
    },
+   "timestamp": 1784720175462000,
+   "traceId": "882e2414691f5540dea9c87fe4b58ca6",
  }

  164 |                   )
  165 |
> 166 |                 expect(span).toEqual(
      |                              ^
  167 |                   expect.objectContaining({
  168 |                     name: 'AppRender.executeServerAction',
  169 |                     attributes: expect.objectContaining({

  at toEqual (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:166:30)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:157:15)

● opentelemetry - default › root context › app router › should handle RSC with fetch

expect(received).toMatchObject(expected)

- Expected  - 2
+ Received  + 2

@@ -9,21 +9,21 @@
        "next.rsc": false,
        "next.span_name": "GET /app/[param]/rsc-fetch",
        "next.span_type": "BaseServer.handleRequest",
      },
      "kind": 1,
-     "name": "GET /app/[param]/rsc-fetch",
+     "name": "BaseServer.handleRequest",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
            "next.route": "/app/[param]/rsc-fetch",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch",
            "next.span_type": "AppRender.getBodyResult",
          },
          "kind": 0,
-         "name": "render route (app) /app/[param]/rsc-fetch",
+         "name": "AppRender.getBodyResult",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:192:13)

● opentelemetry - default › root context › app router › should propagate custom context without span

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

  Array [
    Object {
      "attributes": Object {
        "custom": "custom1",
      },
-     "name": "GET /app/[param]/rsc-fetch",
+     "name": "BaseServer.handleRequest",
    },
  ]

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:339:13)

● opentelemetry - default › root context › app router › should handle RSC with fetch on edge

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

@@ -19,11 +19,11 @@
            "next.route": "/app/[param]/rsc-fetch/edge",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch/edge",
            "next.span_type": "AppRender.getBodyResult",
          },
          "kind": 0,
-         "name": "render route (app) /app/[param]/rsc-fetch/edge",
+         "name": "AppRender.getBodyResult",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:352:13)

● opentelemetry - default › root context › app router › should handle RSC with fetch in RSC mode

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

@@ -9,11 +9,11 @@
        "next.rsc": true,
        "next.span_name": "RSC GET /app/[param]/rsc-fetch",
        "next.span_type": "BaseServer.handleRequest",
      },
      "kind": 1,
-     "name": "RSC GET /app/[param]/rsc-fetch",
+     "name": "BaseServer.handleRequest",
      "parentId": undefined,
      "runtime": "nodejs",
      "status": Object {
        "code": 0,
      },

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:472:13)

● opentelemetry - default › root context › app router › should handle route handlers in app router

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

@@ -8,11 +8,11 @@
        "next.route": "/api/app/[param]/data",
        "next.span_name": "GET /api/app/[param]/data",
        "next.span_type": "BaseServer.handleRequest",
      },
      "kind": 1,
-     "name": "GET /api/app/[param]/data",
+     "name": "BaseServer.handleRequest",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
            "next.route": "/api/app/[param]/data",

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:497:13)

● opentelemetry - default › root context › app router › should record accurate status code for non-200 route handler responses

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

@@ -8,11 +8,11 @@
        "next.route": "/api/app/[param]/status",
        "next.span_name": "GET /api/app/[param]/status",
        "next.span_type": "BaseServer.handleRequest",
      },
      "kind": 1,
-     "name": "GET /api/app/[param]/status",
+     "name": "BaseServer.handleRequest",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
            "next.route": "/api/app/[param]/status",

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:557:13)

● opentelemetry - default › root context › app router › should record status code for failing handler

expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 1

@@ -8,11 +8,11 @@
        "next.route": "/api/app/[param]/error",
        "next.span_name": "GET /api/app/[param]/error",
        "next.span_type": "BaseServer.handleRequest",
      },
      "kind": 1,
-     "name": "GET /api/app/[param]/error",
+     "name": "BaseServer.handleRequest",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
            "next.route": "/api/app/[param]/error",

  2172 |     })
  2173 |
> 2174 |     expect(filteredTree).toMatchObject(match)
       |                          ^
  2175 |   })
  2176 | }
  2177 |

  at toMatchObject (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2174:26)
  at fn (lib/next-test-utils.ts:867:20)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:2099:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:617:13)

● opentelemetry - default › root context › app router › should handle error in RSC

expect(received).toMatchObject(expected)

- Exp

... truncated ...

pnpm test-dev test/development/app-dir/request-insights/request-insights.test.ts (job)

  • request insights > tracks RSC rendering and HTML completion across Suspense (DD)
Expand output

● request insights › tracks RSC rendering and HTML completion across Suspense

expect(received).toBeGreaterThanOrEqual(expected)

Expected: >= 150
Received:    143.41015625

  612 |     expect(waitForHTMLCompletionSpan).toBeDefined()
  613 |     expect(renderRSCResponseSpan!.durationMs).toBeGreaterThanOrEqual(150)
> 614 |     expect(waitForHTMLCompletionSpan!.durationMs).toBeGreaterThanOrEqual(150)
      |                                                   ^
  615 |     expect(renderHTMLShellSpan!.durationMs).toBeLessThan(
  616 |       renderRSCResponseSpan!.durationMs!
  617 |     )

  at Object.toBeGreaterThanOrEqual (development/app-dir/request-insights/request-insights.test.ts:614:51)

pnpm test-dev test/e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts (job)

  • otel-parent-span-propagation > should set http.route on handleRequest span for dynamic routes (DD)
  • otel-parent-span-propagation > should set http.route on handleRequest span for static routes (DD)
Expand output

● otel-parent-span-propagation › should set http.route on handleRequest span for dynamic routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /[slug]"
Received: "BaseServer.handleRequest"

  50 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/[slug]')
  51 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/[slug]')
> 52 |       expect(handleRequestSpan!.name).toBe('GET /[slug]')
     |                                       ^
  53 |     })
  54 |   })
  55 |

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:52:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:41:5)

● otel-parent-span-propagation › should set http.route on handleRequest span for static routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /"
Received: "BaseServer.handleRequest"

  68 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/')
  69 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/')
> 70 |       expect(handleRequestSpan!.name).toBe('GET /')
     |                                       ^
  71 |     })
  72 |   })
  73 | })

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:70:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:59:5)

pnpm test-start test/e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts (job)

  • otel-parent-span-propagation > should set http.route on handleRequest span for dynamic routes (DD)
  • otel-parent-span-propagation > should set http.route on handleRequest span for static routes (DD)
Expand output

● otel-parent-span-propagation › should set http.route on handleRequest span for dynamic routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /[slug]"
Received: "BaseServer.handleRequest"

  50 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/[slug]')
  51 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/[slug]')
> 52 |       expect(handleRequestSpan!.name).toBe('GET /[slug]')
     |                                       ^
  53 |     })
  54 |   })
  55 |

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:52:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:41:5)

● otel-parent-span-propagation › should set http.route on handleRequest span for static routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /"
Received: "BaseServer.handleRequest"

  68 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/')
  69 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/')
> 70 |       expect(handleRequestSpan!.name).toBe('GET /')
     |                                       ^
  71 |     })
  72 |   })
  73 | })

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:70:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:59:5)

pnpm test-dev-turbo test/development/acceptance/ReactRefreshLogBox-builtins.test.ts (turbopack) (job)

  • ReactRefreshLogBox > Node.js builtins (DD)
  • ReactRefreshLogBox > Module not found (DD)
  • ReactRefreshLogBox > Module not found (missing global CSS) (DD)
Expand output

● ReactRefreshLogBox › Node.js builtins

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox Node.js builtins 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Module not found: Can't resolve 'dns'",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./node_modules/my-package/index.js (1:13)
- Error: Module not found: Can't resolve 'dns'
- > 1 | const dns = require('dns')
-     |             ^^^^^^^^^^^^^^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  46 |
  47 |     if (isTurbopack) {
> 48 |       await expect(browser).toDisplayRedbox(`
     |                             ^
  49 |        {
  50 |          "description": "Module not found: Can't resolve 'dns'",
  51 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance/ReactRefreshLogBox-builtins.test.ts:48:29)

● ReactRefreshLogBox › Module not found

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox Module not found 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Module not found: Can't resolve 'b'",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./index.js (1:1)
- Error: Module not found: Can't resolve 'b'
- > 1 | import Comp from 'b'
-     | ^^^^^^^^^^^^^^^^^^^^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  113 |
  114 |     if (isTurbopack) {
> 115 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  116 |        {
  117 |          "description": "Module not found: Can't resolve 'b'",
  118 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance/ReactRefreshLogBox-builtins.test.ts:115:29)

● ReactRefreshLogBox › Module not found (missing global CSS)

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox Module not found (missing global CSS) 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Module not found: Can't resolve './non-existent.css'",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./pages/_app.js (1:1)
- Error: Module not found: Can't resolve './non-existent.css'
- > 1 | import './non-existent.css'
-     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  257 |
  258 |     if (isTurbopack) {
> 259 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  260 |        {
  261 |          "description": "Module not found: Can't resolve './non-existent.css'",
  262 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance/ReactRefreshLogBox-builtins.test.ts:259:29)

pnpm test-dev-turbo test/development/acceptance/server-component-compiler-errors-in-pages.test.ts (turbopack) (job)

  • Error Overlay for server components compiler errors in pages > importing 'next/cache' APIs in pages > cacheTag is not allowed (DD)
Expand output

● Error Overlay for server components compiler errors in pages › importing 'next/cache' APIs in pages › cacheTag is not allowed

Expected Redbox but found no visible one.

  405 |       )
  406 |
> 407 |       await session.waitForRedbox()
      |       ^
  408 |       await expect(session.getRedboxSource()).resolves.toMatch(
  409 |         `You're importing a module that depends on "${api}". This API is only available in Server Components in the App Router, but you are using it in the Pages Router.`
  410 |       )

  at development/acceptance/server-component-compiler-errors-in-pages.test.ts:407:7

pnpm test-dev-turbo test/e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts (turbopack) (job)

  • otel-parent-span-propagation > should set http.route on handleRequest span for dynamic routes (DD)
  • otel-parent-span-propagation > should set http.route on handleRequest span for static routes (DD)
Expand output

● otel-parent-span-propagation › should set http.route on handleRequest span for dynamic routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /[slug]"
Received: "BaseServer.handleRequest"

  50 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/[slug]')
  51 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/[slug]')
> 52 |       expect(handleRequestSpan!.name).toBe('GET /[slug]')
     |                                       ^
  53 |     })
  54 |   })
  55 |

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:52:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:41:5)

● otel-parent-span-propagation › should set http.route on handleRequest span for static routes

expect(received).toBe(expected) // Object.is equality

Expected: "GET /"
Received: "BaseServer.handleRequest"

  68 |       expect(handleRequestSpan!.attributes?.['http.route']).toBe('/')
  69 |       expect(handleRequestSpan!.attributes?.['next.route']).toBe('/')
> 70 |       expect(handleRequestSpan!.name).toBe('GET /')
     |                                       ^
  71 |     })
  72 |   })
  73 | })

  at toBe (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:70:39)
  at fn (lib/next-test-utils.ts:867:20)
  at Object.<anonymous> (e2e/app-dir/otel-parent-span-propagation/otel-parent-span-propagation.test.ts:59:5)

pnpm test-dev-turbo test/e2e/opentelemetry/instrumentation/opentelemetry.test.ts (turbopack) (job)

  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch (DD)
  • opentelemetry - default > incoming context propagation > app router > should propagate custom context without span (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch on edge (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle RSC with fetch in RSC mode (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle route handlers in app router (DD)
  • opentelemetry - default > incoming context propagation > app router > should record accurate status code for non-200 route handler responses (DD)
  • opentelemetry - default > incoming context propagation > app router > should record status code for failing handler (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle error in RSC (DD)
  • opentelemetry - default > incoming context propagation > app router > should handle error inside Suspense boundary (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getStaticProps when fallback: 'blocking' (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps exceptions (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle getServerSideProps returning notFound (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle api routes in pages (DD)
  • opentelemetry - default > incoming context propagation > pages > should handle failing api routes in pages (DD)
  • opentelemetry - default > root context > app router > should trace inline Server Action (DD)
  • opentelemetry - default > root context > app router > should trace exported Server Action (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch (DD)
  • opentelemetry - default > root context > app router > should propagate custom context without span (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch on edge (DD)
  • opentelemetry - default > root context > app router > should handle RSC with fetch in RSC mode (DD)
  • opentelemetry - default > root context > app router > should handle rout

... truncated to fit in one GitHub comment ...

@timneutkens timneutkens changed the title codex/request insights rsc timing poc Surface RSC timings in Request Insights Jul 22, 2026
attributes: {
'next.span_name': `run Server Action ${serverActionName}`,
'next.span_category': 'application',
'next.span.category': 'application',

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.

The OTel e2e test still asserts the old span attribute key next.span_category for the AppRender.executeServerAction span, but the PR renamed it to next.span.category, so both Server Action span assertions will fail.

Fix on Vercel

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.

1 participant