Skip to content

Commit 26b95d4

Browse files
RUM-9508: LogsCustom scenario for android benchmark app
1 parent 0e0e229 commit 26b95d4

33 files changed

+1336
-322
lines changed

gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ androidXRecyclerView = "1.3.2"
2727
androidXWorkManager = "2.8.1" # Next version will bring coroutines
2828
googleAccompanist = "0.20.2"
2929
googleMaterial = "1.3.0"
30+
dagger = "2.56.2"
3031

3132
# DD-TRACE-OT
3233
openTracing = "0.32.0"
@@ -144,6 +145,8 @@ androidXNavigationFragment = { module = "androidx.navigation:navigation-fragment
144145
androidXNavigationRuntime = { module = "androidx.navigation:navigation-runtime", version.ref = "androidXNavigation" }
145146
androidXRecyclerView = { module = "androidx.recyclerview:recyclerview", version.ref = "androidXRecyclerView" }
146147
androidXWorkManager = { module = "androidx.work:work-runtime", version.ref = "androidXWorkManager" }
148+
daggerLib = { module = "com.google.dagger:dagger", version.ref = "dagger" }
149+
daggerCompiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
147150
googleAccompanistAppCompatTheme = { module = "com.google.accompanist:accompanist-appcompat-theme", version.ref = "googleAccompanist" }
148151
googleAccompanistPager = { module = "com.google.accompanist:accompanist-pager", version.ref = "googleAccompanist" }
149152
googleAccompanistPagerIndicators = { module = "com.google.accompanist:accompanist-pager-indicators", version.ref = "googleAccompanist" }

sample/benchmark/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,14 @@ dependencies {
8989
implementation(libs.androidXConstraintLayout)
9090
implementation(libs.googleMaterial)
9191
implementation(libs.glideCore)
92+
implementation(libs.material3Android)
9293
implementation(libs.timber)
9394
implementation(platform(libs.androidXComposeBom))
9495
implementation(libs.bundles.androidXCompose)
9596
implementation(libs.coilCompose)
97+
implementation(libs.daggerLib)
98+
kapt(libs.daggerCompiler)
99+
implementation(libs.coroutinesCore)
96100
implementation(project(":features:dd-sdk-android-logs"))
97101
implementation(project(":features:dd-sdk-android-rum"))
98102
implementation(project(":features:dd-sdk-android-trace"))

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

Lines changed: 13 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -6,102 +6,25 @@
66

77
package com.datadog.benchmark.sample
88

9-
import android.annotation.SuppressLint
109
import android.app.Application
11-
import android.util.Log
12-
import com.datadog.android.Datadog
13-
import com.datadog.android.compose.enableComposeActionTracking
14-
import com.datadog.android.core.configuration.BackPressureMitigation
15-
import com.datadog.android.core.configuration.BackPressureStrategy
16-
import com.datadog.android.core.configuration.BatchSize
17-
import com.datadog.android.core.configuration.Configuration
18-
import com.datadog.android.core.configuration.UploadFrequency
19-
import com.datadog.android.privacy.TrackingConsent
20-
import com.datadog.android.rum.Rum
21-
import com.datadog.android.rum.RumConfiguration
22-
import com.datadog.android.rum.tracking.NavigationViewTrackingStrategy
23-
import com.datadog.sample.benchmark.BuildConfig
24-
import com.datadog.sample.benchmark.R
10+
import androidx.annotation.Keep
11+
import com.datadog.android.api.SdkCore
12+
import com.datadog.benchmark.sample.di.app.BenchmarkAppComponent
13+
import com.datadog.benchmark.sample.di.app.DaggerBenchmarkAppComponent
14+
import javax.inject.Inject
2515

2616
internal class BenchmarkApplication : Application() {
2717

28-
override fun onCreate() {
29-
super.onCreate()
30-
initDatadogSdk()
31-
}
18+
internal lateinit var benchmarkAppComponent: BenchmarkAppComponent
3219

33-
private fun initDatadogSdk() {
34-
Datadog.initialize(
35-
this,
36-
createDatadogConfiguration(),
37-
TrackingConsent.GRANTED
38-
)
39-
val rumConfig = createRumConfiguration()
40-
Rum.enable(rumConfig)
41-
}
42-
43-
private fun createRumConfiguration(): RumConfiguration {
44-
return RumConfiguration.Builder(BuildConfig.BENCHMARK_RUM_APPLICATION_ID)
45-
.useViewTrackingStrategy(
46-
NavigationViewTrackingStrategy(
47-
R.id.nav_host_fragment,
48-
true,
49-
BenchmarkNavigationPredicate()
50-
)
51-
)
52-
.setTelemetrySampleRate(SAMPLE_RATE_TELEMETRY)
53-
.trackUserInteractions()
54-
.trackLongTasks(THRESHOLD_LONG_TASK_INTERVAL)
55-
.trackNonFatalAnrs(true)
56-
.setViewEventMapper { event ->
57-
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
58-
event
59-
}
60-
.setActionEventMapper { event ->
61-
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
62-
event
63-
}
64-
.setResourceEventMapper { event ->
65-
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
66-
event
67-
}
68-
.setErrorEventMapper { event ->
69-
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
70-
event
71-
}
72-
.setLongTaskEventMapper { event ->
73-
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
74-
event
75-
}
76-
.enableComposeActionTracking()
77-
.build()
78-
}
20+
@Inject
21+
@Keep
22+
internal lateinit var sdkCore: SdkCore
7923

80-
@SuppressLint("LogNotTimber")
81-
private fun createDatadogConfiguration(): Configuration {
82-
val configBuilder = Configuration.Builder(
83-
clientToken = BuildConfig.BENCHMARK_CLIENT_TOKEN,
84-
env = BuildConfig.BUILD_TYPE
85-
)
86-
.setBatchSize(BatchSize.SMALL)
87-
.setUploadFrequency(UploadFrequency.FREQUENT)
88-
89-
configBuilder.setBackpressureStrategy(
90-
BackPressureStrategy(
91-
CAPACITY_BACK_PRESSURE_STRATEGY,
92-
{ Log.w("BackPressure", "THRESHOLD REACHED!") },
93-
{ Log.e("BackPressure", "ITEM DROPPED $it!") },
94-
BackPressureMitigation.IGNORE_NEWEST
95-
)
96-
)
97-
98-
return configBuilder.build()
99-
}
24+
override fun onCreate() {
25+
super.onCreate()
10026

101-
companion object {
102-
private const val ATTR_IS_MAPPED = "is_mapped"
103-
private const val SAMPLE_RATE_TELEMETRY = 100f
104-
private const val THRESHOLD_LONG_TASK_INTERVAL = 250L
105-
private const val CAPACITY_BACK_PRESSURE_STRATEGY = 32
27+
benchmarkAppComponent = DaggerBenchmarkAppComponent.factory().create(this)
28+
benchmarkAppComponent.inject(this)
10629
}
10730
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
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
8+
9+
import com.datadog.android.api.SdkCore
10+
import com.datadog.android.compose.enableComposeActionTracking
11+
import com.datadog.android.log.Logs
12+
import com.datadog.android.log.LogsConfiguration
13+
import com.datadog.android.rum.Rum
14+
import com.datadog.android.rum.RumConfiguration
15+
import com.datadog.android.rum.tracking.NavigationViewTrackingStrategy
16+
import com.datadog.android.sessionreplay.SessionReplay
17+
import com.datadog.android.sessionreplay.SessionReplayConfiguration
18+
import com.datadog.android.sessionreplay.SessionReplayPrivacy
19+
import com.datadog.android.sessionreplay.compose.ComposeExtensionSupport
20+
import com.datadog.android.sessionreplay.material.MaterialExtensionSupport
21+
import com.datadog.benchmark.sample.config.BenchmarkConfig
22+
import com.datadog.benchmark.sample.config.SyntheticsRun
23+
import com.datadog.benchmark.sample.config.SyntheticsScenario
24+
import com.datadog.benchmark.sample.di.activity.BenchmarkActivityScope
25+
import com.datadog.benchmark.sample.navigation.BenchmarkNavigationPredicate
26+
import com.datadog.sample.benchmark.BuildConfig
27+
import com.datadog.sample.benchmark.R
28+
import javax.inject.Inject
29+
30+
@BenchmarkActivityScope
31+
@Suppress("TooManyFunctions")
32+
internal class DatadogFeaturesInitializer @Inject constructor(
33+
private val sdkCore: SdkCore,
34+
private val config: BenchmarkConfig
35+
) {
36+
fun initialize() {
37+
if (needToEnableRum()) {
38+
enableRum()
39+
}
40+
41+
if (needToEnableLogs()) {
42+
enableLogs()
43+
}
44+
45+
if (needToEnableSessionReplay()) {
46+
enableSessionReplay()
47+
}
48+
}
49+
50+
private fun needToEnableSessionReplay(): Boolean {
51+
return isInstrumentedRun() && isSessionReplayScenario()
52+
}
53+
54+
@Suppress("DEPRECATION")
55+
private fun enableSessionReplay() {
56+
val sessionReplayConfig = SessionReplayConfiguration
57+
.Builder(SAMPLE_IN_ALL_SESSIONS)
58+
.setPrivacy(SessionReplayPrivacy.ALLOW)
59+
.addExtensionSupport(MaterialExtensionSupport())
60+
.addExtensionSupport(ComposeExtensionSupport())
61+
.build()
62+
63+
SessionReplay.enable(sessionReplayConfig, sdkCore)
64+
}
65+
66+
private fun needToEnableLogs(): Boolean {
67+
return isInstrumentedRun() && isLogsScenario()
68+
}
69+
70+
private fun enableLogs() {
71+
val logsConfig = LogsConfiguration.Builder().build()
72+
Logs.enable(logsConfig, sdkCore)
73+
}
74+
75+
private fun needToEnableRum(): Boolean {
76+
return when (isInstrumentedRun()) {
77+
true -> isSessionReplayScenario() || isRumScenario()
78+
false -> isSessionReplayScenario()
79+
}
80+
}
81+
82+
private fun createRumConfiguration(): RumConfiguration {
83+
return RumConfiguration.Builder(BuildConfig.BENCHMARK_RUM_APPLICATION_ID)
84+
.useViewTrackingStrategy(
85+
NavigationViewTrackingStrategy(
86+
R.id.nav_host_fragment,
87+
true,
88+
BenchmarkNavigationPredicate()
89+
)
90+
)
91+
.setTelemetrySampleRate(SAMPLE_RATE_TELEMETRY)
92+
.trackUserInteractions()
93+
.trackLongTasks(THRESHOLD_LONG_TASK_INTERVAL)
94+
.trackNonFatalAnrs(true)
95+
.setViewEventMapper { event ->
96+
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
97+
event
98+
}
99+
.setActionEventMapper { event ->
100+
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
101+
event
102+
}
103+
.setResourceEventMapper { event ->
104+
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
105+
event
106+
}
107+
.setErrorEventMapper { event ->
108+
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
109+
event
110+
}
111+
.setLongTaskEventMapper { event ->
112+
event.context?.additionalProperties?.put(ATTR_IS_MAPPED, true)
113+
event
114+
}
115+
.enableComposeActionTracking()
116+
.build()
117+
}
118+
119+
private fun enableRum() {
120+
val rumConfig = createRumConfiguration()
121+
Rum.enable(rumConfig, sdkCore = sdkCore)
122+
}
123+
124+
private fun isSessionReplayScenario() = when (config.scenario) {
125+
SyntheticsScenario.SessionReplayCompose,
126+
SyntheticsScenario.SessionReplay -> true
127+
else -> false
128+
}
129+
130+
private fun isRumScenario() = when (config.scenario) {
131+
SyntheticsScenario.Rum -> true
132+
else -> false
133+
}
134+
135+
private fun isLogsScenario() = when (config.scenario) {
136+
SyntheticsScenario.LogsCustom,
137+
SyntheticsScenario.LogsHeavyTraffic -> true
138+
else -> false
139+
}
140+
141+
private fun isInstrumentedRun() = config.run == SyntheticsRun.Instrumented
142+
143+
companion object {
144+
private const val SAMPLE_IN_ALL_SESSIONS = 100f
145+
private const val ATTR_IS_MAPPED = "is_mapped"
146+
private const val SAMPLE_RATE_TELEMETRY = 100f
147+
private const val THRESHOLD_LONG_TASK_INTERVAL = 250L
148+
}
149+
}

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

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,73 @@ package com.datadog.benchmark.sample
99
import android.os.Bundle
1010
import androidx.activity.compose.setContent
1111
import androidx.appcompat.app.AppCompatActivity
12-
import androidx.navigation.NavController
13-
import androidx.navigation.Navigation
14-
import com.datadog.benchmark.sample.benchmark.DatadogBenchmark
15-
import com.datadog.benchmark.sample.compose.MainView
12+
import androidx.navigation.findNavController
13+
import com.datadog.benchmark.DatadogBaseMeter
14+
import com.datadog.benchmark.sample.config.BenchmarkConfig
15+
import com.datadog.benchmark.sample.di.activity.BenchmarkActivityComponent
16+
import com.datadog.benchmark.sample.di.activity.DaggerBenchmarkActivityComponent
17+
import com.datadog.benchmark.sample.navigation.FragmentsNavigationManager
18+
import com.datadog.benchmark.sample.ui.sessionreplaycompose.MainView
1619
import com.datadog.sample.benchmark.R
20+
import javax.inject.Inject
1721

1822
/**
1923
* MainActivity of benchmark sample application.
2024
*/
2125
class MainActivity : AppCompatActivity() {
2226

23-
private lateinit var navController: NavController
24-
private lateinit var datadogBenchmark: DatadogBenchmark
27+
@Inject
28+
internal lateinit var datadogMeter: DatadogBaseMeter
29+
30+
@Inject
31+
internal lateinit var fragmentsNavigationManager: FragmentsNavigationManager
32+
33+
@Inject
34+
internal lateinit var datadogFeaturesInitializer: DatadogFeaturesInitializer
35+
36+
private lateinit var config: BenchmarkConfig
37+
38+
internal lateinit var benchmarkActivityComponent: BenchmarkActivityComponent
39+
2540
override fun onCreate(savedInstanceState: Bundle?) {
2641
super.onCreate(savedInstanceState)
2742

28-
datadogBenchmark = DatadogBenchmark(
29-
DatadogBenchmark.Config.resolveSyntheticsBundle(intent.extras)
43+
config = BenchmarkConfig.resolveSyntheticsBundle(intent.extras)
44+
45+
benchmarkActivityComponent = DaggerBenchmarkActivityComponent.factory().create(
46+
deps = (application as BenchmarkApplication).benchmarkAppComponent,
47+
config = config,
48+
mainActivity = this
3049
)
31-
if (datadogBenchmark.isComposeEnabled) {
50+
51+
benchmarkActivityComponent.inject(this)
52+
53+
if (config.isComposeEnabled) {
3254
supportActionBar?.hide()
3355
setContent {
3456
MainView()
3557
}
3658
} else {
3759
setContentView(R.layout.activity_main)
3860
}
61+
62+
datadogFeaturesInitializer.initialize()
3963
}
4064

4165
override fun onStart() {
4266
super.onStart()
43-
datadogBenchmark.start()
67+
datadogMeter.startMeasuring()
4468
}
4569

4670
override fun onStop() {
71+
datadogMeter.stopMeasuring()
4772
super.onStop()
48-
datadogBenchmark.stop()
4973
}
5074

5175
override fun onResume() {
5276
super.onResume()
53-
if (!datadogBenchmark.isComposeEnabled) {
54-
navController = Navigation.findNavController(this, R.id.nav_host_fragment)
77+
if (!config.isComposeEnabled) {
78+
fragmentsNavigationManager.setNavController(findNavController(R.id.nav_host_fragment))
5579
}
5680
}
5781
}

0 commit comments

Comments
 (0)