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

@ -0,0 +1,19 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.services.analytics.api
/**
* Represents an analytics span in the Rust SDK.
*/
interface AnalyticsSdkSpan {
/** Enters the span and starts collecting metrics. */
fun enter()
/** Exit the span and stop collecting the metrics. A request should be sent shortly after. */
fun exit()
}

View file

@ -0,0 +1,16 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.services.analytics.api
interface AnalyticsSdkSpanFactory {
/** Create an SDK span with the provided [name] and optional [parentTraceId]. */
fun create(name: String, parentTraceId: String?): AnalyticsSdkSpan
/** Create a bridge span which will join our tracing spans to the SDK ones while it's active. */
fun bridge(parentTraceId: String?): AnalyticsSdkSpan
}

View file

@ -72,6 +72,8 @@ interface AnalyticsService : AnalyticsTracker, ErrorTracker {
* Removes an ongoing [AnalyticsLongRunningTransaction] so it's no longer shared.
*/
fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction?
fun enterSdkSpan(name: String?, parentTraceId: String?): AnalyticsSdkSpan
}
inline fun <T> AnalyticsService.recordTransaction(
@ -110,3 +112,12 @@ fun AnalyticsService.finishLongRunningTransaction(
it.finish()
}
}
inline fun <T> AnalyticsService.inBridgeSdkSpan(parentTraceId: String?, block: (AnalyticsSdkSpan) -> T): T {
val span = enterSdkSpan(name = null, parentTraceId = parentTraceId)
return try {
block(span)
} finally {
span.exit()
}
}

View file

@ -0,0 +1,13 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.services.analytics.api
object NoopAnalyticsSdkSpan : AnalyticsSdkSpan {
override fun enter() {}
override fun exit() {}
}

View file

@ -13,5 +13,6 @@ object NoopAnalyticsTransaction : AnalyticsTransaction {
override fun startChild(operation: String, description: String?): AnalyticsTransaction = NoopAnalyticsTransaction
override fun setData(key: String, value: Any) {}
override fun isFinished(): Boolean = true
override fun traceId(): String? = null
override fun finish() {}
}