Skip to content

Commit 9515e48

Browse files
Merge pull request #2647 from DataDog/aleksandr-gringauz/RUM-9958/align-datadog-init-with-ios-for-benchmarks
RUM-9958: Align datadog initialization with ios for benchmark app
2 parents 8be1d29 + f572439 commit 9515e48

File tree

7 files changed

+84
-88
lines changed

7 files changed

+84
-88
lines changed

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,13 @@
77
package com.datadog.benchmark.sample
88

99
import android.app.Application
10-
import androidx.annotation.Keep
11-
import com.datadog.android.api.SdkCore
1210
import com.datadog.benchmark.sample.di.app.BenchmarkAppComponent
1311
import com.datadog.benchmark.sample.di.app.DaggerBenchmarkAppComponent
14-
import javax.inject.Inject
1512

1613
internal class BenchmarkApplication : Application() {
1714

1815
internal lateinit var benchmarkAppComponent: BenchmarkAppComponent
1916

20-
@Inject
21-
@Keep
22-
internal lateinit var sdkCore: SdkCore
23-
2417
override fun onCreate() {
2518
super.onCreate()
2619

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,30 @@ import com.datadog.android.trace.TraceConfiguration
2323
import com.datadog.benchmark.sample.config.BenchmarkConfig
2424
import com.datadog.benchmark.sample.config.SyntheticsRun
2525
import com.datadog.benchmark.sample.config.SyntheticsScenario
26+
import com.datadog.benchmark.sample.di.activity.BenchmarkActivityScope
2627
import com.datadog.benchmark.sample.navigation.BenchmarkNavigationPredicate
2728
import com.datadog.sample.benchmark.BuildConfig
2829
import com.datadog.sample.benchmark.R
30+
import dagger.Lazy
2931
import javax.inject.Inject
30-
import javax.inject.Singleton
3132

3233
/**
3334
* The general recommendation is to initialize all the components at the Application.onCreate
3435
* to have all the observability as early as possible. However in the Benchmark app we know what features
3536
* we need only in [MainActivity.onCreate], it depends on the [SyntheticsScenario] which is derived from intent extras.
3637
*/
37-
@Singleton
38+
@BenchmarkActivityScope
3839
@Suppress("TooManyFunctions")
3940
internal class DatadogFeaturesInitializer @Inject constructor(
40-
private val sdkCore: SdkCore
41+
private val sdkCore: Lazy<SdkCore>
4142
) {
4243
private var isInitialized = false
44+
4345
fun initialize(config: BenchmarkConfig) {
46+
if (config.run == SyntheticsRun.Baseline) {
47+
return
48+
}
49+
4450
if (isInitialized) {
4551
return
4652
}
@@ -76,7 +82,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
7682
.addExtensionSupport(ComposeExtensionSupport())
7783
.build()
7884

79-
SessionReplay.enable(sessionReplayConfig, sdkCore)
85+
SessionReplay.enable(sessionReplayConfig, sdkCore.get())
8086
}
8187

8288
private fun needToEnableLogs(config: BenchmarkConfig): Boolean {
@@ -85,13 +91,14 @@ internal class DatadogFeaturesInitializer @Inject constructor(
8591

8692
private fun enableLogs() {
8793
val logsConfig = LogsConfiguration.Builder().build()
88-
Logs.enable(logsConfig, sdkCore)
94+
Logs.enable(logsConfig, sdkCore.get())
8995
}
9096

9197
private fun needToEnableRum(config: BenchmarkConfig): Boolean {
92-
return when (isInstrumentedRun(config)) {
93-
true -> isSessionReplayScenario(config) || isRumScenario(config)
94-
false -> isSessionReplayScenario(config)
98+
return if (isInstrumentedRun(config)) {
99+
isSessionReplayScenario(config) || isRumScenario(config)
100+
} else {
101+
false
95102
}
96103
}
97104

@@ -138,7 +145,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
138145

139146
private fun enableRum(config: BenchmarkConfig) {
140147
val rumConfig = createRumConfiguration(config)
141-
Rum.enable(rumConfig, sdkCore = sdkCore)
148+
Rum.enable(rumConfig, sdkCore = sdkCore.get())
142149
}
143150

144151
private fun isSessionReplayScenario(config: BenchmarkConfig) = when (config.scenario) {
@@ -186,7 +193,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
186193
private fun enableTracing() {
187194
val tracesConfig = TraceConfiguration.Builder().build()
188195

189-
Trace.enable(tracesConfig, sdkCore)
196+
Trace.enable(tracesConfig, sdkCore.get())
190197
}
191198

192199
private fun isInstrumentedRun(config: BenchmarkConfig) = config.run == SyntheticsRun.Instrumented

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88

99
package com.datadog.benchmark.sample.di.activity
1010

11-
import com.datadog.android.api.SdkCore
12-
import com.datadog.benchmark.sample.DatadogFeaturesInitializer
11+
import android.content.Context
1312
import com.datadog.benchmark.sample.MainActivity
1413
import com.datadog.benchmark.sample.config.BenchmarkConfig
1514
import com.datadog.benchmark.sample.di.common.DispatchersModule
@@ -27,8 +26,7 @@ import javax.inject.Scope
2726
internal annotation class BenchmarkActivityScope
2827

2928
internal interface BenchmarkActivityComponentDependencies {
30-
val sdkCore: SdkCore
31-
val datadogFeaturesInitializer: DatadogFeaturesInitializer
29+
val context: Context
3230
}
3331

3432
@Component(

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,27 @@
66

77
package com.datadog.benchmark.sample.di.activity
88

9+
import android.annotation.SuppressLint
10+
import android.content.Context
11+
import android.util.Log
12+
import com.datadog.android.Datadog
913
import com.datadog.android.api.SdkCore
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
1019
import com.datadog.android.log.Logger
20+
import com.datadog.android.privacy.TrackingConsent
1121
import com.datadog.android.rum.GlobalRumMonitor
1222
import com.datadog.android.rum.RumMonitor
1323
import com.datadog.benchmark.DatadogBaseMeter
1424
import com.datadog.benchmark.DatadogExporterConfiguration
1525
import com.datadog.benchmark.DatadogSdkMeter
1626
import com.datadog.benchmark.DatadogVitalsMeter
27+
import com.datadog.benchmark.sample.MainActivity
1728
import com.datadog.benchmark.sample.config.BenchmarkConfig
29+
import com.datadog.benchmark.sample.config.SyntheticsRun
1830
import com.datadog.benchmark.sample.config.SyntheticsScenario
1931
import com.datadog.sample.benchmark.BuildConfig
2032
import dagger.Module
@@ -23,6 +35,29 @@ import dagger.Provides
2335
@Module
2436
internal interface DatadogActivityModule {
2537
companion object {
38+
/**
39+
* The general recommendation is to initialize Datadog SDK at the Application.onCreate
40+
* to have all the observability as early as possible. However in the Benchmark app we know what kind of run we
41+
* have [SyntheticsRun.Instrumented] or [SyntheticsRun.Baseline] only in [MainActivity.onCreate].
42+
* It is derived from intent extras.
43+
*/
44+
@Provides
45+
@BenchmarkActivityScope
46+
fun provideSdkCore(
47+
context: Context,
48+
config: BenchmarkConfig
49+
): SdkCore {
50+
check(config.run != SyntheticsRun.Baseline) {
51+
"Datadog must not be initialized in baseline run"
52+
}
53+
54+
return Datadog.initialize(
55+
context,
56+
createDatadogConfiguration(),
57+
TrackingConsent.GRANTED
58+
)!!
59+
}
60+
2661
@Provides
2762
@BenchmarkActivityScope
2863
fun provideDatadogMeter(config: BenchmarkConfig): DatadogBaseMeter {
@@ -59,5 +94,29 @@ internal interface DatadogActivityModule {
5994
}
6095
}
6196

97+
@SuppressLint("LogNotTimber")
98+
private fun createDatadogConfiguration(): Configuration {
99+
val configBuilder = Configuration.Builder(
100+
clientToken = BuildConfig.BENCHMARK_CLIENT_TOKEN,
101+
env = BuildConfig.BUILD_TYPE
102+
)
103+
.setBatchSize(BatchSize.SMALL)
104+
.setUploadFrequency(UploadFrequency.FREQUENT)
105+
106+
configBuilder.setBackpressureStrategy(
107+
BackPressureStrategy(
108+
CAPACITY_BACK_PRESSURE_STRATEGY,
109+
{ Log.w("BackPressure", "Threshold reached") },
110+
{ Log.e("BackPressure", "Item dropped: $it") },
111+
BackPressureMitigation.IGNORE_NEWEST
112+
)
113+
)
114+
115+
return configBuilder.build()
116+
}
117+
118+
// the same as the default one
119+
private const val CAPACITY_BACK_PRESSURE_STRATEGY = 1024
120+
62121
private const val METER_INTERVAL_IN_SECONDS = 10L
63122
private const val BENCHMARK_APPLICATION_NAME = "Benchmark Application"

sample/benchmark/src/main/java/com/datadog/benchmark/sample/di/app/BenchmarkAppComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import javax.inject.Singleton
1414

1515
@Component(
1616
modules = [
17-
AppModule::class,
18-
DatadogModule::class
17+
AppModule::class
1918
]
2019
)
2120
@Singleton

sample/benchmark/src/main/java/com/datadog/benchmark/sample/di/app/DatadogModule.kt

Lines changed: 0 additions & 62 deletions
This file was deleted.

sample/benchmark/src/test/java/com/datadog/benchmark/sample/config/DatadogFeaturesInitializerTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import org.mockito.Mockito
2121
import org.mockito.junit.jupiter.MockitoExtension
2222
import org.mockito.junit.jupiter.MockitoSettings
2323
import org.mockito.kotlin.any
24+
import org.mockito.kotlin.verify
25+
import org.mockito.kotlin.verifyNoInteractions
2426
import org.mockito.quality.Strictness
2527

2628
@Extensions(
@@ -48,7 +50,7 @@ class DatadogFeaturesInitializerTest {
4850
}
4951

5052
@Test
51-
fun `M skip session replay and enable rum W run is baseline and scenario is sr`() {
53+
fun `M enable nothing W run is baseline and scenario is sr`() {
5254
// Given
5355
val config = BenchmarkConfig(
5456
run = SyntheticsRun.Baseline,
@@ -58,7 +60,7 @@ class DatadogFeaturesInitializerTest {
5860
mockAllAndCheck(config) {
5961
// Then
6062
sessionReplay.verifyNoInteractions()
61-
rum.verifyRumEnabled()
63+
rum.verifyNoInteractions()
6264
logs.verifyNoInteractions()
6365
}
6466
}
@@ -101,7 +103,7 @@ class DatadogFeaturesInitializerTest {
101103
Mockito.mockStatic(Logs::class.java).use { logsStatic ->
102104
// When
103105
DatadogFeaturesInitializer(
104-
sdkCore = mockSdkCore
106+
sdkCore = { mockSdkCore }
105107
).initialize(config)
106108

107109
// Then

0 commit comments

Comments
 (0)