Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions features/dd-sdk-android-rum/api/apiSurface
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ enum com.datadog.android.rum.RumResourceMethod
- CONNECT
interface com.datadog.android.rum.RumSessionListener
fun onSessionStarted(String, Boolean)
enum com.datadog.android.rum.RumSessionType
- SYNTHETICS
- USER
class com.datadog.android.rum._RumInternalProxy
fun addLongTask(Long, String)
fun updatePerformanceMetric(RumPerformanceMetric, Double)
Expand All @@ -169,6 +172,7 @@ class com.datadog.android.rum._RumInternalProxy
fun setTelemetryConfigurationEventMapper(com.datadog.android.rum.RumConfiguration.Builder, com.datadog.android.event.EventMapper<com.datadog.android.telemetry.model.TelemetryConfigurationEvent>): com.datadog.android.rum.RumConfiguration.Builder
fun setAdditionalConfiguration(com.datadog.android.rum.RumConfiguration.Builder, Map<String, Any>): com.datadog.android.rum.RumConfiguration.Builder
fun setComposeActionTrackingStrategy(com.datadog.android.rum.RumConfiguration.Builder, com.datadog.android.rum.tracking.ActionTrackingStrategy): com.datadog.android.rum.RumConfiguration.Builder
fun setRumSessionTypeOverride(com.datadog.android.rum.RumConfiguration.Builder, RumSessionType): com.datadog.android.rum.RumConfiguration.Builder
data class com.datadog.android.rum.configuration.SlowFramesConfiguration
constructor(Int = DEFAULT_SLOW_FRAME_RECORDS_MAX_AMOUNT, Long = DEFAULT_FROZEN_FRAME_THRESHOLD_NS, Long = DEFAULT_CONTINUOUS_SLOW_FRAME_THRESHOLD_NS, Long = DEFAULT_FREEZE_DURATION_NS, Long = DEFAULT_VIEW_LIFETIME_THRESHOLD_NS)
companion object
Expand Down
8 changes: 8 additions & 0 deletions features/dd-sdk-android-rum/api/dd-sdk-android-rum.api
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,13 @@ public abstract interface class com/datadog/android/rum/RumSessionListener {
public abstract fun onSessionStarted (Ljava/lang/String;Z)V
}

public final class com/datadog/android/rum/RumSessionType : java/lang/Enum {
public static final field SYNTHETICS Lcom/datadog/android/rum/RumSessionType;
public static final field USER Lcom/datadog/android/rum/RumSessionType;
public static fun valueOf (Ljava/lang/String;)Lcom/datadog/android/rum/RumSessionType;
public static fun values ()[Lcom/datadog/android/rum/RumSessionType;
}

public final class com/datadog/android/rum/_RumInternalProxy {
public static final field Companion Lcom/datadog/android/rum/_RumInternalProxy$Companion;
public final fun addLongTask (JLjava/lang/String;)V
Expand All @@ -247,6 +254,7 @@ public final class com/datadog/android/rum/_RumInternalProxy {
public final class com/datadog/android/rum/_RumInternalProxy$Companion {
public final fun setAdditionalConfiguration (Lcom/datadog/android/rum/RumConfiguration$Builder;Ljava/util/Map;)Lcom/datadog/android/rum/RumConfiguration$Builder;
public final fun setComposeActionTrackingStrategy (Lcom/datadog/android/rum/RumConfiguration$Builder;Lcom/datadog/android/rum/tracking/ActionTrackingStrategy;)Lcom/datadog/android/rum/RumConfiguration$Builder;
public final fun setRumSessionTypeOverride (Lcom/datadog/android/rum/RumConfiguration$Builder;Lcom/datadog/android/rum/RumSessionType;)Lcom/datadog/android/rum/RumConfiguration$Builder;
public final fun setTelemetryConfigurationEventMapper (Lcom/datadog/android/rum/RumConfiguration$Builder;Lcom/datadog/android/event/EventMapper;)Lcom/datadog/android/rum/RumConfiguration$Builder;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ object Rum {
executorService = sdkCore.createSingleThreadExecutorService("rum-pipeline"),
initialResourceIdentifier = rumFeature.initialResourceIdentifier,
lastInteractionIdentifier = rumFeature.lastInteractionIdentifier,
slowFramesListener = rumFeature.slowFramesListener
slowFramesListener = rumFeature.slowFramesListener,
rumSessionTypeOverride = rumFeature.configuration.rumSessionTypeOverride
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,15 @@ data class RumConfiguration internal constructor(
rumConfig.copy(composeActionTrackingStrategy = composeActionTrackingStrategy)
return this
}

/**
* Set RUM session type that will be propagated to all RUM events and used regardless of
* whether the session is happening inside a synthetic test or not.
*/
internal fun setRumSessionTypeOverride(rumSessionTypeOverride: RumSessionType): Builder {
rumConfig = rumConfig.copy(rumSessionTypeOverride = rumSessionTypeOverride)
return this
}
// endregion
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2016-Present Datadog, Inc.
*/

package com.datadog.android.rum

import com.datadog.android.lint.InternalApi

/**
* Enum representing the RUM session type.
*/
@InternalApi
enum class RumSessionType {
SYNTHETICS,
USER
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,12 @@ class _RumInternalProxy internal constructor(private val rumMonitor: AdvancedRum
): Builder {
return builder.setComposeActionTrackingStrategy(composeActionTrackingStrategy)
}

fun setRumSessionTypeOverride(
builder: Builder,
rumSessionTypeOverride: RumSessionType
): Builder {
return builder.setRumSessionTypeOverride(rumSessionTypeOverride)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.datadog.android.internal.telemetry.InternalTelemetryEvent
import com.datadog.android.rum.GlobalRumMonitor
import com.datadog.android.rum.RumErrorSource
import com.datadog.android.rum.RumSessionListener
import com.datadog.android.rum.RumSessionType
import com.datadog.android.rum.configuration.SlowFramesConfiguration
import com.datadog.android.rum.configuration.VitalsUpdateFrequency
import com.datadog.android.rum.internal.anr.ANRDetectorRunnable
Expand Down Expand Up @@ -628,7 +629,8 @@ internal class RumFeature(
val slowFramesConfiguration: SlowFramesConfiguration?,
val composeActionTrackingStrategy: ActionTrackingStrategy,
val additionalConfig: Map<String, Any>,
val trackAnonymousUser: Boolean
val trackAnonymousUser: Boolean,
val rumSessionTypeOverride: RumSessionType?
)

internal companion object {
Expand Down Expand Up @@ -677,7 +679,8 @@ internal class RumFeature(
composeActionTrackingStrategy = NoOpActionTrackingStrategy(),
additionalConfig = emptyMap(),
trackAnonymousUser = true,
slowFramesConfiguration = null
slowFramesConfiguration = null,
rumSessionTypeOverride = null
)

internal const val EVENT_MESSAGE_PROPERTY = "message"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2016-Present Datadog, Inc.
*/

package com.datadog.android.rum.internal

import com.datadog.android.rum.RumSessionType
import com.datadog.android.rum.model.ActionEvent
import com.datadog.android.rum.model.ErrorEvent
import com.datadog.android.rum.model.LongTaskEvent
import com.datadog.android.rum.model.ResourceEvent
import com.datadog.android.rum.model.ViewEvent

internal fun RumSessionType.toAction(): ActionEvent.ActionEventSessionType {
return when (this) {
RumSessionType.SYNTHETICS -> ActionEvent.ActionEventSessionType.SYNTHETICS
RumSessionType.USER -> ActionEvent.ActionEventSessionType.USER
}
}

internal fun RumSessionType.toResource(): ResourceEvent.ResourceEventSessionType {
return when (this) {
RumSessionType.SYNTHETICS -> ResourceEvent.ResourceEventSessionType.SYNTHETICS
RumSessionType.USER -> ResourceEvent.ResourceEventSessionType.USER
}
}

internal fun RumSessionType.toError(): ErrorEvent.ErrorEventSessionType {
return when (this) {
RumSessionType.SYNTHETICS -> ErrorEvent.ErrorEventSessionType.SYNTHETICS
RumSessionType.USER -> ErrorEvent.ErrorEventSessionType.USER
}
}

internal fun RumSessionType.toView(): ViewEvent.ViewEventSessionType {
return when (this) {
RumSessionType.SYNTHETICS -> ViewEvent.ViewEventSessionType.SYNTHETICS
RumSessionType.USER -> ViewEvent.ViewEventSessionType.USER
}
}

internal fun RumSessionType.toLongTask(): LongTaskEvent.LongTaskEventSessionType {
return when (this) {
RumSessionType.SYNTHETICS -> LongTaskEvent.LongTaskEventSessionType.SYNTHETICS
RumSessionType.USER -> LongTaskEvent.LongTaskEventSessionType.USER
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ import com.datadog.android.api.storage.DataWriter
import com.datadog.android.core.InternalSdkCore
import com.datadog.android.rum.GlobalRumMonitor
import com.datadog.android.rum.RumActionType
import com.datadog.android.rum.RumSessionType
import com.datadog.android.rum.internal.FeaturesContextResolver
import com.datadog.android.rum.internal.domain.RumContext
import com.datadog.android.rum.internal.domain.Time
import com.datadog.android.rum.internal.monitor.StorageEvent
import com.datadog.android.rum.internal.toAction
import com.datadog.android.rum.internal.utils.hasUserData
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
import com.datadog.android.rum.model.ActionEvent
Expand All @@ -36,7 +38,8 @@ internal class RumActionScope(
maxDurationMs: Long = ACTION_MAX_DURATION_MS,
private val featuresContextResolver: FeaturesContextResolver = FeaturesContextResolver(),
private val trackFrustrations: Boolean,
internal val sampleRate: Float
internal val sampleRate: Float,
private val rumSessionTypeOverride: RumSessionType?
) : RumScope {

private val inactivityThresholdNs = TimeUnit.MILLISECONDS.toNanos(inactivityThresholdMs)
Expand Down Expand Up @@ -230,11 +233,13 @@ internal class RumActionScope(
resultId = rumContext.syntheticsResultId
)
}
val sessionType = if (syntheticsAttribute == null) {
ActionEvent.ActionEventSessionType.USER
} else {
ActionEvent.ActionEventSessionType.SYNTHETICS

val sessionType = when {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we have rumSessionType use it. If we are inside a synthetic test, use sessionType=SYNTHETICS, otherwise sessionType=USER

rumSessionTypeOverride != null -> rumSessionTypeOverride.toAction()
syntheticsAttribute == null -> ActionEvent.ActionEventSessionType.USER
else -> ActionEvent.ActionEventSessionType.SYNTHETICS
}

val frustrations = mutableListOf<ActionEvent.Type>()
if (trackFrustrations && eventErrorCount > 0 && actualType == RumActionType.TAP) {
frustrations.add(ActionEvent.Type.ERROR_TAP)
Expand Down Expand Up @@ -351,20 +356,22 @@ internal class RumActionScope(
timestampOffset: Long,
featuresContextResolver: FeaturesContextResolver,
trackFrustrations: Boolean,
sampleRate: Float
sampleRate: Float,
rumSessionTypeOverride: RumSessionType?
): RumScope {
return RumActionScope(
parentScope,
sdkCore,
event.waitForStop,
event.eventTime,
event.type,
event.name,
event.attributes,
timestampOffset,
parentScope = parentScope,
sdkCore = sdkCore,
waitForStop = event.waitForStop,
eventTime = event.eventTime,
initialType = event.type,
initialName = event.name,
initialAttributes = event.attributes,
serverTimeOffsetInMs = timestampOffset,
featuresContextResolver = featuresContextResolver,
trackFrustrations = trackFrustrations,
sampleRate = sampleRate
sampleRate = sampleRate,
rumSessionTypeOverride = rumSessionTypeOverride
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.datadog.android.core.InternalSdkCore
import com.datadog.android.core.internal.net.FirstPartyHostHeaderTypeResolver
import com.datadog.android.rum.DdRumContentProvider
import com.datadog.android.rum.RumSessionListener
import com.datadog.android.rum.RumSessionType
import com.datadog.android.rum.internal.domain.RumContext
import com.datadog.android.rum.internal.domain.Time
import com.datadog.android.rum.internal.metric.SessionMetricDispatcher
Expand All @@ -39,29 +40,31 @@ internal class RumApplicationScope(
private val sessionListener: RumSessionListener?,
internal val initialResourceIdentifier: InitialResourceIdentifier,
internal val lastInteractionIdentifier: LastInteractionIdentifier?,
private val slowFramesListener: SlowFramesListener?
private val slowFramesListener: SlowFramesListener?,
private val rumSessionTypeOverride: RumSessionType?
) : RumScope, RumViewChangedListener {

private var rumContext = RumContext(applicationId = applicationId)

internal val childScopes: MutableList<RumScope> = mutableListOf(
RumSessionScope(
this,
sdkCore,
sessionEndedMetricDispatcher,
sampleRate,
backgroundTrackingEnabled,
trackFrustrations,
this,
firstPartyHostHeaderTypeResolver,
cpuVitalMonitor,
memoryVitalMonitor,
frameRateVitalMonitor,
sessionListener,
false,
initialResourceIdentifier,
lastInteractionIdentifier,
slowFramesListener
parentScope = this,
sdkCore = sdkCore,
sessionEndedMetricDispatcher = sessionEndedMetricDispatcher,
sampleRate = sampleRate,
backgroundTrackingEnabled = backgroundTrackingEnabled,
trackFrustrations = trackFrustrations,
viewChangedListener = this,
firstPartyHostHeaderTypeResolver = firstPartyHostHeaderTypeResolver,
cpuVitalMonitor = cpuVitalMonitor,
memoryVitalMonitor = memoryVitalMonitor,
frameRateVitalMonitor = frameRateVitalMonitor,
sessionListener = sessionListener,
applicationDisplayed = false,
networkSettledResourceIdentifier = initialResourceIdentifier,
lastInteractionIdentifier = lastInteractionIdentifier,
slowFramesListener = slowFramesListener,
rumSessionTypeOverride = rumSessionTypeOverride
)
)

Expand Down Expand Up @@ -141,22 +144,23 @@ internal class RumApplicationScope(
@WorkerThread
private fun startNewSession(event: RumRawEvent, writer: DataWriter<Any>) {
val newSession = RumSessionScope(
this,
sdkCore,
sessionEndedMetricDispatcher,
sampleRate,
backgroundTrackingEnabled,
trackFrustrations,
this,
firstPartyHostHeaderTypeResolver,
cpuVitalMonitor,
memoryVitalMonitor,
frameRateVitalMonitor,
sessionListener,
true,
initialResourceIdentifier,
lastInteractionIdentifier,
slowFramesListener
parentScope = this,
sdkCore = sdkCore,
sessionEndedMetricDispatcher = sessionEndedMetricDispatcher,
sampleRate = sampleRate,
backgroundTrackingEnabled = backgroundTrackingEnabled,
trackFrustrations = trackFrustrations,
viewChangedListener = this,
firstPartyHostHeaderTypeResolver = firstPartyHostHeaderTypeResolver,
cpuVitalMonitor = cpuVitalMonitor,
memoryVitalMonitor = memoryVitalMonitor,
frameRateVitalMonitor = frameRateVitalMonitor,
sessionListener = sessionListener,
applicationDisplayed = true,
networkSettledResourceIdentifier = initialResourceIdentifier,
lastInteractionIdentifier = lastInteractionIdentifier,
slowFramesListener = slowFramesListener,
rumSessionTypeOverride = rumSessionTypeOverride
)
childScopes.add(newSession)
if (event !is RumRawEvent.StartView) {
Expand Down
Loading
Loading