From f7bfcedd577467dff17269c02eaaaf9491aba777 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 26 Jan 2026 15:41:58 +0100 Subject: [PATCH] Try fixing performance metrics (#6046) We've detected outliers in the `Up-to-date room list` and `Open a room` transactions in Sentry. This commit tries to make sure we're starting/stopping the long running transactions when needed. --- .../io/element/android/appnav/room/RoomFlowNode.kt | 4 ++++ .../android/appnav/room/joined/JoinedRoomFlowNode.kt | 10 ++++++++++ .../appnav/room/joined/JoinedRoomLoadedFlowNode.kt | 4 ---- .../watchers/DefaultAnalyticsRoomListStateWatcher.kt | 8 ++++++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 6446f754b0..7080b34f8e 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -214,6 +214,10 @@ class RoomFlowNode( ) } is NavTarget.JoinRoom -> { + // Clear analytics transactions for opening a joined room, since we're display a non-joined one + analyticsService.removeLongRunningTransaction(LoadJoinedRoomFlow) + analyticsService.removeLongRunningTransaction(OpenRoom) + val inputs = JoinRoomEntryPoint.Inputs( roomId = navTarget.roomId, roomIdOrAlias = inputs.roomIdOrAlias, diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt index 504bdfec58..0c9abbc571 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt @@ -41,6 +41,10 @@ import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.ui.room.LoadingRoomState import io.element.android.libraries.matrix.ui.room.LoadingRoomStateFlowFactory +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadJoinedRoomFlow +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.NotificationToMessage +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.OpenRoom +import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -53,6 +57,7 @@ class JoinedRoomFlowNode( @Assisted val buildContext: BuildContext, @Assisted plugins: List, loadingRoomStateFlowFactory: LoadingRoomStateFlowFactory, + private val analyticsService: AnalyticsService, ) : BaseFlowNode( backstack = BackStack( @@ -81,6 +86,11 @@ class JoinedRoomFlowNode( override fun onBuilt() { super.onBuilt() + + val parentTransaction = analyticsService.getLongRunningTransaction(NotificationToMessage) + val openRoomTransaction = analyticsService.startLongRunningTransaction(OpenRoom, parentTransaction) + analyticsService.startLongRunningTransaction(LoadJoinedRoomFlow, openRoomTransaction) + loadingRoomStateStateFlow .map { it is LoadingRoomState.Loaded diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt index 05ebab2b10..d0d3df590d 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt @@ -48,8 +48,6 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadJoinedRoomFlow -import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadMessagesUi -import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.OpenRoom import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.finishLongRunningTransaction import io.element.android.services.appnavstate.api.ActiveRoomsHolder @@ -106,8 +104,6 @@ class JoinedRoomLoadedFlowNode( init { lifecycle.subscribe( onCreate = { - val parent = analyticsService.getLongRunningTransaction(OpenRoom) - analyticsService.startLongRunningTransaction(LoadMessagesUi, parent) Timber.v("OnCreate => ${inputs.room.roomId}") appNavigationStateService.onNavigateToRoom(id, inputs.room.roomId) activeRoomsHolder.addRoom(inputs.room) diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt index 7e11e703ec..75dffd0af1 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt @@ -46,13 +46,17 @@ class DefaultAnalyticsRoomListStateWatcher( return } + val longRunningTransaction = AnalyticsLongRunningTransaction.CatchUp + appNavigationStateService.appNavigationState .map { it.isInForeground } .distinctUntilChanged() .withPreviousValue() .onEach { (wasInForeground, isInForeground) -> if (isInForeground && roomListService.state.value != RoomListService.State.Running) { - analyticsService.startLongRunningTransaction(AnalyticsLongRunningTransaction.CatchUp) + analyticsService.startLongRunningTransaction(longRunningTransaction) + } else if (!isInForeground) { + analyticsService.removeLongRunningTransaction(longRunningTransaction) } if (wasInForeground == false && isInForeground) { @@ -64,7 +68,7 @@ class DefaultAnalyticsRoomListStateWatcher( roomListService.state .onEach { state -> if (state == RoomListService.State.Running && isWarmState.get()) { - analyticsService.finishLongRunningTransaction(AnalyticsLongRunningTransaction.CatchUp) + analyticsService.finishLongRunningTransaction(longRunningTransaction) } } .launchIn(coroutineScope)