Skip to content

Commit 291bdbd

Browse files
RUM-11784: Send TTID vital
1 parent 641c42d commit 291bdbd

29 files changed

+714
-169
lines changed

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/Rum.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ import com.datadog.android.api.feature.Feature
1616
import com.datadog.android.api.feature.FeatureSdkCore
1717
import com.datadog.android.core.InternalSdkCore
1818
import com.datadog.android.core.sampling.RateBasedSampler
19+
import com.datadog.android.rum.internal.FeaturesContextResolver
1920
import com.datadog.android.rum.internal.RumAnonymousIdentifierManager
2021
import com.datadog.android.rum.internal.RumFeature
22+
import com.datadog.android.rum.internal.domain.scope.RumVitalEventHelper
2123
import com.datadog.android.rum.internal.metric.SessionEndedMetricDispatcher
2224
import com.datadog.android.rum.internal.monitor.DatadogRumMonitor
2325
import com.datadog.android.rum.internal.startup.RumAppStartupTelemetryReporter
@@ -145,7 +147,15 @@ object Rum {
145147
accessibilitySnapshotManager = rumFeature.accessibilitySnapshotManager,
146148
batteryInfoProvider = rumFeature.batteryInfoProvider,
147149
displayInfoProvider = rumFeature.displayInfoProvider,
148-
rumAppStartupTelemetryReporter = RumAppStartupTelemetryReporter.create(sdkCore)
150+
rumAppStartupTelemetryReporter = RumAppStartupTelemetryReporter.create(sdkCore),
151+
rumVitalEventHelper = RumVitalEventHelper(
152+
rumSessionTypeOverride = rumFeature.configuration.rumSessionTypeOverride,
153+
batteryInfoProvider = rumFeature.batteryInfoProvider,
154+
displayInfoProvider = rumFeature.displayInfoProvider,
155+
sampleRate = rumFeature.sampleRate,
156+
internalLogger = sdkCore.internalLogger
157+
),
158+
featuresContextResolver = FeaturesContextResolver()
149159
)
150160
}
151161

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/RumFeature.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ internal class RumFeature(
687687
override fun onFirstFrameDrawn(timestampNs: Long) {
688688
val info = RumTTIDInfo(
689689
scenario = scenario,
690-
durationNs = timestampNs - scenario.initialTimeNs
690+
durationNs = timestampNs - scenario.initialTime.nanoTime
691691
)
692692
(GlobalRumMonitor.get(sdkCore) as? AdvancedRumMonitor)
693693
?.sendTTIDEvent(info)

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumApplicationScope.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.datadog.android.rum.DdRumContentProvider
1818
import com.datadog.android.rum.GlobalRumMonitor
1919
import com.datadog.android.rum.RumSessionListener
2020
import com.datadog.android.rum.RumSessionType
21+
import com.datadog.android.rum.internal.FeaturesContextResolver
2122
import com.datadog.android.rum.internal.domain.InfoProvider
2223
import com.datadog.android.rum.internal.domain.RumContext
2324
import com.datadog.android.rum.internal.domain.Time
@@ -52,7 +53,9 @@ internal class RumApplicationScope(
5253
private val accessibilitySnapshotManager: AccessibilitySnapshotManager,
5354
private val batteryInfoProvider: InfoProvider<BatteryInfo>,
5455
private val displayInfoProvider: InfoProvider<DisplayInfo>,
55-
private val rumAppStartupTelemetryReporter: RumAppStartupTelemetryReporter
56+
private val rumAppStartupTelemetryReporter: RumAppStartupTelemetryReporter,
57+
private val rumVitalEventHelper: RumVitalEventHelper,
58+
private val featuresContextResolver: FeaturesContextResolver
5659
) : RumScope, RumViewChangedListener {
5760

5861
override val parentScope: RumScope? = null
@@ -81,7 +84,9 @@ internal class RumApplicationScope(
8184
accessibilitySnapshotManager = accessibilitySnapshotManager,
8285
batteryInfoProvider = batteryInfoProvider,
8386
displayInfoProvider = displayInfoProvider,
84-
rumAppStartupTelemetryReporter = rumAppStartupTelemetryReporter
87+
rumAppStartupTelemetryReporter = rumAppStartupTelemetryReporter,
88+
rumVitalEventHelper = rumVitalEventHelper,
89+
featuresContextResolver = featuresContextResolver
8590
)
8691
)
8792

@@ -202,7 +207,9 @@ internal class RumApplicationScope(
202207
accessibilitySnapshotManager = accessibilitySnapshotManager,
203208
batteryInfoProvider = batteryInfoProvider,
204209
displayInfoProvider = displayInfoProvider,
205-
rumAppStartupTelemetryReporter = rumAppStartupTelemetryReporter
210+
rumAppStartupTelemetryReporter = rumAppStartupTelemetryReporter,
211+
rumVitalEventHelper = rumVitalEventHelper,
212+
featuresContextResolver = featuresContextResolver
206213
)
207214
childScopes.add(newSession)
208215
if (event !is RumRawEvent.StartView) {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumEventExt.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ import com.datadog.android.rum.RumResourceMethod
1717
import com.datadog.android.rum.featureoperations.FailureReason
1818
import com.datadog.android.rum.internal.RumErrorSourceType
1919
import com.datadog.android.rum.internal.domain.event.ResourceTiming
20+
import com.datadog.android.rum.internal.startup.RumStartupScenario
2021
import com.datadog.android.rum.model.ActionEvent
2122
import com.datadog.android.rum.model.ErrorEvent
2223
import com.datadog.android.rum.model.LongTaskEvent
2324
import com.datadog.android.rum.model.ResourceEvent
2425
import com.datadog.android.rum.model.ViewEvent
2526
import com.datadog.android.rum.model.VitalEvent
27+
import com.datadog.android.rum.model.VitalEvent.StartupType
2628
import java.util.Locale
2729

2830
// region Resource.Method conversion
@@ -669,4 +671,13 @@ internal fun FailureReason.toSchemaFailureReason(): VitalEvent.FailureReason {
669671
FailureReason.OTHER -> VitalEvent.FailureReason.OTHER
670672
}
671673
}
674+
675+
internal fun RumStartupScenario.toVitalStartupType(): StartupType {
676+
return when (this) {
677+
is RumStartupScenario.Cold -> StartupType.COLD_START
678+
is RumStartupScenario.WarmAfterActivityDestroyed,
679+
is RumStartupScenario.WarmFirstActivity -> StartupType.WARM_START
680+
}
681+
}
682+
672683
// endregion

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumSessionScope.kt

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.datadog.android.core.InternalSdkCore
1616
import com.datadog.android.core.internal.net.FirstPartyHostHeaderTypeResolver
1717
import com.datadog.android.rum.RumSessionListener
1818
import com.datadog.android.rum.RumSessionType
19+
import com.datadog.android.rum.internal.FeaturesContextResolver
1920
import com.datadog.android.rum.internal.domain.InfoProvider
2021
import com.datadog.android.rum.internal.domain.RumContext
2122
import com.datadog.android.rum.internal.domain.Time
@@ -25,10 +26,12 @@ import com.datadog.android.rum.internal.domain.display.DisplayInfo
2526
import com.datadog.android.rum.internal.metric.SessionMetricDispatcher
2627
import com.datadog.android.rum.internal.metric.slowframes.SlowFramesListener
2728
import com.datadog.android.rum.internal.startup.RumAppStartupTelemetryReporter
29+
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
2830
import com.datadog.android.rum.internal.utils.percent
2931
import com.datadog.android.rum.internal.vitals.VitalMonitor
3032
import com.datadog.android.rum.metric.interactiontonextview.LastInteractionIdentifier
3133
import com.datadog.android.rum.metric.networksettled.InitialResourceIdentifier
34+
import com.datadog.android.rum.model.VitalEvent
3235
import java.security.SecureRandom
3336
import java.util.UUID
3437
import java.util.concurrent.TimeUnit
@@ -58,7 +61,9 @@ internal class RumSessionScope(
5861
private val sessionInactivityNanos: Long = DEFAULT_SESSION_INACTIVITY_NS,
5962
private val sessionMaxDurationNanos: Long = DEFAULT_SESSION_MAX_DURATION_NS,
6063
rumSessionTypeOverride: RumSessionType?,
61-
private val rumAppStartupTelemetryReporter: RumAppStartupTelemetryReporter
64+
private val rumAppStartupTelemetryReporter: RumAppStartupTelemetryReporter,
65+
private val rumVitalEventHelper: RumVitalEventHelper,
66+
private val featuresContextResolver: FeaturesContextResolver
6267
) : RumScope {
6368

6469
internal var sessionId = RumContext.NULL_UUID
@@ -95,7 +100,8 @@ internal class RumSessionScope(
95100
rumSessionTypeOverride = rumSessionTypeOverride,
96101
accessibilitySnapshotManager = accessibilitySnapshotManager,
97102
batteryInfoProvider = batteryInfoProvider,
98-
displayInfoProvider = displayInfoProvider
103+
displayInfoProvider = displayInfoProvider,
104+
rumVitalEventHelper = rumVitalEventHelper
99105
)
100106

101107
internal val activeView: RumViewScope?
@@ -156,11 +162,12 @@ internal class RumSessionScope(
156162
when (event) {
157163
is RumRawEvent.AppStartTTIDEvent -> {
158164
if (sessionState == State.TRACKED) {
159-
rumAppStartupTelemetryReporter.reportTTID(
160-
info = event.info,
161-
indexInSession = appStartIndex
165+
handleTTIDEvent(
166+
event = event,
167+
datadogContext = datadogContext,
168+
writeScope = writeScope,
169+
writer = actualWriter
162170
)
163-
appStartIndex++
164171
}
165172
}
166173
is RumRawEvent.SdkInit -> {}
@@ -281,6 +288,58 @@ internal class RumSessionScope(
281288
)
282289
}
283290

291+
private fun handleTTIDEvent(
292+
event: RumRawEvent.AppStartTTIDEvent,
293+
datadogContext: DatadogContext,
294+
writeScope: EventWriteScope,
295+
writer: DataWriter<Any>
296+
) {
297+
sdkCore.newRumEventWriteOperation(datadogContext, writeScope, writer) {
298+
createTTIDVitalEvent(
299+
event = event,
300+
datadogContext = datadogContext
301+
)
302+
}.submit()
303+
304+
rumAppStartupTelemetryReporter.reportTTID(
305+
info = event.info,
306+
indexInSession = appStartIndex
307+
)
308+
309+
appStartIndex++
310+
}
311+
312+
private fun createTTIDVitalEvent(
313+
event: RumRawEvent.AppStartTTIDEvent,
314+
datadogContext: DatadogContext
315+
): VitalEvent {
316+
val rumContext = getRumContext()
317+
318+
val hasReplay = childScope?.activeView?.viewId?.let {
319+
featuresContextResolver.resolveViewHasReplay(datadogContext, it)
320+
}
321+
322+
return rumVitalEventHelper.newVitalEvent(
323+
timestampMs = event.info.scenario.initialTime.timestamp + sdkCore.time.serverTimeOffsetMs,
324+
datadogContext = datadogContext,
325+
eventAttributes = emptyMap(),
326+
customAttributes = getCustomAttributes(),
327+
view = null,
328+
hasReplay = hasReplay,
329+
rumContext = rumContext,
330+
vital = VitalEvent.Vital.AppLaunchProperties(
331+
id = UUID.randomUUID().toString(),
332+
name = null,
333+
description = null,
334+
appLaunchMetric = VitalEvent.AppLaunchMetric.TTID,
335+
duration = event.info.durationNs,
336+
startupType = event.info.scenario.toVitalStartupType(),
337+
isPrewarmed = null,
338+
hasSavedInstanceStateBundle = event.info.scenario.hasSavedInstanceStateBundle
339+
)
340+
)
341+
}
342+
284343
// endregion
285344

286345
companion object {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumViewManagerScope.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ internal class RumViewManagerScope(
5858
private val rumSessionTypeOverride: RumSessionType?,
5959
private val accessibilitySnapshotManager: AccessibilitySnapshotManager,
6060
private val batteryInfoProvider: InfoProvider<BatteryInfo>,
61-
private val displayInfoProvider: InfoProvider<DisplayInfo>
61+
private val displayInfoProvider: InfoProvider<DisplayInfo>,
62+
private val rumVitalEventHelper: RumVitalEventHelper
6263
) : RumScope {
6364

6465
private val interactionToNextViewMetricResolver: InteractionToNextViewMetricResolver =
@@ -285,7 +286,8 @@ internal class RumViewManagerScope(
285286
rumSessionTypeOverride = rumSessionTypeOverride,
286287
accessibilitySnapshotManager = accessibilitySnapshotManager,
287288
batteryInfoProvider = batteryInfoProvider,
288-
displayInfoProvider = displayInfoProvider
289+
displayInfoProvider = displayInfoProvider,
290+
rumVitalEventHelper = rumVitalEventHelper
289291
)
290292
applicationDisplayed = true
291293
childrenScopes.add(viewScope)
@@ -368,7 +370,8 @@ internal class RumViewManagerScope(
368370
rumSessionTypeOverride = rumSessionTypeOverride,
369371
accessibilitySnapshotManager = accessibilitySnapshotManager,
370372
batteryInfoProvider = batteryInfoProvider,
371-
displayInfoProvider = displayInfoProvider
373+
displayInfoProvider = displayInfoProvider,
374+
rumVitalEventHelper = rumVitalEventHelper
372375
)
373376
}
374377

@@ -410,7 +413,8 @@ internal class RumViewManagerScope(
410413
rumSessionTypeOverride = rumSessionTypeOverride,
411414
accessibilitySnapshotManager = accessibilitySnapshotManager,
412415
batteryInfoProvider = batteryInfoProvider,
413-
displayInfoProvider = displayInfoProvider
416+
displayInfoProvider = displayInfoProvider,
417+
rumVitalEventHelper = rumVitalEventHelper
414418
)
415419
}
416420

0 commit comments

Comments
 (0)