Skip to content

Commit 6322afd

Browse files
Always set session id attributes even when empty (#3281)
* fix: rate limit manual end via user session * persist inactivity timeout for user sessions * return correct ID in SdkStateApiDelegate * refactor: alter timer syntax * refactor inactivity timeout * update semantic conventions * enforce manual session end requirements correctly * handle backwards time shift * support correct session ordinals * wire through session ids * refactor: prevent setting part id without user session id * wire in correct session ids for native crashes * refactor: alter AEI session id attributes * always set session id attributes even when empty
1 parent ba64d7b commit 6322afd

29 files changed

Lines changed: 145 additions & 92 deletions

File tree

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/EssentialServiceModuleImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ import io.embrace.android.embracesdk.internal.capture.user.UserService
1818
import io.embrace.android.embracesdk.internal.config.ConfigService
1919
import io.embrace.android.embracesdk.internal.navigation.NavigationTrackingServiceImpl
2020
import io.embrace.android.embracesdk.internal.session.id.SessionIdProvider
21+
import io.embrace.android.embracesdk.internal.session.id.SessionIdProviderImpl
2122
import io.embrace.android.embracesdk.internal.session.id.SessionPartTracker
2223
import io.embrace.android.embracesdk.internal.session.id.SessionPartTrackerImpl
2324
import io.embrace.android.embracesdk.internal.session.lifecycle.AppStateTrackerImpl
25+
import io.embrace.android.embracesdk.internal.session.orchestrator.SessionOrchestrator
2426
import io.embrace.android.embracesdk.internal.utils.EmbTrace
2527
import io.embrace.android.embracesdk.internal.utils.Provider
2628
import io.embrace.android.embracesdk.internal.worker.Worker
@@ -33,6 +35,7 @@ class EssentialServiceModuleImpl(
3335
workerThreadModule: WorkerThreadModule,
3436
lifecycleOwnerProvider: Provider<LifecycleOwner?>,
3537
networkConnectivityServiceProvider: Provider<NetworkConnectivityService?>,
38+
private val sessionOrchestratorProvider: Provider<SessionOrchestrator>,
3639
) : EssentialServiceModule {
3740

3841
override val appStateTracker: AppStateTracker by singleton {
@@ -86,10 +89,7 @@ class EssentialServiceModuleImpl(
8689
}
8790

8891
override val sessionIdProvider: SessionIdProvider by singleton {
89-
object : SessionIdProvider {
90-
override fun getCurrentSessionPartId(): String? = sessionPartTracker.getActiveSessionPartId()
91-
override fun getCurrentUserSessionId(): String? = null
92-
}
92+
SessionIdProviderImpl(sessionOrchestratorProvider, sessionPartTracker)
9393
}
9494

9595
override val userSessionPropertiesService: UserSessionPropertiesService by singleton {

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/SupplierTypealiases.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.embrace.android.embracesdk.internal.delivery.debug.DeliveryTracer
88
import io.embrace.android.embracesdk.internal.delivery.execution.RequestExecutionService
99
import io.embrace.android.embracesdk.internal.delivery.storage.PayloadStorageService
1010
import io.embrace.android.embracesdk.internal.envelope.session.OtelPayloadMapper
11+
import io.embrace.android.embracesdk.internal.session.orchestrator.SessionOrchestrator
1112
import io.embrace.android.embracesdk.internal.storage.StorageService
1213
import io.embrace.android.embracesdk.internal.utils.Provider
1314

@@ -44,6 +45,7 @@ typealias EssentialServiceModuleSupplier = (
4445
workerThreadModule: WorkerThreadModule,
4546
lifecycleOwnerProvider: Provider<LifecycleOwner?>,
4647
networkConnectivityServiceProvider: Provider<NetworkConnectivityService?>,
48+
sessionOrchestratorProvider: Provider<SessionOrchestrator>,
4749
) -> EssentialServiceModule
4850

4951
typealias FeatureModuleSupplier = (

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/UserSessionOrchestrationModuleImpl.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.embrace.android.embracesdk.internal.injection
33
import io.embrace.android.embracesdk.internal.config.ConfigService
44
import io.embrace.android.embracesdk.internal.session.UserSessionMetadataStore
55
import io.embrace.android.embracesdk.internal.session.id.SessionIdProvider
6-
import io.embrace.android.embracesdk.internal.session.id.SessionIdProviderImpl
76
import io.embrace.android.embracesdk.internal.session.message.PayloadFactoryImpl
87
import io.embrace.android.embracesdk.internal.session.message.PayloadMessageCollatorImpl
98
import io.embrace.android.embracesdk.internal.session.orchestrator.OrchestratorBoundaryDelegate
@@ -28,10 +27,7 @@ class UserSessionOrchestrationModuleImpl(
2827
) : UserSessionOrchestrationModule {
2928

3029
override val sessionIdProvider: SessionIdProvider by singleton {
31-
SessionIdProviderImpl(
32-
sessionOrchestrator,
33-
essentialServiceModule.sessionPartTracker,
34-
)
30+
essentialServiceModule.sessionIdProvider
3531
}
3632

3733
override val sessionOrchestrator: SessionOrchestrator by singleton {

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/session/id/SessionIdProviderImpl.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package io.embrace.android.embracesdk.internal.session.id
33
import io.embrace.android.embracesdk.internal.session.orchestrator.SessionOrchestrator
44

55
internal class SessionIdProviderImpl(
6-
private val sessionOrchestrator: SessionOrchestrator,
6+
private val sessionOrchestratorProvider: () -> SessionOrchestrator?,
77
private val sessionPartTracker: SessionPartTracker,
88
) : SessionIdProvider {
99

10-
override fun getCurrentUserSessionId(): String? =
11-
sessionOrchestrator.currentUserSession()?.userSessionId
10+
override fun getCurrentUserSessionId(): String =
11+
sessionOrchestratorProvider()?.currentUserSession()?.userSessionId ?: ""
1212

13-
override fun getCurrentSessionPartId(): String? =
14-
sessionPartTracker.getActiveSessionPart()?.sessionPartId
13+
override fun getCurrentSessionPartId(): String =
14+
sessionPartTracker.getActiveSessionPart()?.sessionPartId ?: ""
1515
}

embrace-android-core/src/test/kotlin/io/embrace/android/embracesdk/internal/resurrection/PayloadResurrectionServiceImplTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ class PayloadResurrectionServiceImplTest {
497497
) = NativeCrashData(
498498
nativeCrashId = nativeCrashId,
499499
sessionPartId = sessionId,
500+
userSessionId = "",
500501
timestamp = 0L,
501502
crash = null,
502503
symbols = null,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.embrace.android.embracesdk.internal.session.id
2+
3+
import io.embrace.android.embracesdk.fakes.FakeSessionOrchestrator
4+
import io.embrace.android.embracesdk.fakes.FakeSessionPartTracker
5+
import io.embrace.android.embracesdk.fakes.fakeSessionPartToken
6+
import io.embrace.android.embracesdk.internal.session.UserSessionMetadata
7+
import org.junit.Assert.assertEquals
8+
import org.junit.Before
9+
import org.junit.Test
10+
11+
internal class SessionIdProviderImplTest {
12+
13+
private lateinit var sessionOrchestrator: FakeSessionOrchestrator
14+
private lateinit var sessionPartTracker: FakeSessionPartTracker
15+
private lateinit var provider: SessionIdProviderImpl
16+
17+
@Before
18+
fun setUp() {
19+
sessionOrchestrator = FakeSessionOrchestrator()
20+
sessionPartTracker = FakeSessionPartTracker()
21+
provider = SessionIdProviderImpl({ sessionOrchestrator }, sessionPartTracker)
22+
}
23+
24+
@Test
25+
fun `returns empty string when no active user session`() {
26+
assertEquals("", provider.getCurrentSessionPartId())
27+
assertEquals("", provider.getCurrentUserSessionId())
28+
}
29+
30+
@Test
31+
fun `returns session part id when active session part exists`() {
32+
sessionPartTracker.currentSession = fakeSessionPartToken()
33+
assertEquals("fakeSessionId", provider.getCurrentSessionPartId())
34+
}
35+
36+
@Test
37+
fun `returns user session id when active user session exists`() {
38+
sessionOrchestrator.currentSession = UserSessionMetadata(
39+
startTimeMs = 1000L,
40+
userSessionId = "user-session-uuid",
41+
userSessionNumber = 1L,
42+
maxDurationSecs = 3600L,
43+
inactivityTimeoutSecs = 300L,
44+
partNumber = 1,
45+
lastActivityMs = 1000L,
46+
)
47+
assertEquals("user-session-uuid", provider.getCurrentUserSessionId())
48+
}
49+
}

embrace-android-core/src/test/kotlin/io/embrace/android/embracesdk/internal/session/orchestrator/SessionOrchestratorListenerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ internal class SessionOrchestratorListenerTest {
276276
),
277277
clock,
278278
object : SessionIdProvider {
279-
override fun getCurrentSessionPartId(): String? = sessionTracker.getActiveSessionPartId()
280-
override fun getCurrentUserSessionId(): String? = null
279+
override fun getCurrentSessionPartId(): String = sessionTracker.getActiveSessionPartId() ?: ""
280+
override fun getCurrentUserSessionId(): String = ""
281281
},
282282
store
283283
)

embrace-android-core/src/test/kotlin/io/embrace/android/embracesdk/internal/session/orchestrator/SessionOrchestratorTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,8 +1034,8 @@ internal class SessionOrchestratorTest {
10341034
),
10351035
clock,
10361036
object : SessionIdProvider {
1037-
override fun getCurrentSessionPartId(): String? = sessionTracker.getActiveSessionPartId()
1038-
override fun getCurrentUserSessionId(): String? = null
1037+
override fun getCurrentSessionPartId(): String = sessionTracker.getActiveSessionPartId() ?: ""
1038+
override fun getCurrentUserSessionId(): String = ""
10391039
},
10401040
store
10411041
)

embrace-android-infra/src/main/kotlin/io/embrace/android/embracesdk/internal/session/id/SessionIdProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ interface SessionIdProvider {
88
/**
99
* Returns the ID of the current user session.
1010
*/
11-
fun getCurrentUserSessionId(): String?
11+
fun getCurrentUserSessionId(): String
1212

1313
/**
1414
* Returns the ID of the current session part.
1515
*/
16-
fun getCurrentSessionPartId(): String?
16+
fun getCurrentSessionPartId(): String
1717
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
io.embrace.android.embracesdk.semconv.optIn=true
2+
io.opentelemetry.kotlin.semconv.optIn=true

0 commit comments

Comments
 (0)