Skip to content

Commit 0a877a0

Browse files
Merge pull request #781 from DataDog/carlosnogueira/RUM-1860/add-batch-public-config
[RUM-1860] Expose batch processing public configuration to react-native
2 parents 9b5285f + db1a6e4 commit 0a877a0

File tree

17 files changed

+249
-82
lines changed

17 files changed

+249
-82
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66

77
package com.datadog.reactnative
88

9+
import com.datadog.android.core.configuration.BatchProcessingLevel
910
import com.datadog.android.trace.TracingHeaderType
1011
import java.net.Proxy
1112

13+
14+
1215
/**
1316
* A configuration object to initialize Datadog's features.
1417
* @param clientToken A valid Datadog client token.
@@ -38,6 +41,7 @@ import java.net.Proxy
3841
* @param bundleLogsWithRum Enables RUM correlation with logs.
3942
* @param bundleLogsWithTraces Enables Traces correlation with logs.
4043
* @param trackNonFatalAnrs Enables tracking of non-fatal ANRs on Android.
44+
* @param batchProcessingLevel The preferred number of batches of data that will be sent in a single upload (can be 'LOW', 'MEDIUM' (default), 'HIGH')
4145
*/
4246
data class DdSdkConfiguration(
4347
val clientToken: String,
@@ -66,7 +70,8 @@ data class DdSdkConfiguration(
6670
val firstPartyHosts: Map<String, Set<TracingHeaderType>>? = null,
6771
val bundleLogsWithRum: Boolean? = null,
6872
val bundleLogsWithTraces: Boolean? = null,
69-
val trackNonFatalAnrs: Boolean? = null
73+
val trackNonFatalAnrs: Boolean? = null,
74+
val batchProcessingLevel: String? = null
7075
)
7176

7277
internal data class JSONConfigurationFile(
@@ -98,7 +103,8 @@ internal data class JSONDdSdkConfiguration(
98103
val firstPartyHosts: List<JSONFirstPartyHost>? = null,
99104
val bundleLogsWithRum: Boolean? = null,
100105
val bundleLogsWithTraces: Boolean? = null,
101-
val trackNonFatalAnrs: Boolean? = null
106+
val trackNonFatalAnrs: Boolean? = null,
107+
val batchProcessingLevel: String? = null
102108
)
103109

104110
internal data class JSONProxyConfiguration(

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration {
4747
firstPartyHosts = getArray("firstPartyHosts")?.asFirstPartyHosts(),
4848
bundleLogsWithRum = getBoolean("bundleLogsWithRum"),
4949
bundleLogsWithTraces = getBoolean("bundleLogsWithTraces"),
50-
trackNonFatalAnrs = getBooleanOrNull("trackNonFatalAnrs")
50+
trackNonFatalAnrs = getBooleanOrNull("trackNonFatalAnrs"),
51+
batchProcessingLevel = getString("batchProcessingLevel")
5152
)
5253
}
5354

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.datadog.android.DatadogSite
1313
import com.datadog.android.core.configuration.BatchSize
1414
import com.datadog.android.core.configuration.Configuration
1515
import com.datadog.android.core.configuration.UploadFrequency
16+
import com.datadog.android.core.configuration.BatchProcessingLevel
1617
import com.datadog.android.event.EventMapper
1718
import com.datadog.android.log.LogsConfiguration
1819
import com.datadog.android.privacy.TrackingConsent
@@ -251,6 +252,7 @@ class DdSdkNativeInitialization internal constructor(
251252
buildBatchSize(configuration.batchSize)
252253
)
253254

255+
254256
configuration.proxyConfig?.let { (proxy, authenticator) ->
255257
configBuilder.setProxy(proxy, authenticator)
256258
}
@@ -259,6 +261,8 @@ class DdSdkNativeInitialization internal constructor(
259261
configBuilder.setFirstPartyHostsWithHeaderType(configuration.firstPartyHosts)
260262
}
261263

264+
configBuilder.setBatchProcessingLevel(buildBatchProcessingLevel(configuration.batchProcessingLevel))
265+
262266
return configBuilder.build()
263267
}
264268

@@ -320,6 +324,16 @@ class DdSdkNativeInitialization internal constructor(
320324
}
321325
}
322326

327+
328+
private fun buildBatchProcessingLevel(batchProcessingLevel: String?): BatchProcessingLevel {
329+
return when (batchProcessingLevel?.lowercase(Locale.US)) {
330+
"low" -> BatchProcessingLevel.LOW
331+
"medium" -> BatchProcessingLevel.MEDIUM
332+
"high" -> BatchProcessingLevel.HIGH
333+
else -> BatchProcessingLevel.MEDIUM
334+
}
335+
}
336+
323337
internal fun getConfigurationFromJSONFile(): DdSdkConfiguration {
324338
try {
325339
val jsonString = jsonFileReader.parseAssetsJSONFile(appContext, "datadog-configuration.json")

packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.os.Looper
1111
import android.util.Log
1212
import android.view.Choreographer
1313
import com.datadog.android.DatadogSite
14+
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
@@ -1502,6 +1503,45 @@ internal class DdSdkTest {
15021503
}
15031504
}
15041505

1506+
@ParameterizedTest
1507+
@MethodSource("provideBatchProcessingLevel")
1508+
fun `𝕄 initialize native SDK 𝕎 initialize() {batch processing level}`(
1509+
input: String,
1510+
expectedBatchSize: BatchProcessingLevel,
1511+
@Forgery configuration: DdSdkConfiguration
1512+
) {
1513+
// Given
1514+
val bridgeConfiguration = configuration.copy(
1515+
batchProcessingLevel = input
1516+
)
1517+
val sdkConfigCaptor = argumentCaptor<Configuration>()
1518+
val rumConfigCaptor = argumentCaptor<RumConfiguration>()
1519+
val logsConfigCaptor = argumentCaptor<LogsConfiguration>()
1520+
val traceConfigCaptor = argumentCaptor<TraceConfiguration>()
1521+
1522+
// When
1523+
testedBridgeSdk.initialize(bridgeConfiguration.toReadableJavaOnlyMap(), mockPromise)
1524+
1525+
// Then
1526+
inOrder(mockDatadog) {
1527+
verify(mockDatadog).initialize(
1528+
same(mockContext),
1529+
sdkConfigCaptor.capture(),
1530+
any()
1531+
)
1532+
verify(mockDatadog).enableRum(rumConfigCaptor.capture())
1533+
verify(mockDatadog).enableTrace(traceConfigCaptor.capture())
1534+
verify(mockDatadog).enableLogs(logsConfigCaptor.capture())
1535+
}
1536+
assertThat(sdkConfigCaptor.firstValue)
1537+
.hasField("coreConfig") { coreConfig ->
1538+
coreConfig.hasFieldEqualTo(
1539+
"batchProcessingLevel",
1540+
expectedBatchSize
1541+
)
1542+
}
1543+
}
1544+
15051545
@Test
15061546
fun `𝕄 initialize native SDK 𝕎 initialize() {trackBackgroundEvents}`(
15071547
@Forgery configuration: DdSdkConfiguration,
@@ -2358,5 +2398,14 @@ internal class DdSdkTest {
23582398
Arguments.of("FREQUENT", UploadFrequency.FREQUENT)
23592399
)
23602400
}
2401+
2402+
@JvmStatic
2403+
fun provideBatchProcessingLevel(): Stream<Arguments?>? {
2404+
return Stream.of(
2405+
Arguments.of("LOW", BatchProcessingLevel.LOW),
2406+
Arguments.of("MEDIUM", BatchProcessingLevel.MEDIUM),
2407+
Arguments.of("HIGH", BatchProcessingLevel.HIGH)
2408+
)
2409+
}
23612410
}
23622411
}

packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.tools.unit
88

9+
import com.datadog.android.core.configuration.BatchProcessingLevel
910
import com.datadog.android.core.configuration.BatchSize
1011
import com.datadog.android.core.configuration.UploadFrequency
1112
import com.datadog.android.rum.configuration.VitalsUpdateFrequency
@@ -101,6 +102,12 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap {
101102

102103
trackNonFatalAnrs?.let { map.put("trackNonFatalAnrs", it) }
103104

105+
if (batchProcessingLevel != null) {
106+
map["batchProcessingLevel"] = batchProcessingLevel
107+
} else {
108+
map["batchProcessingLevel"] = BatchProcessingLevel.MEDIUM.toString()
109+
}
110+
104111
return map.toReadableMap()
105112
}
106113

packages/core/android/src/test/kotlin/com/datadog/tools/unit/forge/DdSdkConfigurationForgeryFactory.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,14 @@ class DdSdkConfigurationForgeryFactory : ForgeryFactory<DdSdkConfiguration> {
8080
firstPartyHosts = null,
8181
bundleLogsWithRum = forge.aBool(),
8282
bundleLogsWithTraces = forge.aBool(),
83-
trackNonFatalAnrs = forge.aBool()
83+
trackNonFatalAnrs = forge.aBool(),
84+
batchProcessingLevel = forge.aNullable {
85+
anElementFrom(
86+
"LOW",
87+
"MEDIUM",
88+
"HIGH"
89+
)
90+
}
8491
)
8592
}
8693
}

packages/core/ios/Sources/DdSdkConfiguration.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import DatadogRUM
4040
- bundleLogsWithTraces: Correlates logs with traces.
4141
- appHangThreshold: The threshold for non-fatal app hangs reporting in seconds.
4242
- trackWatchdogTerminations: Whether the SDK should track application termination by the watchdog
43+
- batchProcessingLevel: Maximum number of batches processed sequentially without a delay
4344
*/
4445
@objc(DdSdkConfiguration)
4546
public class DdSdkConfiguration: NSObject {
@@ -72,6 +73,7 @@ public class DdSdkConfiguration: NSObject {
7273
public var bundleLogsWithTraces: Bool
7374
public var appHangThreshold: Double? = nil
7475
public var trackWatchdogTerminations: Bool
76+
public var batchProcessingLevel: Datadog.Configuration.BatchProcessingLevel
7577

7678
public init(
7779
clientToken: String,
@@ -102,7 +104,8 @@ public class DdSdkConfiguration: NSObject {
102104
bundleLogsWithRum: Bool,
103105
bundleLogsWithTraces: Bool,
104106
appHangThreshold: Double?,
105-
trackWatchdogTerminations: Bool
107+
trackWatchdogTerminations: Bool,
108+
batchProcessingLevel: Datadog.Configuration.BatchProcessingLevel
106109
) {
107110
self.clientToken = clientToken
108111
self.env = env
@@ -133,6 +136,7 @@ public class DdSdkConfiguration: NSObject {
133136
self.bundleLogsWithTraces = bundleLogsWithTraces
134137
self.appHangThreshold = appHangThreshold
135138
self.trackWatchdogTerminations = trackWatchdogTerminations
139+
self.batchProcessingLevel = batchProcessingLevel
136140
}
137141
}
138142

packages/core/ios/Sources/DdSdkNativeInitialization.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ public class DdSdkNativeInitialization: NSObject {
9595
service: configuration.serviceName as? String,
9696
batchSize: configuration.batchSize,
9797
uploadFrequency: configuration.uploadFrequency,
98-
proxyConfiguration: configuration.proxyConfig
98+
proxyConfiguration: configuration.proxyConfig,
99+
batchProcessingLevel: configuration.batchProcessingLevel
99100
)
100101

101102
if var additionalConfiguration = configuration.additionalConfig as? [String: Any] {

packages/core/ios/Sources/RNDdSdkConfiguration.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ extension NSDictionary {
4141
let bundleLogsWithTraces = object(forKey: "bundleLogsWithTraces") as? Bool
4242
let appHangThreshold = object(forKey: "appHangThreshold") as? Double
4343
let trackWatchdogTerminations = object(forKey: "trackWatchdogTerminations") as? Bool
44+
let batchProcessingLevel = object(forKey: "batchProcessingLevel") as? NSString
4445

4546
return DdSdkConfiguration(
4647
clientToken: (clientToken != nil) ? clientToken! : String(),
@@ -71,7 +72,8 @@ extension NSDictionary {
7172
bundleLogsWithRum: bundleLogsWithRum ?? DefaultConfiguration.bundleLogsWithRum,
7273
bundleLogsWithTraces: bundleLogsWithTraces ?? DefaultConfiguration.bundleLogsWithTraces,
7374
appHangThreshold: appHangThreshold,
74-
trackWatchdogTerminations: trackWatchdogTerminations ?? DefaultConfiguration.trackWatchdogTerminations
75+
trackWatchdogTerminations: trackWatchdogTerminations ?? DefaultConfiguration.trackWatchdogTerminations,
76+
batchProcessingLevel: batchProcessingLevel.asBatchProcessingLevel()
7577
)
7678
}
7779

@@ -238,6 +240,7 @@ extension Dictionary where Key == String, Value == AnyObject {
238240
let bundleLogsWithTraces = configuration["bundleLogsWithTraces"] as? Bool
239241
let appHangThreshold = configuration["appHangThreshold"] as? Double
240242
let trackWatchdogTerminations = configuration["trackWatchdogTerminations"] as? Bool
243+
let batchProcessingLevel = configuration["batchProcessingLevel"] as? NSString
241244

242245
return DdSdkConfiguration(
243246
clientToken: clientToken ?? String(),
@@ -271,7 +274,8 @@ extension Dictionary where Key == String, Value == AnyObject {
271274
bundleLogsWithRum: bundleLogsWithRum ?? DefaultConfiguration.bundleLogsWithRum,
272275
bundleLogsWithTraces: bundleLogsWithTraces ?? DefaultConfiguration.bundleLogsWithTraces,
273276
appHangThreshold: appHangThreshold,
274-
trackWatchdogTerminations: trackWatchdogTerminations ?? DefaultConfiguration.trackWatchdogTerminations
277+
trackWatchdogTerminations: trackWatchdogTerminations ?? DefaultConfiguration.trackWatchdogTerminations,
278+
batchProcessingLevel: batchProcessingLevel.asBatchProcessingLevel()
275279
)
276280
}
277281
}
@@ -349,4 +353,17 @@ extension NSString? {
349353
return .us1
350354
}
351355
}
356+
357+
func asBatchProcessingLevel() -> Datadog.Configuration.BatchProcessingLevel {
358+
switch self?.lowercased {
359+
case "low":
360+
return .low
361+
case "medium":
362+
return .medium
363+
case "high":
364+
return .high
365+
default:
366+
return .medium
367+
}
368+
}
352369
}

0 commit comments

Comments
 (0)