Skip to content

Commit d31251a

Browse files
adinauerclaude
andcommitted
fix(core): Require active session for session trace lifecycle
Only remap root transactions onto the session propagation context when a session is currently active. This avoids reusing the ambient scope trace when session trace lifecycle is enabled before a session starts. Co-Authored-By: Claude <[email protected]>
1 parent 422aa61 commit d31251a

2 files changed

Lines changed: 33 additions & 6 deletions

File tree

sentry/src/main/java/io/sentry/Scopes.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,10 +1024,11 @@ && getOptions().getProfileLifecycle() == ProfileLifecycle.TRACE
10241024

10251025
private @NotNull TransactionContext maybeApplySessionTraceLifecycle(
10261026
final @NotNull TransactionContext transactionContext) {
1027-
final @NotNull PropagationContext propagationContext =
1028-
getCombinedScopeView().getPropagationContext();
10291027
if (getOptions().isEnableSessionTraceLifecycle()
1030-
&& transactionContext.getParentSpanId() == null) {
1028+
&& transactionContext.getParentSpanId() == null
1029+
&& getCombinedScopeView().getSession() != null) {
1030+
final @NotNull PropagationContext propagationContext =
1031+
getCombinedScopeView().getPropagationContext();
10311032
return TransactionContext.fromPropagationContextAsRoot(
10321033
propagationContext, transactionContext);
10331034
}

sentry/src/test/java/io/sentry/ScopesTest.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,10 +1823,28 @@ class ScopesTest {
18231823
}
18241824

18251825
@Test
1826-
fun `when session trace lifecycle is enabled, startTransaction uses session propagation context`() {
1826+
fun `when session trace lifecycle is enabled without active session, root transaction does not use scope propagation context`() {
18271827
val scopes = generateScopes { it.isEnableSessionTraceLifecycle = true }
18281828
var propagationContext: PropagationContext? = null
18291829
scopes.configureScope { propagationContext = it.propagationContext }
1830+
val context = TransactionContext("name", "op")
1831+
1832+
val transaction = scopes.startTransaction(context)
1833+
1834+
assertTrue(transaction is SentryTracer)
1835+
assertEquals(context.traceId, transaction.root.spanContext.traceId)
1836+
assertNotEquals(propagationContext!!.traceId, transaction.root.spanContext.traceId)
1837+
}
1838+
1839+
@Test
1840+
fun `when session trace lifecycle is enabled, startTransaction uses session propagation context`() {
1841+
val scopes = generateScopes {
1842+
it.isEnableSessionTraceLifecycle = true
1843+
it.release = "1.0.0"
1844+
}
1845+
scopes.startSession()
1846+
var propagationContext: PropagationContext? = null
1847+
scopes.configureScope { propagationContext = it.propagationContext }
18301848

18311849
val transaction = scopes.startTransaction(TransactionContext("name", "op"))
18321850

@@ -1839,7 +1857,11 @@ class ScopesTest {
18391857

18401858
@Test
18411859
fun `continued trace with parent span is not remapped to session trace`() {
1842-
val scopes = generateScopes { it.isEnableSessionTraceLifecycle = true }
1860+
val scopes = generateScopes {
1861+
it.isEnableSessionTraceLifecycle = true
1862+
it.release = "1.0.0"
1863+
}
1864+
scopes.startSession()
18431865
val traceId = "75302ac48a024bde9a3b3734a82e36c8"
18441866
val parentSpanId = "1000000000000000"
18451867
val context = scopes.continueTrace("$traceId-$parentSpanId-1", emptyList())!!
@@ -1853,7 +1875,11 @@ class ScopesTest {
18531875

18541876
@Test
18551877
fun `when session trace lifecycle is enabled, root transaction uses current propagation context`() {
1856-
val scopes = generateScopes { it.isEnableSessionTraceLifecycle = true }
1878+
val scopes = generateScopes {
1879+
it.isEnableSessionTraceLifecycle = true
1880+
it.release = "1.0.0"
1881+
}
1882+
scopes.startSession()
18571883
val traceId = "75302ac48a024bde9a3b3734a82e36c8"
18581884
val parentSpanId = "1000000000000000"
18591885
scopes.continueTrace("$traceId-$parentSpanId-1", emptyList())

0 commit comments

Comments
 (0)