feat(tracing): Copy app start vitals onto standalone children - #6631
Conversation
Mobile vitals grouping queries app.vitals.start.type and app.vitals.start.screen on child spans. Those attributes were only on the standalone app.start root, so breakdown and user spans under app.start.extended did not group with the root. Co-Authored-By: Cursor <cursoragent@cursor.com>
Semver Impact of This PR⚪ None (no version bump detected) 📋 Changelog PreviewThis is how your changes will appear in the changelog.
🤖 This preview updates automatically when you update the PR. |
|
There was a problem hiding this comment.
Pull request overview
Adds propagation of standalone app-start vitals dimensions (app.vitals.start.type, app.vitals.start.screen) from the root app.start transaction onto all child spans so downstream mobile vitals grouping/drill-down works consistently (including breakdown spans, native spans, and user spans under app.start.extended). The root-only behavior for app.vitals.start.value, the non-standalone ui.load path, and the deadline/suppressed-measurement behavior are preserved.
Changes:
- Copy
app.vitals.start.type/app.vitals.start.screenfrom standaloneapp.startroot trace data onto everyevent.spans[]entry. - Expand unit test coverage for standalone children propagation (incl. native spans, no-screen behavior, extended/user descendants, and suppression paths).
- Update locked snapshot and document the feature in
CHANGELOG.md.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| packages/core/src/js/tracing/integrations/appStart.ts | Adds copyStandaloneAppStartVitalsToChildren and wires it into the standalone attach flow. |
| packages/core/test/tracing/integrations/appStart.test.ts | Adds assertions/helpers to validate vitals propagation to standalone child spans (incl. extended/user descendants). |
| packages/core/test/tracing/integrations/snapshots/appStart.test.ts.snap | Updates the locked standalone snapshot to reflect vitals on child span data. |
| CHANGELOG.md | Notes the new standalone child-span vitals propagation behavior. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
📲 Install BuildsAndroid
|
Android (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8e18f68+dirty | 426.20 ms | 456.44 ms | 30.24 ms |
| 038a6d7+dirty | 524.82 ms | 531.92 ms | 7.10 ms |
| a858ac3+dirty | 426.50 ms | 484.82 ms | 58.32 ms |
| 822d35b+dirty | 429.31 ms | 498.04 ms | 68.73 ms |
| 5ca03f9+dirty | 423.30 ms | 467.00 ms | 43.70 ms |
| 083e3ef+dirty | 446.67 ms | 491.68 ms | 45.01 ms |
| 4953e94+dirty | 442.02 ms | 456.52 ms | 14.50 ms |
| 244f6e8+dirty | 424.36 ms | 488.29 ms | 63.92 ms |
| 2e64504+dirty | 450.52 ms | 482.70 ms | 32.18 ms |
| a9df5ce+dirty | 418.40 ms | 452.38 ms | 33.98 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8e18f68+dirty | 49.74 MiB | 55.45 MiB | 5.71 MiB |
| 038a6d7+dirty | 48.30 MiB | 53.60 MiB | 5.30 MiB |
| a858ac3+dirty | 49.74 MiB | 55.08 MiB | 5.34 MiB |
| 822d35b+dirty | 49.74 MiB | 54.84 MiB | 5.10 MiB |
| 5ca03f9+dirty | 49.74 MiB | 55.26 MiB | 5.52 MiB |
| 083e3ef+dirty | 49.74 MiB | 55.36 MiB | 5.61 MiB |
| 4953e94+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 244f6e8+dirty | 49.74 MiB | 55.38 MiB | 5.63 MiB |
| 2e64504+dirty | 49.74 MiB | 55.45 MiB | 5.71 MiB |
| a9df5ce+dirty | 49.74 MiB | 55.36 MiB | 5.62 MiB |
iOS (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 64630e5+dirty | 3842.70 ms | 1218.11 ms | -2624.60 ms |
| b0d3373+dirty | 3831.75 ms | 1227.29 ms | -2604.46 ms |
| b04af96+dirty | 3818.92 ms | 1219.76 ms | -2599.16 ms |
| 3d31fcf+dirty | 3838.09 ms | 1223.46 ms | -2614.63 ms |
| a0a3177+dirty | 3844.73 ms | 1225.23 ms | -2619.51 ms |
| af33f3b+dirty | 3849.98 ms | 1236.45 ms | -2613.53 ms |
| 09a902f+dirty | 3835.67 ms | 1217.11 ms | -2618.57 ms |
| 5a316ea+dirty | 3820.11 ms | 1211.28 ms | -2608.83 ms |
| 403b9f3+dirty | 3832.18 ms | 1213.32 ms | -2618.87 ms |
| acd838e+dirty | 3849.78 ms | 1230.00 ms | -2619.78 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 64630e5+dirty | 4.98 MiB | 6.46 MiB | 1.49 MiB |
| b0d3373+dirty | 5.15 MiB | 6.68 MiB | 1.53 MiB |
| b04af96+dirty | 4.98 MiB | 6.54 MiB | 1.56 MiB |
| 3d31fcf+dirty | 4.98 MiB | 6.56 MiB | 1.58 MiB |
| a0a3177+dirty | 4.98 MiB | 6.55 MiB | 1.58 MiB |
| af33f3b+dirty | 4.98 MiB | 6.51 MiB | 1.54 MiB |
| 09a902f+dirty | 4.98 MiB | 6.46 MiB | 1.49 MiB |
| 5a316ea+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| 403b9f3+dirty | 5.08 MiB | 6.72 MiB | 1.64 MiB |
| acd838e+dirty | 5.15 MiB | 6.70 MiB | 1.55 MiB |
iOS (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 3ce5254+dirty | 1217.70 ms | 1224.69 ms | 6.99 ms |
| 0b1b5e3+dirty | 3820.72 ms | 1207.94 ms | -2612.78 ms |
| 44abcc2+dirty | 3841.42 ms | 1214.77 ms | -2626.65 ms |
| 1d3572b+dirty | 3830.71 ms | 1222.23 ms | -2608.49 ms |
| 6177334+dirty | 3851.52 ms | 1226.23 ms | -2625.29 ms |
| 5ee78d6+dirty | 3815.71 ms | 1217.04 ms | -2598.67 ms |
| 083e3ef+dirty | 3871.96 ms | 1234.95 ms | -2637.01 ms |
| ce7b368+dirty | 3851.41 ms | 1222.37 ms | -2629.04 ms |
| 7887847+dirty | 3844.89 ms | 1221.67 ms | -2623.22 ms |
| 1122a96+dirty | 3839.17 ms | 1219.23 ms | -2619.93 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 3ce5254+dirty | 3.38 MiB | 4.76 MiB | 1.38 MiB |
| 0b1b5e3+dirty | 5.15 MiB | 6.70 MiB | 1.54 MiB |
| 44abcc2+dirty | 4.98 MiB | 6.55 MiB | 1.57 MiB |
| 1d3572b+dirty | 4.98 MiB | 6.56 MiB | 1.58 MiB |
| 6177334+dirty | 5.15 MiB | 6.68 MiB | 1.53 MiB |
| 5ee78d6+dirty | 5.15 MiB | 6.69 MiB | 1.53 MiB |
| 083e3ef+dirty | 4.98 MiB | 6.55 MiB | 1.57 MiB |
| ce7b368+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| 7887847+dirty | 4.98 MiB | 6.46 MiB | 1.48 MiB |
| 1122a96+dirty | 5.15 MiB | 6.68 MiB | 1.53 MiB |
Android (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8e18f68+dirty | 443.14 ms | 446.98 ms | 3.84 ms |
| ca9d079+dirty | 460.67 ms | 512.54 ms | 51.87 ms |
| c151573+dirty | 485.39 ms | 495.18 ms | 9.79 ms |
| 5a21b51+dirty | 505.16 ms | 539.20 ms | 34.04 ms |
| ecf47a2+dirty | 457.21 ms | 498.10 ms | 40.89 ms |
| 1d3572b+dirty | 444.48 ms | 478.42 ms | 33.94 ms |
| 3ce5254+dirty | 373.90 ms | 427.84 ms | 53.94 ms |
| 9b5615c+dirty | 428.67 ms | 490.15 ms | 61.48 ms |
| 2e64504+dirty | 488.33 ms | 541.31 ms | 52.98 ms |
| ad66da3+dirty | 411.49 ms | 449.38 ms | 37.89 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8e18f68+dirty | 49.74 MiB | 55.45 MiB | 5.71 MiB |
| ca9d079+dirty | 48.30 MiB | 53.58 MiB | 5.28 MiB |
| c151573+dirty | 48.30 MiB | 53.54 MiB | 5.24 MiB |
| 5a21b51+dirty | 48.30 MiB | 53.49 MiB | 5.19 MiB |
| ecf47a2+dirty | 49.74 MiB | 54.82 MiB | 5.07 MiB |
| 1d3572b+dirty | 49.74 MiB | 55.38 MiB | 5.63 MiB |
| 3ce5254+dirty | 43.94 MiB | 48.98 MiB | 5.04 MiB |
| 9b5615c+dirty | 49.74 MiB | 55.09 MiB | 5.34 MiB |
| 2e64504+dirty | 49.74 MiB | 55.45 MiB | 5.71 MiB |
| ad66da3+dirty | 48.30 MiB | 53.49 MiB | 5.19 MiB |
antonis
left a comment
There was a problem hiding this comment.
LGTM 🚢
Thank you for handling this Gino 🙇
📢 Type of change
📜 Description
Copy
app.vitals.start.typeandapp.vitals.start.screenfrom the standaloneapp.startroot onto every child span, including SDK breakdown spans and user spans underapp.start.extended.app.vitals.start.valuestays on the root only. Screen is omitted when no route has been registered. The non-standaloneui.loadpath is unchanged. Deadline / suppressed-measurement captures still omit these vitals on both the root and children.💡 Motivation and Context
Mobile vitals grouping/drill-down queries
app.vitals.start.typeandapp.vitals.start.screenon child spans. Those attributes were only on the standaloneapp.startroot, so breakdown and user-added children did not group with the root.Matches Android (getsentry/sentry-java#6005) and Flutter (getsentry/sentry-dart#3988).
Related to getsentry/sentry#122577
💚 How did you test it?
packages/core/test/tracing/integrations/appStart.test.tscovering SDK children, native spans, no-screen, extended/user descendants, deadline suppression, and non-standalone non-propagationyarn workspace @sentry/react-native test:sdk(1904 passing)📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps