Skip to content

Commit 7ee07d3

Browse files
Merge pull request #978 from DataDog/sbarrio/RUM-11204/use-core-sdk-native-instance-on-android
[RUM 11204] [Modularization] Use native SDK's core instance instead of DatadogSdkWrapperStorage's
2 parents 7d3677b + 34560c2 commit 7ee07d3

14 files changed

Lines changed: 1832 additions & 1180 deletions

File tree

packages/core/android/src/main/kotlin/com/datadog/reactnative/DatadogSDKWrapper.kt

Lines changed: 4 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,14 @@
77
package com.datadog.reactnative
88

99
import android.content.Context
10-
import android.util.Log
1110
import com.datadog.android.Datadog
12-
import com.datadog.android._InternalProxy
1311
import com.datadog.android.api.InternalLogger
14-
import com.datadog.android.api.SdkCore
1512
import com.datadog.android.api.feature.FeatureSdkCore
1613
import com.datadog.android.core.InternalSdkCore
1714
import com.datadog.android.core.configuration.Configuration
18-
import com.datadog.android.log.Logs
19-
import com.datadog.android.log.LogsConfiguration
2015
import com.datadog.android.privacy.TrackingConsent
2116
import com.datadog.android.rum.GlobalRumMonitor
22-
import com.datadog.android.rum.Rum
23-
import com.datadog.android.rum.RumConfiguration
2417
import com.datadog.android.rum.RumMonitor
25-
import com.datadog.android.trace.Trace
26-
import com.datadog.android.trace.TraceConfiguration
2718
import com.datadog.android.webview.WebViewTracking
2819
import com.facebook.react.bridge.ReadableMap
2920

@@ -49,50 +40,18 @@ object DatadogSDKWrapperStorage {
4940
listener(ddCore)
5041
}
5142
}
52-
53-
/**
54-
* Sets instance of core SDK to be used to initialize features.
55-
*/
56-
fun setSdkCore(core: InternalSdkCore?) {
57-
this.core = core
58-
}
59-
60-
/**
61-
* Returns the core set by setSdkCore or the default core instance by default.
62-
*/
63-
fun getSdkCore(): SdkCore {
64-
core?.let {
65-
return it
66-
}
67-
Log.d(
68-
DatadogSDKWrapperStorage::class.java.canonicalName,
69-
"SdkCore was not set in DatadogSDKWrapperStorage, using default instance."
70-
)
71-
return Datadog.getInstance()
72-
}
7343
}
7444

7545
internal class DatadogSDKWrapper : DatadogWrapper {
7646
override var bundleLogsWithRum = DefaultConfiguration.bundleLogsWithRum
7747
override var bundleLogsWithTraces = DefaultConfiguration.bundleLogsWithTraces
7848

79-
// We use Kotlin backing field here to initialize once the telemetry proxy
80-
// and make sure it is only after SDK is initialized.
81-
private var telemetryProxy: _InternalProxy._TelemetryProxy? = null
82-
get() {
83-
if (field == null && isInitialized()) {
84-
field = Datadog._internalProxy()._telemetry
85-
}
86-
87-
return field
88-
}
89-
9049
// We use Kotlin backing field here to initialize once the telemetry proxy
9150
// and make sure it is only after SDK is initialized.
9251
private var webViewProxy: WebViewTracking._InternalWebViewProxy? = null
9352
get() {
9453
if (field == null && isInitialized()) {
95-
field = WebViewTracking._InternalWebViewProxy(DatadogSDKWrapperStorage.getSdkCore())
54+
field = WebViewTracking._InternalWebViewProxy(Datadog.getInstance())
9655
}
9756

9857
return field
@@ -108,20 +67,7 @@ internal class DatadogSDKWrapper : DatadogWrapper {
10867
consent: TrackingConsent
10968
) {
11069
val core = Datadog.initialize(context, configuration, consent)
111-
DatadogSDKWrapperStorage.setSdkCore(core as InternalSdkCore)
112-
DatadogSDKWrapperStorage.notifyOnInitializedListeners(core)
113-
}
114-
115-
override fun enableRum(configuration: RumConfiguration) {
116-
Rum.enable(configuration, DatadogSDKWrapperStorage.getSdkCore())
117-
}
118-
119-
override fun enableLogs(configuration: LogsConfiguration) {
120-
Logs.enable(configuration, DatadogSDKWrapperStorage.getSdkCore())
121-
}
122-
123-
override fun enableTrace(configuration: TraceConfiguration) {
124-
Trace.enable(configuration, DatadogSDKWrapperStorage.getSdkCore())
70+
DatadogSDKWrapperStorage.notifyOnInitializedListeners(core as InternalSdkCore)
12571
}
12672

12773
@Deprecated("Use setUserInfo instead; the user ID is now required.")
@@ -160,34 +106,6 @@ internal class DatadogSDKWrapper : DatadogWrapper {
160106
Datadog.setTrackingConsent(trackingConsent)
161107
}
162108

163-
override fun sendTelemetryLog(message: String, attributes: ReadableMap, config: ReadableMap) {
164-
val core = DatadogSDKWrapperStorage.getSdkCore() as FeatureSdkCore?
165-
val logger = core?.internalLogger;
166-
167-
val additionalProperties = attributes.toMap()
168-
val telemetryConfig = config.toMap()
169-
170-
logger?.log(
171-
level = InternalLogger.Level.INFO,
172-
target = InternalLogger.Target.TELEMETRY,
173-
messageBuilder = { message },
174-
onlyOnce = (telemetryConfig["onlyOnce"] as? Boolean) ?: true,
175-
additionalProperties = additionalProperties
176-
)
177-
}
178-
179-
override fun telemetryDebug(message: String) {
180-
telemetryProxy?.debug(message)
181-
}
182-
183-
override fun telemetryError(message: String, stack: String?, kind: String?) {
184-
telemetryProxy?.error(message, stack, kind)
185-
}
186-
187-
override fun telemetryError(message: String, throwable: Throwable?) {
188-
telemetryProxy?.error(message, throwable)
189-
}
190-
191109
override fun consumeWebviewEvent(message: String) {
192110
webViewProxy?.consumeWebviewEvent(message)
193111
}
@@ -197,11 +115,11 @@ internal class DatadogSDKWrapper : DatadogWrapper {
197115
}
198116

199117
override fun getRumMonitor(): RumMonitor {
200-
return GlobalRumMonitor.get(DatadogSDKWrapperStorage.getSdkCore())
118+
return GlobalRumMonitor.get(Datadog.getInstance())
201119
}
202120

203121
override fun clearAllData() {
204-
return Datadog.clearAllData(DatadogSDKWrapperStorage.getSdkCore())
122+
return Datadog.clearAllData(Datadog.getInstance())
205123
}
206124
}
207125

packages/core/android/src/main/kotlin/com/datadog/reactnative/DatadogWrapper.kt

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import com.facebook.react.bridge.ReadableMap
1818
import java.lang.IllegalArgumentException
1919

2020
/**
21-
* Wrapper around [Datadog].
21+
* Wrapper around [com.datadog.android.Datadog].
2222
*/
2323
@Suppress("ComplexInterface", "TooManyFunctions")
2424
interface DatadogWrapper {
@@ -49,10 +49,8 @@ interface DatadogWrapper {
4949
/**
5050
* Initializes the Datadog SDK.
5151
* @param context your application context
52-
* @param credentials your organization credentials
5352
* @param configuration the configuration for the SDK library
54-
* @param trackingConsent as the initial state of the tracking consent flag.
55-
* @see [Credentials]
53+
* @param consent as the initial state of the tracking consent flag.
5654
* @see [Configuration]
5755
* @see [TrackingConsent]
5856
* @throws IllegalArgumentException if the env name is using illegal characters and your
@@ -64,33 +62,6 @@ interface DatadogWrapper {
6462
consent: TrackingConsent
6563
)
6664

67-
/**
68-
* Enables the RUM feature of the SDK.
69-
*
70-
* @param configuration the configuration for the RUM feature
71-
*/
72-
fun enableRum(
73-
configuration: RumConfiguration
74-
)
75-
76-
/**
77-
* Enables the Logs feature of the SDK.
78-
*
79-
* @param configuration the configuration for the Logs feature
80-
*/
81-
fun enableLogs(
82-
configuration: LogsConfiguration
83-
)
84-
85-
/**
86-
* Enables the Trace feature of the SDK.
87-
*
88-
* @param configuration the configuration for the Trace feature
89-
*/
90-
fun enableTrace(
91-
configuration: TraceConfiguration
92-
)
93-
9465
/**
9566
* Sets the user information.
9667
*
@@ -126,7 +97,7 @@ interface DatadogWrapper {
12697

12798
/**
12899
* Sets the user information.
129-
* @param extraUserInfo: The additional information. (To set the id, name or email please user setUserInfo).
100+
* @param extraInfo: The additional information. (To set the id, name or email please user setUserInfo).
130101
*/
131102
fun addUserExtraInfo(
132103
extraInfo: Map<String, Any?>
@@ -144,27 +115,6 @@ interface DatadogWrapper {
144115
*/
145116
fun setTrackingConsent(trackingConsent: TrackingConsent)
146117

147-
148-
/**
149-
* Sends telemetry event with attributes.
150-
*/
151-
fun sendTelemetryLog(message: String, attributes: ReadableMap, config: ReadableMap)
152-
153-
/**
154-
* Sends telemetry debug event.
155-
*/
156-
fun telemetryDebug(message: String)
157-
158-
/**
159-
* Sends telemetry error.
160-
*/
161-
fun telemetryError(message: String, stack: String?, kind: String?)
162-
163-
/**
164-
* Sends telemetry error.
165-
*/
166-
fun telemetryError(message: String, throwable: Throwable?)
167-
168118
/**
169119
* Sends Webview events.
170120
*/

packages/core/android/src/main/kotlin/com/datadog/reactnative/DdLogsImplementation.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.datadog.reactnative
88

99
import android.util.Log as AndroidLog
10+
import com.datadog.android.Datadog
1011
import com.datadog.android.log.Logger
1112
import com.facebook.react.bridge.Promise
1213
import com.facebook.react.bridge.ReadableMap
@@ -22,7 +23,7 @@ class DdLogsImplementation(
2223
val bundleLogsWithRum = datadog.bundleLogsWithRum
2324
val bundleLogsWithTraces = datadog.bundleLogsWithTraces
2425

25-
logger ?: Logger.Builder(DatadogSDKWrapperStorage.getSdkCore())
26+
logger ?: Logger.Builder(Datadog.getInstance())
2627
.setLogcatLogsEnabled(true)
2728
.setBundleWithRumEnabled(bundleLogsWithRum)
2829
.setBundleWithTraceEnabled(bundleLogsWithTraces)

packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkImplementation.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean
2424
class DdSdkImplementation(
2525
private val reactContext: ReactApplicationContext,
2626
private val datadog: DatadogWrapper = DatadogSDKWrapper(),
27+
private val ddTelemetry: DdTelemetry = DdTelemetry(),
2728
private val uiThreadExecutor: UiThreadExecutor = ReactUiThreadExecutor()
2829
) {
2930
internal val appContext: Context = reactContext.applicationContext
@@ -39,7 +40,7 @@ class DdSdkImplementation(
3940
fun initialize(configuration: ReadableMap, promise: Promise) {
4041
val ddSdkConfiguration = configuration.asDdSdkConfiguration()
4142

42-
val nativeInitialization = DdSdkNativeInitialization(appContext, datadog)
43+
val nativeInitialization = DdSdkNativeInitialization(appContext, datadog, ddTelemetry)
4344
nativeInitialization.initialize(ddSdkConfiguration)
4445

4546
this.frameRateProvider = createFrameRateProvider(ddSdkConfiguration)
@@ -145,7 +146,7 @@ class DdSdkImplementation(
145146
* @param config Configuration object, can take 'onlyOnce: Boolean'
146147
*/
147148
fun sendTelemetryLog(message: String, attributes: ReadableMap, config: ReadableMap, promise: Promise) {
148-
datadog.sendTelemetryLog(message, attributes, config)
149+
ddTelemetry.sendTelemetryLog(message, attributes, config)
149150
promise.resolve(null)
150151
}
151152

@@ -154,7 +155,7 @@ class DdSdkImplementation(
154155
* @param message Debug message.
155156
*/
156157
fun telemetryDebug(message: String, promise: Promise) {
157-
datadog.telemetryDebug(message)
158+
ddTelemetry.telemetryDebug(message)
158159
promise.resolve(null)
159160
}
160161

@@ -165,7 +166,7 @@ class DdSdkImplementation(
165166
* @param kind Error kind.
166167
*/
167168
fun telemetryError(message: String, stack: String, kind: String, promise: Promise) {
168-
datadog.telemetryError(message, stack, kind)
169+
ddTelemetry.telemetryError(message, stack, kind)
169170
promise.resolve(null)
170171
}
171172

packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ package com.datadog.reactnative
99
import android.content.Context
1010
import android.content.pm.PackageManager
1111
import android.util.Log
12+
import com.datadog.android.Datadog
1213
import com.datadog.android.DatadogSite
1314
import com.datadog.android.core.configuration.BatchProcessingLevel
1415
import com.datadog.android.core.configuration.BatchSize
1516
import com.datadog.android.core.configuration.Configuration
1617
import com.datadog.android.core.configuration.UploadFrequency
1718
import com.datadog.android.event.EventMapper
19+
import com.datadog.android.log.Logs
1820
import com.datadog.android.log.LogsConfiguration
1921
import com.datadog.android.privacy.TrackingConsent
22+
import com.datadog.android.rum.Rum
2023
import com.datadog.android.rum.RumConfiguration
2124
import com.datadog.android.rum._RumInternalProxy
2225
import com.datadog.android.rum.configuration.VitalsUpdateFrequency
@@ -25,6 +28,7 @@ import com.datadog.android.rum.model.ActionEvent
2528
import com.datadog.android.rum.model.ResourceEvent
2629
import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy
2730
import com.datadog.android.telemetry.model.TelemetryConfigurationEvent
31+
import com.datadog.android.trace.Trace
2832
import com.datadog.android.trace.TraceConfiguration
2933
import com.google.gson.Gson
3034
import java.util.Locale
@@ -37,6 +41,7 @@ import kotlin.time.Duration.Companion.seconds
3741
class DdSdkNativeInitialization internal constructor(
3842
private val appContext: Context,
3943
private val datadog: DatadogWrapper = DatadogSDKWrapper(),
44+
private val ddTelemetry: DdTelemetry = DdTelemetry(),
4045
private val jsonFileReader: JSONFileReader = JSONFileReader()
4146
) {
4247
internal fun initialize(ddSdkConfiguration: DdSdkConfiguration) {
@@ -59,11 +64,9 @@ class DdSdkNativeInitialization internal constructor(
5964

6065
datadog.initialize(appContext, sdkConfiguration, trackingConsent)
6166

62-
datadog.enableRum(rumConfiguration)
63-
64-
datadog.enableTrace(traceConfiguration)
65-
66-
datadog.enableLogs(logsConfiguration)
67+
Rum.enable(rumConfiguration, Datadog.getInstance())
68+
Logs.enable(logsConfiguration, Datadog.getInstance())
69+
Trace.enable(traceConfiguration, Datadog.getInstance())
6770
}
6871

6972
private fun configureRumAndTracesForLogs(configuration: DdSdkConfiguration) {
@@ -95,7 +98,7 @@ class DdSdkNativeInitialization internal constructor(
9598
try {
9699
appContext.packageManager.getPackageInfo(packageName, 0)
97100
} catch (e: PackageManager.NameNotFoundException) {
98-
datadog.telemetryError(e.message ?: DdSdkImplementation.PACKAGE_INFO_NOT_FOUND_ERROR_MESSAGE, e)
101+
ddTelemetry.telemetryError(e.message ?: DdSdkImplementation.PACKAGE_INFO_NOT_FOUND_ERROR_MESSAGE, e)
99102
return DdSdkImplementation.DEFAULT_APP_VERSION
100103
}
101104

packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkReactNativePackage.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import com.facebook.react.module.model.ReactModuleInfoProvider
1818
*/
1919
class DdSdkReactNativePackage : TurboReactPackage() {
2020
private val sdkWrapper = DatadogSDKWrapper()
21+
private val ddTelemetry = DdTelemetry()
2122
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
2223
return when (name) {
23-
DdSdkImplementation.NAME -> DdSdk(reactContext, sdkWrapper)
24+
DdSdkImplementation.NAME -> DdSdk(reactContext, sdkWrapper, ddTelemetry)
2425
DdRumImplementation.NAME -> DdRum(reactContext, sdkWrapper)
2526
DdTraceImplementation.NAME -> DdTrace(reactContext)
2627
DdLogsImplementation.NAME -> DdLogs(reactContext, sdkWrapper)

0 commit comments

Comments
 (0)