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.
This commit is contained in:
Jorge Martin Espinosa 2026-01-26 15:41:58 +01:00 committed by GitHub
parent 047849496b
commit f7bfcedd57
4 changed files with 20 additions and 6 deletions

View file

@ -214,6 +214,10 @@ class RoomFlowNode(
) )
} }
is NavTarget.JoinRoom -> { 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( val inputs = JoinRoomEntryPoint.Inputs(
roomId = navTarget.roomId, roomId = navTarget.roomId,
roomIdOrAlias = inputs.roomIdOrAlias, roomIdOrAlias = inputs.roomIdOrAlias,

View file

@ -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.api.room.JoinedRoom
import io.element.android.libraries.matrix.ui.room.LoadingRoomState import io.element.android.libraries.matrix.ui.room.LoadingRoomState
import io.element.android.libraries.matrix.ui.room.LoadingRoomStateFlowFactory 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.distinctUntilChanged
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@ -53,6 +57,7 @@ class JoinedRoomFlowNode(
@Assisted val buildContext: BuildContext, @Assisted val buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
loadingRoomStateFlowFactory: LoadingRoomStateFlowFactory, loadingRoomStateFlowFactory: LoadingRoomStateFlowFactory,
private val analyticsService: AnalyticsService,
) : ) :
BaseFlowNode<JoinedRoomFlowNode.NavTarget>( BaseFlowNode<JoinedRoomFlowNode.NavTarget>(
backstack = BackStack( backstack = BackStack(
@ -81,6 +86,11 @@ class JoinedRoomFlowNode(
override fun onBuilt() { override fun onBuilt() {
super.onBuilt() super.onBuilt()
val parentTransaction = analyticsService.getLongRunningTransaction(NotificationToMessage)
val openRoomTransaction = analyticsService.startLongRunningTransaction(OpenRoom, parentTransaction)
analyticsService.startLongRunningTransaction(LoadJoinedRoomFlow, openRoomTransaction)
loadingRoomStateStateFlow loadingRoomStateStateFlow
.map { .map {
it is LoadingRoomState.Loaded it is LoadingRoomState.Loaded

View file

@ -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.permalink.PermalinkData
import io.element.android.libraries.matrix.api.room.JoinedRoom 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.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.AnalyticsService
import io.element.android.services.analytics.api.finishLongRunningTransaction import io.element.android.services.analytics.api.finishLongRunningTransaction
import io.element.android.services.appnavstate.api.ActiveRoomsHolder import io.element.android.services.appnavstate.api.ActiveRoomsHolder
@ -106,8 +104,6 @@ class JoinedRoomLoadedFlowNode(
init { init {
lifecycle.subscribe( lifecycle.subscribe(
onCreate = { onCreate = {
val parent = analyticsService.getLongRunningTransaction(OpenRoom)
analyticsService.startLongRunningTransaction(LoadMessagesUi, parent)
Timber.v("OnCreate => ${inputs.room.roomId}") Timber.v("OnCreate => ${inputs.room.roomId}")
appNavigationStateService.onNavigateToRoom(id, inputs.room.roomId) appNavigationStateService.onNavigateToRoom(id, inputs.room.roomId)
activeRoomsHolder.addRoom(inputs.room) activeRoomsHolder.addRoom(inputs.room)

View file

@ -46,13 +46,17 @@ class DefaultAnalyticsRoomListStateWatcher(
return return
} }
val longRunningTransaction = AnalyticsLongRunningTransaction.CatchUp
appNavigationStateService.appNavigationState appNavigationStateService.appNavigationState
.map { it.isInForeground } .map { it.isInForeground }
.distinctUntilChanged() .distinctUntilChanged()
.withPreviousValue() .withPreviousValue()
.onEach { (wasInForeground, isInForeground) -> .onEach { (wasInForeground, isInForeground) ->
if (isInForeground && roomListService.state.value != RoomListService.State.Running) { 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) { if (wasInForeground == false && isInForeground) {
@ -64,7 +68,7 @@ class DefaultAnalyticsRoomListStateWatcher(
roomListService.state roomListService.state
.onEach { state -> .onEach { state ->
if (state == RoomListService.State.Running && isWarmState.get()) { if (state == RoomListService.State.Running && isWarmState.get()) {
analyticsService.finishLongRunningTransaction(AnalyticsLongRunningTransaction.CatchUp) analyticsService.finishLongRunningTransaction(longRunningTransaction)
} }
} }
.launchIn(coroutineScope) .launchIn(coroutineScope)