Skip to content

Commit d6bd044

Browse files
committed
RUM-10363: Apply suggested changes
1 parent 5153c40 commit d6bd044

File tree

12 files changed

+59
-50
lines changed

12 files changed

+59
-50
lines changed

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/DatadogCore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ internal class DatadogCore(
457457
executorServiceFactory ?: CoreFeature.DEFAULT_FLUSHABLE_EXECUTOR_SERVICE_FACTORY
458458
coreFeature = CoreFeature(
459459
internalLogger,
460-
DefaultAppStartTimeProvider(),
460+
DefaultAppStartTimeProvider(timeProviderFactory = { timeProvider }),
461461
flushableExecutorServiceFactory,
462462
CoreFeature.DEFAULT_SCHEDULED_EXECUTOR_SERVICE_FACTORY
463463
)

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/time/DefaultAppStartTimeProvider.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ import android.os.Build
1111
import android.os.Process
1212
import android.os.SystemClock
1313
import com.datadog.android.core.internal.system.BuildSdkVersionProvider
14-
import com.datadog.android.internal.time.DefaultTimeProvider
1514
import com.datadog.android.internal.time.TimeProvider
1615
import com.datadog.android.rum.DdRumContentProvider
1716
import java.util.concurrent.TimeUnit
1817
import kotlin.time.Duration.Companion.seconds
1918

2019
internal class DefaultAppStartTimeProvider(
21-
private val timeProvider: TimeProvider = DefaultTimeProvider(),
20+
private val timeProviderFactory: () -> TimeProvider,
2221
buildSdkVersionProvider: BuildSdkVersionProvider = BuildSdkVersionProvider.DEFAULT
2322
) : AppStartTimeProvider {
2423

@@ -27,7 +26,7 @@ internal class DefaultAppStartTimeProvider(
2726
when {
2827
buildSdkVersionProvider.version >= Build.VERSION_CODES.N -> {
2928
val diffMs = SystemClock.elapsedRealtime() - Process.getStartElapsedRealtime()
30-
val result = timeProvider.getDeviceElapsedTimeNs() - TimeUnit.MILLISECONDS.toNanos(diffMs)
29+
val result = timeProviderFactory().getDeviceElapsedTimeNs() - TimeUnit.MILLISECONDS.toNanos(diffMs)
3130

3231
/**
3332
* Occasionally [Process.getStartElapsedRealtime] returns buggy values. We filter them and fall back
@@ -44,7 +43,7 @@ internal class DefaultAppStartTimeProvider(
4443
}
4544

4645
override val appUptimeNs: Long
47-
get() = timeProvider.getDeviceElapsedTimeNs() - appStartTimeNs
46+
get() = timeProviderFactory().getDeviceElapsedTimeNs() - appStartTimeNs
4847

4948
companion object {
5049
internal val PROCESS_START_TO_CP_START_DIFF_THRESHOLD_NS = 10.seconds.inWholeNanoseconds

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/time/KronosTimeProvider.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,24 @@
77
package com.datadog.android.core.internal.time
88

99
import com.datadog.android.api.InternalLogger
10+
import com.datadog.android.internal.time.BaseTimeProvider
1011
import com.datadog.android.internal.time.TimeProvider
1112
import com.lyft.kronos.Clock
1213
import java.util.concurrent.TimeUnit
1314

1415
/**
1516
* A [TimeProvider] implementation that uses Kronos NTP for server time synchronization.
1617
*
17-
* Device timestamp and elapsed time are inherited from [TimeProvider] default implementations.
18+
* Device timestamp and elapsed time are inherited from [BaseTimeProvider].
1819
*/
1920
internal class KronosTimeProvider(
2021
private val clock: Clock,
2122
private val internalLogger: InternalLogger
22-
) : TimeProvider {
23+
) : BaseTimeProvider() {
2324

2425
override fun getServerTimestamp(): Long {
2526
return clock.safeGetCurrentTimeMs()
26-
.getOrElse { System.currentTimeMillis() }
27+
.getOrElse { getDeviceTimestamp() }
2728
}
2829

2930
override fun getServerOffsetMillis(): Long {

dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/internal/data/upload/RotatingDnsResolverTest.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ internal class RotatingDnsResolverTest {
6060
fun `set up`(forge: Forge) {
6161
fakeInetAddresses = forge.aList { mock() }
6262

63-
whenever(mockTimeProvider.getDeviceElapsedTimeNs()) doReturn fakeElapsedTimeNs
64-
6563
testedDns = RotatingDnsResolver(mockDelegate, TEST_TTL_MS, mockTimeProvider)
6664
}
6765

@@ -135,14 +133,12 @@ internal class RotatingDnsResolverTest {
135133
fakeInetAddresses = forge.aList(size = forge.anInt(min = 1, max = 3)) { mock() }
136134
whenever(mockDelegate.lookup(fakeHostname)) doReturn fakeInetAddresses
137135

138-
val fakeExpiredTime = fakeElapsedTimeNs + TEST_TTL_MS.inWholeNanoseconds
139-
whenever(mockTimeProvider.getDeviceElapsedTimeNs()).doReturn(fakeElapsedTimeNs, fakeExpiredTime)
140-
141136
var exceptionThrown: Exception? = null
142137

143138
// When
144139
List(100) {
145140
Thread {
141+
Thread.sleep(forge.aLong(min = 0, max = 100))
146142
try {
147143
testedDns.lookup(fakeHostname)
148144
} catch (e: Exception) {

dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/internal/time/DefaultAppStartTimeProviderTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class DefaultAppStartTimeProviderTest {
5050

5151
// When
5252
val testedAppStartTimeProvider = DefaultAppStartTimeProvider(
53-
mockTimeProvider,
53+
{ mockTimeProvider },
5454
mockBuildSdkVersionProvider
5555
)
5656
val providedStartTime = testedAppStartTimeProvider.appStartTimeNs
@@ -69,7 +69,7 @@ class DefaultAppStartTimeProviderTest {
6969

7070
// When
7171
val testedAppStartTimeProvider = DefaultAppStartTimeProvider(
72-
mockTimeProvider,
72+
{ mockTimeProvider },
7373
mockBuildSdkVersionProvider
7474
)
7575
val providedStartTime = testedAppStartTimeProvider.appStartTimeNs
@@ -95,7 +95,7 @@ class DefaultAppStartTimeProviderTest {
9595
.doReturn(fakeStartTimeNs + fakeUptimeNs)
9696

9797
val testedProvider = DefaultAppStartTimeProvider(
98-
mockTimeProvider,
98+
{ mockTimeProvider },
9999
mockBuildSdkVersionProvider
100100
)
101101

@@ -123,7 +123,7 @@ class DefaultAppStartTimeProviderTest {
123123
.doReturn(fakeStartTimeNs + 200L)
124124

125125
val testedProvider = DefaultAppStartTimeProvider(
126-
mockTimeProvider,
126+
{ mockTimeProvider },
127127
mockBuildSdkVersionProvider
128128
)
129129

dd-sdk-android-internal/api/apiSurface

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class com.datadog.android.internal.thread.NamedRunnable : NamedExecutionUnit, Ru
9191
constructor(String, Runnable)
9292
class com.datadog.android.internal.thread.NamedCallable<V> : NamedExecutionUnit, java.util.concurrent.Callable<V>
9393
constructor(String, java.util.concurrent.Callable<V>)
94-
class com.datadog.android.internal.time.DefaultTimeProvider : TimeProvider
94+
class com.datadog.android.internal.time.DefaultTimeProvider : BaseTimeProvider
9595
override fun getServerTimestamp(): Long
9696
override fun getServerOffsetNanos(): Long
9797
override fun getServerOffsetMillis(): Long
@@ -101,6 +101,9 @@ interface com.datadog.android.internal.time.TimeProvider
101101
fun getDeviceElapsedTimeNs(): Long
102102
fun getServerOffsetNanos(): Long
103103
fun getServerOffsetMillis(): Long
104+
abstract class com.datadog.android.internal.time.BaseTimeProvider : TimeProvider
105+
override fun getDeviceTimestamp(): Long
106+
override fun getDeviceElapsedTimeNs(): Long
104107
fun ByteArray.toHexString(): String
105108
interface com.datadog.android.internal.utils.DDCoreSubscription<T: Any>
106109
fun addListener(T)

dd-sdk-android-internal/api/dd-sdk-android-internal.api

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,14 @@ public final class com/datadog/android/internal/thread/NamedRunnable : com/datad
253253
public fun run ()V
254254
}
255255

256-
public final class com/datadog/android/internal/time/DefaultTimeProvider : com/datadog/android/internal/time/TimeProvider {
256+
public abstract class com/datadog/android/internal/time/BaseTimeProvider : com/datadog/android/internal/time/TimeProvider {
257+
public fun <init> ()V
258+
public final fun getDeviceElapsedTimeNs ()J
259+
public final fun getDeviceTimestamp ()J
260+
}
261+
262+
public final class com/datadog/android/internal/time/DefaultTimeProvider : com/datadog/android/internal/time/BaseTimeProvider {
257263
public fun <init> ()V
258-
public fun getDeviceElapsedTimeNs ()J
259-
public fun getDeviceTimestamp ()J
260264
public fun getServerOffsetMillis ()J
261265
public fun getServerOffsetNanos ()J
262266
public fun getServerTimestamp ()J
@@ -270,11 +274,6 @@ public abstract interface class com/datadog/android/internal/time/TimeProvider {
270274
public abstract fun getServerTimestamp ()J
271275
}
272276

273-
public final class com/datadog/android/internal/time/TimeProvider$DefaultImpls {
274-
public static fun getDeviceElapsedTimeNs (Lcom/datadog/android/internal/time/TimeProvider;)J
275-
public static fun getDeviceTimestamp (Lcom/datadog/android/internal/time/TimeProvider;)J
276-
}
277-
278277
public final class com/datadog/android/internal/utils/ByteArrayExtKt {
279278
public static final fun toHexString ([B)Ljava/lang/String;
280279
}

dd-sdk-android-internal/src/main/java/com/datadog/android/internal/time/DefaultTimeProvider.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ package com.datadog.android.internal.time
1010
* A [TimeProvider] implementation that provides the current device time as both device and server time.
1111
* The offsets are always 0.
1212
*
13-
* Device timestamp and elapsed time are inherited from [TimeProvider] default implementations.
13+
* Device timestamp and elapsed time are inherited from [BaseTimeProvider].
1414
*/
15-
class DefaultTimeProvider : TimeProvider {
16-
override fun getServerTimestamp(): Long = System.currentTimeMillis()
15+
class DefaultTimeProvider : BaseTimeProvider() {
16+
override fun getServerTimestamp(): Long = getDeviceTimestamp()
1717

1818
override fun getServerOffsetNanos(): Long = 0L
1919

dd-sdk-android-internal/src/main/java/com/datadog/android/internal/time/TimeProvider.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,20 @@ interface TimeProvider {
1515

1616
/**
1717
* Returns the current device timestamp in milliseconds.
18-
*
19-
* Default implementation returns [System.currentTimeMillis].
20-
* This should not be overridden as device time always refers to the local system clock.
18+
* This is implemented in [BaseTimeProvider] as [System.currentTimeMillis].
2119
*/
22-
fun getDeviceTimestamp(): Long = System.currentTimeMillis()
20+
fun getDeviceTimestamp(): Long
2321

2422
/**
2523
* Returns the current server timestamp in milliseconds.
2624
*/
2725
fun getServerTimestamp(): Long
2826

2927
/**
30-
* Returns the current device elapsed time in nanoseconds.
31-
*
32-
* Default implementation returns [System.nanoTime].
33-
* This should not be overridden as device elapsed time always refers to the monotonic system clock.
28+
* Returns the current device monotonic elapsed time in nanoseconds.
29+
* This is implemented in [BaseTimeProvider] as [System.nanoTime].
3430
*/
35-
fun getDeviceElapsedTimeNs(): Long = System.nanoTime()
31+
fun getDeviceElapsedTimeNs(): Long
3632

3733
/**
3834
* Returns the offset between the device and server time references in nanoseconds.
@@ -44,3 +40,11 @@ interface TimeProvider {
4440
*/
4541
fun getServerOffsetMillis(): Long
4642
}
43+
44+
/**
45+
* A base implementation of [TimeProvider] that provides the device time using system calls.
46+
*/
47+
abstract class BaseTimeProvider : TimeProvider {
48+
final override fun getDeviceTimestamp(): Long = System.currentTimeMillis()
49+
final override fun getDeviceElapsedTimeNs(): Long = System.nanoTime()
50+
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.content.Context
1111
import android.util.Log
1212
import com.datadog.android.Datadog
1313
import com.datadog.android.api.SdkCore
14+
import com.datadog.android.api.feature.FeatureSdkCore
1415
import com.datadog.android.core.configuration.BackPressureMitigation
1516
import com.datadog.android.core.configuration.BackPressureStrategy
1617
import com.datadog.android.core.configuration.BatchSize
@@ -54,7 +55,7 @@ internal interface DatadogModule {
5455

5556
@Provides
5657
@Singleton
57-
fun provideDatadogMeter(config: BenchmarkConfig): DatadogBaseMeter {
58+
fun provideDatadogMeter(config: BenchmarkConfig, sdkCore: SdkCore): DatadogBaseMeter {
5859
val exporterConfig = DatadogExporterConfiguration.Builder(BuildConfig.BENCHMARK_API_KEY)
5960
.setApplicationId(BuildConfig.APPLICATION_ID)
6061
.setApplicationName(BENCHMARK_APPLICATION_NAME)
@@ -67,7 +68,10 @@ internal interface DatadogModule {
6768
return if (config.scenario == SyntheticsScenario.Upload) {
6869
DatadogSdkMeter.create(exporterConfig)
6970
} else {
70-
DatadogVitalsMeter.create(exporterConfig)
71+
DatadogVitalsMeter.create(
72+
exporterConfig,
73+
sdkCore as FeatureSdkCore
74+
)
7175
}
7276
}
7377

0 commit comments

Comments
 (0)