Skip to content

Commit e366b79

Browse files
Merge pull request #2644 from DataDog/aleksandr-gringauz/RUM-9510/rummanual-scenario-android-benchmarks-2
RUM-9510: RumManual scenario for android benchmark app
2 parents af2861f + acd58ee commit e366b79

File tree

10 files changed

+577
-32
lines changed

10 files changed

+577
-32
lines changed

sample/benchmark/src/main/java/com/datadog/benchmark/sample/DatadogFeaturesInitializer.kt

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
4747
isInitialized = true
4848

4949
if (needToEnableRum(config)) {
50-
enableRum()
50+
enableRum(config)
5151
}
5252

5353
if (needToEnableLogs(config)) {
@@ -95,61 +95,65 @@ internal class DatadogFeaturesInitializer @Inject constructor(
9595
}
9696
}
9797

98-
private fun createRumConfiguration(): RumConfiguration {
99-
return RumConfiguration.Builder(BuildConfig.BENCHMARK_RUM_APPLICATION_ID)
100-
.useViewTrackingStrategy(
101-
NavigationViewTrackingStrategy(
102-
R.id.nav_host_fragment,
103-
true,
104-
BenchmarkNavigationPredicate()
98+
private fun createRumConfiguration(config: BenchmarkConfig): RumConfiguration {
99+
return RumConfiguration.Builder(BuildConfig.BENCHMARK_RUM_APPLICATION_ID).apply {
100+
if (config.scenario != SyntheticsScenario.RumManual) {
101+
useViewTrackingStrategy(
102+
NavigationViewTrackingStrategy(
103+
R.id.nav_host_fragment,
104+
true,
105+
BenchmarkNavigationPredicate()
106+
)
105107
)
106-
)
107-
.setTelemetrySampleRate(SAMPLE_RATE_TELEMETRY)
108-
.trackUserInteractions()
109-
.trackLongTasks(THRESHOLD_LONG_TASK_INTERVAL)
110-
.trackNonFatalAnrs(true)
111-
.setViewEventMapper { event ->
108+
} else {
109+
useViewTrackingStrategy(null)
110+
}
111+
setTelemetrySampleRate(SAMPLE_RATE_TELEMETRY)
112+
trackUserInteractions()
113+
trackLongTasks(THRESHOLD_LONG_TASK_INTERVAL)
114+
trackNonFatalAnrs(true)
115+
setViewEventMapper { event ->
112116
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
113117
event
114118
}
115-
.setActionEventMapper { event ->
119+
setActionEventMapper { event ->
116120
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
117121
event
118122
}
119-
.setResourceEventMapper { event ->
123+
setResourceEventMapper { event ->
120124
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
121125
event
122126
}
123-
.setErrorEventMapper { event ->
127+
setErrorEventMapper { event ->
124128
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
125129
event
126130
}
127-
.setLongTaskEventMapper { event ->
131+
setLongTaskEventMapper { event ->
128132
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
129133
event
130134
}
131-
.enableComposeActionTracking()
132-
.build()
135+
enableComposeActionTracking()
136+
}.build()
133137
}
134138

135-
private fun enableRum() {
136-
val rumConfig = createRumConfiguration()
139+
private fun enableRum(config: BenchmarkConfig) {
140+
val rumConfig = createRumConfiguration(config)
137141
Rum.enable(rumConfig, sdkCore = sdkCore)
138142
}
139143

140144
private fun isSessionReplayScenario(config: BenchmarkConfig) = when (config.scenario) {
141145
SyntheticsScenario.SessionReplayCompose,
142146
SyntheticsScenario.Upload,
143147
SyntheticsScenario.SessionReplay -> true
144-
SyntheticsScenario.Rum,
148+
SyntheticsScenario.RumManual,
145149
SyntheticsScenario.Trace,
146150
SyntheticsScenario.LogsCustom,
147151
SyntheticsScenario.LogsHeavyTraffic,
148152
null -> false
149153
}
150154

151155
private fun isRumScenario(config: BenchmarkConfig) = when (config.scenario) {
152-
SyntheticsScenario.Rum -> true
156+
SyntheticsScenario.RumManual -> true
153157
SyntheticsScenario.SessionReplay,
154158
SyntheticsScenario.SessionReplayCompose,
155159
SyntheticsScenario.Trace,
@@ -164,7 +168,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
164168
SyntheticsScenario.LogsHeavyTraffic -> true
165169
SyntheticsScenario.SessionReplay,
166170
SyntheticsScenario.SessionReplayCompose,
167-
SyntheticsScenario.Rum,
171+
SyntheticsScenario.RumManual,
168172
SyntheticsScenario.Trace,
169173
SyntheticsScenario.Upload,
170174
null -> false

sample/benchmark/src/main/java/com/datadog/benchmark/sample/MainActivityViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ internal class MainActivityViewModelFactory(
2727

2828
val benchmarkActivityComponent = DaggerBenchmarkActivityComponent.factory().create(
2929
deps = application.benchmarkAppComponent,
30-
config = config,
31-
mainActivity = activity
30+
config = config
3231
)
3332

3433
return MainActivityViewModel(benchmarkActivityComponent) as T

sample/benchmark/src/main/java/com/datadog/benchmark/sample/config/SyntheticsScenario.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal enum class SyntheticsScenario(val value: String) {
1212

1313
SessionReplayCompose("sr_compose"),
1414

15-
Rum("rum"),
15+
RumManual("rum_manual"),
1616

1717
Trace("trace"),
1818

sample/benchmark/src/main/java/com/datadog/benchmark/sample/di/activity/BenchmarkActivityComponent.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7+
@file:Suppress("MethodOverloading")
8+
79
package com.datadog.benchmark.sample.di.activity
810

911
import com.datadog.android.api.SdkCore
@@ -13,6 +15,7 @@ import com.datadog.benchmark.sample.config.BenchmarkConfig
1315
import com.datadog.benchmark.sample.di.common.DispatchersModule
1416
import com.datadog.benchmark.sample.ui.logscustom.LogsFragment
1517
import com.datadog.benchmark.sample.ui.logsheavytraffic.di.LogsHeavyTrafficComponentDependencies
18+
import com.datadog.benchmark.sample.ui.rummanual.RumManualScenarioFragment
1619
import com.datadog.benchmark.sample.ui.sessionreplay.SessionReplayAppcompatFragment
1720
import com.datadog.benchmark.sample.ui.sessionreplay.SessionReplayMaterialFragment
1821
import com.datadog.benchmark.sample.ui.trace.TraceScenarioFragment
@@ -46,8 +49,7 @@ internal interface BenchmarkActivityComponent : LogsHeavyTrafficComponentDepende
4649
interface Factory {
4750
fun create(
4851
deps: BenchmarkActivityComponentDependencies,
49-
@BindsInstance config: BenchmarkConfig,
50-
@BindsInstance mainActivity: MainActivity
52+
@BindsInstance config: BenchmarkConfig
5153
): BenchmarkActivityComponent
5254
}
5355

@@ -57,4 +59,5 @@ internal interface BenchmarkActivityComponent : LogsHeavyTrafficComponentDepende
5759
fun inject(sessionReplayMaterialFragment: SessionReplayMaterialFragment)
5860
fun inject(logsFragment: LogsFragment)
5961
fun inject(traceScenarioFragment: TraceScenarioFragment)
62+
fun inject(rumManualScenarioFragment: RumManualScenarioFragment)
6063
}

sample/benchmark/src/main/java/com/datadog/benchmark/sample/di/activity/DatadogActivityModule.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ package com.datadog.benchmark.sample.di.activity
88

99
import com.datadog.android.api.SdkCore
1010
import com.datadog.android.log.Logger
11+
import com.datadog.android.rum.GlobalRumMonitor
12+
import com.datadog.android.rum.RumMonitor
1113
import com.datadog.benchmark.DatadogBaseMeter
1214
import com.datadog.benchmark.DatadogExporterConfiguration
1315
import com.datadog.benchmark.DatadogSdkMeter
@@ -48,6 +50,12 @@ internal interface DatadogActivityModule {
4850
.setLogcatLogsEnabled(true)
4951
.build()
5052
}
53+
54+
@Provides
55+
@BenchmarkActivityScope
56+
fun provideRumMonitor(sdkCore: SdkCore): RumMonitor {
57+
return GlobalRumMonitor.get(sdkCore = sdkCore)
58+
}
5159
}
5260
}
5361

sample/benchmark/src/main/java/com/datadog/benchmark/sample/di/activity/ViewModelsModule.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import androidx.lifecycle.ViewModelProvider
1010
import androidx.lifecycle.viewmodel.initializer
1111
import androidx.lifecycle.viewmodel.viewModelFactory
1212
import com.datadog.android.log.Logger
13+
import com.datadog.android.rum.RumMonitor
1314
import com.datadog.benchmark.sample.di.common.CoroutineDispatcherQualifier
1415
import com.datadog.benchmark.sample.di.common.CoroutineDispatcherType
1516
import com.datadog.benchmark.sample.ui.logscustom.LogsScreenViewModel
17+
import com.datadog.benchmark.sample.ui.rummanual.RumManualScenarioViewModel
1618
import com.datadog.benchmark.sample.ui.trace.TraceScenarioViewModel
1719
import dagger.Module
1820
import dagger.Provides
@@ -56,5 +58,20 @@ internal interface ViewModelsModule {
5658
)
5759
}
5860
}
61+
62+
@Provides
63+
@ViewModelQualifier(RumManualScenarioViewModel::class)
64+
fun provideRumManualScenarioViewModelFactory(
65+
rumMonitor: RumMonitor,
66+
@CoroutineDispatcherQualifier(CoroutineDispatcherType.Default)
67+
defaultDispatcher: CoroutineDispatcher
68+
): ViewModelProvider.Factory = viewModelFactory {
69+
initializer {
70+
RumManualScenarioViewModel(
71+
rumMonitor = rumMonitor,
72+
defaultDispatcher = defaultDispatcher
73+
)
74+
}
75+
}
5976
}
6077
}

sample/benchmark/src/main/java/com/datadog/benchmark/sample/navigation/FragmentsNavigationManagerImpl.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.datadog.benchmark.sample.config.BenchmarkConfig
1515
import com.datadog.benchmark.sample.config.SyntheticsScenario
1616
import com.datadog.benchmark.sample.ui.logscustom.LogsFragment
1717
import com.datadog.benchmark.sample.ui.logsheavytraffic.LogsHeavyTrafficHostFragment
18+
import com.datadog.benchmark.sample.ui.rummanual.RumManualScenarioFragment
1819
import com.datadog.benchmark.sample.ui.sessionreplay.SessionReplayAppcompatFragment
1920
import com.datadog.benchmark.sample.ui.sessionreplay.SessionReplayMaterialFragment
2021
import com.datadog.benchmark.sample.ui.trace.TraceScenarioFragment
@@ -55,7 +56,7 @@ private fun createStartDestination(scenario: SyntheticsScenario?): String {
5556
SyntheticsScenario.SessionReplayCompose -> error("Using fragments for SessionReplayCompose scenario")
5657
SyntheticsScenario.LogsCustom -> LOGS_FRAGMENT_KEY
5758
SyntheticsScenario.LogsHeavyTraffic -> LOGS_HEAVY_TRAFFIC_FRAGMENT_KEY
58-
SyntheticsScenario.Rum -> SESSION_REPLAY_METERIAL_FRAGMENT_KEY // TODO RUM-9510
59+
SyntheticsScenario.RumManual -> RUM_MANUAL_FRAGMENT_KEY
5960
SyntheticsScenario.Trace -> TRACE_SCENARIO_FRAGMENT_KEY
6061
}
6162
}
@@ -68,7 +69,7 @@ private fun NavGraphBuilder.navGraph(scenario: SyntheticsScenario?) {
6869
SyntheticsScenario.SessionReplayCompose -> error("Using fragments for SessionReplayCompose scenario")
6970
SyntheticsScenario.LogsCustom -> navGraphLogs()
7071
SyntheticsScenario.LogsHeavyTraffic -> navGraphLogsHeavyTraffic()
71-
SyntheticsScenario.Rum -> navGraphSessionReplay() // TODO RUM-9510
72+
SyntheticsScenario.RumManual -> navGraphRumManualScenario()
7273
SyntheticsScenario.Trace -> navGraphTraceScenario()
7374
}
7475
}
@@ -101,8 +102,15 @@ private fun NavGraphBuilder.navGraphTraceScenario() {
101102
}
102103
}
103104

105+
private fun NavGraphBuilder.navGraphRumManualScenario() {
106+
fragment<RumManualScenarioFragment>(route = RUM_MANUAL_FRAGMENT_KEY) {
107+
label = "rum manual scenario"
108+
}
109+
}
110+
104111
private const val LOGS_FRAGMENT_KEY = "logs_fragment"
105112
private const val LOGS_HEAVY_TRAFFIC_FRAGMENT_KEY = "logs_heavy_traffic_fragment"
106113
private const val SESSION_REPLAY_METERIAL_FRAGMENT_KEY = "fragment_session_replay_material"
107114
private const val SESSION_REPLAY_APPCOMPAT_FRAGMENT_KEY = "fragment_session_replay_appcompat"
108115
private const val TRACE_SCENARIO_FRAGMENT_KEY = "fragment_trace_scenario"
116+
private const val RUM_MANUAL_FRAGMENT_KEY = "fragment_rum_manual_scenario"
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
package com.datadog.benchmark.sample.ui.rummanual
8+
9+
import android.os.Bundle
10+
import android.view.LayoutInflater
11+
import android.view.View
12+
import android.view.ViewGroup
13+
import androidx.compose.foundation.layout.fillMaxSize
14+
import androidx.compose.runtime.getValue
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.platform.ComposeView
17+
import androidx.fragment.app.Fragment
18+
import androidx.fragment.app.viewModels
19+
import androidx.lifecycle.ViewModelProvider
20+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
21+
import com.datadog.benchmark.sample.benchmarkActivityComponent
22+
import com.datadog.benchmark.sample.di.activity.ViewModelQualifier
23+
import javax.inject.Inject
24+
25+
internal class RumManualScenarioFragment : Fragment() {
26+
27+
@Inject
28+
@ViewModelQualifier(RumManualScenarioViewModel::class)
29+
internal lateinit var viewModelFactory: ViewModelProvider.Factory
30+
31+
private val viewModel: RumManualScenarioViewModel by viewModels { viewModelFactory }
32+
33+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
34+
requireActivity().benchmarkActivityComponent.inject(this)
35+
36+
return ComposeView(requireActivity()).apply {
37+
setContent {
38+
val state by viewModel.rumManualScenarioState.collectAsStateWithLifecycle()
39+
40+
RumManualScenarioScreen(
41+
modifier = Modifier.fillMaxSize(),
42+
state = state,
43+
dispatch = viewModel::dispatch
44+
)
45+
}
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)