Skip to content

Commit 97946d9

Browse files
committed
RUM-10907: Supporting process uptime for telemetry debug attribute
1 parent 2a08737 commit 97946d9

File tree

22 files changed

+148
-84
lines changed

22 files changed

+148
-84
lines changed

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ interface com.datadog.android.core.InternalSdkCore : com.datadog.android.api.fea
201201
val lastViewEvent: com.google.gson.JsonObject?
202202
val lastFatalAnrSent: Long?
203203
val appStartTimeNs: Long
204+
val appUptimeNs: Long
204205
fun writeLastViewEvent(ByteArray)
205206
fun deleteLastViewEvent()
206207
fun writeLastFatalAnrSent(Long)

dd-sdk-android-core/api/dd-sdk-android-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ public abstract interface class com/datadog/android/core/InternalSdkCore : com/d
594594
public abstract fun deleteLastViewEvent ()V
595595
public abstract fun getAllFeatures ()Ljava/util/List;
596596
public abstract fun getAppStartTimeNs ()J
597+
public abstract fun getAppUptimeNs ()J
597598
public abstract fun getDatadogContext (Ljava/util/Set;)Lcom/datadog/android/api/context/DatadogContext;
598599
public abstract fun getFirstPartyHostResolver ()Lcom/datadog/android/core/internal/net/FirstPartyHostHeaderTypeResolver;
599600
public abstract fun getLastFatalAnrSent ()Ljava/lang/Long;

dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/TimeInfo.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ data class TimeInfo(
2020
val serverTimeNs: Long,
2121
val serverTimeOffsetNs: Long,
2222
val serverTimeOffsetMs: Long
23-
)
23+
) {
24+
internal companion object {
25+
internal val EMPTY = TimeInfo(0, 0, 0, 0)
26+
}
27+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ interface InternalSdkCore : FeatureSdkCore {
7878
@InternalApi
7979
val appStartTimeNs: Long
8080

81+
/**
82+
* Provide the time since the application started in nanoseconds from device boot, or our best guess
83+
* if the actual start time is not available. Note: since the implementation may rely on [System.nanoTime],
84+
* this property can only be used to measure elapsed time and is not related to any other notion of system
85+
* or wall-clock time. The value is the time since VM start.
86+
*/
87+
@InternalApi
88+
val appUptimeNs: Long
89+
8190
/**
8291
* Writes current RUM view event to the dedicated file for the needs of NDK crash reporting.
8392
*

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ internal class CoreFeature(
209209
internal val appStartTimeNs: Long
210210
get() = appStartTimeProvider.appStartTimeNs
211211

212+
internal val appUptimeNs: Long
213+
get() = appStartTimeProvider.appUptimeNs
214+
212215
// lazy here on purpose: we need to read it only once, even if it is used in different features
213216
@get:WorkerThread
214217
internal val lastViewEvent: JsonObject? by lazy {

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import com.datadog.android.api.context.DatadogContext
1010
import com.datadog.android.api.context.DeviceInfo
1111
import com.datadog.android.api.context.LocaleInfo
1212
import com.datadog.android.api.context.ProcessInfo
13-
import com.datadog.android.api.context.TimeInfo
14-
import java.util.concurrent.TimeUnit
13+
import com.datadog.android.core.internal.time.composeTimeInfo
1514

1615
internal class DatadogContextProvider(
1716
private val coreFeature: CoreFeature,
@@ -30,17 +29,7 @@ internal class DatadogContextProvider(
3029
variant = coreFeature.variant,
3130
sdkVersion = coreFeature.sdkVersion,
3231
source = coreFeature.sourceName,
33-
time = with(coreFeature.timeProvider) {
34-
val deviceTimeMs = getDeviceTimestamp()
35-
val serverTimeMs = getServerTimestamp()
36-
TimeInfo(
37-
deviceTimeNs = TimeUnit.MILLISECONDS.toNanos(deviceTimeMs),
38-
serverTimeNs = TimeUnit.MILLISECONDS.toNanos(serverTimeMs),
39-
serverTimeOffsetNs = TimeUnit.MILLISECONDS
40-
.toNanos(serverTimeMs - deviceTimeMs),
41-
serverTimeOffsetMs = serverTimeMs - deviceTimeMs
42-
)
43-
},
32+
time = coreFeature.timeProvider.composeTimeInfo(),
4433
processInfo = ProcessInfo(
4534
isMainProcess = coreFeature.isMainProcess
4635
),

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.datadog.android.core.internal.logger.SdkInternalLogger
3434
import com.datadog.android.core.internal.net.FirstPartyHostHeaderTypeResolver
3535
import com.datadog.android.core.internal.system.BuildSdkVersionProvider
3636
import com.datadog.android.core.internal.time.DefaultAppStartTimeProvider
37+
import com.datadog.android.core.internal.time.composeTimeInfo
3738
import com.datadog.android.core.internal.utils.executeSafe
3839
import com.datadog.android.core.internal.utils.getSafe
3940
import com.datadog.android.core.internal.utils.scheduleSafe
@@ -100,17 +101,7 @@ internal class DatadogCore(
100101
/** @inheritDoc */
101102
override val time: TimeInfo
102103
get() {
103-
return with(coreFeature.timeProvider) {
104-
val deviceTimeMs = getDeviceTimestamp()
105-
val serverTimeMs = getServerTimestamp()
106-
TimeInfo(
107-
deviceTimeNs = TimeUnit.MILLISECONDS.toNanos(deviceTimeMs),
108-
serverTimeNs = TimeUnit.MILLISECONDS.toNanos(serverTimeMs),
109-
serverTimeOffsetNs = TimeUnit.MILLISECONDS
110-
.toNanos(serverTimeMs - deviceTimeMs),
111-
serverTimeOffsetMs = serverTimeMs - deviceTimeMs
112-
)
113-
}
104+
return coreFeature.timeProvider.composeTimeInfo()
114105
}
115106

116107
/** @inheritDoc */
@@ -387,6 +378,9 @@ internal class DatadogCore(
387378
override val appStartTimeNs: Long
388379
get() = coreFeature.appStartTimeNs
389380

381+
override val appUptimeNs: Long
382+
get() = coreFeature.appUptimeNs
383+
390384
@WorkerThread
391385
override fun writeLastViewEvent(data: ByteArray) {
392386
// we need to write it only if we are going to read ApplicationExitInfo (available on

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,7 @@ internal class NoOpContextProvider : ContextProvider {
2828
variant = "",
2929
source = "",
3030
sdkVersion = "",
31-
time = TimeInfo(
32-
deviceTimeNs = 0L,
33-
serverTimeNs = 0L,
34-
serverTimeOffsetMs = 0L,
35-
serverTimeOffsetNs = 0L
36-
),
31+
time = TimeInfo.EMPTY,
3732
processInfo = ProcessInfo(isMainProcess = true),
3833
networkInfo = NetworkInfo(
3934
connectivity = NetworkInfo.Connectivity.NETWORK_OTHER,

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,15 @@ import java.util.concurrent.TimeUnit
4141
/**
4242
* A no-op implementation of [SdkCore].
4343
*/
44+
@Suppress("TooManyFunctions")
4445
internal object NoOpInternalSdkCore : InternalSdkCore {
4546

4647
override val name: String = "no-op"
4748

4849
override val time: TimeInfo = with(System.currentTimeMillis()) {
49-
TimeInfo(
50+
TimeInfo.EMPTY.copy(
5051
deviceTimeNs = TimeUnit.MILLISECONDS.toNanos(this),
51-
serverTimeNs = TimeUnit.MILLISECONDS.toNanos(this),
52-
serverTimeOffsetNs = 0L,
53-
serverTimeOffsetMs = 0L
52+
serverTimeNs = TimeUnit.MILLISECONDS.toNanos(this)
5453
)
5554
}
5655

@@ -78,6 +77,8 @@ internal object NoOpInternalSdkCore : InternalSdkCore {
7877
get() = null
7978
override val appStartTimeNs: Long
8079
get() = 0
80+
override val appUptimeNs: Long
81+
get() = 0
8182

8283
// endregion
8384

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,10 @@ internal interface AppStartTimeProvider {
1212
* if the actual start time is not available.
1313
*/
1414
val appStartTimeNs: Long
15+
16+
/**
17+
* Provide the time since the application started in nanoseconds from device boot, or our best guess
18+
* if the actual start time is not available.
19+
*/
20+
val appUptimeNs: Long
1521
}

0 commit comments

Comments
 (0)