Repository navigation
Nav3 SentryTraced spans attach to another root’s navigation transaction #6368
Description
Description
When multiple Nav3 roots are hosted by different Activities or Fragments, SentryTraced can attach a route's ui.compose and ui.render spans to another root's navigation transaction. This produces a trace whose transaction name and child route names disagree.
Reproduced with the Android sample app on fix/nav3-view-pager-2 (sample build from c1113ebedb; a later amend changed only tests), version 8.61.1, on an API 37 emulator. The sample's Recent transactions sheet reads the finished SentryTransaction from beforeSendTransaction, so the mismatch is in the transaction sent by the SDK.
Steps to reproduce
Multi-Activity
- In the Android sample, open Nav3 Activity with the default setup, then select Multi-Activity.
- Open Products Activity → Open Product 42.
- Tap Push Confirmation in 5 s, then immediately tap Go to Checkout to open Checkout Activity.
- After the delayed route is pushed in the background Products Activity, leave Checkout and inspect Recent transactions.
The tagged controls are nav3_tab_multi_activity, nav3_multi_activity_open_products, nav3_product_list_open_product_42, nav3_product_detail_delayed_confirmation, and nav3_product_detail_go_to_checkout.
Multi-Fragment / ViewPager2
- In the same sample, select Multi-Fragment → Open fragments Activity → Pager.
- Move from Page 0 to Page 1 and Page 2. The neighboring Fragment pages are preloaded at
STARTED(offscreenPageLimit = 1). - Inspect the finished Page 0
/ProductListtransaction in Recent transactions.
The tagged controls are nav3_tab_multi_fragment, nav3_multi_fragment_open_fragments, nav3_multi_fragment_open_pager, and nav3_multi_fragment_page_0 through _2.
Expected
A SentryTraced route's composition and render spans are children of that route's own navigation transaction. If its root does not currently have a transaction, its spans should not be attached to another root's transaction.
Actual
- The Checkout Activity's
/Checkouttransaction containsui.compose - Nav3 /Confirmationfrom the background Products Activity. Captured trace. - A Page 0
/ProductListtransaction containsui.composeandui.renderspans for Page 1/Checkoutand Page 2/Confirmation. Captured trace.
The sample's test.navigation.route_activation spans also attach to the wrong transaction in these runs. Those spans come from sample instrumentation; the ui.compose and ui.render spans demonstrate the SDK issue.
Likely cause
SentryTraced obtains its owner from LocalSentrySpan.current.orBootstrapCurrentTransaction() (sentry-compose/.../SentryComposeTracing.kt). The Nav3 sample does not provide a per-entry LocalSentrySpan, so the fallback reads whichever transaction is bound to the shared scope at composition time. A background Activity or preloaded Fragment can compose while another root owns that scope transaction. The Nav3 lease limits which root publishes navigation state but does not bind SentryTraced spans to their entry.
A possible fix is for each Nav3 entry to provide its own parent span to SentryTraced, with a no-op owner when the entry has no transaction. The exact API and preview-span policy need design review.
Related
- Support use of SentryNavEffect in multi-Activity and multi-Fragment applications #6345 added multi-Activity and multi-Fragment Nav3 support. This issue concerns composition-span attribution across those roots.
- Idle transactions containing SentryTraced spans wait for the deadline and finish as DEADLINE_EXCEEDED #6366 tracks idle
SentryTracedtransactions finishing at the deadline; that timeout behavior is separate from this attribution bug.
Activity
linear-code commentedon Oct 23, 2026
JAVA-797