From 7d5e421b600362d61a9512ee3c9cfa872785a8cf Mon Sep 17 00:00:00 2001 From: Barbora Plasovska Date: Tue, 7 Jul 2026 15:11:25 +0200 Subject: [PATCH 1/5] RUM-17173 Add timeseries configuration support for memory and CPU RUM metrics --- .../datadog/reactnative/DdSdkConfiguration.kt | 33 +++++- .../reactnative/DdSdkConfigurationExt.kt | 35 +++++- .../reactnative/DdSdkNativeInitialization.kt | 24 +++++ .../DdSdkNativeInitializationTest.kt | 3 + .../com/datadog/reactnative/DdSdkTest.kt | 100 ++++++++++++++++++ .../input/complete-configuration.json | 4 + .../core/datadog-configuration.schema.json | 29 +++++ .../core/ios/Sources/DdSdkConfiguration.swift | 11 +- .../Sources/DdSdkNativeInitialization.swift | 6 +- .../ios/Sources/RNDdSdkConfiguration.swift | 25 ++++- .../DdSdkNativeInitializationTests.swift | 4 + packages/core/ios/Tests/DdSdkTests.swift | 33 +++++- .../Fixtures/complete-configuration.json | 4 + .../DdSdkReactNativeConfiguration.test.ts | 3 + .../core/src/config/FileBasedConfiguration.ts | 3 +- .../src/config/FileBasedConfiguration.type.ts | 2 + .../__tests__/FileBasedConfiguration.test.ts | 6 ++ .../configuration-all-fields.json | 6 +- .../src/config/features/RumConfiguration.ts | 5 + .../config/features/RumConfiguration.type.ts | 8 +- .../config/features/RumConfigurationNative.ts | 3 + .../config/types/TimeseriesConfiguration.ts | 40 +++++++ packages/core/src/config/types/index.ts | 1 + 23 files changed, 376 insertions(+), 12 deletions(-) create mode 100644 packages/core/src/config/types/TimeseriesConfiguration.ts diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt index 50a3ae377..a03ce2d96 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt @@ -65,6 +65,7 @@ data class DdSdkConfiguration( * @param initialResourceThreshold The amount of time after a view starts where a Resource should be considered when calculating Time to Network-Settled (TNS). * @param telemetrySampleRate The sample rate (between 0 and 100) of telemetry events. * @param customEndpoint Custom RUM intake endpoint used to override the default Datadog intake. + * @param timeseries Experimental: configuration for memory and CPU timeseries collection. */ data class RumConfiguration( val applicationId: String, @@ -82,7 +83,26 @@ data class RumConfiguration( val trackNonFatalAnrs: Boolean? = null, val initialResourceThreshold: Double? = null, val telemetrySampleRate: Double? = null, - val customEndpoint: String? = null + val customEndpoint: String? = null, + val timeseries: TimeseriesConfiguration? = null +) + +/** + * Experimental: configuration for memory and CPU timeseries collection. + * Requires a native SDK build with timeseries support. + * + * @param enabled Enables collection of memory and CPU timeseries events. + * @param bufferSize The number of samples collected before a timeseries batch is flushed. + * @param intervalMs The sampling interval in milliseconds. + * @param collectInBackground Whether to keep sampling timeseries when the app is in background. + * @param useDeltaCompression Whether to encode each sample as a delta from the previous value instead of an absolute value. + */ +data class TimeseriesConfiguration( + val enabled: Boolean, + val bufferSize: Double? = null, + val intervalMs: Double? = null, + val collectInBackground: Boolean? = null, + val useDeltaCompression: Boolean? = null ) /** @@ -157,7 +177,16 @@ internal data class JSONRumConfiguration( val vitalsUpdateFrequency: String? = null, val trackMemoryWarnings: Boolean? = null, val telemetrySampleRate: Double? = null, - val customEndpoint: String? = null + val customEndpoint: String? = null, + val timeseries: JSONTimeseriesConfiguration? = null +) + +internal data class JSONTimeseriesConfiguration( + val enabled: Boolean? = null, + val bufferSize: Double? = null, + val intervalMs: Double? = null, + val collectInBackground: Boolean? = null, + val useDeltaCompression: Boolean? = null ) internal data class JSONLogsConfiguration( diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt index 0bf90624c..ebd041d68 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt @@ -45,7 +45,8 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { trackNonFatalAnrs = rm.getBooleanOrNull("trackNonFatalAnrs"), initialResourceThreshold = rm.getDoubleOrNull("initialResourceThreshold"), telemetrySampleRate = rm.getDoubleOrNull("telemetrySampleRate"), - customEndpoint = rm.getString("customEndpoint") + customEndpoint = rm.getString("customEndpoint"), + timeseries = rm.getMap("timeseries")?.asTimeseriesConfiguration() ) } @@ -86,6 +87,16 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { } +internal fun ReadableMap.asTimeseriesConfiguration(): TimeseriesConfiguration { + return TimeseriesConfiguration( + enabled = getBooleanOrNull("enabled") ?: false, + bufferSize = getDoubleOrNull("bufferSize"), + intervalMs = getDoubleOrNull("intervalMs"), + collectInBackground = getBooleanOrNull("collectInBackground"), + useDeltaCompression = getBooleanOrNull("useDeltaCompression") + ) +} + internal fun ReadableMap.asConfigurationForTelemetry(): ConfigurationForTelemetry { return ConfigurationForTelemetry( initializationType = getString("initializationType"), @@ -187,7 +198,8 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { initialResourceThreshold = rum.initialResourceThreshold ?: DefaultConfiguration.initialResourceThreshold, telemetrySampleRate = rum.telemetrySampleRate?.toDouble() ?: DefaultConfiguration.telemetrySampleRate, - customEndpoint = rum.customEndpoint + customEndpoint = rum.customEndpoint, + timeseries = rum.timeseries?.asTimeseriesConfiguration() ) } @@ -229,6 +241,16 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { } +internal fun JSONTimeseriesConfiguration.asTimeseriesConfiguration(): TimeseriesConfiguration { + return TimeseriesConfiguration( + enabled = this.enabled ?: false, + bufferSize = this.bufferSize, + intervalMs = this.intervalMs, + collectInBackground = this.collectInBackground, + useDeltaCompression = this.useDeltaCompression + ) +} + internal fun JSONProxyConfiguration.asProxyConfig(): Pair? { return buildProxyConfig(type, address, port, username, password) } @@ -331,6 +353,15 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { rum.initialResourceThreshold?.let { rumMap.putDouble("initialResourceThreshold", it) } rum.telemetrySampleRate?.let { rumMap.putDouble("telemetrySampleRate", it) } rum.customEndpoint?.let { rumMap.putString("customEndpoint", it) } + rum.timeseries?.let { timeseries -> + val timeseriesMap = WritableNativeMap() + timeseriesMap.putBoolean("enabled", timeseries.enabled) + timeseries.bufferSize?.let { timeseriesMap.putDouble("bufferSize", it) } + timeseries.intervalMs?.let { timeseriesMap.putDouble("intervalMs", it) } + timeseries.collectInBackground?.let { timeseriesMap.putBoolean("collectInBackground", it) } + timeseries.useDeltaCompression?.let { timeseriesMap.putBoolean("useDeltaCompression", it) } + rumMap.putMap("timeseries", timeseriesMap) + } map.putMap("rumConfiguration", rumMap) } diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt index ae9ee7118..1ba3ec82f 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt @@ -19,6 +19,7 @@ import com.datadog.android.event.EventMapper import com.datadog.android.log.Logs import com.datadog.android.log.LogsConfiguration import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.rum.ExperimentalRumApi import com.datadog.android.rum.Rum import com.datadog.android.rum.RumConfiguration import com.datadog.android._InternalProxy @@ -27,6 +28,7 @@ import com.datadog.android.rum.configuration.VitalsUpdateFrequency import com.datadog.android.rum.metric.networksettled.TimeBasedInitialResourceIdentifier import com.datadog.android.rum.model.ActionEvent import com.datadog.android.rum.model.ResourceEvent +import com.datadog.android.rum.timeseries.TimeseriesConfiguration as NativeTimeseriesConfiguration import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy import com.datadog.android.telemetry.model.TelemetryConfigurationEvent import com.datadog.android.trace.Trace @@ -254,11 +256,33 @@ class DdSdkNativeInitialization internal constructor( configBuilder.setInitialResourceIdentifier(TimeBasedInitialResourceIdentifier(milliseconds)) } + configuration.rumConfiguration?.timeseries?.let { timeseries -> + setTimeseriesConfiguration(configBuilder, timeseries) + } + configBuilder.setSessionListener(DdSdkSessionStartedListener.getInstance()) return configBuilder.build() } + @OptIn(ExperimentalRumApi::class) + private fun setTimeseriesConfiguration( + configBuilder: RumConfiguration.Builder, + timeseries: TimeseriesConfiguration + ) { + if (!timeseries.enabled) { + return + } + + val nativeConfigBuilder = NativeTimeseriesConfiguration.Builder() + timeseries.bufferSize?.let { nativeConfigBuilder.setBufferSize(it.toInt()) } + timeseries.intervalMs?.let { nativeConfigBuilder.setIntervalMs(it.toLong()) } + timeseries.collectInBackground?.let { nativeConfigBuilder.collectInBackground(it) } + timeseries.useDeltaCompression?.let { nativeConfigBuilder.useDeltaCompression(it) } + + configBuilder.setTimeseriesConfiguration(nativeConfigBuilder.build()) + } + private fun buildLogsConfiguration(configuration: DdSdkConfiguration): LogsConfiguration { val configBuilder = LogsConfiguration.Builder() configuration.logsConfiguration?.customEndpoint?.let { diff --git a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt index 4e9cb24c7..ad8799c9c 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt @@ -144,6 +144,8 @@ internal class DdSdkNativeInitializationTest { "[B3MULTI, TRACECONTEXT]" ) assertThat(configuration.rumConfiguration?.initialResourceThreshold).isEqualTo(0.5) + assertThat(configuration.rumConfiguration?.timeseries?.enabled).isEqualTo(true) + assertThat(configuration.rumConfiguration?.timeseries?.bufferSize).isEqualTo(15.0) } @Test @@ -192,6 +194,7 @@ internal class DdSdkNativeInitializationTest { assertThat(configuration.rumConfiguration?.firstPartyHosts).isNull() assertThat(configuration.logsConfiguration?.customEndpoint).isNull() assertThat(configuration.traceConfiguration?.customEndpoint).isNull() + assertThat(configuration.rumConfiguration?.timeseries).isNull() } @Test diff --git a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt index b29bb4857..5c4538e0b 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt @@ -2368,6 +2368,106 @@ internal class DdSdkTest { } } + @Test + fun `𝕄 initialize native SDK 𝕎 initialize() {timeseries enabled}`( + @Forgery configuration: DdSdkConfiguration + ) { + // Given + val rumConfiguration = configuration.rumConfiguration?.copy( + timeseries = TimeseriesConfiguration(enabled = true, bufferSize = 15.0) + ) + val bridgeConfiguration = configuration.copy( + rumConfiguration = rumConfiguration + ) + val sdkConfigCaptor = argumentCaptor() + val rumConfigCaptor = argumentCaptor() + val logsConfigCaptor = argumentCaptor() + val traceConfigCaptor = argumentCaptor() + + val rumMock = org.mockito.Mockito.mockStatic(Rum::class.java) + val traceMock = org.mockito.Mockito.mockStatic(Trace::class.java) + val logsMock = org.mockito.Mockito.mockStatic(Logs::class.java) + + try { + rumMock.`when` { Rum.enable(any(), any()) }.then { } + logsMock.`when` { Logs.enable(any(), any()) }.then { } + traceMock.`when` { Trace.enable(any(), any()) }.then { } + + // When + testedBridgeSdk.initialize(bridgeConfiguration.toReadableJavaOnlyMap(), mockPromise) + + // Then + inOrder(mockDatadog) { + verify(mockDatadog).initialize( + same(mockContext), + sdkConfigCaptor.capture(), + any() + ) + rumMock.verify { Rum.enable(rumConfigCaptor.capture(), any()) } + traceMock.verify { Trace.enable(traceConfigCaptor.capture(), any()) } + logsMock.verify { Logs.enable(logsConfigCaptor.capture(), any()) } + } + assertThat(rumConfigCaptor.firstValue) + .hasField("featureConfiguration") { + it.hasField("timeseriesConfiguration") { ts -> + ts.hasFieldEqualTo("bufferSize", 15) + } + } + } finally { + rumMock.close() + logsMock.close() + traceMock.close() + } + } + + @Test + fun `𝕄 initialize native SDK 𝕎 initialize() {timeseries disabled by default}`( + @Forgery configuration: DdSdkConfiguration + ) { + // Given + val rumConfiguration = configuration.rumConfiguration?.copy(timeseries = null) + val bridgeConfiguration = configuration.copy( + rumConfiguration = rumConfiguration + ) + val sdkConfigCaptor = argumentCaptor() + val rumConfigCaptor = argumentCaptor() + val logsConfigCaptor = argumentCaptor() + val traceConfigCaptor = argumentCaptor() + + val rumMock = org.mockito.Mockito.mockStatic(Rum::class.java) + val traceMock = org.mockito.Mockito.mockStatic(Trace::class.java) + val logsMock = org.mockito.Mockito.mockStatic(Logs::class.java) + + try { + rumMock.`when` { Rum.enable(any(), any()) }.then { } + logsMock.`when` { Logs.enable(any(), any()) }.then { } + traceMock.`when` { Trace.enable(any(), any()) }.then { } + + // When + testedBridgeSdk.initialize(bridgeConfiguration.toReadableJavaOnlyMap(), mockPromise) + + // Then + inOrder(mockDatadog) { + verify(mockDatadog).initialize( + same(mockContext), + sdkConfigCaptor.capture(), + any() + ) + rumMock.verify { Rum.enable(rumConfigCaptor.capture(), any()) } + traceMock.verify { Trace.enable(traceConfigCaptor.capture(), any()) } + logsMock.verify { Logs.enable(logsConfigCaptor.capture(), any()) } + } + assertThat(rumConfigCaptor.firstValue) + .hasField("featureConfiguration") { + it.hasFieldEqualTo("timeseriesConfiguration", null) + } + } finally { + rumMock.close() + logsMock.close() + traceMock.close() + } + } + @Test fun `𝕄 initialize native SDK 𝕎 initialize() {never vitals frequency update}`( @Forgery configuration: DdSdkConfiguration diff --git a/packages/core/android/src/test/resources/input/complete-configuration.json b/packages/core/android/src/test/resources/input/complete-configuration.json index 29bf0dd27..0c2a1ad56 100644 --- a/packages/core/android/src/test/resources/input/complete-configuration.json +++ b/packages/core/android/src/test/resources/input/complete-configuration.json @@ -30,6 +30,10 @@ "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false, + "timeseries": { + "enabled": true, + "bufferSize": 15 + }, "firstPartyHosts": [ { "match": "example.com", diff --git a/packages/core/datadog-configuration.schema.json b/packages/core/datadog-configuration.schema.json index be0a2d84e..63c92d6c3 100644 --- a/packages/core/datadog-configuration.schema.json +++ b/packages/core/datadog-configuration.schema.json @@ -262,6 +262,35 @@ "customEndpoint": { "description": "Target a custom server for RUM.", "type": "string" + }, + "timeseries": { + "description": "Experimental: configuration for memory and CPU timeseries collection. Requires a native SDK build with timeseries support.", + "type": "object", + "properties": { + "enabled": { + "description": "Enables collection of memory and CPU timeseries events.", + "type": "boolean" + }, + "bufferSize": { + "description": "The number of samples collected before a timeseries batch is flushed. iOS and Android only.", + "type": "integer" + }, + "intervalMs": { + "description": "The sampling interval in milliseconds. Android only.", + "type": "integer" + }, + "collectInBackground": { + "description": "Whether to keep sampling timeseries when the app is in background. Android only.", + "type": "boolean" + }, + "useDeltaCompression": { + "description": "Whether to encode each sample as a delta from the previous value instead of an absolute value. Android only.", + "type": "boolean" + } + }, + "required": [ + "enabled" + ] } }, "required": [ diff --git a/packages/core/ios/Sources/DdSdkConfiguration.swift b/packages/core/ios/Sources/DdSdkConfiguration.swift index fd8e8f3e1..7b6b4bf49 100644 --- a/packages/core/ios/Sources/DdSdkConfiguration.swift +++ b/packages/core/ios/Sources/DdSdkConfiguration.swift @@ -103,6 +103,9 @@ public class DdSdkConfiguration: NSObject { /// - trackMemoryWarnings: Whether memory warning events should be tracked. /// - telemetrySampleRate: Sampling rate (0–100) for internal telemetry emitted via RUM. /// - customEndpoint: A custom RUM intake endpoint to override the default Datadog intake. +/// - enableTimeseries: Experimental: enables collection of memory and CPU timeseries events. +/// Requires a native SDK build with timeseries support. +/// - timeseriesBatchSize: The number of samples collected before a timeseries batch is flushed. public class RumConfiguration: NSObject { public var applicationId: String = "" public var trackFrustrations: Bool? = true @@ -122,6 +125,8 @@ public class RumConfiguration: NSObject { public var trackMemoryWarnings: Bool? = nil public var telemetrySampleRate: Double? = nil public var customEndpoint: String? = nil + public var enableTimeseries: Bool? = nil + public var timeseriesBatchSize: Double? = nil init( applicationId: String, @@ -141,7 +146,9 @@ public class RumConfiguration: NSObject { initialResourceThreshold: Double?, trackMemoryWarnings: Bool?, telemetrySampleRate: Double?, - customEndpoint: String? + customEndpoint: String?, + enableTimeseries: Bool? = nil, + timeseriesBatchSize: Double? = nil ) { self.applicationId = applicationId self.trackFrustrations = trackFrustrations @@ -161,6 +168,8 @@ public class RumConfiguration: NSObject { self.trackMemoryWarnings = trackMemoryWarnings self.telemetrySampleRate = telemetrySampleRate self.customEndpoint = customEndpoint + self.enableTimeseries = enableTimeseries + self.timeseriesBatchSize = timeseriesBatchSize } } diff --git a/packages/core/ios/Sources/DdSdkNativeInitialization.swift b/packages/core/ios/Sources/DdSdkNativeInitialization.swift index c46ddd145..34d666c65 100644 --- a/packages/core/ios/Sources/DdSdkNativeInitialization.swift +++ b/packages/core/ios/Sources/DdSdkNativeInitialization.swift @@ -236,7 +236,11 @@ public class DdSdkNativeInitialization: NSObject { trackMemoryWarnings: rumConfig.trackMemoryWarnings ?? DefaultConfiguration.trackMemoryWarnings, telemetrySampleRate: Float( - rumConfig.telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate) + rumConfig.telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate), + enableTimeseries: rumConfig.enableTimeseries + ?? DefaultConfiguration.enableTimeseries, + timeseriesBatchSize: Int( + rumConfig.timeseriesBatchSize ?? DefaultConfiguration.timeseriesBatchSize) ) } diff --git a/packages/core/ios/Sources/RNDdSdkConfiguration.swift b/packages/core/ios/Sources/RNDdSdkConfiguration.swift index bd84625b3..a4e06dbda 100644 --- a/packages/core/ios/Sources/RNDdSdkConfiguration.swift +++ b/packages/core/ios/Sources/RNDdSdkConfiguration.swift @@ -71,6 +71,10 @@ extension NSDictionary { let telemetrySampleRate = rumDict["telemetrySampleRate"] as? Double let customEndpoint = rumDict["customEndpoint"] as? String + let timeseriesDict = rumDict["timeseries"] as? NSDictionary + let enableTimeseries = timeseriesDict?["enabled"] as? Bool + let timeseriesBatchSize = timeseriesDict?["bufferSize"] as? Double + rumConfiguration = RumConfiguration( applicationId: applicationId, trackFrustrations: trackFrustrations ?? DefaultConfiguration.trackFrustrations, @@ -98,7 +102,10 @@ extension NSDictionary { ?? DefaultConfiguration.trackMemoryWarnings, telemetrySampleRate: telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate, - customEndpoint: customEndpoint + customEndpoint: customEndpoint, + enableTimeseries: enableTimeseries ?? DefaultConfiguration.enableTimeseries, + timeseriesBatchSize: timeseriesBatchSize + ?? DefaultConfiguration.timeseriesBatchSize ) } else { rumConfiguration = nil @@ -284,6 +291,8 @@ internal struct DefaultConfiguration { static let bundleLogsWithTraces = true static let trackWatchdogTerminations = false static let trackMemoryWarnings = true + static let enableTimeseries = false + static let timeseriesBatchSize = 30.0 } extension Dictionary where Key == String, Value == AnyObject { @@ -357,6 +366,15 @@ extension Dictionary where Key == String, Value == AnyObject { let firstPartyHosts = firstPartyHostsArray?.asFirstPartyHosts() ?? DefaultConfiguration.firstPartyHosts + let timeseriesDict = rum["timeseries"] as? [String: Any?] + let enableTimeseries = timeseriesDict?["enabled"] as? Bool + let timeseriesBatchSizeRaw = timeseriesDict?["bufferSize"] + let timeseriesBatchSize: Double? = { + if let v = timeseriesBatchSizeRaw as? Double { return v } + if let v = timeseriesBatchSizeRaw as? Int { return Double(v) } + return nil + }() + rumConfiguration = RumConfiguration( applicationId: applicationId, trackFrustrations: rum["trackFrustrations"] as? Bool @@ -387,7 +405,10 @@ extension Dictionary where Key == String, Value == AnyObject { ?? DefaultConfiguration.trackMemoryWarnings, telemetrySampleRate: (rum["telemetrySampleRate"] as? Double) ?? DefaultConfiguration.telemetrySampleRate, - customEndpoint: rum["customEndpoint"] as? String + customEndpoint: rum["customEndpoint"] as? String, + enableTimeseries: enableTimeseries ?? DefaultConfiguration.enableTimeseries, + timeseriesBatchSize: timeseriesBatchSize + ?? DefaultConfiguration.timeseriesBatchSize ) } else { rumConfiguration = nil diff --git a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift index cb6a6c500..577d9309b 100644 --- a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift +++ b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift @@ -66,6 +66,8 @@ class DdSdkNativeInitializationTests: XCTestCase { let expectedFirstPartyHosts: [String: Set]? = ["example.com": [.b3multi, .tracecontext]] XCTAssertEqual(configuration?.rumConfiguration?.firstPartyHosts, expectedFirstPartyHosts) XCTAssertEqual(configuration?.rumConfiguration?.initialResourceThreshold, 0.5) + XCTAssertEqual(configuration?.rumConfiguration?.enableTimeseries, true) + XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 15.0) } func testReturnsConfigurationWithMinimalData() { @@ -104,6 +106,8 @@ class DdSdkNativeInitializationTests: XCTestCase { let expectedFirstPartyHosts: [String: Set]? = [:] XCTAssertEqual(configuration?.rumConfiguration?.firstPartyHosts, expectedFirstPartyHosts) XCTAssertEqual(configuration?.rumConfiguration?.initialResourceThreshold, nil) + XCTAssertEqual(configuration?.rumConfiguration?.enableTimeseries, false) + XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 30.0) } func testPrintsMessageWithIncorrectFile() { diff --git a/packages/core/ios/Tests/DdSdkTests.swift b/packages/core/ios/Tests/DdSdkTests.swift index bc13c4f98..fedb5b811 100644 --- a/packages/core/ios/Tests/DdSdkTests.swift +++ b/packages/core/ios/Tests/DdSdkTests.swift @@ -1049,6 +1049,34 @@ class DdSdkTests: XCTestCase { XCTAssertEqual(ddConfig.vitalsUpdateFrequency, nil) } + func testBuildConfigurationEnabledTimeseries() { + let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.enableTimeseries = true + rumConfiguration.timeseriesBatchSize = 15.0 + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) + + let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( + configuration: configuration + ) + + XCTAssertEqual(ddConfig.enableTimeseries, true) + XCTAssertEqual(ddConfig.timeseriesBatchSize, 15) + } + + func testBuildConfigurationDisabledTimeseriesByDefault() { + let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.enableTimeseries = nil + rumConfiguration.timeseriesBatchSize = nil + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) + + let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( + configuration: configuration + ) + + XCTAssertEqual(ddConfig.enableTimeseries, false) + XCTAssertEqual(ddConfig.timeseriesBatchSize, 30) + } + func testBuildConfigurationAverageUploadFrequency() { let configuration: DdSdkConfiguration = .mockAny(uploadFrequency: "AVERAGE") @@ -1781,7 +1809,9 @@ func makeDefaultRumConfiguration() -> RumConfiguration { initialResourceThreshold: nil, trackMemoryWarnings: true, telemetrySampleRate: 45.0, - customEndpoint: nil + customEndpoint: nil, + enableTimeseries: nil, + timeseriesBatchSize: nil ) } @@ -1908,6 +1938,7 @@ extension NSDictionary { rumConfig["nativeInteractionTracking"] = rumConfiguration?["nativeInteractionTracking"] rumConfig["customEndpoint"] = rumConfiguration?["customEndpoint"] rumConfig["trackFrustrations"] = rumConfiguration?["trackFrustrations"] + rumConfig["timeseries"] = rumConfiguration?["timeseries"] logsConfig["bundleLogsWithRum"] = logsConfiguration?["bundleLogsWithRum"] logsConfig["bundleLogsWithTraces"] = logsConfiguration?["bundleLogsWithTraces"] diff --git a/packages/core/ios/Tests/Fixtures/complete-configuration.json b/packages/core/ios/Tests/Fixtures/complete-configuration.json index d2648a289..4123ee324 100644 --- a/packages/core/ios/Tests/Fixtures/complete-configuration.json +++ b/packages/core/ios/Tests/Fixtures/complete-configuration.json @@ -30,6 +30,10 @@ "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false, + "timeseries": { + "enabled": true, + "bufferSize": 15 + }, "firstPartyHosts": [ { "match": "example.com", diff --git a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts index 207d9abdd..9e398986c 100644 --- a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts +++ b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts @@ -71,6 +71,7 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, + "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": true, @@ -215,6 +216,7 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 80, "sessionSampleRate": 80, "telemetrySampleRate": 20, + "timeseries": undefined, "trackBackgroundEvents": true, "trackErrors": true, "trackFrustrations": true, @@ -318,6 +320,7 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 0, "sessionSampleRate": 0, "telemetrySampleRate": 0, + "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": false, diff --git a/packages/core/src/config/FileBasedConfiguration.ts b/packages/core/src/config/FileBasedConfiguration.ts index c226050c0..939e1bed1 100644 --- a/packages/core/src/config/FileBasedConfiguration.ts +++ b/packages/core/src/config/FileBasedConfiguration.ts @@ -206,7 +206,8 @@ export const getJSONConfiguration = ( telemetrySampleRate: configuration.rumConfiguration.telemetrySampleRate, nativeInteractionTracking: - configuration.rumConfiguration.nativeInteractionTracking + configuration.rumConfiguration.nativeInteractionTracking, + timeseries: configuration.rumConfiguration.timeseries } }), ...(configuration.traceConfiguration !== undefined && { diff --git a/packages/core/src/config/FileBasedConfiguration.type.ts b/packages/core/src/config/FileBasedConfiguration.type.ts index 693fa5738..e2a546938 100644 --- a/packages/core/src/config/FileBasedConfiguration.type.ts +++ b/packages/core/src/config/FileBasedConfiguration.type.ts @@ -11,6 +11,7 @@ import type { BatchSize, ProxyConfiguration, SdkVerbosity, + TimeseriesConfiguration, TrackingConsent, UploadFrequency, VitalsUpdateFrequency @@ -54,6 +55,7 @@ export interface JsonConfiguration extends CoreConfigurationOptions { trackWatchdogTerminations?: boolean; vitalsUpdateFrequency?: VitalsUpdateFrequency; telemetrySampleRate?: number; + timeseries?: TimeseriesConfiguration; }; traceConfiguration?: { customEndpoint?: string; diff --git a/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts b/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts index 5b062447f..bc17f47dd 100644 --- a/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts +++ b/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts @@ -65,6 +65,10 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, + "timeseries": { + "bufferSize": 15, + "enabled": true, + }, "trackBackgroundEvents": true, "trackErrors": true, "trackFrustrations": true, @@ -177,6 +181,7 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, + "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": true, "trackFrustrations": true, @@ -241,6 +246,7 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, + "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": true, diff --git a/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json b/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json index 3b5d15d59..8e7480f15 100644 --- a/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json +++ b/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json @@ -32,7 +32,11 @@ "trackBackgroundEvents": true, "trackMemoryWarnings": false, "trackWatchdogTerminations": true, - "vitalsUpdateFrequency": "NEVER" + "vitalsUpdateFrequency": "NEVER", + "timeseries": { + "enabled": true, + "bufferSize": 15 + } }, "traceConfiguration": { "customEndpoint": "https://example.com/trace" diff --git a/packages/core/src/config/features/RumConfiguration.ts b/packages/core/src/config/features/RumConfiguration.ts index 3ab70409c..e701587a7 100644 --- a/packages/core/src/config/features/RumConfiguration.ts +++ b/packages/core/src/config/features/RumConfiguration.ts @@ -7,6 +7,7 @@ import type { ActionEventMapper } from '../../rum/eventMappers/actionEventMapper import type { ErrorEventMapper } from '../../rum/eventMappers/errorEventMapper'; import type { ResourceEventMapper } from '../../rum/eventMappers/resourceEventMapper'; import type { FirstPartyHost } from '../../rum/types'; +import type { TimeseriesConfiguration } from '../types'; import { VitalsUpdateFrequency } from '../types'; import type { @@ -31,6 +32,7 @@ const DEFAULTS = { resourceTraceSampleRate: 100.0, sessionSampleRate: 100.0, telemetrySampleRate: 20.0, + timeseries: undefined, trackBackgroundEvents: false, trackErrors: false, trackFrustrations: true, @@ -100,6 +102,9 @@ export class RumConfiguration implements RumConfigurationType { // Telemetry Sample Rate public telemetrySampleRate: number = DEFAULTS.telemetrySampleRate; + // Experimental Timeseries Configuration + public timeseries?: TimeseriesConfiguration = DEFAULTS.timeseries; + // Track Background Events Enabled public trackBackgroundEvents: boolean = DEFAULTS.trackBackgroundEvents; diff --git a/packages/core/src/config/features/RumConfiguration.type.ts b/packages/core/src/config/features/RumConfiguration.type.ts index 0a2094ece..60c2286aa 100644 --- a/packages/core/src/config/features/RumConfiguration.type.ts +++ b/packages/core/src/config/features/RumConfiguration.type.ts @@ -7,7 +7,7 @@ import type { ActionEventMapper } from '../../rum/eventMappers/actionEventMapper import type { ErrorEventMapper } from '../../rum/eventMappers/errorEventMapper'; import type { ResourceEventMapper } from '../../rum/eventMappers/resourceEventMapper'; import type { FirstPartyHost } from '../../rum/types'; -import type { VitalsUpdateFrequency } from '../types'; +import type { TimeseriesConfiguration, VitalsUpdateFrequency } from '../types'; /** * Required RUM configuration values. @@ -116,6 +116,12 @@ export interface RumConfigurationOptions { */ sessionSampleRate?: number; + /** + * Experimental: configuration for memory and CPU timeseries collection. + * Requires a native SDK build with timeseries support. + */ + timeseries?: TimeseriesConfiguration; + /** * Enables tracking of background RUM events. */ diff --git a/packages/core/src/config/features/RumConfigurationNative.ts b/packages/core/src/config/features/RumConfigurationNative.ts index 155f086e9..aabce2403 100644 --- a/packages/core/src/config/features/RumConfigurationNative.ts +++ b/packages/core/src/config/features/RumConfigurationNative.ts @@ -3,6 +3,8 @@ * This product includes software developed at Datadog (https://www.datadoghq.com/). * Copyright 2016-Present Datadog, Inc. */ +import type { TimeseriesConfiguration } from '../types'; + export type RumNativeConfiguration = { readonly applicationId: string; readonly trackFrustrations: boolean; @@ -23,4 +25,5 @@ export type RumNativeConfiguration = { readonly telemetrySampleRate: number; readonly customEndpoint: string; readonly firstPartyHosts: { match: string; propagatorTypes: string[] }[]; + readonly timeseries: TimeseriesConfiguration | undefined; }; diff --git a/packages/core/src/config/types/TimeseriesConfiguration.ts b/packages/core/src/config/types/TimeseriesConfiguration.ts new file mode 100644 index 000000000..e78433fd9 --- /dev/null +++ b/packages/core/src/config/types/TimeseriesConfiguration.ts @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/** + * Experimental: configuration for memory and CPU timeseries collection. + * Requires a native SDK build with timeseries support. + */ +export interface TimeseriesConfiguration { + /** + * Enables collection of memory and CPU timeseries events. + */ + enabled: boolean; + + /** + * The number of samples collected before a timeseries batch is flushed. + * iOS and Android only. + */ + bufferSize?: number; + + /** + * The sampling interval in milliseconds. + * Android only. + */ + intervalMs?: number; + + /** + * Whether to keep sampling timeseries when the app is in background. + * Android only. + */ + collectInBackground?: boolean; + + /** + * Whether to encode each sample as a delta from the previous value instead of an absolute value. + * Android only. + */ + useDeltaCompression?: boolean; +} diff --git a/packages/core/src/config/types/index.ts b/packages/core/src/config/types/index.ts index 6df83e28c..c43632532 100644 --- a/packages/core/src/config/types/index.ts +++ b/packages/core/src/config/types/index.ts @@ -8,6 +8,7 @@ export { BatchProcessingLevel } from './BatchProcessingLevel'; export { BatchSize } from './BatchSize'; export { ProxyConfiguration, ProxyType } from './ProxyConfiguration'; export { SdkVerbosity } from './SdkVerbosity'; +export type { TimeseriesConfiguration } from './TimeseriesConfiguration'; export { TrackingConsent } from './TrackingConsent'; export { UploadFrequency } from './UploadFrequency'; export { VitalsUpdateFrequency } from './VitalsUpdateFrequency'; From e3149324d6175c712923be0b9afb61cfe7564c63 Mon Sep 17 00:00:00 2001 From: Barbora Plasovska Date: Fri, 17 Jul 2026 13:53:23 +0200 Subject: [PATCH 2/5] RUM-17173 Bump default timeseriesBatchSize on iOS to match native's new default of 120 --- packages/core/ios/Sources/RNDdSdkConfiguration.swift | 2 +- packages/core/ios/Tests/DdSdkNativeInitializationTests.swift | 2 +- packages/core/ios/Tests/DdSdkTests.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/ios/Sources/RNDdSdkConfiguration.swift b/packages/core/ios/Sources/RNDdSdkConfiguration.swift index a4e06dbda..616cb6364 100644 --- a/packages/core/ios/Sources/RNDdSdkConfiguration.swift +++ b/packages/core/ios/Sources/RNDdSdkConfiguration.swift @@ -292,7 +292,7 @@ internal struct DefaultConfiguration { static let trackWatchdogTerminations = false static let trackMemoryWarnings = true static let enableTimeseries = false - static let timeseriesBatchSize = 30.0 + static let timeseriesBatchSize = 120.0 } extension Dictionary where Key == String, Value == AnyObject { diff --git a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift index 577d9309b..54c6a384f 100644 --- a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift +++ b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift @@ -107,7 +107,7 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.rumConfiguration?.firstPartyHosts, expectedFirstPartyHosts) XCTAssertEqual(configuration?.rumConfiguration?.initialResourceThreshold, nil) XCTAssertEqual(configuration?.rumConfiguration?.enableTimeseries, false) - XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 30.0) + XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 120.0) } func testPrintsMessageWithIncorrectFile() { diff --git a/packages/core/ios/Tests/DdSdkTests.swift b/packages/core/ios/Tests/DdSdkTests.swift index fedb5b811..70e7add7d 100644 --- a/packages/core/ios/Tests/DdSdkTests.swift +++ b/packages/core/ios/Tests/DdSdkTests.swift @@ -1074,7 +1074,7 @@ class DdSdkTests: XCTestCase { ) XCTAssertEqual(ddConfig.enableTimeseries, false) - XCTAssertEqual(ddConfig.timeseriesBatchSize, 30) + XCTAssertEqual(ddConfig.timeseriesBatchSize, 120) } func testBuildConfigurationAverageUploadFrequency() { From 1a0b9cfd309f95f42e4c3ef526f2d33f67da05c6 Mon Sep 17 00:00:00 2001 From: Barbora Plasovska Date: Fri, 17 Jul 2026 14:25:23 +0200 Subject: [PATCH 3/5] RUM-17173 Remove useDeltaCompression and collectInBackground from timeseries config on Android --- .../com/datadog/reactnative/DdSdkConfiguration.kt | 10 ++-------- .../com/datadog/reactnative/DdSdkConfigurationExt.kt | 10 ++-------- .../datadog/reactnative/DdSdkNativeInitialization.kt | 2 -- .../com/datadog/tools/unit/DdSdkConfigurationExt.kt | 10 ++++++++++ packages/core/datadog-configuration.schema.json | 8 -------- .../core/src/config/types/TimeseriesConfiguration.ts | 12 ------------ 6 files changed, 14 insertions(+), 38 deletions(-) diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt index a03ce2d96..48a7a27a0 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt @@ -94,15 +94,11 @@ data class RumConfiguration( * @param enabled Enables collection of memory and CPU timeseries events. * @param bufferSize The number of samples collected before a timeseries batch is flushed. * @param intervalMs The sampling interval in milliseconds. - * @param collectInBackground Whether to keep sampling timeseries when the app is in background. - * @param useDeltaCompression Whether to encode each sample as a delta from the previous value instead of an absolute value. */ data class TimeseriesConfiguration( val enabled: Boolean, val bufferSize: Double? = null, - val intervalMs: Double? = null, - val collectInBackground: Boolean? = null, - val useDeltaCompression: Boolean? = null + val intervalMs: Double? = null ) /** @@ -184,9 +180,7 @@ internal data class JSONRumConfiguration( internal data class JSONTimeseriesConfiguration( val enabled: Boolean? = null, val bufferSize: Double? = null, - val intervalMs: Double? = null, - val collectInBackground: Boolean? = null, - val useDeltaCompression: Boolean? = null + val intervalMs: Double? = null ) internal data class JSONLogsConfiguration( diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt index ebd041d68..7aa6b754d 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt @@ -91,9 +91,7 @@ internal fun ReadableMap.asTimeseriesConfiguration(): TimeseriesConfiguration { return TimeseriesConfiguration( enabled = getBooleanOrNull("enabled") ?: false, bufferSize = getDoubleOrNull("bufferSize"), - intervalMs = getDoubleOrNull("intervalMs"), - collectInBackground = getBooleanOrNull("collectInBackground"), - useDeltaCompression = getBooleanOrNull("useDeltaCompression") + intervalMs = getDoubleOrNull("intervalMs") ) } @@ -245,9 +243,7 @@ internal fun JSONTimeseriesConfiguration.asTimeseriesConfiguration(): Timeseries return TimeseriesConfiguration( enabled = this.enabled ?: false, bufferSize = this.bufferSize, - intervalMs = this.intervalMs, - collectInBackground = this.collectInBackground, - useDeltaCompression = this.useDeltaCompression + intervalMs = this.intervalMs ) } @@ -358,8 +354,6 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { timeseriesMap.putBoolean("enabled", timeseries.enabled) timeseries.bufferSize?.let { timeseriesMap.putDouble("bufferSize", it) } timeseries.intervalMs?.let { timeseriesMap.putDouble("intervalMs", it) } - timeseries.collectInBackground?.let { timeseriesMap.putBoolean("collectInBackground", it) } - timeseries.useDeltaCompression?.let { timeseriesMap.putBoolean("useDeltaCompression", it) } rumMap.putMap("timeseries", timeseriesMap) } diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt index 1ba3ec82f..8e92e111a 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt @@ -277,8 +277,6 @@ class DdSdkNativeInitialization internal constructor( val nativeConfigBuilder = NativeTimeseriesConfiguration.Builder() timeseries.bufferSize?.let { nativeConfigBuilder.setBufferSize(it.toInt()) } timeseries.intervalMs?.let { nativeConfigBuilder.setIntervalMs(it.toLong()) } - timeseries.collectInBackground?.let { nativeConfigBuilder.collectInBackground(it) } - timeseries.useDeltaCompression?.let { nativeConfigBuilder.useDeltaCompression(it) } configBuilder.setTimeseriesConfiguration(nativeConfigBuilder.build()) } diff --git a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt index 4fc6c96d6..1280b40a2 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt @@ -13,6 +13,7 @@ import com.datadog.android.rum.configuration.VitalsUpdateFrequency import com.datadog.reactnative.ConfigurationForTelemetry import com.datadog.reactnative.DdSdkConfiguration import com.datadog.reactnative.ProxyAuthenticator +import com.datadog.reactnative.TimeseriesConfiguration import com.facebook.react.bridge.ReadableMap import java.net.Proxy @@ -67,6 +68,7 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { rumMap["initialResourceThreshold"] = rum?.initialResourceThreshold ?: 0.1 rumMap["telemetrySampleRate"] = rum?.telemetrySampleRate ?: 20.0 rum?.customEndpoint?.let { rumMap["customEndpoint"] = it } + rum?.timeseries?.let { rumMap["timeseries"] = it.toReadableMap() } map["rumConfiguration"] = rumMap.toReadableMap() } @@ -93,6 +95,14 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { return map.toReadableMap() } +internal fun TimeseriesConfiguration.toReadableMap(): ReadableMap { + val map = mutableMapOf() + map["enabled"] = enabled + bufferSize?.let { map["bufferSize"] = it } + intervalMs?.let { map["intervalMs"] = it } + return map.toReadableMap() +} + internal fun ConfigurationForTelemetry.toReadableJavaOnlyMap(): ReadableMap { val map = mutableMapOf() initializationType?.let { map.put("initializationType", it) } diff --git a/packages/core/datadog-configuration.schema.json b/packages/core/datadog-configuration.schema.json index 63c92d6c3..43e55c17c 100644 --- a/packages/core/datadog-configuration.schema.json +++ b/packages/core/datadog-configuration.schema.json @@ -278,14 +278,6 @@ "intervalMs": { "description": "The sampling interval in milliseconds. Android only.", "type": "integer" - }, - "collectInBackground": { - "description": "Whether to keep sampling timeseries when the app is in background. Android only.", - "type": "boolean" - }, - "useDeltaCompression": { - "description": "Whether to encode each sample as a delta from the previous value instead of an absolute value. Android only.", - "type": "boolean" } }, "required": [ diff --git a/packages/core/src/config/types/TimeseriesConfiguration.ts b/packages/core/src/config/types/TimeseriesConfiguration.ts index e78433fd9..12615b984 100644 --- a/packages/core/src/config/types/TimeseriesConfiguration.ts +++ b/packages/core/src/config/types/TimeseriesConfiguration.ts @@ -25,16 +25,4 @@ export interface TimeseriesConfiguration { * Android only. */ intervalMs?: number; - - /** - * Whether to keep sampling timeseries when the app is in background. - * Android only. - */ - collectInBackground?: boolean; - - /** - * Whether to encode each sample as a delta from the previous value instead of an absolute value. - * Android only. - */ - useDeltaCompression?: boolean; } From a7658c84d9038f52c5b855b8a7d383b809adfe75 Mon Sep 17 00:00:00 2001 From: Barbora Plasovska Date: Thu, 23 Jul 2026 16:04:47 +0200 Subject: [PATCH 4/5] RUM-17173 Update default-config snapshot for new timeseries field --- .../src/sdk/DatadogProvider/__tests__/initialization.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx index 1380fb0c2..0411aaa39 100644 --- a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx +++ b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx @@ -102,6 +102,7 @@ describe('DatadogProvider', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, + "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": true, "trackFrustrations": true, From 6f518517e572747d0109f46f71777c7178e7398a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbora=20Pla=C5=A1ovsk=C3=A1?= Date: Fri, 21 Aug 2026 14:42:37 +0200 Subject: [PATCH 5/5] RUM-17173 Align timeseries collectTypes config with shipped native 3.16.0 API --- example/ios/Podfile.lock | 491 ++++++++++++++---- packages/core/DatadogSDKReactNative.podspec | 14 +- .../datadog/reactnative/DdSdkConfiguration.kt | 16 +- .../reactnative/DdSdkConfigurationExt.kt | 22 +- .../reactnative/DdSdkNativeInitialization.kt | 19 +- .../DdSdkNativeInitializationTest.kt | 5 +- .../com/datadog/reactnative/DdSdkTest.kt | 5 +- .../tools/unit/DdSdkConfigurationExt.kt | 6 +- .../input/complete-configuration.json | 7 +- .../core/datadog-configuration.schema.json | 31 +- .../core/ios/Sources/DdSdkConfiguration.swift | 9 +- .../Sources/DdSdkNativeInitialization.swift | 26 +- .../ios/Sources/RNDdSdkConfiguration.swift | 29 +- .../DdSdkNativeInitializationTests.swift | 4 +- packages/core/ios/Tests/DdSdkTests.swift | 14 +- .../Fixtures/complete-configuration.json | 7 +- .../DdSdkReactNativeConfiguration.test.ts | 6 +- .../core/src/config/FileBasedConfiguration.ts | 3 +- .../src/config/FileBasedConfiguration.type.ts | 2 +- .../__tests__/FileBasedConfiguration.test.ts | 13 +- .../configuration-all-fields.json | 7 +- .../src/config/features/RumConfiguration.ts | 9 +- .../config/features/RumConfiguration.type.ts | 12 +- .../config/features/RumConfigurationNative.ts | 2 +- .../config/types/TimeseriesConfiguration.ts | 22 +- packages/core/src/config/types/index.ts | 5 +- .../__tests__/initialization.test.tsx | 2 +- ...DatadogSDKReactNativeSessionReplay.podspec | 2 +- .../DatadogSDKReactNativeWebView.podspec | 4 +- 29 files changed, 534 insertions(+), 260 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index d8e237809..4e125ea5a 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,64 +1,178 @@ PODS: - boost (1.84.0) - - DatadogCore (3.11.0): - - DatadogInternal (= 3.11.0) - - DatadogCrashReporting (3.11.0): - - DatadogInternal (= 3.11.0) - - KSCrash/Filters (= 2.5.0) - - KSCrash/Recording (= 2.5.0) - - DatadogFlags (3.11.0): - - DatadogInternal (= 3.11.0) - - DatadogInternal (3.11.0) - - DatadogLogs (3.11.0): - - DatadogInternal (= 3.11.0) - - DatadogRUM (3.11.0): - - DatadogInternal (= 3.11.0) + - DatadogCore (3.16.0): + - DatadogInternal (= 3.16.0) + - DatadogCrashReporting (3.16.0): + - DatadogInternal (= 3.16.0) + - KSCrash/Filters (= 2.5.1) + - KSCrash/Recording (= 2.5.1) + - DatadogFlags (3.16.0): + - DatadogInternal (= 3.16.0) + - DatadogInternal (3.16.0) + - DatadogLogs (3.16.0): + - DatadogInternal (= 3.16.0) + - DatadogRUM (3.16.0): + - DatadogInternal (= 3.16.0) - DatadogSDKReactNative (3.5.3): - - DatadogCore (= 3.11.0) - - DatadogCrashReporting (= 3.11.0) - - DatadogFlags (= 3.11.0) - - DatadogLogs (= 3.11.0) - - DatadogRUM (= 3.11.0) - - DatadogTrace (= 3.11.0) - - DatadogWebViewTracking (= 3.11.0) + - DatadogCore (= 3.16.0) + - DatadogCrashReporting (= 3.16.0) + - DatadogFlags (= 3.16.0) + - DatadogLogs (= 3.16.0) + - DatadogRUM (= 3.16.0) + - DatadogTrace (= 3.16.0) + - DatadogWebViewTracking (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - DatadogSDKReactNative/Tests (3.5.3): - - DatadogCore (= 3.11.0) - - DatadogCrashReporting (= 3.11.0) - - DatadogFlags (= 3.11.0) - - DatadogLogs (= 3.11.0) - - DatadogRUM (= 3.11.0) - - DatadogTrace (= 3.11.0) - - DatadogWebViewTracking (= 3.11.0) + - DatadogCore (= 3.16.0) + - DatadogCrashReporting (= 3.16.0) + - DatadogFlags (= 3.16.0) + - DatadogLogs (= 3.16.0) + - DatadogRUM (= 3.16.0) + - DatadogTrace (= 3.16.0) + - DatadogWebViewTracking (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - DatadogSDKReactNativeSessionReplay (3.5.3): - DatadogSDKReactNative - - DatadogSessionReplay (= 3.11.0) + - DatadogSessionReplay (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - DatadogSDKReactNativeSessionReplay/Tests (3.5.3): - DatadogSDKReactNative - - DatadogSessionReplay (= 3.11.0) + - DatadogSessionReplay (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric - React-RCTText + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - DatadogSDKReactNativeWebView (3.5.3): - - DatadogInternal (= 3.11.0) + - DatadogInternal (= 3.16.0) - DatadogSDKReactNative - - DatadogWebViewTracking (= 3.11.0) + - DatadogWebViewTracking (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - DatadogSDKReactNativeWebView/Tests (3.5.3): - - DatadogInternal (= 3.11.0) + - DatadogInternal (= 3.16.0) - DatadogSDKReactNative - - DatadogWebViewTracking (= 3.11.0) + - DatadogWebViewTracking (= 3.16.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager - react-native-webview + - React-NativeModulesApple + - React-RCTFabric - React-RCTText - - DatadogSessionReplay (3.11.0): - - DatadogInternal (= 3.11.0) - - DatadogTrace (3.11.0): - - DatadogInternal (= 3.11.0) - - OpenTelemetry-Swift-Api (~> 2.3.0) - - DatadogWebViewTracking (3.11.0): - - DatadogInternal (= 3.11.0) + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - DatadogSessionReplay (3.16.0): + - DatadogInternal (= 3.16.0) + - DatadogTrace (3.16.0): + - DatadogInternal (= 3.16.0) + - OpenTelemetry-Swift-Api (~> 2.5.0) + - DatadogWebViewTracking (3.16.0): + - DatadogInternal (= 3.16.0) - DoubleConversion (1.1.6) - fast_float (6.1.4) - FBLazyVector (0.76.9) @@ -68,18 +182,18 @@ PODS: - hermes-engine/Pre-built (= 0.76.9) - hermes-engine/Pre-built (0.76.9) - HMSegmentedControl (1.5.6) - - KSCrash/Core (2.5.0) - - KSCrash/Filters (2.5.0): + - KSCrash/Core (2.5.1) + - KSCrash/Filters (2.5.1): - KSCrash/Recording - KSCrash/RecordingCore - KSCrash/ReportingCore - - KSCrash/Recording (2.5.0): + - KSCrash/Recording (2.5.1): - KSCrash/RecordingCore - - KSCrash/RecordingCore (2.5.0): + - KSCrash/RecordingCore (2.5.1): - KSCrash/Core - - KSCrash/ReportingCore (2.5.0): + - KSCrash/ReportingCore (2.5.1): - KSCrash/Core - - OpenTelemetry-Swift-Api (2.3.0) + - OpenTelemetry-Swift-Api (2.5.1) - RCT-Folly (2024.10.14.00): - boost - DoubleConversion @@ -119,6 +233,7 @@ PODS: - React-RCTText (= 0.76.9) - React-RCTVibration (= 0.76.9) - React-callinvoker (0.76.9) + - React-Codegen (0.1.0) - React-Core (0.76.9): - glog - hermes-engine @@ -1361,7 +1476,71 @@ PODS: - react-native-crash-tester (0.2.3): - React-Core - react-native-safe-area-context (5.1.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - react-native-safe-area-context/common (= 5.1.0) + - react-native-safe-area-context/fabric (= 5.1.0) + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-safe-area-context/common (5.1.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-safe-area-context/fabric (5.1.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - react-native-webview (13.14.2): - DoubleConversion - glog @@ -1656,20 +1835,87 @@ PODS: - React-perflogger - React-utils (= 0.76.9) - ReactNativeNavigation (8.0.0-snapshot.1658): + - DoubleConversion + - glog + - hermes-engine - HMSegmentedControl + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React + - React-Codegen - React-Core - React-CoreModules + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric - React-RCTImage - React-RCTText + - React-rendererdebug + - React-rncore + - React-runtimeexecutor + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - ReactNativeNavigation/Core (= 8.0.0-snapshot.1658) + - Yoga - ReactNativeNavigation/Core (8.0.0-snapshot.1658): + - DoubleConversion + - glog + - hermes-engine - HMSegmentedControl + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React + - React-Codegen - React-Core - React-CoreModules + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric - React-RCTImage - React-RCTText + - React-rendererdebug + - React-rncore + - React-runtimeexecutor + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - RNCAsyncStorage (2.2.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - RNGestureHandler (2.24.0): - DoubleConversion - glog @@ -1692,6 +1938,29 @@ PODS: - ReactCommon/turbomodule/core - Yoga - RNScreens (4.5.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.5.0) + - Yoga + - RNScreens/common (4.5.0): - DoubleConversion - glog - hermes-engine @@ -1811,6 +2080,7 @@ SPEC REPOS: - HMSegmentedControl - KSCrash - OpenTelemetry-Swift-Api + - React-Codegen - SocketRocket EXTERNAL SOURCES: @@ -1966,18 +2236,18 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - DatadogCore: 106d2aa8bef1a3dfb2a75723240f78cb5f8310fd - DatadogCrashReporting: eace5202ae63d92835718cf4a86489fdaef681a3 - DatadogFlags: 0587c5b5db34874ce22264abc5e03102b53d3656 - DatadogInternal: 00709affd9889ca9e8fd96e85e39ad865e651c32 - DatadogLogs: ef98708261f8f7ba82d15360f9951d43f578163b - DatadogRUM: 67d130164f4a7663e05a3d02803be9e9dd1abbb7 - DatadogSDKReactNative: 66576d6b653154697cd96fc31dfecd02422bf269 - DatadogSDKReactNativeSessionReplay: 94e5cbbc90418341a6747990c669f824a3ea9b5f - DatadogSDKReactNativeWebView: 9b0dc689690db585965c968a5798086b742ae212 - DatadogSessionReplay: 23107da4c61d0c84435efc6111929d562988045b - DatadogTrace: 17f50647107755fba79fc2298bf4cb282e0efb1f - DatadogWebViewTracking: 1290fce6010bf65b5e0e0ffa9048b448782e469c + DatadogCore: 7eed8fbaaa1575503c389f343c230858343c8baf + DatadogCrashReporting: 04f3c3a5bfd9921aef4d44b4ab80accb39c84ddb + DatadogFlags: 033cf48e769c271843e77068c015519880011866 + DatadogInternal: e5a4652ee266986e29c6b8491aff7f78dc3b731d + DatadogLogs: 52792add5827042f619771a23656e2bfb6b0f4e7 + DatadogRUM: b78d608e013f39c5679ed31ad97dad323c6113e8 + DatadogSDKReactNative: 733c81b0d491bba08e7e831bc17edcc07c10ae70 + DatadogSDKReactNativeSessionReplay: 7474aa7182d99ecc2ebf794a9708dde6ae6d9be4 + DatadogSDKReactNativeWebView: f1dcab75cd9feb9ab3c64e0511199923d3241b52 + DatadogSessionReplay: 932b2077b1a5367de1450479d72093621b9fd618 + DatadogTrace: 5ef84e254e2e1d337bc52e0cdf16396ca102aeb1 + DatadogWebViewTracking: e0470157f55a83680a549d79ba2985e0d17465db DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45 @@ -1985,71 +2255,72 @@ SPEC CHECKSUMS: glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11 HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352 - KSCrash: 80e1e24eaefbe5134934ae11ca8d7746586bc2ed - OpenTelemetry-Swift-Api: 3d77582ab6837a63b65bf7d2eacc57d8f2595edd - RCT-Folly: 7b4f73a92ad9571b9dbdb05bb30fad927fa971e1 + KSCrash: 8c4464fd5da7de520f2ce4a00fdf63f169a80f18 + OpenTelemetry-Swift-Api: 3be9043f6288eb4ac3cbe7548b5bd45fb4ed5849 + RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17 RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83 RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716 RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea - React-Core: 0a06707a0b34982efc4a556aff5dae4b22863455 - React-CoreModules: 907334e94314189c2e5eed4877f3efe7b26d85b0 - React-cxxreact: 3a1d5e8f4faa5e09be26614e9c8bbcae8d11b73d + React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a + React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245 + React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c + React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964 - React-defaultsnativemodule: a965cb39fb0a79276ab611793d39f52e59a9a851 - React-domnativemodule: d647f94e503c62c44f54291334b1aa22a30fa08b - React-Fabric: 64586dc191fc1c170372a638b8e722e4f1d0a09b - React-FabricComponents: b0ebd032387468ea700574c581b139f57a7497fb - React-FabricImage: 81f0e0794caf25ad1224fa406d288fbc1986607f + React-defaultsnativemodule: 18a684542f82ce1897552a1c4b847be414c9566e + React-domnativemodule: 90bdd4ec3ab38c47cfc3461c1e9283a8507d613f + React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b + React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520 + React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576 React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c - React-featureflagsnativemodule: 95a02d895475de8ace78fedd76143866838bb720 - React-graphics: cbebe910e4a15b65b0bff94a4d3ed278894d6386 - React-hermes: ec18c10f5a69d49fb9b5e17ae95494e9ea13d4d3 - React-idlecallbacksnativemodule: 0c1ae840cc5587197cd926a3cb76828ad059d116 - React-ImageManager: f2a4c01c2ccb2193e60a20c135da74c7ca4d36f2 - React-jserrorhandler: 61d205b5a7cbc57fed3371dd7eed48c97f49fc64 - React-jsi: 95f7676103137861b79b0f319467627bcfa629ee - React-jsiexecutor: 41e0fe87cda9ea3970ffb872ef10f1ff8dbd1932 - React-jsinspector: 15578208796723e5c6f39069b6e8bf36863ef6e2 - React-jsitracing: 3758cdb155ea7711f0e77952572ea62d90c69f0b - React-logger: dbca7bdfd4aa5ef69431362bde6b36d49403cb20 - React-Mapbuffer: 6efad4a606c1fae7e4a93385ee096681ef0300dc - React-microtasksnativemodule: 8732b71aa66045da4bb341ddee1bb539f71e5f38 - react-native-crash-tester: 3ffaa64141427ca362079cb53559fe9a532487ae - react-native-safe-area-context: 04803a01f39f31cc6605a5531280b477b48f8a88 - react-native-webview: 1e12de2fad74c17b4f8b1b53ebd1e3baa0148d71 + React-featureflagsnativemodule: 742a8325b3c821d2a1ca13a6d2a0fc72d04555e0 + React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121 + React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf + React-idlecallbacksnativemodule: d61d9c9816131bf70d3d80cd04889fc625ee523f + React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020 + React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6 + React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d + React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893 + React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086 + React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f + React-logger: c4052eb941cca9a097ef01b59543a656dc088559 + React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de + React-microtasksnativemodule: d80ff86c8902872d397d9622f1a97aadcc12cead + react-native-crash-tester: 48bde9d6f5256c61ef2e0c52dfc74256b26e55eb + react-native-safe-area-context: 60695fadbcee6ab51b28b835abb10ea983dbe181 + react-native-webview: c22f2daa3134c9e5b26ab4b47bde9f0df9093086 React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678 - React-NativeModulesApple: 958d4f6c5c2ace4c0f427cf7ef82e28ae6538a22 - React-perflogger: 9b4f13c0afe56bc7b4a0e93ec74b1150421ee22d - React-performancetimeline: 359db1cb889aa0282fafc5838331b0987c4915a9 + React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e + React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358 + React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342 - React-RCTAnimation: d8c82deebebe3aaf7a843affac1b57cb2dc073d4 - React-RCTAppDelegate: 6c0377d9c4058773ea7073bb34bb9ebd6ddf5a84 - React-RCTBlob: 70a58c11a6a3500d1a12f2e51ca4f6c99babcff8 - React-RCTFabric: 7eb6dd2c8fda98cb860a572e3f4e4eb60d62c89e - React-RCTImage: 5e9d655ba6a790c31e3176016f9b47fd0978fbf0 - React-RCTLinking: 2a48338252805091f7521eaf92687206401bdf2a - React-RCTNetwork: 0c1282b377257f6b1c81934f72d8a1d0c010e4c3 - React-RCTSettings: f757b679a74e5962be64ea08d7865a7debd67b40 - React-RCTText: e7d20c490b407d3b4a2daa48db4bcd8ec1032af2 - React-RCTVibration: 8228e37144ca3122a91f1de16ba8e0707159cfec + React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585 + React-RCTAppDelegate: 345a6f1b82abc578437df0ce7e9c48740eca827c + React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6 + React-RCTFabric: 007b1a98201cc49b5bc6e1417d7fe3f6fc6e2b78 + React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8 + React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa + React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7 + React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223 + React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf + React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78 React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6 - React-rendererdebug: 81becbc8852b38d9b1b68672aa504556481330d5 + React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74 - React-RuntimeApple: 52ed0e9e84a7c2607a901149fb13599a3c057655 - React-RuntimeCore: ca6189d2e53d86db826e2673fe8af6571b8be157 + React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd + React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899 - React-RuntimeHermes: 3b752dc5d8a1661c9d1687391d6d96acfa385549 - React-runtimescheduler: 8321bb09175ace2a4f0b3e3834637eb85bf42ebe + React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385 + React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9 - React-utils: 54df9ada708578c8ad40d92895d6fed03e0e8a9e - ReactCodegen: 21a52ccddc6479448fc91903a437dd23ddc7366c - ReactCommon: bfd3600989d79bc3acbe7704161b171a1480b9fd - ReactNativeNavigation: 50c1eef68b821e7265eff3a391d27ed18fdce459 - RNCAsyncStorage: 23e56519cc41d3bade3c8d4479f7760cb1c11996 - RNGestureHandler: 950dfa674dbf481460ca389c65b9036ac4ab8ada - RNScreens: 606ab1cf68162f7ba0d049a31f2a84089a6fffb4 + React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f + ReactCodegen: f853a20cc9125c5521c8766b4b49375fec20648b + ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9 + ReactNativeNavigation: 3cba7b34997204db62b2a48d528a915ea29330c4 + RNCAsyncStorage: 87a74d13ba0128f853817e45e21c4051e1f2cd45 + RNGestureHandler: 92c39001ed1490dc416a90f9632d42dc8a5acee7 + RNScreens: c7c659490e59cb0887cb098a9c9e9431392c05b2 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a diff --git a/packages/core/DatadogSDKReactNative.podspec b/packages/core/DatadogSDKReactNative.podspec index 9fa6f9b59..e04f5fc2e 100644 --- a/packages/core/DatadogSDKReactNative.podspec +++ b/packages/core/DatadogSDKReactNative.podspec @@ -19,15 +19,15 @@ Pod::Spec.new do |s| s.dependency "React-Core" # /!\ Remember to keep the versions in sync with DatadogSDKReactNativeSessionReplay.podspec - s.dependency 'DatadogCore', '3.11.0' - s.dependency 'DatadogLogs', '3.11.0' - s.dependency 'DatadogTrace', '3.11.0' - s.dependency 'DatadogRUM', '3.11.0' - s.dependency 'DatadogCrashReporting', '3.11.0' - s.dependency 'DatadogFlags', '3.11.0' + s.dependency 'DatadogCore', '3.16.0' + s.dependency 'DatadogLogs', '3.16.0' + s.dependency 'DatadogTrace', '3.16.0' + s.dependency 'DatadogRUM', '3.16.0' + s.dependency 'DatadogCrashReporting', '3.16.0' + s.dependency 'DatadogFlags', '3.16.0' # DatadogWebViewTracking is not available for tvOS - s.ios.dependency 'DatadogWebViewTracking', '3.11.0' + s.ios.dependency 'DatadogWebViewTracking', '3.16.0' s.test_spec 'Tests' do |test_spec| test_spec.source_files = 'ios/Tests/**/*.{swift,json}' diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt index 48a7a27a0..d3198a2a3 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfiguration.kt @@ -66,6 +66,7 @@ data class DdSdkConfiguration( * @param telemetrySampleRate The sample rate (between 0 and 100) of telemetry events. * @param customEndpoint Custom RUM intake endpoint used to override the default Datadog intake. * @param timeseries Experimental: configuration for memory and CPU timeseries collection. + * A non-null value enables timeseries collection. */ data class RumConfiguration( val applicationId: String, @@ -91,14 +92,11 @@ data class RumConfiguration( * Experimental: configuration for memory and CPU timeseries collection. * Requires a native SDK build with timeseries support. * - * @param enabled Enables collection of memory and CPU timeseries events. - * @param bufferSize The number of samples collected before a timeseries batch is flushed. - * @param intervalMs The sampling interval in milliseconds. + * @param collectTypes The types of timeseries data to collect ("cpu", "memory"). + * Defaults to collecting all supported types when omitted. */ data class TimeseriesConfiguration( - val enabled: Boolean, - val bufferSize: Double? = null, - val intervalMs: Double? = null + val collectTypes: List? = null ) /** @@ -174,13 +172,11 @@ internal data class JSONRumConfiguration( val trackMemoryWarnings: Boolean? = null, val telemetrySampleRate: Double? = null, val customEndpoint: String? = null, - val timeseries: JSONTimeseriesConfiguration? = null + val unstable_timeseries: JSONTimeseriesConfiguration? = null ) internal data class JSONTimeseriesConfiguration( - val enabled: Boolean? = null, - val bufferSize: Double? = null, - val intervalMs: Double? = null + val collectTypes: List? = null ) internal data class JSONLogsConfiguration( diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt index 7aa6b754d..f933aa16b 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkConfigurationExt.kt @@ -46,7 +46,7 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { initialResourceThreshold = rm.getDoubleOrNull("initialResourceThreshold"), telemetrySampleRate = rm.getDoubleOrNull("telemetrySampleRate"), customEndpoint = rm.getString("customEndpoint"), - timeseries = rm.getMap("timeseries")?.asTimeseriesConfiguration() + timeseries = rm.getMap("unstable_timeseries")?.asTimeseriesConfiguration() ) } @@ -89,9 +89,7 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { internal fun ReadableMap.asTimeseriesConfiguration(): TimeseriesConfiguration { return TimeseriesConfiguration( - enabled = getBooleanOrNull("enabled") ?: false, - bufferSize = getDoubleOrNull("bufferSize"), - intervalMs = getDoubleOrNull("intervalMs") + collectTypes = getArray("collectTypes")?.toArrayList()?.filterIsInstance() ) } @@ -197,7 +195,7 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { telemetrySampleRate = rum.telemetrySampleRate?.toDouble() ?: DefaultConfiguration.telemetrySampleRate, customEndpoint = rum.customEndpoint, - timeseries = rum.timeseries?.asTimeseriesConfiguration() + timeseries = rum.unstable_timeseries?.asTimeseriesConfiguration() ) } @@ -241,9 +239,7 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { internal fun JSONTimeseriesConfiguration.asTimeseriesConfiguration(): TimeseriesConfiguration { return TimeseriesConfiguration( - enabled = this.enabled ?: false, - bufferSize = this.bufferSize, - intervalMs = this.intervalMs + collectTypes = this.collectTypes ) } @@ -351,10 +347,12 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { rum.customEndpoint?.let { rumMap.putString("customEndpoint", it) } rum.timeseries?.let { timeseries -> val timeseriesMap = WritableNativeMap() - timeseriesMap.putBoolean("enabled", timeseries.enabled) - timeseries.bufferSize?.let { timeseriesMap.putDouble("bufferSize", it) } - timeseries.intervalMs?.let { timeseriesMap.putDouble("intervalMs", it) } - rumMap.putMap("timeseries", timeseriesMap) + timeseries.collectTypes?.let { types -> + val typesArray = WritableNativeArray() + types.forEach { typesArray.pushString(it) } + timeseriesMap.putArray("collectTypes", typesArray) + } + rumMap.putMap("unstable_timeseries", timeseriesMap) } map.putMap("rumConfiguration", rumMap) diff --git a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt index 8e92e111a..2132a78f2 100644 --- a/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt +++ b/packages/core/android/src/main/kotlin/com/datadog/reactnative/DdSdkNativeInitialization.kt @@ -29,6 +29,7 @@ import com.datadog.android.rum.metric.networksettled.TimeBasedInitialResourceIde import com.datadog.android.rum.model.ActionEvent import com.datadog.android.rum.model.ResourceEvent import com.datadog.android.rum.timeseries.TimeseriesConfiguration as NativeTimeseriesConfiguration +import com.datadog.android.rum.timeseries.TimeseriesType as NativeTimeseriesType import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy import com.datadog.android.telemetry.model.TelemetryConfigurationEvent import com.datadog.android.trace.Trace @@ -270,17 +271,23 @@ class DdSdkNativeInitialization internal constructor( configBuilder: RumConfiguration.Builder, timeseries: TimeseriesConfiguration ) { - if (!timeseries.enabled) { - return - } - val nativeConfigBuilder = NativeTimeseriesConfiguration.Builder() - timeseries.bufferSize?.let { nativeConfigBuilder.setBufferSize(it.toInt()) } - timeseries.intervalMs?.let { nativeConfigBuilder.setIntervalMs(it.toLong()) } + val collectTypes = timeseries.collectTypes?.mapNotNull { it.asTimeseriesType() } + if (collectTypes != null) { + nativeConfigBuilder.collectOnly(*collectTypes.toTypedArray()) + } configBuilder.setTimeseriesConfiguration(nativeConfigBuilder.build()) } + private fun String.asTimeseriesType(): NativeTimeseriesType? { + return when (lowercase(Locale.US)) { + "cpu" -> NativeTimeseriesType.CPU + "memory" -> NativeTimeseriesType.MEMORY + else -> null + } + } + private fun buildLogsConfiguration(configuration: DdSdkConfiguration): LogsConfiguration { val configBuilder = LogsConfiguration.Builder() configuration.logsConfiguration?.customEndpoint?.let { diff --git a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt index ad8799c9c..81bd926c2 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkNativeInitializationTest.kt @@ -144,8 +144,9 @@ internal class DdSdkNativeInitializationTest { "[B3MULTI, TRACECONTEXT]" ) assertThat(configuration.rumConfiguration?.initialResourceThreshold).isEqualTo(0.5) - assertThat(configuration.rumConfiguration?.timeseries?.enabled).isEqualTo(true) - assertThat(configuration.rumConfiguration?.timeseries?.bufferSize).isEqualTo(15.0) + assertThat(configuration.rumConfiguration?.timeseries?.collectTypes).isEqualTo( + listOf("cpu") + ) } @Test diff --git a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt index 5c4538e0b..dc49bbb76 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/reactnative/DdSdkTest.kt @@ -30,6 +30,7 @@ import com.datadog.android.rum.configuration.VitalsUpdateFrequency import com.datadog.android.rum.metric.networksettled.TimeBasedInitialResourceIdentifier import com.datadog.android.rum.model.ActionEvent import com.datadog.android.rum.model.ResourceEvent +import com.datadog.android.rum.timeseries.TimeseriesType import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy import com.datadog.android.telemetry.model.TelemetryConfigurationEvent import com.datadog.android.trace.Trace @@ -2374,7 +2375,7 @@ internal class DdSdkTest { ) { // Given val rumConfiguration = configuration.rumConfiguration?.copy( - timeseries = TimeseriesConfiguration(enabled = true, bufferSize = 15.0) + timeseries = TimeseriesConfiguration(collectTypes = listOf("cpu")) ) val bridgeConfiguration = configuration.copy( rumConfiguration = rumConfiguration @@ -2410,7 +2411,7 @@ internal class DdSdkTest { assertThat(rumConfigCaptor.firstValue) .hasField("featureConfiguration") { it.hasField("timeseriesConfiguration") { ts -> - ts.hasFieldEqualTo("bufferSize", 15) + ts.hasFieldEqualTo("enabledTypes", setOf(TimeseriesType.CPU)) } } } finally { diff --git a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt index 1280b40a2..5726fee1c 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/DdSdkConfigurationExt.kt @@ -68,7 +68,7 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { rumMap["initialResourceThreshold"] = rum?.initialResourceThreshold ?: 0.1 rumMap["telemetrySampleRate"] = rum?.telemetrySampleRate ?: 20.0 rum?.customEndpoint?.let { rumMap["customEndpoint"] = it } - rum?.timeseries?.let { rumMap["timeseries"] = it.toReadableMap() } + rum?.timeseries?.let { rumMap["unstable_timeseries"] = it.toReadableMap() } map["rumConfiguration"] = rumMap.toReadableMap() } @@ -97,9 +97,7 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { internal fun TimeseriesConfiguration.toReadableMap(): ReadableMap { val map = mutableMapOf() - map["enabled"] = enabled - bufferSize?.let { map["bufferSize"] = it } - intervalMs?.let { map["intervalMs"] = it } + collectTypes?.let { map["collectTypes"] = it.toReadableArray() } return map.toReadableMap() } diff --git a/packages/core/android/src/test/resources/input/complete-configuration.json b/packages/core/android/src/test/resources/input/complete-configuration.json index 0c2a1ad56..7ede39d02 100644 --- a/packages/core/android/src/test/resources/input/complete-configuration.json +++ b/packages/core/android/src/test/resources/input/complete-configuration.json @@ -30,9 +30,10 @@ "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false, - "timeseries": { - "enabled": true, - "bufferSize": 15 + "unstable_timeseries": { + "collectTypes": [ + "cpu" + ] }, "firstPartyHosts": [ { diff --git a/packages/core/datadog-configuration.schema.json b/packages/core/datadog-configuration.schema.json index 43e55c17c..65a470417 100644 --- a/packages/core/datadog-configuration.schema.json +++ b/packages/core/datadog-configuration.schema.json @@ -263,26 +263,23 @@ "description": "Target a custom server for RUM.", "type": "string" }, - "timeseries": { - "description": "Experimental: configuration for memory and CPU timeseries collection. Requires a native SDK build with timeseries support.", + "unstable_timeseries": { + "description": "Experimental: configuration for memory and CPU timeseries collection. Requires a native SDK build with timeseries support. Presence of this object enables timeseries collection.", "type": "object", "properties": { - "enabled": { - "description": "Enables collection of memory and CPU timeseries events.", - "type": "boolean" - }, - "bufferSize": { - "description": "The number of samples collected before a timeseries batch is flushed. iOS and Android only.", - "type": "integer" - }, - "intervalMs": { - "description": "The sampling interval in milliseconds. Android only.", - "type": "integer" + "collectTypes": { + "description": "The types of timeseries data to collect. Defaults to collecting all supported types when omitted.", + "type": "array", + "items": { + "description": "Type of timeseries data to collect.", + "type": "string", + "enum": [ + "cpu", + "memory" + ] + } } - }, - "required": [ - "enabled" - ] + } } }, "required": [ diff --git a/packages/core/ios/Sources/DdSdkConfiguration.swift b/packages/core/ios/Sources/DdSdkConfiguration.swift index 7b6b4bf49..326fa4d78 100644 --- a/packages/core/ios/Sources/DdSdkConfiguration.swift +++ b/packages/core/ios/Sources/DdSdkConfiguration.swift @@ -105,7 +105,8 @@ public class DdSdkConfiguration: NSObject { /// - customEndpoint: A custom RUM intake endpoint to override the default Datadog intake. /// - enableTimeseries: Experimental: enables collection of memory and CPU timeseries events. /// Requires a native SDK build with timeseries support. -/// - timeseriesBatchSize: The number of samples collected before a timeseries batch is flushed. +/// - timeseriesCollectTypes: The types of timeseries data to collect ("cpu", "memory"). +/// Nil collects all supported types. public class RumConfiguration: NSObject { public var applicationId: String = "" public var trackFrustrations: Bool? = true @@ -126,7 +127,7 @@ public class RumConfiguration: NSObject { public var telemetrySampleRate: Double? = nil public var customEndpoint: String? = nil public var enableTimeseries: Bool? = nil - public var timeseriesBatchSize: Double? = nil + public var timeseriesCollectTypes: [String]? = nil init( applicationId: String, @@ -148,7 +149,7 @@ public class RumConfiguration: NSObject { telemetrySampleRate: Double?, customEndpoint: String?, enableTimeseries: Bool? = nil, - timeseriesBatchSize: Double? = nil + timeseriesCollectTypes: [String]? = nil ) { self.applicationId = applicationId self.trackFrustrations = trackFrustrations @@ -169,7 +170,7 @@ public class RumConfiguration: NSObject { self.telemetrySampleRate = telemetrySampleRate self.customEndpoint = customEndpoint self.enableTimeseries = enableTimeseries - self.timeseriesBatchSize = timeseriesBatchSize + self.timeseriesCollectTypes = timeseriesCollectTypes } } diff --git a/packages/core/ios/Sources/DdSdkNativeInitialization.swift b/packages/core/ios/Sources/DdSdkNativeInitialization.swift index 34d666c65..8c32828ed 100644 --- a/packages/core/ios/Sources/DdSdkNativeInitialization.swift +++ b/packages/core/ios/Sources/DdSdkNativeInitialization.swift @@ -8,7 +8,7 @@ import DatadogCore import DatadogCrashReporting import DatadogInternal import DatadogLogs -import DatadogRUM +@_spi(Experimental) import DatadogRUM import DatadogTrace import Foundation import React @@ -198,7 +198,7 @@ public class DdSdkNativeInitialization: NSObject { threshold: initialThreshold) } - return RUM.Configuration( + var configuration = RUM.Configuration( applicationID: rumConfig.applicationId, sessionSampleRate: Float( rumConfig.sessionSampleRate ?? DefaultConfiguration.sessionSamplingRate), @@ -236,12 +236,24 @@ public class DdSdkNativeInitialization: NSObject { trackMemoryWarnings: rumConfig.trackMemoryWarnings ?? DefaultConfiguration.trackMemoryWarnings, telemetrySampleRate: Float( - rumConfig.telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate), - enableTimeseries: rumConfig.enableTimeseries - ?? DefaultConfiguration.enableTimeseries, - timeseriesBatchSize: Int( - rumConfig.timeseriesBatchSize ?? DefaultConfiguration.timeseriesBatchSize) + rumConfig.telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate) ) + + if rumConfig.enableTimeseries ?? false { + let collectTypes: [TimeseriesType]? = rumConfig.timeseriesCollectTypes?.compactMap { + switch $0.lowercased() { + case "cpu": + return .cpu + case "memory": + return .memory + default: + return nil + } + } + configuration.timeseries = Timeseries(collectTypes: collectTypes) + } + + return configuration } func buildLogsConfiguration(configuration: DdSdkConfiguration) -> Logs.Configuration { diff --git a/packages/core/ios/Sources/RNDdSdkConfiguration.swift b/packages/core/ios/Sources/RNDdSdkConfiguration.swift index 616cb6364..963ee2464 100644 --- a/packages/core/ios/Sources/RNDdSdkConfiguration.swift +++ b/packages/core/ios/Sources/RNDdSdkConfiguration.swift @@ -71,9 +71,9 @@ extension NSDictionary { let telemetrySampleRate = rumDict["telemetrySampleRate"] as? Double let customEndpoint = rumDict["customEndpoint"] as? String - let timeseriesDict = rumDict["timeseries"] as? NSDictionary - let enableTimeseries = timeseriesDict?["enabled"] as? Bool - let timeseriesBatchSize = timeseriesDict?["bufferSize"] as? Double + let timeseriesDict = rumDict["unstable_timeseries"] as? NSDictionary + let enableTimeseries = timeseriesDict != nil + let timeseriesCollectTypes = timeseriesDict?["collectTypes"] as? [String] rumConfiguration = RumConfiguration( applicationId: applicationId, @@ -103,9 +103,8 @@ extension NSDictionary { telemetrySampleRate: telemetrySampleRate ?? DefaultConfiguration.telemetrySampleRate, customEndpoint: customEndpoint, - enableTimeseries: enableTimeseries ?? DefaultConfiguration.enableTimeseries, - timeseriesBatchSize: timeseriesBatchSize - ?? DefaultConfiguration.timeseriesBatchSize + enableTimeseries: enableTimeseries, + timeseriesCollectTypes: timeseriesCollectTypes ) } else { rumConfiguration = nil @@ -291,8 +290,6 @@ internal struct DefaultConfiguration { static let bundleLogsWithTraces = true static let trackWatchdogTerminations = false static let trackMemoryWarnings = true - static let enableTimeseries = false - static let timeseriesBatchSize = 120.0 } extension Dictionary where Key == String, Value == AnyObject { @@ -366,14 +363,9 @@ extension Dictionary where Key == String, Value == AnyObject { let firstPartyHosts = firstPartyHostsArray?.asFirstPartyHosts() ?? DefaultConfiguration.firstPartyHosts - let timeseriesDict = rum["timeseries"] as? [String: Any?] - let enableTimeseries = timeseriesDict?["enabled"] as? Bool - let timeseriesBatchSizeRaw = timeseriesDict?["bufferSize"] - let timeseriesBatchSize: Double? = { - if let v = timeseriesBatchSizeRaw as? Double { return v } - if let v = timeseriesBatchSizeRaw as? Int { return Double(v) } - return nil - }() + let timeseriesDict = rum["unstable_timeseries"] as? [String: Any?] + let enableTimeseries = timeseriesDict != nil + let timeseriesCollectTypes = timeseriesDict?["collectTypes"] as? [String] rumConfiguration = RumConfiguration( applicationId: applicationId, @@ -406,9 +398,8 @@ extension Dictionary where Key == String, Value == AnyObject { telemetrySampleRate: (rum["telemetrySampleRate"] as? Double) ?? DefaultConfiguration.telemetrySampleRate, customEndpoint: rum["customEndpoint"] as? String, - enableTimeseries: enableTimeseries ?? DefaultConfiguration.enableTimeseries, - timeseriesBatchSize: timeseriesBatchSize - ?? DefaultConfiguration.timeseriesBatchSize + enableTimeseries: enableTimeseries, + timeseriesCollectTypes: timeseriesCollectTypes ) } else { rumConfiguration = nil diff --git a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift index 54c6a384f..49038200b 100644 --- a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift +++ b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift @@ -67,7 +67,7 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.rumConfiguration?.firstPartyHosts, expectedFirstPartyHosts) XCTAssertEqual(configuration?.rumConfiguration?.initialResourceThreshold, 0.5) XCTAssertEqual(configuration?.rumConfiguration?.enableTimeseries, true) - XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 15.0) + XCTAssertEqual(configuration?.rumConfiguration?.timeseriesCollectTypes, ["cpu"]) } func testReturnsConfigurationWithMinimalData() { @@ -107,7 +107,7 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.rumConfiguration?.firstPartyHosts, expectedFirstPartyHosts) XCTAssertEqual(configuration?.rumConfiguration?.initialResourceThreshold, nil) XCTAssertEqual(configuration?.rumConfiguration?.enableTimeseries, false) - XCTAssertEqual(configuration?.rumConfiguration?.timeseriesBatchSize, 120.0) + XCTAssertNil(configuration?.rumConfiguration?.timeseriesCollectTypes) } func testPrintsMessageWithIncorrectFile() { diff --git a/packages/core/ios/Tests/DdSdkTests.swift b/packages/core/ios/Tests/DdSdkTests.swift index 70e7add7d..b53dc8d5d 100644 --- a/packages/core/ios/Tests/DdSdkTests.swift +++ b/packages/core/ios/Tests/DdSdkTests.swift @@ -1052,29 +1052,27 @@ class DdSdkTests: XCTestCase { func testBuildConfigurationEnabledTimeseries() { let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() rumConfiguration.enableTimeseries = true - rumConfiguration.timeseriesBatchSize = 15.0 + rumConfiguration.timeseriesCollectTypes = ["cpu"] let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( configuration: configuration ) - XCTAssertEqual(ddConfig.enableTimeseries, true) - XCTAssertEqual(ddConfig.timeseriesBatchSize, 15) + XCTAssertEqual(ddConfig.timeseries?.collectTypes, [.cpu]) } func testBuildConfigurationDisabledTimeseriesByDefault() { let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() rumConfiguration.enableTimeseries = nil - rumConfiguration.timeseriesBatchSize = nil + rumConfiguration.timeseriesCollectTypes = nil let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( configuration: configuration ) - XCTAssertEqual(ddConfig.enableTimeseries, false) - XCTAssertEqual(ddConfig.timeseriesBatchSize, 120) + XCTAssertNil(ddConfig.timeseries) } func testBuildConfigurationAverageUploadFrequency() { @@ -1811,7 +1809,7 @@ func makeDefaultRumConfiguration() -> RumConfiguration { telemetrySampleRate: 45.0, customEndpoint: nil, enableTimeseries: nil, - timeseriesBatchSize: nil + timeseriesCollectTypes: nil ) } @@ -1938,7 +1936,7 @@ extension NSDictionary { rumConfig["nativeInteractionTracking"] = rumConfiguration?["nativeInteractionTracking"] rumConfig["customEndpoint"] = rumConfiguration?["customEndpoint"] rumConfig["trackFrustrations"] = rumConfiguration?["trackFrustrations"] - rumConfig["timeseries"] = rumConfiguration?["timeseries"] + rumConfig["unstable_timeseries"] = rumConfiguration?["unstable_timeseries"] logsConfig["bundleLogsWithRum"] = logsConfiguration?["bundleLogsWithRum"] logsConfig["bundleLogsWithTraces"] = logsConfiguration?["bundleLogsWithTraces"] diff --git a/packages/core/ios/Tests/Fixtures/complete-configuration.json b/packages/core/ios/Tests/Fixtures/complete-configuration.json index 4123ee324..ba835ed4c 100644 --- a/packages/core/ios/Tests/Fixtures/complete-configuration.json +++ b/packages/core/ios/Tests/Fixtures/complete-configuration.json @@ -30,9 +30,10 @@ "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false, - "timeseries": { - "enabled": true, - "bufferSize": 15 + "unstable_timeseries": { + "collectTypes": [ + "cpu" + ] }, "firstPartyHosts": [ { diff --git a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts index 9e398986c..a485af4f8 100644 --- a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts +++ b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts @@ -71,7 +71,6 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, - "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": true, @@ -80,6 +79,7 @@ describe('DdSdkReactNativeConfiguration', () => { "trackNonFatalAnrs": undefined, "trackResources": false, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, @@ -216,7 +216,6 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 80, "sessionSampleRate": 80, "telemetrySampleRate": 20, - "timeseries": undefined, "trackBackgroundEvents": true, "trackErrors": true, "trackFrustrations": true, @@ -225,6 +224,7 @@ describe('DdSdkReactNativeConfiguration', () => { "trackNonFatalAnrs": true, "trackResources": true, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, @@ -320,7 +320,6 @@ describe('DdSdkReactNativeConfiguration', () => { "resourceTraceSampleRate": 0, "sessionSampleRate": 0, "telemetrySampleRate": 0, - "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": false, @@ -329,6 +328,7 @@ describe('DdSdkReactNativeConfiguration', () => { "trackNonFatalAnrs": false, "trackResources": false, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": false, "vitalsUpdateFrequency": "AVERAGE", }, diff --git a/packages/core/src/config/FileBasedConfiguration.ts b/packages/core/src/config/FileBasedConfiguration.ts index 939e1bed1..74eb45634 100644 --- a/packages/core/src/config/FileBasedConfiguration.ts +++ b/packages/core/src/config/FileBasedConfiguration.ts @@ -207,7 +207,8 @@ export const getJSONConfiguration = ( configuration.rumConfiguration.telemetrySampleRate, nativeInteractionTracking: configuration.rumConfiguration.nativeInteractionTracking, - timeseries: configuration.rumConfiguration.timeseries + unstable_timeseries: + configuration.rumConfiguration.unstable_timeseries } }), ...(configuration.traceConfiguration !== undefined && { diff --git a/packages/core/src/config/FileBasedConfiguration.type.ts b/packages/core/src/config/FileBasedConfiguration.type.ts index e2a546938..0ddfd6aa0 100644 --- a/packages/core/src/config/FileBasedConfiguration.type.ts +++ b/packages/core/src/config/FileBasedConfiguration.type.ts @@ -55,7 +55,7 @@ export interface JsonConfiguration extends CoreConfigurationOptions { trackWatchdogTerminations?: boolean; vitalsUpdateFrequency?: VitalsUpdateFrequency; telemetrySampleRate?: number; - timeseries?: TimeseriesConfiguration; + unstable_timeseries?: TimeseriesConfiguration; }; traceConfiguration?: { customEndpoint?: string; diff --git a/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts b/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts index bc17f47dd..1a26fea8b 100644 --- a/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts +++ b/packages/core/src/config/__tests__/FileBasedConfiguration.test.ts @@ -65,10 +65,6 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, - "timeseries": { - "bufferSize": 15, - "enabled": true, - }, "trackBackgroundEvents": true, "trackErrors": true, "trackFrustrations": true, @@ -77,6 +73,11 @@ describe('FileBasedConfiguration', () => { "trackNonFatalAnrs": true, "trackResources": true, "trackWatchdogTerminations": true, + "unstable_timeseries": { + "collectTypes": [ + "cpu", + ], + }, "useAccessibilityLabel": false, "vitalsUpdateFrequency": "NEVER", }, @@ -181,7 +182,6 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, - "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": true, "trackFrustrations": true, @@ -190,6 +190,7 @@ describe('FileBasedConfiguration', () => { "trackNonFatalAnrs": undefined, "trackResources": true, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": false, "vitalsUpdateFrequency": "AVERAGE", }, @@ -246,7 +247,6 @@ describe('FileBasedConfiguration', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, - "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": false, "trackFrustrations": true, @@ -255,6 +255,7 @@ describe('FileBasedConfiguration', () => { "trackNonFatalAnrs": undefined, "trackResources": false, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, diff --git a/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json b/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json index 8e7480f15..05f3d6333 100644 --- a/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json +++ b/packages/core/src/config/__tests__/__fixtures__/configuration-all-fields.json @@ -33,9 +33,10 @@ "trackMemoryWarnings": false, "trackWatchdogTerminations": true, "vitalsUpdateFrequency": "NEVER", - "timeseries": { - "enabled": true, - "bufferSize": 15 + "unstable_timeseries": { + "collectTypes": [ + "cpu" + ] } }, "traceConfiguration": { diff --git a/packages/core/src/config/features/RumConfiguration.ts b/packages/core/src/config/features/RumConfiguration.ts index e701587a7..e4d047c39 100644 --- a/packages/core/src/config/features/RumConfiguration.ts +++ b/packages/core/src/config/features/RumConfiguration.ts @@ -32,7 +32,6 @@ const DEFAULTS = { resourceTraceSampleRate: 100.0, sessionSampleRate: 100.0, telemetrySampleRate: 20.0, - timeseries: undefined, trackBackgroundEvents: false, trackErrors: false, trackFrustrations: true, @@ -41,6 +40,7 @@ const DEFAULTS = { trackNonFatalAnrs: undefined, trackResources: false, trackWatchdogTerminations: false, + unstable_timeseries: undefined, useAccessibilityLabel: true, vitalsUpdateFrequency: VitalsUpdateFrequency.AVERAGE }; @@ -102,9 +102,6 @@ export class RumConfiguration implements RumConfigurationType { // Telemetry Sample Rate public telemetrySampleRate: number = DEFAULTS.telemetrySampleRate; - // Experimental Timeseries Configuration - public timeseries?: TimeseriesConfiguration = DEFAULTS.timeseries; - // Track Background Events Enabled public trackBackgroundEvents: boolean = DEFAULTS.trackBackgroundEvents; @@ -121,6 +118,10 @@ export class RumConfiguration implements RumConfigurationType { public trackWatchdogTerminations: boolean = DEFAULTS.trackWatchdogTerminations; + // Experimental Timeseries Configuration + public unstable_timeseries?: TimeseriesConfiguration = + DEFAULTS.unstable_timeseries; + // Use Accessibility Label enabled for interaction tracking public useAccessibilityLabel: boolean = DEFAULTS.useAccessibilityLabel; diff --git a/packages/core/src/config/features/RumConfiguration.type.ts b/packages/core/src/config/features/RumConfiguration.type.ts index 60c2286aa..5dc72d206 100644 --- a/packages/core/src/config/features/RumConfiguration.type.ts +++ b/packages/core/src/config/features/RumConfiguration.type.ts @@ -116,12 +116,6 @@ export interface RumConfigurationOptions { */ sessionSampleRate?: number; - /** - * Experimental: configuration for memory and CPU timeseries collection. - * Requires a native SDK build with timeseries support. - */ - timeseries?: TimeseriesConfiguration; - /** * Enables tracking of background RUM events. */ @@ -161,6 +155,12 @@ export interface RumConfigurationOptions { * Preferred frequency for collecting mobile vitals. */ vitalsUpdateFrequency?: VitalsUpdateFrequency; + + /** + * Experimental: configuration for memory and CPU timeseries collection. + * Requires a native SDK build with timeseries support. + */ + unstable_timeseries?: TimeseriesConfiguration; } /** diff --git a/packages/core/src/config/features/RumConfigurationNative.ts b/packages/core/src/config/features/RumConfigurationNative.ts index aabce2403..c86d8579d 100644 --- a/packages/core/src/config/features/RumConfigurationNative.ts +++ b/packages/core/src/config/features/RumConfigurationNative.ts @@ -25,5 +25,5 @@ export type RumNativeConfiguration = { readonly telemetrySampleRate: number; readonly customEndpoint: string; readonly firstPartyHosts: { match: string; propagatorTypes: string[] }[]; - readonly timeseries: TimeseriesConfiguration | undefined; + readonly unstable_timeseries: TimeseriesConfiguration | undefined; }; diff --git a/packages/core/src/config/types/TimeseriesConfiguration.ts b/packages/core/src/config/types/TimeseriesConfiguration.ts index 12615b984..cec5a926e 100644 --- a/packages/core/src/config/types/TimeseriesConfiguration.ts +++ b/packages/core/src/config/types/TimeseriesConfiguration.ts @@ -4,25 +4,19 @@ * Copyright 2016-Present Datadog, Inc. */ +/** + * Experimental: the type of timeseries data to collect. + */ +export type TimeseriesType = 'cpu' | 'memory'; + /** * Experimental: configuration for memory and CPU timeseries collection. * Requires a native SDK build with timeseries support. */ export interface TimeseriesConfiguration { /** - * Enables collection of memory and CPU timeseries events. - */ - enabled: boolean; - - /** - * The number of samples collected before a timeseries batch is flushed. - * iOS and Android only. - */ - bufferSize?: number; - - /** - * The sampling interval in milliseconds. - * Android only. + * The types of timeseries data to collect. + * Defaults to collecting all supported types when omitted. */ - intervalMs?: number; + collectTypes?: TimeseriesType[]; } diff --git a/packages/core/src/config/types/index.ts b/packages/core/src/config/types/index.ts index c43632532..2dcdbe243 100644 --- a/packages/core/src/config/types/index.ts +++ b/packages/core/src/config/types/index.ts @@ -8,7 +8,10 @@ export { BatchProcessingLevel } from './BatchProcessingLevel'; export { BatchSize } from './BatchSize'; export { ProxyConfiguration, ProxyType } from './ProxyConfiguration'; export { SdkVerbosity } from './SdkVerbosity'; -export type { TimeseriesConfiguration } from './TimeseriesConfiguration'; +export type { + TimeseriesConfiguration, + TimeseriesType +} from './TimeseriesConfiguration'; export { TrackingConsent } from './TrackingConsent'; export { UploadFrequency } from './UploadFrequency'; export { VitalsUpdateFrequency } from './VitalsUpdateFrequency'; diff --git a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx index 0411aaa39..a045db869 100644 --- a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx +++ b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx @@ -102,7 +102,6 @@ describe('DatadogProvider', () => { "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, - "timeseries": undefined, "trackBackgroundEvents": false, "trackErrors": true, "trackFrustrations": true, @@ -111,6 +110,7 @@ describe('DatadogProvider', () => { "trackNonFatalAnrs": undefined, "trackResources": false, "trackWatchdogTerminations": false, + "unstable_timeseries": undefined, "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, diff --git a/packages/react-native-session-replay/DatadogSDKReactNativeSessionReplay.podspec b/packages/react-native-session-replay/DatadogSDKReactNativeSessionReplay.podspec index e81101d9c..a78a62ca4 100644 --- a/packages/react-native-session-replay/DatadogSDKReactNativeSessionReplay.podspec +++ b/packages/react-native-session-replay/DatadogSDKReactNativeSessionReplay.podspec @@ -22,7 +22,7 @@ Pod::Spec.new do |s| s.dependency "React-Core" # /!\ Remember to keep the version in sync with DatadogSDKReactNative.podspec - s.dependency 'DatadogSessionReplay', '3.11.0' + s.dependency 'DatadogSessionReplay', '3.16.0' s.dependency 'DatadogSDKReactNative' s.test_spec 'Tests' do |test_spec| diff --git a/packages/react-native-webview/DatadogSDKReactNativeWebView.podspec b/packages/react-native-webview/DatadogSDKReactNativeWebView.podspec index 38bca4e66..722e76634 100644 --- a/packages/react-native-webview/DatadogSDKReactNativeWebView.podspec +++ b/packages/react-native-webview/DatadogSDKReactNativeWebView.podspec @@ -23,8 +23,8 @@ Pod::Spec.new do |s| end # /!\ Remember to keep the version in sync with DatadogSDKReactNative.podspec - s.dependency 'DatadogWebViewTracking', '3.11.0' - s.dependency 'DatadogInternal', '3.11.0' + s.dependency 'DatadogWebViewTracking', '3.16.0' + s.dependency 'DatadogInternal', '3.16.0' s.dependency 'DatadogSDKReactNative' s.test_spec 'Tests' do |test_spec|