Allow bridging Sentry spans to the SDK ones.

Add distributed tracing for `Room.timelineWithConfiguration`, so we can inspect the associated Rust trace.
This commit is contained in:
Jorge Martín 2025-11-21 17:20:12 +01:00 committed by Jorge Martin Espinosa
parent 6c404fda36
commit bd427735ff
15 changed files with 195 additions and 10 deletions

View file

@ -20,7 +20,10 @@ import io.element.android.libraries.di.annotations.AppCoroutineScope
import io.element.android.libraries.sessionstorage.api.observer.SessionListener
import io.element.android.libraries.sessionstorage.api.observer.SessionObserver
import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction
import io.element.android.services.analytics.api.AnalyticsSdkSpan
import io.element.android.services.analytics.api.AnalyticsSdkSpanFactory
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analytics.api.NoopAnalyticsSdkSpan
import io.element.android.services.analytics.api.NoopAnalyticsTransaction
import io.element.android.services.analytics.impl.log.analyticsTag
import io.element.android.services.analytics.impl.store.AnalyticsStore
@ -43,6 +46,7 @@ class DefaultAnalyticsService(
@AppCoroutineScope
private val coroutineScope: CoroutineScope,
private val sessionObserver: SessionObserver,
private val analyticsSdkSpanFactory: AnalyticsSdkSpanFactory,
) : AnalyticsService, SessionListener {
private val pendingLongRunningTransactions = ConcurrentHashMap<AnalyticsLongRunningTransaction, AnalyticsTransaction>()
@ -171,4 +175,16 @@ class DefaultAnalyticsService(
override fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? {
return pendingLongRunningTransactions.remove(longRunningTransaction)
}
override fun enterSdkSpan(name: String?, parentTraceId: String?): AnalyticsSdkSpan {
return if (userConsent.get()) {
if (name != null) {
analyticsSdkSpanFactory.create(name, parentTraceId)
} else {
analyticsSdkSpanFactory.bridge(parentTraceId)
}.apply { enter() }
} else {
NoopAnalyticsSdkSpan
}
}
}

View file

@ -21,6 +21,7 @@ import io.element.android.libraries.sessionstorage.api.observer.SessionObserver
import io.element.android.libraries.sessionstorage.test.observer.NoOpSessionObserver
import io.element.android.services.analytics.impl.store.AnalyticsStore
import io.element.android.services.analytics.impl.store.FakeAnalyticsStore
import io.element.android.services.analytics.test.FakeAnalyticsSdkSpanFactory
import io.element.android.services.analyticsproviders.api.AnalyticsProvider
import io.element.android.services.analyticsproviders.test.FakeAnalyticsProvider
import io.element.android.tests.testutils.lambda.lambdaRecorder
@ -278,6 +279,7 @@ class DefaultAnalyticsServiceTest {
analyticsStore = analyticsStore,
coroutineScope = coroutineScope,
sessionObserver = sessionObserver,
analyticsSdkSpanFactory = FakeAnalyticsSdkSpanFactory(),
).also {
// Wait for the service to be ready
delay(1)