Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RUM-449: Enable RUM and Traces for Logs #601

Closed
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ object DatadogSDKWrapperStorage {
}

internal class DatadogSDKWrapper : DatadogWrapper {
override var bundleLogsWithRum = BUNDLE_LOGS_WITH_RUM_DEFAULT
override var bundleLogsWithTraces = BUNDLE_LOGS_WITH_TRACES_DEFAULT

// We use Kotlin backing field here to initialize once the telemetry proxy
// and make sure it is only after SDK is initialized.
Expand Down Expand Up @@ -166,5 +168,10 @@ internal class DatadogSDKWrapper : DatadogWrapper {
override fun clearAllData() {
return Datadog.clearAllData(DatadogSDKWrapperStorage.getSdkCore())
}

internal companion object {
internal const val BUNDLE_LOGS_WITH_RUM_DEFAULT = true
internal const val BUNDLE_LOGS_WITH_TRACES_DEFAULT = true
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import android.content.Context
import com.datadog.android.core.configuration.Configuration
import com.datadog.android.log.LogsConfiguration
import com.datadog.android.privacy.TrackingConsent
import com.datadog.android.rum.GlobalRumMonitor
import com.datadog.android.rum.RumConfiguration
import com.datadog.android.rum.RumMonitor
import com.datadog.android.trace.TraceConfiguration
Expand All @@ -21,6 +20,17 @@ import java.lang.IllegalArgumentException
*/
@Suppress("ComplexInterface", "TooManyFunctions")
interface DatadogWrapper {
/**
* Enables RUM for logs.
* By default, RUM is enabled for logs.
*/
var bundleLogsWithRum : Boolean

/**
* Enables Traces for logs.
* By default, Traces is enabled for logs.
*/
var bundleLogsWithTraces : Boolean

/**
* Sets the verbosity of the Datadog library.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ package com.datadog.reactnative

import android.util.Log as AndroidLog
import com.datadog.android.log.Logger
import com.datadog.reactnative.DatadogSDKWrapper.Companion.BUNDLE_LOGS_WITH_RUM_DEFAULT
import com.datadog.reactnative.DatadogSDKWrapper.Companion.BUNDLE_LOGS_WITH_TRACES_DEFAULT
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReadableMap

Expand All @@ -19,8 +21,15 @@ class DdLogsImplementation(
private val datadog: DatadogWrapper = DatadogSDKWrapper()
) {
private val reactNativeLogger: Logger by lazy {
val bundleLogsWithRum = (datadog as? DatadogSDKWrapper)?.bundleLogsWithRum
?: BUNDLE_LOGS_WITH_RUM_DEFAULT
val bundleLogsWithTraces = (datadog as? DatadogSDKWrapper)?.bundleLogsWithTraces
?: BUNDLE_LOGS_WITH_TRACES_DEFAULT

logger ?: Logger.Builder(DatadogSDKWrapperStorage.getSdkCore())
.setLogcatLogsEnabled(true)
.setBundleWithRumEnabled(bundleLogsWithRum)
.setBundleWithTraceEnabled(bundleLogsWithTraces)
.setName("DdLogs")
.build()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy
import com.datadog.android.telemetry.model.TelemetryConfigurationEvent
import com.datadog.android.trace.TraceConfiguration
import com.datadog.android.trace.TracingHeaderType
import com.datadog.reactnative.DatadogSDKWrapper.Companion.BUNDLE_LOGS_WITH_RUM_DEFAULT
import com.datadog.reactnative.DatadogSDKWrapper.Companion.BUNDLE_LOGS_WITH_TRACES_DEFAULT
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReadableArray
Expand Down Expand Up @@ -61,6 +63,7 @@ class DdSdkImplementation(
val trackingConsent = buildTrackingConsent(ddSdkConfiguration.trackingConsent)

configureSdkVerbosity(ddSdkConfiguration)
configureRumAndTracesForLogs(ddSdkConfiguration)

datadog.initialize(appContext, sdkConfiguration, trackingConsent)

Expand Down Expand Up @@ -169,6 +172,18 @@ class DdSdkImplementation(
}
}

private fun configureRumAndTracesForLogs(configuration: DdSdkConfiguration) {
val rumForLogsEnabled =
configuration.additionalConfig?.get(DD_ENABLE_RUM_FOR_LOGS) as? Boolean
?: BUNDLE_LOGS_WITH_RUM_DEFAULT
val tracesForLogsEnabled =
configuration.additionalConfig?.get(DD_ENABLE_TRACES_FOR_LOGS) as? Boolean
?: BUNDLE_LOGS_WITH_TRACES_DEFAULT

datadog.bundleLogsWithRum = rumForLogsEnabled
datadog.bundleLogsWithTraces = tracesForLogsEnabled
}

private fun getDefaultAppVersion(): String {
val packageName = appContext.packageName
val packageInfo =
Expand Down Expand Up @@ -397,7 +412,7 @@ class DdSdkImplementation(
Log.w(
DdSdk::class.java.canonicalName,
"Unknown consent given: $trackingConsent, " +
"using ${TrackingConsent.PENDING} as default"
"using ${TrackingConsent.PENDING} as default"
)
TrackingConsent.PENDING
}
Expand Down Expand Up @@ -515,7 +530,7 @@ class DdSdkImplementation(
): ((Double) -> Unit)? {
val jsRefreshRateMonitoringEnabled =
buildVitalUpdateFrequency(ddSdkConfiguration.vitalsUpdateFrequency) !=
VitalsUpdateFrequency.NEVER
VitalsUpdateFrequency.NEVER
val jsLongTasksMonitoringEnabled = ddSdkConfiguration.longTaskThresholdMs != 0.0

if (!jsLongTasksMonitoringEnabled && !jsRefreshRateMonitoringEnabled) {
Expand All @@ -531,8 +546,8 @@ class DdSdkImplementation(
if (jsLongTasksMonitoringEnabled &&
it >
TimeUnit.MILLISECONDS.toNanos(
ddSdkConfiguration.longTaskThresholdMs?.toLong() ?: 0L
)
ddSdkConfiguration.longTaskThresholdMs?.toLong() ?: 0L
)
) {
datadog.getRumMonitor()._getInternal()?.addLongTask(it.toLong(), "javascript")
}
Expand All @@ -546,6 +561,8 @@ class DdSdkImplementation(
internal const val DD_NATIVE_VIEW_TRACKING = "_dd.native_view_tracking"
internal const val DD_NATIVE_INTERACTION_TRACKING = "_dd.native_interaction_tracking"
internal const val DD_SDK_VERBOSITY = "_dd.sdk_verbosity"
internal const val DD_ENABLE_RUM_FOR_LOGS = "_dd.enable_rum_for_logs"
internal const val DD_ENABLE_TRACES_FOR_LOGS = "_dd.enable_traces_for_logs"
internal const val DD_SERVICE_NAME = "_dd.service_name"
internal const val DD_FIRST_PARTY_HOSTS = "_dd.first_party_hosts"
internal const val DD_VERSION = "_dd.version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ import com.facebook.react.module.model.ReactModuleInfoProvider
* Package of native dd-sdk-reactnative native modules.
*/
class DdSdkReactNativePackage : TurboReactPackage() {
private val sdkWrapper = DatadogSDKWrapper()

override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
return when (name) {
DdSdkImplementation.NAME -> DdSdk(reactContext)
DdRumImplementation.NAME -> DdRum(reactContext)
DdSdkImplementation.NAME -> DdSdk(reactContext, sdkWrapper)
DdRumImplementation.NAME -> DdRum(reactContext, sdkWrapper)
DdTraceImplementation.NAME -> DdTrace(reactContext)
DdLogsImplementation.NAME -> DdLogs(reactContext)
DdLogsImplementation.NAME -> DdLogs(reactContext, sdkWrapper)
else -> null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ import com.facebook.react.bridge.ReadableMap
* The entry point to use Datadog's Logs feature.
*/
class DdLogs(
reactContext: ReactApplicationContext
reactContext: ReactApplicationContext,
datadogWrapper: DatadogWrapper
) : ReactContextBaseJavaModule(reactContext) {

private val implementation = DdLogsImplementation()
private val implementation = DdLogsImplementation(datadog = datadogWrapper)

override fun getName(): String = DdLogsImplementation.NAME

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ import com.facebook.react.bridge.ReadableMap
* The entry point to use Datadog's RUM feature.
*/
@Suppress("TooManyFunctions")
class DdRum(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
class DdRum(
reactContext: ReactApplicationContext,
datadogWrapper: DatadogWrapper
) : ReactContextBaseJavaModule(reactContext) {

private val implementation = DdRumImplementation()
private val implementation = DdRumImplementation(datadog = datadogWrapper)

override fun getName(): String = DdRumImplementation.NAME

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ import com.facebook.react.bridge.ReadableMap

/** The entry point to initialize Datadog's features. */
class DdSdk(
reactContext: ReactApplicationContext
reactContext: ReactApplicationContext,
datadogWrapper: DatadogWrapper = DatadogSDKWrapper()
) : ReactContextBaseJavaModule(reactContext) {

private val implementation = DdSdkImplementation(reactContext)
private val implementation = DdSdkImplementation(reactContext, datadog = datadogWrapper)

override fun getName(): String = DdSdkImplementation.NAME

Expand Down
13 changes: 12 additions & 1 deletion packages/core/src/DdSdkReactNative.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ export class DdSdkReactNative {
'_dd.native_interaction_tracking';
private static readonly DD_VERSION = '_dd.version';
private static readonly DD_VERSION_SUFFIX = '_dd.version_suffix';
private static readonly DD_ENABLE_RUM_FOR_LOGS = '_dd.enable_rum_for_logs';
private static readonly DD_ENABLE_TRACES_FOR_LOGS =
'_dd.enable_traces_for_logs';

// Proxy
private static readonly DD_PROXY_TYPE_KEY = '_dd.proxy.type';
Expand Down Expand Up @@ -133,7 +136,9 @@ export class DdSdkReactNative {
.version,
// eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
reactVersion: require('react/package.json').version
}
},
configuration.bundleLogsWithRum,
configuration.bundleLogsWithTraces
Comment on lines +140 to +141
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we also need to pass the data here since we seem to get it from the additionalConfig field anyway?

)
);
InternalLog.log('Datadog SDK was initialized', SdkVerbosity.INFO);
Expand Down Expand Up @@ -267,6 +272,12 @@ export class DdSdkReactNative {
configuration.additionalConfig[
DdSdkReactNative.DD_NATIVE_INTERACTION_TRACKING_KEY
] = configuration.nativeInteractionTracking;
configuration.additionalConfig[
DdSdkReactNative.DD_ENABLE_RUM_FOR_LOGS
] = configuration.bundleLogsWithRum;
configuration.additionalConfig[
DdSdkReactNative.DD_ENABLE_TRACES_FOR_LOGS
] = configuration.bundleLogsWithTraces;

if (configuration.verbosity) {
configuration.additionalConfig[
Expand Down
18 changes: 17 additions & 1 deletion packages/core/src/DdSdkReactNativeConfiguration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,9 @@ const DEFAULTS = {
uploadFrequency: UploadFrequency.AVERAGE,
batchSize: BatchSize.MEDIUM,
trackBackgroundEvents: false,
getCustomEndpoints: () => ({})
getCustomEndpoints: () => ({}),
bundleLogsWithRum: true,
bundleLogsWithTraces: true
};

/**
Expand Down Expand Up @@ -250,6 +252,18 @@ export class DdSdkReactNativeConfiguration {
*/
public trackBackgroundEvents: boolean = DEFAULTS.trackBackgroundEvents;

/**
* Enables RUM for logs.
* By default, RUM is enabled for logs.
*/
public bundleLogsWithRum: boolean = DEFAULTS.bundleLogsWithRum;

/**
* Enables Traces for logs.
* By default, Traces is enabled for logs.
*/
public bundleLogsWithTraces: boolean = DEFAULTS.bundleLogsWithTraces;

/**
* Specifies a custom prop to name RUM actions on elements having an `onPress` prop.
*
Expand Down Expand Up @@ -383,6 +397,8 @@ export type PartialInitializationConfiguration = {
readonly batchSize?: BatchSize;
readonly trackBackgroundEvents?: boolean;
readonly customEndpoints?: CustomEndpoints;
readonly bundleLogsWithRum?: boolean;
readonly bundleLogsWithTraces?: boolean;
};

const setConfigurationAttribute = <
Expand Down
Loading
Loading