diff --git a/benchmarks/src/testSetup/testUtils.ts b/benchmarks/src/testSetup/testUtils.ts index 2bd28f913..064349f90 100644 --- a/benchmarks/src/testSetup/testUtils.ts +++ b/benchmarks/src/testSetup/testUtils.ts @@ -9,7 +9,6 @@ import { DatadogProviderConfiguration, DdSdkReactNative, CoreConfiguration, - RumConfiguration, SdkVerbosity, TrackingConsent } from '@datadog/mobile-react-native'; @@ -41,14 +40,19 @@ export const getDatadogProviderConfig = () => { let config = new DatadogProviderConfiguration( baseConfig.clientToken ?? '', baseConfig.env ?? '', - TrackingConsent.GRANTED + TrackingConsent.GRANTED, + { + applicationId: baseConfig.applicationID ?? '', + trackInteractions: true, + trackResources: true, + trackErrors: true, + sessionSampleRate: 100, + nativeCrashReportEnabled: true + } ); config.service = `com.rn.${platform}.benchmark` config.verbosity = SdkVerbosity.DEBUG; - config.nativeCrashReportEnabled = true - config.rumConfiguration = new RumConfiguration(baseConfig.applicationID ?? '', true, true, true); - config.rumConfiguration.sessionSampleRate = 100; return config; }; @@ -58,13 +62,18 @@ export const initializeDatadog = (clientToken?: string, environment?: string, ap const config = new CoreConfiguration( clientToken ?? '', environment ?? '', - TrackingConsent.GRANTED + TrackingConsent.GRANTED, + { + applicationId:appId, + trackInteractions: true, + trackResources: true, + trackErrors: true, + sessionSampleRate: 100, + nativeCrashReportEnabled: true, + } ); config.service = `com.rn.${platform}.benchmark` config.verbosity = SdkVerbosity.DEBUG; - config.nativeCrashReportEnabled = true - config.rumConfiguration = new RumConfiguration(appId ?? '', true, true, true) - config.rumConfiguration.sessionSampleRate = 100; return DdSdkReactNative.initialize(config); }; diff --git a/example/src/ddUtils.tsx b/example/src/ddUtils.tsx index 8c75dea94..5ce44ba77 100644 --- a/example/src/ddUtils.tsx +++ b/example/src/ddUtils.tsx @@ -3,7 +3,6 @@ import { DdLogs, DdSdkReactNative, CoreConfiguration, - RumConfiguration, SdkVerbosity, TrackingConsent } from '@datadog/mobile-react-native'; @@ -16,13 +15,18 @@ export function getDatadogConfig(trackingConsent: TrackingConsent) { CLIENT_TOKEN, ENVIRONMENT, trackingConsent, + { + applicationId: APPLICATION_ID, + trackInteractions: true, + trackResources: true, + trackErrors: true, + sessionSampleRate: 100, + nativeCrashReportEnabled: true + } ); config.service = "com.datadoghq.reactnative.sample" - config.nativeCrashReportEnabled = true config.verbosity = SdkVerbosity.DEBUG; - config.rumConfiguration = new RumConfiguration(APPLICATION_ID, true, true, true); - config.rumConfiguration.sessionSampleRate = 100 return config } @@ -38,13 +42,18 @@ export function initializeDatadog(trackingConsent: TrackingConsent) { const config = new CoreConfiguration( CLIENT_TOKEN, ENVIRONMENT, - trackingConsent + trackingConsent, + { + applicationId: APPLICATION_ID, + trackInteractions: true, + trackResources: true, + trackErrors: true, + sessionSampleRate: 100, + nativeCrashReportEnabled: true + } ) - config.nativeCrashReportEnabled = true config.verbosity = SdkVerbosity.DEBUG; config.service = "com.datadoghq.reactnative.sample" - config.rumConfiguration = new RumConfiguration(APPLICATION_ID, true, true, true); - config.rumConfiguration.sessionSampleRate = 100 DdSdkReactNative.initialize(config).then(() => { DdLogs.info('The RN Sdk was properly initialized') diff --git a/packages/codepush/src/__tests__/index.test.tsx b/packages/codepush/src/__tests__/index.test.tsx index cb2f09ac3..79d659b5b 100644 --- a/packages/codepush/src/__tests__/index.test.tsx +++ b/packages/codepush/src/__tests__/index.test.tsx @@ -286,10 +286,12 @@ describe('AppCenter Codepush integration', () => { const autoInstrumentationConfig = { rumConfiguration: { + useAccessibilityLabel: true, actionNameAttribute: 'test-action-name-attr', trackErrors: true, trackResources: true, - trackInteractions: true + trackInteractions: true, + resourceTraceSampleRate: 100 }, firstPartyHosts: [ { @@ -297,11 +299,8 @@ describe('AppCenter Codepush integration', () => { propagatorTypes: [PropagatorType.DATADOG] } ], - useAccessibilityLabel: true, logsConfiguration: {}, - traceConfiguration: { - resourceTraceSampleRate: 100 - } + traceConfiguration: {} }; const configuration = new FileBasedConfiguration({ @@ -320,27 +319,26 @@ describe('AppCenter Codepush integration', () => { DdSdkReactNative._enableFeaturesFromDatadogProvider ).toHaveBeenCalledWith({ rumConfiguration: { + useAccessibilityLabel: true, actionNameAttribute: 'test-action-name-attr', actionEventMapper: null, resourceEventMapper: null, errorEventMapper: null, trackErrors: true, trackResources: true, - trackInteractions: true + trackInteractions: true, + resourceTraceSampleRate: 100 }, logsConfiguration: { logEventMapper: null }, - traceConfiguration: { - resourceTraceSampleRate: 100 - }, + traceConfiguration: {}, firstPartyHosts: [ { match: 'example.com', propagatorTypes: [PropagatorType.DATADOG] } - ], - useAccessibilityLabel: true + ] }); expect( @@ -364,10 +362,12 @@ describe('AppCenter Codepush integration', () => { const autoInstrumentationConfig = { rumConfiguration: { + useAccessibilityLabel: true, actionNameAttribute: 'test-action-name-attr', trackErrors: true, trackResources: true, - trackInteractions: true + trackInteractions: true, + resourceTraceSampleRate: 100 }, logsConfiguration: {}, firstPartyHosts: [ @@ -376,10 +376,7 @@ describe('AppCenter Codepush integration', () => { propagatorTypes: [PropagatorType.DATADOG] } ], - useAccessibilityLabel: true, - traceConfiguration: { - resourceTraceSampleRate: 100 - } + traceConfiguration: {} }; const configuration = new FileBasedConfiguration({ @@ -398,13 +395,15 @@ describe('AppCenter Codepush integration', () => { DdSdkReactNative._enableFeaturesFromDatadogProvider ).toHaveBeenCalledWith({ rumConfiguration: { + useAccessibilityLabel: true, actionNameAttribute: 'test-action-name-attr', trackErrors: true, trackResources: true, trackInteractions: true, actionEventMapper: null, resourceEventMapper: null, - errorEventMapper: null + errorEventMapper: null, + resourceTraceSampleRate: 100 }, logsConfiguration: { logEventMapper: null @@ -415,10 +414,7 @@ describe('AppCenter Codepush integration', () => { propagatorTypes: [PropagatorType.DATADOG] } ], - traceConfiguration: { - resourceTraceSampleRate: 100 - }, - useAccessibilityLabel: true + traceConfiguration: {} }); expect( diff --git a/packages/codepush/src/index.ts b/packages/codepush/src/index.ts index af554a0ab..8675ff037 100644 --- a/packages/codepush/src/index.ts +++ b/packages/codepush/src/index.ts @@ -44,9 +44,10 @@ const buildPartialConfiguration = ( configuration: DatadogProviderConfiguration ): AutoInstrumentationConfiguration => { const partialConfiguration: RequiredOrDiscard = { - useAccessibilityLabel: configuration.useAccessibilityLabel, firstPartyHosts: configuration.firstPartyHosts, rumConfiguration: { + useAccessibilityLabel: + configuration.rumConfiguration?.useAccessibilityLabel ?? true, actionNameAttribute: configuration.rumConfiguration?.actionNameAttribute, trackErrors: configuration.rumConfiguration?.trackErrors ?? false, @@ -54,6 +55,8 @@ const buildPartialConfiguration = ( configuration.rumConfiguration?.trackResources ?? false, trackInteractions: configuration.rumConfiguration?.trackInteractions ?? false, + resourceTraceSampleRate: + configuration.rumConfiguration?.resourceTraceSampleRate, errorEventMapper: configuration.rumConfiguration?.errorEventMapper, resourceEventMapper: configuration.rumConfiguration?.resourceEventMapper, @@ -62,10 +65,7 @@ const buildPartialConfiguration = ( logsConfiguration: { logEventMapper: configuration.logsConfiguration?.logEventMapper }, - traceConfiguration: { - resourceTraceSampleRate: - configuration.traceConfiguration?.resourceTraceSampleRate - } + traceConfiguration: {} }; return removeDiscardProperties( 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 05c7c8c4d..545cd0962 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 @@ -19,8 +19,6 @@ import java.net.Proxy * @param site The Datadog site of your organization (can be 'US', 'EU' or 'GOV', default is 'US'). * @param service Custom service name. * @param verbosity Verbosity level of the SDK’s internal logging. - * @param nativeCrashReportEnabled Whether the SDK should track native Android crashes (default is false). - * @param nativeLongTaskThresholdMs The threshold for native long tasks reporting in milliseconds. * @param trackingConsent Consent, which can take one of the following values: 'pending', 'granted', 'not_granted'. * @param uploadFrequency The frequency to which batches of data are sent (can be 'RARE', 'AVERAGE' (default), 'FREQUENT') * @param batchSize The preferred size for uploaded batches of data (can be 'SMALL', 'MEDIUM' (default), 'LARGE') @@ -39,8 +37,6 @@ data class DdSdkConfiguration( val site: String? = null, val service: String? = null, val verbosity: String? = null, - val nativeCrashReportEnabled: Boolean? = null, - val nativeLongTaskThresholdMs: Double? = null, val trackingConsent: String? = null, val uploadFrequency: String? = null, val batchSize: String? = null, @@ -60,8 +56,11 @@ data class DdSdkConfiguration( * @param trackFrustrations Whether to track frustration signals or not. * @param longTaskThresholdMs The threshold for javascript long tasks reporting in milliseconds. * @param sessionSampleRate The sample rate (between 0 and 100) of RUM sessions kept. + * @param resourceTraceSampleRate Percentage (0–100) of tracing integrations for network calls between your app and your backend. * @param vitalsUpdateFrequency The frequency to which vitals update are sent (can be 'NEVER', 'RARE', 'AVERAGE' (default), 'FREQUENT'). * @param trackBackgroundEvents Enables/Disables tracking RUM event when no RUM View is active. Might increase number of sessions and billing. + * @param nativeCrashReportEnabled Whether the SDK should track native Android crashes (default is false). + * @param nativeLongTaskThresholdMs The threshold for native long tasks reporting in milliseconds. * @param nativeViewTracking Enables/Disables tracking RUM Views on the native level. * @param nativeInteractionTracking Enables/Disables tracking RUM Actions on the native level. * @param trackNonFatalAnrs Enables tracking of non-fatal ANRs on Android. @@ -74,8 +73,11 @@ data class RumConfiguration( val trackFrustrations: Boolean? = null, val longTaskThresholdMs: Double? = null, val sessionSampleRate: Double? = null, + val resourceTraceSampleRate: Double? = null, val vitalsUpdateFrequency: String? = null, val trackBackgroundEvents: Boolean? = null, + val nativeCrashReportEnabled: Boolean? = null, + val nativeLongTaskThresholdMs: Double? = null, val nativeViewTracking: Boolean? = null, val nativeInteractionTracking: Boolean? = null, val trackNonFatalAnrs: Boolean? = null, @@ -100,12 +102,9 @@ data class LogsConfiguration( /** * A configuration object for Datadog Traces (APM) features. * - * @param resourceTraceSampleRate Percentage (0–100) of tracing integrations for network calls between your app - * and your backend. * @param customEndpoint Custom Trace intake endpoint used to override the default Datadog intake. */ data class TraceConfiguration( - val resourceTraceSampleRate: Double? = null, val customEndpoint: String? = null ) @@ -118,12 +117,9 @@ internal data class JSONDdSdkConfiguration( val clientToken: String, val env: String, val trackingConsent: String? = null, - val useAccessibilityLabel: Boolean? = null, val additionalConfiguration: Map? = null, val batchSize: String? = null, val batchProcessingLevel: String? = null, - val nativeCrashReportEnabled: Boolean? = null, - val nativeLongTaskThresholdMs: Double? = null, // we treat only numeric in JSON val proxyConfiguration: JSONProxyConfiguration? = null, val service: String? = null, val uploadFrequency: String? = null, @@ -139,6 +135,7 @@ internal data class JSONDdSdkConfiguration( internal data class JSONRumConfiguration( val applicationId: String? = null, + val useAccessibilityLabel: Boolean? = null, val trackInteractions: Boolean? = null, val trackResources: Boolean? = null, val trackErrors: Boolean? = null, @@ -148,10 +145,12 @@ internal data class JSONRumConfiguration( // schema: integer | boolean, we only support numeric in JSON file val longTaskThresholdMs: Double? = null, - + val nativeCrashReportEnabled: Boolean? = null, + val nativeLongTaskThresholdMs: Double? = null, // we treat only numeric in JSON val nativeViewTracking: Boolean? = null, val nativeInteractionTracking: Boolean? = null, val sessionSampleRate: Double? = null, + val resourceTraceSampleRate: Double? = null, val trackBackgroundEvents: Boolean? = null, val trackFrustrations: Boolean? = null, val trackNonFatalAnrs: Boolean? = null, @@ -169,7 +168,6 @@ internal data class JSONLogsConfiguration( ) internal data class JSONTraceConfiguration( - val resourceTraceSampleRate: Double? = null, val customEndpoint: String? = null ) 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 b16614719..1e4f9b979 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 @@ -34,8 +34,11 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { trackFrustrations = rm.getBooleanOrNull("trackFrustrations"), longTaskThresholdMs = rm.getDoubleOrNull("longTaskThresholdMs") ?: 0.0, sessionSampleRate = rm.getDoubleOrNull("sessionSampleRate"), + resourceTraceSampleRate = rm.getDoubleOrNull("resourceTraceSampleRate"), vitalsUpdateFrequency = rm.getString("vitalsUpdateFrequency"), trackBackgroundEvents = rm.getBooleanOrNull("trackBackgroundEvents"), + nativeCrashReportEnabled = rm.getBooleanOrNull("nativeCrashReportEnabled"), + nativeLongTaskThresholdMs = rm.getDoubleOrNull("nativeLongTaskThresholdMs"), nativeViewTracking = rm.getBooleanOrNull("nativeViewTracking"), nativeInteractionTracking = rm.getBooleanOrNull("nativeInteractionTracking"), trackNonFatalAnrs = rm.getBooleanOrNull("trackNonFatalAnrs"), @@ -55,7 +58,6 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { val traceConfiguration: TraceConfiguration? = traceMap?.let { tm -> TraceConfiguration( - resourceTraceSampleRate = tm.getDoubleOrNull("resourceTraceSampleRate"), customEndpoint = tm.getString("customEndpoint") ) } @@ -70,8 +72,6 @@ internal fun ReadableMap.asDdSdkConfiguration(): DdSdkConfiguration { site = getString("site"), service = getString("service"), verbosity = getString("verbosity"), - nativeCrashReportEnabled = getBooleanOrNull("nativeCrashReportEnabled"), - nativeLongTaskThresholdMs = getDoubleOrNull("nativeLongTaskThresholdMs"), trackingConsent = getString("trackingConsent"), uploadFrequency = getString("uploadFrequency"), batchSize = getString("batchSize"), @@ -175,8 +175,11 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { trackFrustrations = rum.trackFrustrations ?: DefaultConfiguration.trackFrustrations, longTaskThresholdMs = rum.longTaskThresholdMs ?: DefaultConfiguration.longTaskThresholdMs, sessionSampleRate = rum.sessionSampleRate ?: DefaultConfiguration.sessionSamplingRate, + resourceTraceSampleRate = rum.resourceTraceSampleRate, vitalsUpdateFrequency = rum.vitalsUpdateFrequency ?: DefaultConfiguration.vitalsUpdateFrequency, trackBackgroundEvents = rum.trackBackgroundEvents ?: DefaultConfiguration.trackBackgroundEvents, + nativeCrashReportEnabled = rum.nativeCrashReportEnabled ?: DefaultConfiguration.nativeCrashReportEnabled, + nativeLongTaskThresholdMs = rum.nativeLongTaskThresholdMs ?: DefaultConfiguration.nativeLongTaskThresholdMs, nativeViewTracking = rum.nativeViewTracking ?: DefaultConfiguration.nativeViewTracking, nativeInteractionTracking = rum.nativeInteractionTracking ?: DefaultConfiguration.nativeInteractionTracking, trackNonFatalAnrs = rum.trackNonFatalAnrs, @@ -197,7 +200,6 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { val traceConfiguration: TraceConfiguration? = this.traceConfiguration?.let { trace -> TraceConfiguration( - resourceTraceSampleRate = trace.resourceTraceSampleRate, customEndpoint = trace.customEndpoint ) } @@ -213,8 +215,6 @@ internal fun JSONDdSdkConfiguration.asDdSdkConfiguration(): DdSdkConfiguration { site = this.site?: DefaultConfiguration.site, service = this.service, verbosity = this.verbosity, - nativeCrashReportEnabled = this.nativeCrashReportEnabled ?: DefaultConfiguration.nativeCrashReportEnabled, - nativeLongTaskThresholdMs = this.nativeLongTaskThresholdMs ?: DefaultConfiguration.nativeLongTaskThresholdMs, trackingConsent = this.trackingConsent ?: DefaultConfiguration.trackingConsent, uploadFrequency = this.uploadFrequency ?: DefaultConfiguration.uploadFrequency, batchSize = this.batchSize?: DefaultConfiguration.batchSize, @@ -278,8 +278,6 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { map.putString("site", site.toString()) service?.let { map.putString("service", it) } verbosity?.let { map.putString("verbosity", it) } - nativeCrashReportEnabled?.let { map.putBoolean("nativeCrashReportEnabled", it) } - nativeLongTaskThresholdMs?.let { map.putDouble("nativeLongTaskThresholdMs", it) } map.putString("trackingConsent", trackingConsent.toString()) map.putString("uploadFrequency", uploadFrequency.toString()) map.putString("batchSize", batchSize.toString()) @@ -322,8 +320,11 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { rum.trackFrustrations?.let { rumMap.putBoolean("trackFrustrations", it) } rum.longTaskThresholdMs?.let { map.putDouble("longTaskThresholdMs", it) } rum.sessionSampleRate?.let { rumMap.putDouble("sessionSampleRate", it) } + rum.resourceTraceSampleRate?.let { rumMap.putDouble("resourceTraceSampleRate", it) } rum.vitalsUpdateFrequency?.let { rumMap.putString("vitalsUpdateFrequency", it) } rum.trackBackgroundEvents?.let { rumMap.putBoolean("trackBackgroundEvents", it) } + rum.nativeCrashReportEnabled?.let { rumMap.putBoolean("nativeCrashReportEnabled", it) } + rum.nativeLongTaskThresholdMs?.let { rumMap.putDouble("nativeLongTaskThresholdMs", it) } rum.nativeViewTracking?.let { rumMap.putBoolean("nativeViewTracking", it) } rum.nativeInteractionTracking?.let { rumMap.putBoolean("nativeInteractionTracking", it) } rum.trackNonFatalAnrs?.let { rumMap.putBoolean("trackNonFatalAnrs", it) } @@ -342,7 +343,6 @@ internal fun DdSdkConfiguration.toReadableMap(): ReadableMap { } traceConfiguration?.let { trace -> val traceMap = WritableNativeMap() - trace.resourceTraceSampleRate?.let { traceMap.putDouble("resourceTraceSampleRate", it) } trace.customEndpoint?.let { traceMap.putString("customEndpoint", it) } map.putMap("traceConfiguration", traceMap) } 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 4e9673268..33bb4ac74 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 @@ -131,7 +131,7 @@ class DdSdkNativeInitialization internal constructor( val telemetrySampleRate = (configuration.rumConfiguration?.telemetrySampleRate as? Number)?.toFloat() telemetrySampleRate?.let { configBuilder.setTelemetrySampleRate(it) } - val longTask = (configuration.nativeLongTaskThresholdMs as? Number)?.toLong() + val longTask = (configuration.rumConfiguration?.nativeLongTaskThresholdMs as? Number)?.toLong() if (longTask != null) { configBuilder.trackLongTasks(longTask) } @@ -179,14 +179,14 @@ class DdSdkNativeInitialization internal constructor( event: TelemetryConfigurationEvent ): TelemetryConfigurationEvent? { event.telemetry.configuration.trackNativeErrors = - configuration.nativeCrashReportEnabled + configuration.rumConfiguration?.nativeCrashReportEnabled // trackCrossPlatformLongTasks will be deprecated for trackLongTask event.telemetry.configuration.trackCrossPlatformLongTasks = configuration.rumConfiguration?.longTaskThresholdMs != 0.0 event.telemetry.configuration.trackLongTask = configuration.rumConfiguration?.longTaskThresholdMs != 0.0 event.telemetry.configuration.trackNativeLongTasks = - configuration.nativeLongTaskThresholdMs != 0.0 + configuration.rumConfiguration?.nativeLongTaskThresholdMs != 0.0 event.telemetry.configuration.initializationType = configuration.configurationForTelemetry?.initializationType @@ -264,7 +264,7 @@ class DdSdkNativeInitialization internal constructor( } as Map? ?: emptyMap() ) - configBuilder.setCrashReportsEnabled(configuration.nativeCrashReportEnabled ?: false) + configBuilder.setCrashReportsEnabled(configuration.rumConfiguration?.nativeCrashReportEnabled ?: false) configBuilder.useSite(buildSite(configuration.site)) configBuilder.setUploadFrequency( buildUploadFrequency(configuration.uploadFrequency) 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 b5ccce1e2..c402a7b28 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 @@ -93,8 +93,6 @@ internal class DdSdkNativeInitializationTest { assertThat(configuration.trackingConsent).isEqualTo("NOT_GRANTED") assertThat(configuration.uploadFrequency).isEqualTo("FREQUENT") assertThat(configuration.batchSize).isEqualTo("SMALL") - assertThat(configuration.nativeCrashReportEnabled).isEqualTo(true) - assertThat(configuration.nativeLongTaskThresholdMs).isEqualTo(333.0) assertThat(configuration.verbosity).isEqualTo("WARN") assertThat(configuration.service).isEqualTo("my.app") assertThat(configuration.additionalConfiguration?.get("_dd.source")).isEqualTo( @@ -109,6 +107,8 @@ internal class DdSdkNativeInitializationTest { assertThat(configuration.rumConfiguration?.telemetrySampleRate).isEqualTo(60.0) assertThat(configuration.rumConfiguration?.vitalsUpdateFrequency).isEqualTo("NEVER") assertThat(configuration.rumConfiguration?.trackFrustrations).isEqualTo(false) + assertThat(configuration.rumConfiguration?.nativeCrashReportEnabled).isEqualTo(true) + assertThat(configuration.rumConfiguration?.nativeLongTaskThresholdMs).isEqualTo(333.0) assertThat(configuration.rumConfiguration?.nativeViewTracking).isEqualTo(true) assertThat(configuration.rumConfiguration?.nativeInteractionTracking).isEqualTo(true) assertThat(configuration.rumConfiguration?.trackBackgroundEvents).isEqualTo(true) @@ -156,8 +156,6 @@ internal class DdSdkNativeInitializationTest { assertThat(configuration.service).isNull() assertThat(configuration.proxyConfiguration).isNull() assertThat(configuration.firstPartyHosts).isNull() - assertThat(configuration.nativeCrashReportEnabled).isEqualTo(false) - assertThat(configuration.nativeLongTaskThresholdMs).isEqualTo(200.0) assertThat(configuration.site).isEqualTo("US1") assertThat(configuration.uploadFrequency).isEqualTo("AVERAGE") assertThat(configuration.batchSize).isEqualTo("MEDIUM") @@ -178,6 +176,8 @@ internal class DdSdkNativeInitializationTest { assertThat(configuration.rumConfiguration?.trackFrustrations).isEqualTo(true) assertThat(configuration.rumConfiguration?.trackBackgroundEvents).isEqualTo(false) assertThat(configuration.rumConfiguration?.customEndpoint).isNull() + assertThat(configuration.rumConfiguration?.nativeCrashReportEnabled).isEqualTo(false) + assertThat(configuration.rumConfiguration?.nativeLongTaskThresholdMs).isEqualTo(200.0) assertThat(configuration.rumConfiguration?.nativeViewTracking).isEqualTo(false) assertThat(configuration.rumConfiguration?.nativeInteractionTracking).isEqualTo(false) assertThat(configuration.logsConfiguration?.customEndpoint).isNull() 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 2f32a37e8..664c2a758 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 @@ -184,7 +184,10 @@ internal class DdSdkTest { @Test fun `𝕄 initialize native SDK 𝕎 initialize() {nativeCrashReportEnabled=true}`() { // Given - val bridgeConfiguration = fakeConfiguration.copy(nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + val bridgeConfiguration = fakeConfiguration.copy(rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -238,7 +241,10 @@ internal class DdSdkTest { @Test fun `𝕄 initialize native SDK 𝕎 initialize() {nativeCrashReportEnabled=false}`() { // Given - fakeConfiguration = fakeConfiguration.copy(nativeCrashReportEnabled = false, site = null) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = false + ) + fakeConfiguration = fakeConfiguration.copy(site = null, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -292,7 +298,10 @@ internal class DdSdkTest { @Test fun `𝕄 initialize native SDK 𝕎 initialize() {nativeCrashReportEnabled=null}`() { // Given - fakeConfiguration = fakeConfiguration.copy(nativeCrashReportEnabled = false, site = null) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = false + ) + fakeConfiguration = fakeConfiguration.copy(site = null, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() @@ -575,7 +584,10 @@ internal class DdSdkTest { forge: Forge ) { // Given - fakeConfiguration = fakeConfiguration.copy(site = null, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = null, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -632,7 +644,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("us1") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -689,7 +704,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("us3") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -746,7 +764,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("us5") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -803,7 +824,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("us1_fed") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -860,7 +884,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("eu1") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -917,7 +944,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("ap1") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -974,7 +1004,10 @@ internal class DdSdkTest { ) { // Given val site = forge.randomizeCase("ap2") - fakeConfiguration = fakeConfiguration.copy(site = site, nativeCrashReportEnabled = true) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = true + ) + fakeConfiguration = fakeConfiguration.copy(site = site, rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -1601,9 +1634,11 @@ internal class DdSdkTest { val threshold = forge.aDouble(min = 100.0, max = 65536.0) // Given - val bridgeConfiguration = configuration.copy( + val rumConfiguration = configuration.rumConfiguration?.copy( nativeLongTaskThresholdMs = threshold ) + val bridgeConfiguration = configuration.copy(rumConfiguration = rumConfiguration) + val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -1656,9 +1691,10 @@ internal class DdSdkTest { forge: Forge ) { // Given - val bridgeConfiguration = configuration.copy( + val rumConfiguration = configuration.rumConfiguration?.copy( nativeLongTaskThresholdMs = 0.0 ) + val bridgeConfiguration = configuration.copy(rumConfiguration = rumConfiguration) val sdkConfigCaptor = argumentCaptor() val rumConfigCaptor = argumentCaptor() val logsConfigCaptor = argumentCaptor() @@ -2583,11 +2619,11 @@ internal class DdSdkTest { ) { // Given val rumConfiguration = configuration.rumConfiguration?.copy( - longTaskThresholdMs = 0.0 + longTaskThresholdMs = 0.0, + nativeCrashReportEnabled = trackNativeErrors, + nativeLongTaskThresholdMs = 0.0 ) val bridgeConfiguration = configuration.copy( - nativeCrashReportEnabled = trackNativeErrors, - nativeLongTaskThresholdMs = 0.0, rumConfiguration = rumConfiguration, configurationForTelemetry = ConfigurationForTelemetry( initializationType = initializationType, @@ -3261,7 +3297,10 @@ internal class DdSdkTest { @Test fun `𝕄 initialize native SDK 𝕎 initialize() {synthethics attributes}`() { // Given - fakeConfiguration = fakeConfiguration.copy(nativeCrashReportEnabled = false, site = null) + val rumConfiguration = fakeConfiguration.rumConfiguration?.copy( + nativeCrashReportEnabled = false + ) + fakeConfiguration = fakeConfiguration.copy(site = null, rumConfiguration = rumConfiguration) DdSdkSynthetics.testId = "unit-test-test-id" DdSdkSynthetics.resultId = "unit-test-result-id" 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 94dbd95ae..252286947 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 @@ -27,10 +27,6 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { service?.let { map["service"] = it } verbosity?.let { map["verbosity"] = it } - map["nativeCrashReportEnabled"] = nativeCrashReportEnabled ?: false - - map["nativeLongTaskThresholdMs"] = nativeLongTaskThresholdMs ?: 0.0 - trackingConsent?.let { map["trackingConsent"] = it } map["uploadFrequency"] = uploadFrequency ?: UploadFrequency.AVERAGE.toString() @@ -60,9 +56,12 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { rumMap["trackFrustrations"] = rum?.trackFrustrations ?: false rumMap["longTaskThresholdMs"] = rum?.longTaskThresholdMs ?: 0.0 rumMap["sessionSampleRate"] = rum?.sessionSampleRate ?: 100.0 + rum?.resourceTraceSampleRate?.let { rumMap["resourceTraceSampleRate"] = it } rumMap["vitalsUpdateFrequency"] = rum?.vitalsUpdateFrequency ?: VitalsUpdateFrequency.AVERAGE.toString() rumMap["trackBackgroundEvents"] = rum?.trackBackgroundEvents ?: false + rumMap["nativeCrashReportEnabled"] = rum?.nativeCrashReportEnabled ?: false + rumMap["nativeLongTaskThresholdMs"] = rum?.nativeLongTaskThresholdMs ?: 0.0 rum?.nativeViewTracking?.let { rumMap["nativeViewTracking"] = it } rum?.nativeInteractionTracking?.let { rumMap["nativeInteractionTracking"] = it } rum?.trackNonFatalAnrs?.let { rumMap["trackNonFatalAnrs"] = it } @@ -83,7 +82,6 @@ fun DdSdkConfiguration.toReadableJavaOnlyMap(): ReadableMap { traceConfiguration?.let { trace -> val traceMap = mutableMapOf() - trace.resourceTraceSampleRate?.let { traceMap["resourceTraceSampleRate"] = it } trace.customEndpoint?.let { traceMap["customEndpoint"] = it } map["traceConfiguration"] = traceMap.toReadableMap() diff --git a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/forge/DdSdkConfigurationForgeryFactory.kt b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/forge/DdSdkConfigurationForgeryFactory.kt index cc903fa0a..3f846b988 100644 --- a/packages/core/android/src/test/kotlin/com/datadog/tools/unit/forge/DdSdkConfigurationForgeryFactory.kt +++ b/packages/core/android/src/test/kotlin/com/datadog/tools/unit/forge/DdSdkConfigurationForgeryFactory.kt @@ -31,8 +31,6 @@ class DdSdkConfigurationForgeryFactory : ForgeryFactory { site = forge.aNullable { anElementFrom("US", "EU", "GOV") }, service = forge.aNullable { forge.anAlphabeticalString() }, verbosity = forge.aNullable { anElementFrom("debug", "info", "warn", "error") }, - nativeCrashReportEnabled = forge.aNullable { aBool() }, - nativeLongTaskThresholdMs = forge.aNullable { aDouble(100.0, 5000.0) }, trackingConsent = forge.aNullable { anElementFrom("pending", "granted", "not_granted") }, @@ -64,10 +62,13 @@ class DdSdkConfigurationForgeryFactory : ForgeryFactory { trackFrustrations = forge.aNullable { aBool() }, longTaskThresholdMs = forge.aNullable { aDouble(0.0, 100.0) }, sessionSampleRate = forge.aNullable { aDouble(0.0, 100.0) }, + resourceTraceSampleRate = forge.aNullable { aDouble(0.0, 100.0) }, vitalsUpdateFrequency = forge.aNullable { anElementFrom("RARE", "NEVER", "FREQUENT", "AVERAGE") }, trackBackgroundEvents = forge.aNullable { forge.aBool() }, + nativeCrashReportEnabled = forge.aNullable { aBool() }, + nativeLongTaskThresholdMs = forge.aNullable { aDouble(100.0, 5000.0) }, nativeViewTracking = forge.aNullable { aBool() }, nativeInteractionTracking = forge.aNullable { aBool() }, trackNonFatalAnrs = forge.aNullable { aBool() }, @@ -81,7 +82,6 @@ class DdSdkConfigurationForgeryFactory : ForgeryFactory { customEndpoint = forge.aNullable { aString() } ), traceConfiguration = TraceConfiguration( - resourceTraceSampleRate = forge.aNullable { aDouble(0.0, 100.0) }, customEndpoint = forge.aNullable { aString() } ), configurationForTelemetry = ConfigurationForTelemetry( 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 8c61eda5b..b6079988c 100644 --- a/packages/core/android/src/test/resources/input/complete-configuration.json +++ b/packages/core/android/src/test/resources/input/complete-configuration.json @@ -8,18 +8,18 @@ "verbosity": "WARN", "site": "US3", "version": "2.3.1", - "useAccessibilityLabel": true, "batchSize": "SMALL", - "nativeCrashReportEnabled": true, - "nativeLongTaskThresholdMs": 333, "uploadFrequency": "FREQUENT", "rumConfiguration": { "applicationId": "fake-app-id", + "useAccessibilityLabel": true, "trackInteractions": true, "trackResources": true, "trackErrors": true, "nativeViewTracking": true, "longTaskThresholdMs": 44, + "nativeCrashReportEnabled": true, + "nativeLongTaskThresholdMs": 333, "nativeInteractionTracking": true, "actionNameAttribute": "action-name-attr", "customEndpoint": "https://rum.example.com", @@ -27,6 +27,7 @@ "initialResourceThreshold": 0.5, "telemetrySampleRate": 60, "sessionSampleRate": 80, + "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false }, @@ -34,7 +35,6 @@ "customEndpoint": "https://logs.example.com" }, "traceConfiguration": { - "resourceTraceSampleRate": 33, "customEndpoint": "https://trace.example.com" }, "firstPartyHosts": [ diff --git a/packages/core/datadog-configuration.schema.json b/packages/core/datadog-configuration.schema.json index f85b9ae3d..e3919091a 100644 --- a/packages/core/datadog-configuration.schema.json +++ b/packages/core/datadog-configuration.schema.json @@ -26,10 +26,6 @@ "NOT_GRANTED" ] }, - "useAccessibilityLabel": { - "description": "Determines whether the accessibility labels can be used to name RUM actions. Defaults to `true`.", - "type": "boolean" - }, "additionalConfiguration": { "description": "Additional custom configuration passed as key/value pairs. This is forwarded to the native SDKs.", "type": "object", @@ -53,17 +49,6 @@ "HIGH" ] }, - "nativeCrashReportEnabled": { - "description": "Enables crash reporting for native platforms (iOS, Android). Default `false`.", - "type": "boolean" - }, - "nativeLongTaskThresholdMs": { - "description": "The threshold for native long tasks reporting in milliseconds. Set to a number to enable reporting or `false` to disable.", - "type": [ - "integer", - "boolean" - ] - }, "proxyConfiguration": { "type": "object", "description": "Configuration for proxying SDK data.", @@ -179,6 +164,10 @@ "description": "The RUM application ID.", "type": "string" }, + "useAccessibilityLabel": { + "description": "Determines whether the accessibility labels can be used to name RUM actions. Defaults to `true`.", + "type": "boolean" + }, "trackInteractions": { "description": "Track React Native components interactions.", "type": "boolean" @@ -218,10 +207,25 @@ "description": "Enables native interaction tracking.", "type": "boolean" }, + "nativeCrashReportEnabled": { + "description": "Enables crash reporting for native platforms (iOS, Android). Default `false`.", + "type": "boolean" + }, + "nativeLongTaskThresholdMs": { + "description": "The threshold for native long tasks reporting in milliseconds. Set to a number to enable reporting or `false` to disable.", + "type": [ + "integer", + "boolean" + ] + }, "sessionSampleRate": { "description": "Percentage of sampled RUM sessions. Range `0`-`100`. (default `100`).", "type": "integer" }, + "resourceTraceSampleRate": { + "description": "Percentage of tracing integrations for network calls between your app and your backend. Range `0`-`100` (default `100`).", + "type": "number" + }, "trackBackgroundEvents": { "description": "Enables tracking of RUM events when no RUM View is active.", "type": "boolean" @@ -287,10 +291,6 @@ "description": "Traces-specific configuration options.", "type": "object", "properties": { - "resourceTraceSampleRate": { - "description": "Percentage of tracing integrations for network calls between your app and your backend. Range `0`-`100` (default `100`).", - "type": "number" - }, "customEndpoint": { "description": "Target a custom server for Traces", "type": "string" diff --git a/packages/core/ios/Sources/DdSdkConfiguration.swift b/packages/core/ios/Sources/DdSdkConfiguration.swift index 9bd482bd9..25193da9e 100644 --- a/packages/core/ios/Sources/DdSdkConfiguration.swift +++ b/packages/core/ios/Sources/DdSdkConfiguration.swift @@ -18,9 +18,6 @@ import Foundation /// - site: The Datadog site of your organization (e.g., `US1`, `US1_FED`, `US3`, `US5`, `EU1`). /// - service: The custom service name reported for logs, traces, and RUM. /// - verbosity: Verbosity level of the SDK’s internal logging (`DEBUG`, `INFO`, `WARN`, `ERROR`). -/// - nativeCrashReportEnabled: Whether the SDK should track native (iOS / Android) crashes. -/// Default is `false`. -/// - nativeLongTaskThresholdMs: The threshold for reporting native long tasks in milliseconds. /// - trackingConsent: User tracking consent (`pending`, `granted`, `not_granted`). /// - uploadFrequency: The frequency at which batches of data are uploaded. /// - batchSize: The preferred size of batches sent to Datadog. @@ -39,8 +36,6 @@ public class DdSdkConfiguration: NSObject { public var site: DatadogSite public var service: NSString? = nil public var verbosity: NSString? = nil - public var nativeCrashReportEnabled: Bool? = nil - public var nativeLongTaskThresholdMs: Double? = nil public var trackingConsent: TrackingConsent public var uploadFrequency: Datadog.Configuration.UploadFrequency public var batchSize: Datadog.Configuration.BatchSize @@ -59,8 +54,6 @@ public class DdSdkConfiguration: NSObject { site: DatadogSite, service: NSString?, verbosity: NSString? = nil, - nativeCrashReportEnabled: Bool? = nil, - nativeLongTaskThresholdMs: Double? = nil, trackingConsent: TrackingConsent, uploadFrequency: Datadog.Configuration.UploadFrequency, batchSize: Datadog.Configuration.BatchSize, @@ -78,8 +71,6 @@ public class DdSdkConfiguration: NSObject { self.site = site self.service = service self.verbosity = verbosity - self.nativeCrashReportEnabled = nativeCrashReportEnabled - self.nativeLongTaskThresholdMs = nativeLongTaskThresholdMs self.trackingConsent = trackingConsent self.uploadFrequency = uploadFrequency self.batchSize = batchSize @@ -103,6 +94,9 @@ public class DdSdkConfiguration: NSObject { /// - vitalsUpdateFrequency: Frequency at which the SDK collects mobile vitals metrics. /// - trackBackgroundEvents: Enables/disables tracking RUM events when no RUM View is active. /// May increase the number of sessions and billing. +/// - nativeCrashReportEnabled: Whether the SDK should track native (iOS / Android) crashes. +/// Default is `false`. +/// - nativeLongTaskThresholdMs: The threshold for reporting native long tasks in milliseconds. /// - nativeViewTracking: Enables tracking of native iOS/Android UI views. /// - nativeInteractionTracking: Enables tracking of native UI interactions. /// - appHangThreshold: Threshold in seconds for reporting non-fatal app hangs (iOS only). @@ -117,8 +111,11 @@ public class RumConfiguration: NSObject { public var trackFrustrations: Bool? = true public var longTaskThresholdMs: Double = 0.0 public var sessionSampleRate: Double? = nil + public var resourceTraceSampleRate: Double? = nil public var vitalsUpdateFrequency: RUM.Configuration.VitalsFrequency? = nil public var trackBackgroundEvents: Bool? = nil + public var nativeCrashReportEnabled: Bool? = nil + public var nativeLongTaskThresholdMs: Double? = nil public var nativeViewTracking: Bool? = nil public var nativeInteractionTracking: Bool? = nil public var appHangThreshold: Double? = nil @@ -133,8 +130,11 @@ public class RumConfiguration: NSObject { trackFrustrations: Bool?, longTaskThresholdMs: Double, sessionSampleRate: Double?, + resourceTraceSampleRate: Double?, vitalsUpdateFrequency: RUM.Configuration.VitalsFrequency?, trackBackgroundEvents: Bool?, + nativeCrashReportEnabled: Bool? = nil, + nativeLongTaskThresholdMs: Double? = nil, nativeViewTracking: Bool?, nativeInteractionTracking: Bool?, appHangThreshold: Double?, @@ -148,8 +148,11 @@ public class RumConfiguration: NSObject { self.trackFrustrations = trackFrustrations self.longTaskThresholdMs = longTaskThresholdMs self.sessionSampleRate = sessionSampleRate + self.resourceTraceSampleRate = resourceTraceSampleRate self.vitalsUpdateFrequency = vitalsUpdateFrequency self.trackBackgroundEvents = trackBackgroundEvents + self.nativeCrashReportEnabled = nativeCrashReportEnabled + self.nativeLongTaskThresholdMs = nativeLongTaskThresholdMs self.nativeViewTracking = nativeViewTracking self.nativeInteractionTracking = nativeInteractionTracking self.appHangThreshold = appHangThreshold @@ -190,14 +193,11 @@ public class LogsConfiguration: NSObject { /// - resourceTracingSamplingRate: Percentage (0–100) of network resource traces to sample. /// - customEndpoint: A custom Trace intake endpoint to override the default Datadog intake. public class TraceConfiguration: NSObject { - public var resourceTraceSampleRate: Double? = nil public var customEndpoint: String? = nil init( - resourceTraceSampleRate: Double?, customEndpoint: String? ) { - self.resourceTraceSampleRate = resourceTraceSampleRate self.customEndpoint = customEndpoint } } diff --git a/packages/core/ios/Sources/DdSdkImplementation.swift b/packages/core/ios/Sources/DdSdkImplementation.swift index 71c1bb7b7..5348c1c78 100644 --- a/packages/core/ios/Sources/DdSdkImplementation.swift +++ b/packages/core/ios/Sources/DdSdkImplementation.swift @@ -268,8 +268,8 @@ public class DdSdkImplementation: NSObject { trackErrors: rnConfiguration.configurationForTelemetry?.trackErrors, trackInteractions: rnConfiguration.configurationForTelemetry?.trackInteractions, trackLongTask: rnConfiguration.rumConfiguration?.longTaskThresholdMs != 0, - trackNativeErrors: rnConfiguration.nativeLongTaskThresholdMs != 0, - trackNativeLongTasks: rnConfiguration.nativeLongTaskThresholdMs != 0, + trackNativeErrors: rnConfiguration.rumConfiguration?.nativeLongTaskThresholdMs != 0, + trackNativeLongTasks: rnConfiguration.rumConfiguration?.nativeLongTaskThresholdMs != 0, trackNetworkRequests: rnConfiguration.configurationForTelemetry?.trackNetworkRequests ) } diff --git a/packages/core/ios/Sources/DdSdkNativeInitialization.swift b/packages/core/ios/Sources/DdSdkNativeInitialization.swift index cd01e0a63..fd9b9ab5c 100644 --- a/packages/core/ios/Sources/DdSdkNativeInitialization.swift +++ b/packages/core/ios/Sources/DdSdkNativeInitialization.swift @@ -94,7 +94,7 @@ public class DdSdkNativeInitialization: NSObject { let traceConfig = buildTraceConfiguration(configuration: sdkConfiguration) Trace.enable(with: traceConfig) - if sdkConfiguration.nativeCrashReportEnabled ?? false { + if sdkConfiguration.rumConfiguration?.nativeCrashReportEnabled ?? false { CrashReporting.enable() } @@ -140,7 +140,7 @@ public class DdSdkNativeInitialization: NSObject { } var longTaskThreshold: TimeInterval? = nil - if let threshold = configuration.nativeLongTaskThresholdMs, threshold != 0 { + if let threshold = configuration.rumConfiguration?.nativeLongTaskThresholdMs, threshold != 0 { longTaskThreshold = threshold / 1_000 } @@ -160,7 +160,7 @@ public class DdSdkNativeInitialization: NSObject { firstPartyHostsTracing: .traceWithHeaders( hostsWithHeaders: firstPartyHosts, sampleRate: Float( - configuration.traceConfiguration?.resourceTraceSampleRate + configuration.rumConfiguration?.resourceTraceSampleRate ?? DefaultConfiguration.resourceTraceSampleRate) ) ) diff --git a/packages/core/ios/Sources/RNDdSdkConfiguration.swift b/packages/core/ios/Sources/RNDdSdkConfiguration.swift index 9322377e8..027d88f38 100644 --- a/packages/core/ios/Sources/RNDdSdkConfiguration.swift +++ b/packages/core/ios/Sources/RNDdSdkConfiguration.swift @@ -23,9 +23,6 @@ extension NSDictionary { let service = self["service"] as? NSString let verbosity = self["verbosity"] as? NSString - let nativeCrashReportEnabled = self["nativeCrashReportEnabled"] as? Bool - let nativeLongTaskThresholdMs = self["nativeLongTaskThresholdMs"] as? Double - let trackingConsentString = self["trackingConsent"] as? NSString let trackingConsent = trackingConsentString.asTrackingConsent() @@ -55,10 +52,13 @@ extension NSDictionary { let trackFrustrations = rumDict["trackFrustrations"] as? Bool let longTaskThresholdMs = rumDict["longTaskThresholdMs"] as? Double let sessionSampleRate = rumDict["sessionSampleRate"] as? Double + let resourceTraceSampleRate = rumDict["resourceTraceSampleRate"] as? Double let vitalsUpdateFrequencyString = rumDict["vitalsUpdateFrequency"] as? NSString let vitalsUpdateFrequency = vitalsUpdateFrequencyString.asVitalsUpdateFrequency() let trackBackgroundEvents = rumDict["trackBackgroundEvents"] as? Bool + let nativeCrashReportEnabled = rumDict["nativeCrashReportEnabled"] as? Bool + let nativeLongTaskThresholdMs = rumDict["nativeLongTaskThresholdMs"] as? Double let nativeViewTracking = rumDict["nativeViewTracking"] as? Bool let nativeInteractionTracking = rumDict["nativeInteractionTracking"] as? Bool @@ -75,9 +75,15 @@ extension NSDictionary { longTaskThresholdMs: longTaskThresholdMs ?? DefaultConfiguration.longTaskThresholdMs, sessionSampleRate: sessionSampleRate ?? DefaultConfiguration.sessionSamplingRate, + resourceTraceSampleRate: resourceTraceSampleRate + ?? DefaultConfiguration.resourceTraceSampleRate, vitalsUpdateFrequency: vitalsUpdateFrequency, trackBackgroundEvents: trackBackgroundEvents ?? DefaultConfiguration.trackBackgroundEvents, + nativeCrashReportEnabled: nativeCrashReportEnabled + ?? DefaultConfiguration.nativeCrashReportEnabled, + nativeLongTaskThresholdMs: nativeLongTaskThresholdMs + ?? DefaultConfiguration.nativeLongTaskThresholdMs, nativeViewTracking: nativeViewTracking ?? DefaultConfiguration.nativeViewTracking, nativeInteractionTracking: nativeInteractionTracking ?? DefaultConfiguration.nativeInteractionTracking, @@ -121,12 +127,9 @@ extension NSDictionary { let traceConfiguration: TraceConfiguration? if let traceDict = traceConfigurationDict { - let resourceTraceSampleRate = traceDict["resourceTraceSampleRate"] as? Double let customEndpoint = traceDict["customEndpoint"] as? String traceConfiguration = TraceConfiguration( - resourceTraceSampleRate: resourceTraceSampleRate - ?? DefaultConfiguration.resourceTraceSampleRate, customEndpoint: customEndpoint ) } else { @@ -145,10 +148,6 @@ extension NSDictionary { site: site, service: service, verbosity: verbosity, - nativeCrashReportEnabled: nativeCrashReportEnabled - ?? DefaultConfiguration.nativeCrashReportEnabled, - nativeLongTaskThresholdMs: nativeLongTaskThresholdMs - ?? DefaultConfiguration.nativeLongTaskThresholdMs, trackingConsent: trackingConsent, uploadFrequency: uploadFrequency, batchSize: batchSize, @@ -306,16 +305,6 @@ extension Dictionary where Key == String, Value == AnyObject { let service = configuration["service"] as? NSString let verbosity = configuration["verbosity"] as? NSString - let nativeCrashReportEnabled = configuration["nativeCrashReportEnabled"] as? Bool - - let nativeLongTaskRaw = configuration["nativeLongTaskThresholdMs"] - let nativeLongTaskThresholdMs: Double? = { - if let v = nativeLongTaskRaw as? Double { return v } - if let v = nativeLongTaskRaw as? Int { return Double(v) } - if let v = nativeLongTaskRaw as? Bool, v == false { return 0.0 } - return nil - }() - let trackingConsentString = configuration["trackingConsent"] as? NSString let trackingConsent = trackingConsentString.asTrackingConsent() @@ -358,6 +347,15 @@ extension Dictionary where Key == String, Value == AnyObject { let vitalsUpdateFrequency = (rum["vitalsUpdateFrequency"] as? NSString).asVitalsUpdateFrequency() + let nativeCrashReportEnabled = rum["nativeCrashReportEnabled"] as? Bool + let nativeLongTaskRaw = rum["nativeLongTaskThresholdMs"] + let nativeLongTaskThresholdMs: Double? = { + if let v = nativeLongTaskRaw as? Double { return v } + if let v = nativeLongTaskRaw as? Int { return Double(v) } + if let v = nativeLongTaskRaw as? Bool, v == false { return 0.0 } + return nil + }() + rumConfiguration = RumConfiguration( applicationId: applicationId, trackFrustrations: rum["trackFrustrations"] as? Bool @@ -365,9 +363,16 @@ extension Dictionary where Key == String, Value == AnyObject { longTaskThresholdMs: longTaskThresholdMs ?? DefaultConfiguration.longTaskThresholdMs, sessionSampleRate: sessionSampleRate ?? DefaultConfiguration.sessionSamplingRate, + resourceTraceSampleRate: + rum["resourceTraceSampleRate"] as? Double + ?? DefaultConfiguration.resourceTraceSampleRate, vitalsUpdateFrequency: vitalsUpdateFrequency, trackBackgroundEvents: rum["trackBackgroundEvents"] as? Bool ?? DefaultConfiguration.trackBackgroundEvents, + nativeCrashReportEnabled: nativeCrashReportEnabled + ?? DefaultConfiguration.nativeCrashReportEnabled, + nativeLongTaskThresholdMs: nativeLongTaskThresholdMs + ?? DefaultConfiguration.nativeLongTaskThresholdMs, nativeViewTracking: rum["nativeViewTracking"] as? Bool ?? DefaultConfiguration.nativeViewTracking, nativeInteractionTracking: rum["nativeInteractionTracking"] as? Bool @@ -410,9 +415,6 @@ extension Dictionary where Key == String, Value == AnyObject { if let trace = traceDict { traceConfiguration = TraceConfiguration( - resourceTraceSampleRate: - trace["resourceTraceSampleRate"] as? Double - ?? DefaultConfiguration.resourceTraceSampleRate, customEndpoint: trace["customEndpoint"] as? String ) } else { @@ -431,10 +433,6 @@ extension Dictionary where Key == String, Value == AnyObject { site: site, service: service, verbosity: verbosity, - nativeCrashReportEnabled: nativeCrashReportEnabled - ?? DefaultConfiguration.nativeCrashReportEnabled, - nativeLongTaskThresholdMs: nativeLongTaskThresholdMs - ?? DefaultConfiguration.nativeLongTaskThresholdMs, trackingConsent: trackingConsent, uploadFrequency: uploadFrequency, batchSize: batchSize, diff --git a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift index 247da9086..8babac7a3 100644 --- a/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift +++ b/packages/core/ios/Tests/DdSdkNativeInitializationTests.swift @@ -29,8 +29,6 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.clientToken, "fake-client-token") XCTAssertEqual(configuration?.env, "fake-env") XCTAssertEqual(configuration?.rumConfiguration?.applicationId, "fake-app-id") - XCTAssertEqual(configuration?.nativeCrashReportEnabled, true) - XCTAssertEqual(configuration?.nativeLongTaskThresholdMs, 333.0) XCTAssertEqual(configuration?.rumConfiguration?.longTaskThresholdMs, 44.0) XCTAssertEqual(configuration?.rumConfiguration?.sessionSampleRate, 80.0) XCTAssertEqual(configuration?.site, .us3) @@ -47,6 +45,8 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.additionalConfiguration?["_dd.source"] as! String, "react-native") XCTAssertEqual(configuration?.additionalConfiguration?["_dd.sdk_version"] as! String, SdkVersion) XCTAssertEqual(configuration?.configurationForTelemetry, nil) + XCTAssertEqual(configuration?.rumConfiguration?.nativeCrashReportEnabled, true) + XCTAssertEqual(configuration?.rumConfiguration?.nativeLongTaskThresholdMs, 333.0) XCTAssertEqual(configuration?.rumConfiguration?.nativeViewTracking, true) XCTAssertEqual(configuration?.rumConfiguration?.nativeInteractionTracking, true) XCTAssertEqual(configuration?.verbosity, "WARN") @@ -71,8 +71,6 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.clientToken, "fake-client-token") XCTAssertEqual(configuration?.env, "fake-env") XCTAssertEqual(configuration?.rumConfiguration?.applicationId, "fake-app-id") - XCTAssertEqual(configuration?.nativeCrashReportEnabled, false) - XCTAssertEqual(configuration?.nativeLongTaskThresholdMs, 200.0) XCTAssertEqual(configuration?.rumConfiguration?.longTaskThresholdMs, 0.0) XCTAssertEqual(configuration?.rumConfiguration?.sessionSampleRate, 100.0) XCTAssertEqual(configuration?.site, .us1) @@ -89,6 +87,8 @@ class DdSdkNativeInitializationTests: XCTestCase { XCTAssertEqual(configuration?.additionalConfiguration?["_dd.source"] as! String, "react-native") XCTAssertEqual(configuration?.additionalConfiguration?["_dd.sdk_version"] as! String, SdkVersion) XCTAssertEqual(configuration?.configurationForTelemetry, nil) + XCTAssertEqual(configuration?.rumConfiguration?.nativeCrashReportEnabled, false) + XCTAssertEqual(configuration?.rumConfiguration?.nativeLongTaskThresholdMs, 200.0) XCTAssertEqual(configuration?.rumConfiguration?.nativeViewTracking, false) XCTAssertEqual(configuration?.rumConfiguration?.nativeInteractionTracking, false) XCTAssertEqual(configuration?.verbosity, nil) diff --git a/packages/core/ios/Tests/DdSdkTests.swift b/packages/core/ios/Tests/DdSdkTests.swift index 7551b312b..14114c165 100644 --- a/packages/core/ios/Tests/DdSdkTests.swift +++ b/packages/core/ios/Tests/DdSdkTests.swift @@ -468,7 +468,9 @@ class DdSdkTests: XCTestCase { func testBuildConfigurationNoCrashReportByDefault() { let core = MockDatadogCore() - let configuration: DdSdkConfiguration = .mockAny(nativeCrashReportEnabled: nil) + let rumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.nativeCrashReportEnabled = nil + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) DdSdkNativeInitialization().enableFeatures( sdkConfiguration: configuration @@ -479,7 +481,9 @@ class DdSdkTests: XCTestCase { func testBuildConfigurationNoCrashReport() { let core = MockDatadogCore() - let configuration: DdSdkConfiguration = .mockAny(nativeCrashReportEnabled: false) + let rumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.nativeCrashReportEnabled = false + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) DdSdkNativeInitialization().enableFeatures( sdkConfiguration: configuration @@ -493,7 +497,9 @@ class DdSdkTests: XCTestCase { CoreRegistry.register(default: core) defer { CoreRegistry.unregisterDefault() } - let configuration: DdSdkConfiguration = .mockAny(nativeCrashReportEnabled: true) + let rumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.nativeCrashReportEnabled = true + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) DdSdkNativeInitialization().enableFeatures( sdkConfiguration: configuration @@ -921,7 +927,9 @@ class DdSdkTests: XCTestCase { } func testBuildLongTaskThreshold() { - let configuration: DdSdkConfiguration = .mockAny(nativeLongTaskThresholdMs: 2500) + let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.nativeLongTaskThresholdMs = 2500 + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( configuration: configuration @@ -931,7 +939,9 @@ class DdSdkTests: XCTestCase { } func testBuildNoLongTaskTracking() { - let configuration: DdSdkConfiguration = .mockAny(nativeLongTaskThresholdMs: 0) + let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.nativeLongTaskThresholdMs = 0 + let configuration: DdSdkConfiguration = .mockAny(rumConfiguration: rumConfiguration) let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( configuration: configuration @@ -941,13 +951,13 @@ class DdSdkTests: XCTestCase { } func testFirstPartyHosts() { - let traceConfiguration: TraceConfiguration = makeDefaultTraceConfiguration() - traceConfiguration.resourceTraceSampleRate = 66 + let rumConfiguration: RumConfiguration = makeDefaultRumConfiguration() + rumConfiguration.resourceTraceSampleRate = 66 let configuration: DdSdkConfiguration = .mockAny( firstPartyHosts: ([ ["match": "example.com", "propagatorTypes": ["datadog", "b3"]], ["match": "datadog.com", "propagatorTypes": ["b3multi", "tracecontext"]], - ] as NSArray).asFirstPartyHosts(), traceConfiguration: traceConfiguration) + ] as NSArray).asFirstPartyHosts(), rumConfiguration: rumConfiguration) let ddConfig = DdSdkNativeInitialization().buildRumConfiguration( configuration: configuration @@ -1503,10 +1513,10 @@ class DdSdkTests: XCTestCase { let rumConfiguration = makeDefaultRumConfiguration() rumConfiguration.longTaskThresholdMs = 0.1 + rumConfiguration.nativeCrashReportEnabled = false + rumConfiguration.nativeLongTaskThresholdMs = 0.0 let configuration: DdSdkConfiguration = DdSdkConfiguration.mockAny( - nativeCrashReportEnabled: false, - nativeLongTaskThresholdMs: 0.0, rumConfiguration: rumConfiguration, configurationForTelemetry: [ "initializationType": "LEGACY", "trackErrors": true, "trackInteractions": true, @@ -1723,8 +1733,11 @@ func makeDefaultRumConfiguration() -> RumConfiguration { trackFrustrations: nil, longTaskThresholdMs: 0.0, sessionSampleRate: 75.0, + resourceTraceSampleRate: 80.0, vitalsUpdateFrequency: nil, trackBackgroundEvents: nil, + nativeCrashReportEnabled: nil, + nativeLongTaskThresholdMs: nil, nativeViewTracking: nil, nativeInteractionTracking: nil, appHangThreshold: nil, @@ -1746,7 +1759,6 @@ func makeDefaultLogsConfiguration() -> LogsConfiguration { func makeDefaultTraceConfiguration() -> TraceConfiguration { TraceConfiguration( - resourceTraceSampleRate: 80.0, customEndpoint: nil ) } @@ -1759,8 +1771,6 @@ extension DdSdkConfiguration { site: NSString? = nil, service: NSString? = nil, verbosity: NSString? = nil, - nativeCrashReportEnabled: Bool? = nil, - nativeLongTaskThresholdMs: Double? = nil, trackingConsent: NSString? = "pending", uploadFrequency: NSString? = "AVERAGE", batchSize: NSString? = "MEDIUM", @@ -1779,8 +1789,6 @@ extension DdSdkConfiguration { site: site.asSite(), service: service, verbosity: verbosity, - nativeCrashReportEnabled: nativeCrashReportEnabled, - nativeLongTaskThresholdMs: nativeLongTaskThresholdMs, trackingConsent: trackingConsent.asTrackingConsent(), uploadFrequency: uploadFrequency.asUploadFrequency(), batchSize: batchSize.asBatchSize(), @@ -1799,6 +1807,7 @@ let DefaultRumConfigurationDict: NSDictionary = [ "applicationId": "app-id", "longTaskThresHoldMs": 0.0, "sessionSampleRate": 75.0, + "resourceTraceSampleRate": 80.0, "trackWatchdogTerminations": false, "trackMemoryWarnings": true, "telemetrySampleRate": 45.0, @@ -1809,9 +1818,7 @@ let DefaultLogsConfigurationDict: NSDictionary = [ "bundleLogsWithTraces": true, ] -let DefaultTraceConfigurationDict: NSDictionary = [ - "resourceTraceSampleRate": 80.0 -] +let DefaultTraceConfigurationDict: NSDictionary = [:] extension NSDictionary { static func mockAny( @@ -1821,8 +1828,6 @@ extension NSDictionary { site: NSString? = nil, service: NSString? = nil, verbosity: NSString? = nil, - nativeCrashReportEnabled: Bool? = nil, - nativeLongTaskThresholdMs: Double? = nil, trackingConsent: NSString? = "pending", uploadFrequency: NSString? = "AVERAGE", batchSize: NSString? = "MEDIUM", @@ -1845,8 +1850,6 @@ extension NSDictionary { config["site"] = site config["service"] = service config["verbosity"] = verbosity - config["nativeCrashReportEnabled"] = nativeCrashReportEnabled - config["nativeLongTaskThresholdMs"] = nativeLongTaskThresholdMs config["uploadFrequency"] = uploadFrequency config["batchSize"] = batchSize config["batchProcessingLevel"] = batchProcessingLevel @@ -1860,10 +1863,13 @@ extension NSDictionary { rumConfig["applicationId"] = rumConfiguration?["applicationId"] rumConfig["sesionSampleRate"] = rumConfiguration?["sessionSampleRate"] + rumConfig["resourceTraceSampleRate"] = rumConfiguration?["resourceTraceSampleRate"] rumConfig["longTaskThresholdMs"] = rumConfiguration?["longTaskThresholdMs"] rumConfig["telemetrySampleRate"] = rumConfiguration?["telemetrySampleRate"] rumConfig["vitalsUpdateFrequency"] = rumConfiguration?["vitalsUpdateFrequency"] rumConfig["trackBackgroundEvents"] = rumConfiguration?["trackBackgroundEvents"] + rumConfig["nativeCrashReportEnabled"] = rumConfiguration?["nativeCrashReportEnabled"] + rumConfig["nativeLongTaskThresholdMs"] = rumConfiguration?["nativeLongTaskThresholdMs"] rumConfig["nativeViewTracking"] = rumConfiguration?["nativeViewTracking"] rumConfig["nativeInteractionTracking"] = rumConfiguration?["nativeInteractionTracking"] rumConfig["customEndpoint"] = rumConfiguration?["customEndpoint"] @@ -1873,7 +1879,6 @@ extension NSDictionary { logsConfig["bundleLogsWithTraces"] = logsConfiguration?["bundleLogsWithTraces"] logsConfig["customEndpoint"] = logsConfiguration?["customEndpoint"] - traceConfig["resourceTraceSampleRate"] = traceConfiguration?["resourceTraceSampleRate"] traceConfig["customEndpoint"] = traceConfiguration?["customEndpoint"] return config diff --git a/packages/core/ios/Tests/Fixtures/complete-configuration.json b/packages/core/ios/Tests/Fixtures/complete-configuration.json index 8c61eda5b..263c6f0de 100644 --- a/packages/core/ios/Tests/Fixtures/complete-configuration.json +++ b/packages/core/ios/Tests/Fixtures/complete-configuration.json @@ -10,8 +10,6 @@ "version": "2.3.1", "useAccessibilityLabel": true, "batchSize": "SMALL", - "nativeCrashReportEnabled": true, - "nativeLongTaskThresholdMs": 333, "uploadFrequency": "FREQUENT", "rumConfiguration": { "applicationId": "fake-app-id", @@ -20,6 +18,8 @@ "trackErrors": true, "nativeViewTracking": true, "longTaskThresholdMs": 44, + "nativeCrashReportEnabled": true, + "nativeLongTaskThresholdMs": 333, "nativeInteractionTracking": true, "actionNameAttribute": "action-name-attr", "customEndpoint": "https://rum.example.com", @@ -27,6 +27,7 @@ "initialResourceThreshold": 0.5, "telemetrySampleRate": 60, "sessionSampleRate": 80, + "resourceTraceSampleRate": 33, "trackBackgroundEvents": true, "trackFrustrations": false }, @@ -34,7 +35,6 @@ "customEndpoint": "https://logs.example.com" }, "traceConfiguration": { - "resourceTraceSampleRate": 33, "customEndpoint": "https://trace.example.com" }, "firstPartyHosts": [ diff --git a/packages/core/src/DdSdkReactNative.tsx b/packages/core/src/DdSdkReactNative.tsx index dbc598ed6..7588ae24d 100644 --- a/packages/core/src/DdSdkReactNative.tsx +++ b/packages/core/src/DdSdkReactNative.tsx @@ -433,6 +433,13 @@ export class DdSdkReactNative { rumConfiguration.longTaskThresholdMs = adaptLongTaskThreshold( longTaskThresholdMs ); + + const nativeLongTaskThresholdMs = + configuration.rumConfiguration?.nativeLongTaskThresholdMs || + false; + rumConfiguration.nativeLongTaskThresholdMs = adaptLongTaskThreshold( + nativeLongTaskThresholdMs + ); } const trackInteractions = @@ -451,8 +458,6 @@ export class DdSdkReactNative { configuration.site, configuration.service, configuration.verbosity, - configuration.nativeCrashReportEnabled, - adaptLongTaskThreshold(configuration.nativeLongTaskThresholdMs), configuration.trackingConsent, configuration.uploadFrequency, configuration.batchSize, @@ -493,7 +498,7 @@ export class DdSdkReactNative { const actionNameAttribute = configuration.rumConfiguration?.actionNameAttribute; const resourceTraceSampleRate = - configuration.traceConfiguration?.resourceTraceSampleRate || + configuration.rumConfiguration?.resourceTraceSampleRate || DEFAULTS.resourceTraceSampleRate; const logEventMapper = configuration.logsConfiguration?.logEventMapper; const errorEventMapper = @@ -506,7 +511,9 @@ export class DdSdkReactNative { if (globalThis.__DD_RN_BABEL_PLUGIN_ENABLED__) { DdBabelInteractionTracking.config = { trackInteractions, - useAccessibilityLabel: configuration.useAccessibilityLabel + useAccessibilityLabel: + configuration.rumConfiguration?.useAccessibilityLabel || + DEFAULTS.useAccessibilityLabel }; DdBabelInteractionTracking.attachRumInstance(DdRum); @@ -523,7 +530,8 @@ export class DdSdkReactNative { if (trackInteractions && !globalThis.__DD_RN_BABEL_PLUGIN_ENABLED__) { DdRumUserInteractionTracking.startTracking({ actionNameAttribute, - useAccessibilityLabel: configuration.useAccessibilityLabel + useAccessibilityLabel: + configuration.rumConfiguration?.useAccessibilityLabel }); } diff --git a/packages/core/src/DdSdkReactNativeConfiguration.tsx b/packages/core/src/DdSdkReactNativeConfiguration.tsx index 1a25e14e9..22ee14e68 100644 --- a/packages/core/src/DdSdkReactNativeConfiguration.tsx +++ b/packages/core/src/DdSdkReactNativeConfiguration.tsx @@ -155,24 +155,6 @@ export class CoreConfiguration { public batchProcessingLevel: BatchProcessingLevel = BatchProcessingLevel.MEDIUM; - /** - * Enables crash reporting for native platforms (iOS, Android). Default `false`. - */ - public nativeCrashReportEnabled: boolean = - DEFAULTS.nativeCrashReportEnabled; - - /** - * The threshold for native long tasks reporting in milliseconds. - * - * - Setting it to `0` or `false` disables native long task reporting. - * - Values below `100` will be raised to `100`. - * - Values above `5000` will be lowered to `5000`. - * - * Default value is `200`. - */ - public nativeLongTaskThresholdMs: number | false = - DEFAULTS.nativeLongTaskThresholdMs; - public proxyConfiguration?: ProxyConfiguration = undefined; public service?: string = undefined; @@ -246,11 +228,40 @@ export class CoreConfiguration { readonly clientToken: string, readonly env: string, readonly trackingConsent: TrackingConsent = DEFAULTS.trackingConsent, - readonly useAccessibilityLabel: boolean = DEFAULTS.useAccessibilityLabel // eslint-disable-next-line no-empty-function - ) {} + rumConfiguration?: Partial, + logsConfiguration?: Partial, + traceConfiguration?: Partial + ) { + if (rumConfiguration && rumConfiguration.applicationId) { + const baseRumConfig = new RumConfiguration( + rumConfiguration.applicationId + ); + + this.rumConfiguration = Object.assign( + baseRumConfig, + rumConfiguration + ); + } + + if (logsConfiguration) { + this.logsConfiguration = Object.assign( + new LogsConfiguration(), + logsConfiguration + ); + } + + if (traceConfiguration) { + this.traceConfiguration = Object.assign( + new TraceConfiguration(), + traceConfiguration + ); + } + } } export class RumConfiguration { + public useAccessibilityLabel: boolean = DEFAULTS.useAccessibilityLabel; + public actionEventMapper: ActionEventMapper | null = DEFAULTS.actionEventMapper; @@ -302,8 +313,7 @@ export class RumConfiguration { * * Default value is `0` */ - public longTaskThresholdMs: number | false = - DEFAULTS.nativeLongTaskThresholdMs; + public longTaskThresholdMs: number | false = DEFAULTS.longTaskThresholdMs; /** * Enables tracking of memory warnings as RUM events. @@ -315,6 +325,24 @@ export class RumConfiguration { */ public trackMemoryWarnings: boolean = DEFAULTS.trackMemoryWarnings; + /** + * Enables crash reporting for native platforms (iOS, Android). Default `false`. + */ + public nativeCrashReportEnabled: boolean = + DEFAULTS.nativeCrashReportEnabled; + + /** + * The threshold for native long tasks reporting in milliseconds. + * + * - Setting it to `0` or `false` disables native long task reporting. + * - Values below `100` will be raised to `100`. + * - Values above `5000` will be lowered to `5000`. + * + * Default value is `200`. + */ + public nativeLongTaskThresholdMs: number | false = + DEFAULTS.nativeLongTaskThresholdMs; + /** * Enables native views tracking. * Set to `true` if you use a custom navigation system relying on native views. @@ -337,6 +365,12 @@ export class RumConfiguration { */ public sessionSampleRate: number = DEFAULTS.sessionSampleRate; + /** + * Percentage of tracing integrations for network calls between your app and your backend. Range `0`-`100`. + * Default is `100`. + */ + public resourceTraceSampleRate: number = DEFAULTS.resourceTraceSampleRate; + /** * Enables tracking of RUM event when no RUM View is active. * @@ -418,12 +452,6 @@ export class LogsConfiguration { } export class TraceConfiguration { - /** - * Percentage of tracing integrations for network calls between your app and your backend. Range `0`-`100`. - * Default is `100`. - */ - public resourceTraceSampleRate: number = DEFAULTS.resourceTraceSampleRate; - /** * Sets a target custom server for Traces. */ @@ -439,13 +467,17 @@ export class DatadogProviderConfiguration extends CoreConfiguration { * Does not include default values. */ export type AutoInstrumentationConfiguration = { - readonly useAccessibilityLabel?: boolean; readonly firstPartyHosts?: FirstPartyHostsConfiguration; readonly rumConfiguration: { + readonly useAccessibilityLabel: boolean; readonly trackInteractions: boolean; readonly trackResources: boolean; readonly trackErrors: boolean; readonly actionNameAttribute?: string; + readonly resourceTraceSampleRate?: number; + readonly nativeCrashReportEnabled?: boolean; + readonly nativeLongTaskThresholdMs?: number | false; + readonly nativeViewTracking?: boolean; readonly actionEventMapper?: ActionEventMapper | null; readonly errorEventMapper?: ErrorEventMapper | null; readonly resourceEventMapper?: ResourceEventMapper | null; @@ -453,22 +485,21 @@ export type AutoInstrumentationConfiguration = { readonly logsConfiguration: { readonly logEventMapper?: LogEventMapper | null; }; - readonly traceConfiguration: { - readonly resourceTraceSampleRate?: number; - }; + readonly traceConfiguration?: TraceConfiguration; }; /** * Parameters needed to start auto instrumentation. Includes default values. */ export type AutoInstrumentationParameters = { - readonly useAccessibilityLabel: boolean; readonly firstPartyHosts: FirstPartyHostsConfiguration; readonly rumConfiguration?: { + readonly useAccessibilityLabel: boolean; readonly trackInteractions: boolean; readonly trackResources: boolean; readonly trackErrors: boolean; readonly actionNameAttribute?: string; + readonly resourceTraceSampleRate: number; readonly actionEventMapper: ActionEventMapper | null; readonly errorEventMapper: ErrorEventMapper | null; readonly resourceEventMapper: ResourceEventMapper | null; @@ -476,9 +507,7 @@ export type AutoInstrumentationParameters = { readonly logsConfiguration?: { readonly logEventMapper: LogEventMapper | null; }; - readonly traceConfiguration?: { - readonly resourceTraceSampleRate: number; - }; + readonly traceConfiguration?: TraceConfiguration; }; /** @@ -489,10 +518,13 @@ export const addDefaultValuesToAutoInstrumentationConfiguration = ( features: AutoInstrumentationConfiguration ): AutoInstrumentationParameters => { return { - useAccessibilityLabel: DEFAULTS.useAccessibilityLabel, firstPartyHosts: features.firstPartyHosts || DEFAULTS.getFirstPartyHosts(), rumConfiguration: { + useAccessibilityLabel: + features.rumConfiguration.useAccessibilityLabel === undefined + ? DEFAULTS.useAccessibilityLabel + : features.rumConfiguration.useAccessibilityLabel, trackInteractions: features.rumConfiguration.trackInteractions, trackResources: features.rumConfiguration.trackResources, trackErrors: features.rumConfiguration.trackErrors, @@ -508,14 +540,11 @@ export const addDefaultValuesToAutoInstrumentationConfiguration = ( actionEventMapper: features.rumConfiguration.actionEventMapper === undefined ? DEFAULTS.actionEventMapper - : features.rumConfiguration.actionEventMapper - }, - traceConfiguration: { + : features.rumConfiguration.actionEventMapper, resourceTraceSampleRate: - features.traceConfiguration.resourceTraceSampleRate === - undefined + features.rumConfiguration.resourceTraceSampleRate === undefined ? DEFAULTS.resourceTraceSampleRate - : features.traceConfiguration.resourceTraceSampleRate + : features.rumConfiguration.resourceTraceSampleRate }, logsConfiguration: { logEventMapper: @@ -538,14 +567,14 @@ export type PartialInitializationConfiguration = { readonly version?: string; versionSuffix?: string; readonly proxyConfiguration?: ProxyConfiguration; - readonly nativeLongTaskThresholdMs?: number | false; - readonly nativeCrashReportEnabled?: boolean; readonly uploadFrequency?: UploadFrequency; readonly batchSize?: BatchSize; readonly batchProcessingLevel?: BatchProcessingLevel; readonly rumConfiguration?: { readonly applicationId: string; readonly sessionSampleRate?: number; + readonly nativeLongTaskThresholdMs?: number | false; + readonly nativeCrashReportEnabled?: boolean; readonly nativeViewTracking?: boolean; readonly nativeInteractionTracking?: boolean; readonly longTaskThresholdMs?: number | false; @@ -576,8 +605,7 @@ export const buildConfigurationFromPartialConfiguration = ( const SdkConfiguration = new CoreConfiguration( clientToken, env, - configuration.trackingConsent, - features.useAccessibilityLabel + configuration.trackingConsent ); if (configuration.additionalConfiguration) { @@ -594,16 +622,6 @@ export const buildConfigurationFromPartialConfiguration = ( SdkConfiguration.batchSize = configuration.batchSize; } - if (configuration.nativeCrashReportEnabled) { - SdkConfiguration.nativeCrashReportEnabled = - configuration.nativeCrashReportEnabled; - } - - if (configuration.nativeLongTaskThresholdMs) { - SdkConfiguration.nativeLongTaskThresholdMs = - configuration.nativeLongTaskThresholdMs; - } - if (configuration.proxyConfiguration) { SdkConfiguration.proxyConfiguration = configuration.proxyConfiguration; } @@ -650,6 +668,11 @@ export const buildConfigurationFromPartialConfiguration = ( } if (SdkConfiguration.rumConfiguration) { + if (features.rumConfiguration.useAccessibilityLabel !== undefined) { + SdkConfiguration.rumConfiguration.useAccessibilityLabel = + features.rumConfiguration.useAccessibilityLabel; + } + if (features.rumConfiguration.errorEventMapper) { SdkConfiguration.rumConfiguration.errorEventMapper = features.rumConfiguration.errorEventMapper; @@ -680,6 +703,16 @@ export const buildConfigurationFromPartialConfiguration = ( configuration.rumConfiguration?.longTaskThresholdMs; } + if (configuration.rumConfiguration?.nativeCrashReportEnabled) { + SdkConfiguration.rumConfiguration.nativeCrashReportEnabled = + configuration.rumConfiguration.nativeCrashReportEnabled; + } + + if (configuration.rumConfiguration?.nativeLongTaskThresholdMs) { + SdkConfiguration.rumConfiguration.nativeLongTaskThresholdMs = + configuration.rumConfiguration.nativeLongTaskThresholdMs; + } + if (configuration.rumConfiguration?.nativeInteractionTracking) { SdkConfiguration.rumConfiguration.nativeInteractionTracking = configuration.rumConfiguration?.nativeInteractionTracking; @@ -695,6 +728,11 @@ export const buildConfigurationFromPartialConfiguration = ( configuration.rumConfiguration?.sessionSampleRate; } + if (features.rumConfiguration?.resourceTraceSampleRate !== undefined) { + SdkConfiguration.rumConfiguration.resourceTraceSampleRate = + features.rumConfiguration.resourceTraceSampleRate; + } + if (configuration.rumConfiguration?.telemetrySampleRate) { SdkConfiguration.rumConfiguration.telemetrySampleRate = configuration.rumConfiguration?.telemetrySampleRate; @@ -729,13 +767,6 @@ export const buildConfigurationFromPartialConfiguration = ( if (features.traceConfiguration !== undefined) { SdkConfiguration.traceConfiguration = new TraceConfiguration(); - if ( - features.traceConfiguration?.resourceTraceSampleRate !== undefined - ) { - SdkConfiguration.traceConfiguration.resourceTraceSampleRate = - features.traceConfiguration.resourceTraceSampleRate; - } - if (configuration.traceConfiguration?.customEndpoint) { SdkConfiguration.traceConfiguration.customEndpoint = configuration.traceConfiguration?.customEndpoint; diff --git a/packages/core/src/__tests__/DdSdkReactNative.test.tsx b/packages/core/src/__tests__/DdSdkReactNative.test.tsx index 72341c0d6..a80cdd810 100644 --- a/packages/core/src/__tests__/DdSdkReactNative.test.tsx +++ b/packages/core/src/__tests__/DdSdkReactNative.test.tsx @@ -616,8 +616,7 @@ describe('DdSdkReactNative', () => { false, true ); - configuration.traceConfiguration = new TraceConfiguration(); - configuration.traceConfiguration.resourceTraceSampleRate = 42; + configuration.rumConfiguration.resourceTraceSampleRate = 42; configuration.firstPartyHosts = [ 'api.example.com', { @@ -688,9 +687,7 @@ describe('DdSdkReactNative', () => { false, true ); - configuration.traceConfiguration = new TraceConfiguration(); - configuration.traceConfiguration.resourceTraceSampleRate = 2; - + configuration.rumConfiguration.resourceTraceSampleRate = 2; NativeModules.DdSdk.initialize.mockResolvedValue(null); // WHEN @@ -1066,7 +1063,7 @@ describe('DdSdkReactNative', () => { false, true ); - configuration.nativeLongTaskThresholdMs = 234; + configuration.rumConfiguration.nativeLongTaskThresholdMs = 234; configuration.rumConfiguration.longTaskThresholdMs = 456; NativeModules.DdSdk.initialize.mockResolvedValue(null); @@ -1077,7 +1074,9 @@ describe('DdSdkReactNative', () => { // THEN const ddSdkConfiguration = NativeModules.DdSdk.initialize.mock .calls[0][0] as DdSdkNativeConfiguration; - expect(ddSdkConfiguration.nativeLongTaskThresholdMs).toBe(234); + expect( + ddSdkConfiguration.rumConfiguration?.nativeLongTaskThresholdMs + ).toBe(234); expect( ddSdkConfiguration.rumConfiguration?.longTaskThresholdMs ).toBe(456); @@ -1098,7 +1097,7 @@ describe('DdSdkReactNative', () => { false, true ); - configuration.nativeLongTaskThresholdMs = false; + configuration.rumConfiguration.nativeLongTaskThresholdMs = false; configuration.rumConfiguration.longTaskThresholdMs = false; NativeModules.DdSdk.initialize.mockResolvedValue(null); @@ -1109,7 +1108,9 @@ describe('DdSdkReactNative', () => { // THEN const ddSdkConfiguration = NativeModules.DdSdk.initialize.mock .calls[0][0] as DdSdkNativeConfiguration; - expect(ddSdkConfiguration.nativeLongTaskThresholdMs).toBe(0); + expect( + ddSdkConfiguration.rumConfiguration?.nativeLongTaskThresholdMs + ).toBe(0); expect( ddSdkConfiguration.rumConfiguration?.longTaskThresholdMs ).toBe(0); diff --git a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts index 56c9a05d4..c230faf97 100644 --- a/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts +++ b/packages/core/src/__tests__/DdSdkReactNativeConfiguration.test.ts @@ -49,17 +49,18 @@ describe('DdSdkReactNativeConfiguration', () => { "bundleLogsWithTraces": true, "logEventMapper": null, }, - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, "applicationId": "fake-app-id", "errorEventMapper": null, - "longTaskThresholdMs": 200, + "longTaskThresholdMs": 0, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -69,16 +70,14 @@ describe('DdSdkReactNativeConfiguration', () => { "trackMemoryWarnings": true, "trackResources": false, "trackWatchdogTerminations": false, + "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, "site": "US1", - "traceConfiguration": TraceConfiguration { - "resourceTraceSampleRate": 100, - }, + "traceConfiguration": TraceConfiguration {}, "trackingConsent": "granted", "uploadFrequency": "AVERAGE", - "useAccessibilityLabel": true, "verbosity": undefined, } `); @@ -90,26 +89,27 @@ describe('DdSdkReactNativeConfiguration', () => { { rumConfiguration: { actionNameAttribute: 'testID', + useAccessibilityLabel: true, trackErrors: true, trackInteractions: true, trackResources: true, + resourceTraceSampleRate: 80, errorEventMapper: event => event, resourceEventMapper: event => event, actionEventMapper: event => event }, - traceConfiguration: { - resourceTraceSampleRate: 80 - }, + traceConfiguration: {}, logsConfiguration: { logEventMapper: event => event }, - firstPartyHosts: ['api.com'], - useAccessibilityLabel: true + firstPartyHosts: ['api.com'] }, { rumConfiguration: { applicationId: 'fake-app-id', sessionSampleRate: 80, + nativeCrashReportEnabled: true, + nativeLongTaskThresholdMs: 345, nativeViewTracking: true, nativeInteractionTracking: true, longTaskThresholdMs: 567, @@ -142,8 +142,6 @@ describe('DdSdkReactNativeConfiguration', () => { additionalField: 'fake-value' }, trackingConsent: TrackingConsent.PENDING, - nativeCrashReportEnabled: true, - nativeLongTaskThresholdMs: 345, uploadFrequency: UploadFrequency.FREQUENT, batchSize: BatchSize.LARGE } @@ -167,8 +165,6 @@ describe('DdSdkReactNativeConfiguration', () => { "customEndpoint": "https://trace.example.com/", "logEventMapper": [Function], }, - "nativeCrashReportEnabled": true, - "nativeLongTaskThresholdMs": 345, "proxyConfiguration": ProxyConfiguration { "address": "api.com", "port": 443, @@ -182,9 +178,12 @@ describe('DdSdkReactNativeConfiguration', () => { "errorEventMapper": [Function], "initialResourceThreshold": 0.123, "longTaskThresholdMs": 567, + "nativeCrashReportEnabled": true, "nativeInteractionTracking": true, + "nativeLongTaskThresholdMs": 345, "nativeViewTracking": true, "resourceEventMapper": [Function], + "resourceTraceSampleRate": 80, "sessionSampleRate": 80, "telemetrySampleRate": 20, "trackBackgroundEvents": true, @@ -194,17 +193,16 @@ describe('DdSdkReactNativeConfiguration', () => { "trackMemoryWarnings": true, "trackResources": true, "trackWatchdogTerminations": false, + "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, "service": "com.test.app", "site": "EU", "traceConfiguration": TraceConfiguration { "customEndpoint": "https://trace.example.com/", - "resourceTraceSampleRate": 80, }, "trackingConsent": "pending", "uploadFrequency": "FREQUENT", - "useAccessibilityLabel": true, "verbosity": "debug", "version": "1.4.5", "versionSuffix": "codepush-3", @@ -217,15 +215,16 @@ describe('DdSdkReactNativeConfiguration', () => { buildConfigurationFromPartialConfiguration( { rumConfiguration: { + useAccessibilityLabel: false, trackErrors: false, trackInteractions: false, - trackResources: false - }, - traceConfiguration: { - resourceTraceSampleRate: 0 + trackResources: false, + resourceTraceSampleRate: 0, + nativeCrashReportEnabled: false, + nativeLongTaskThresholdMs: false }, - logsConfiguration: {}, - useAccessibilityLabel: false + traceConfiguration: {}, + logsConfiguration: {} }, { rumConfiguration: { @@ -247,9 +246,7 @@ describe('DdSdkReactNativeConfiguration', () => { service: '', version: '', versionSuffix: '', - additionalConfiguration: {}, - nativeCrashReportEnabled: false, - nativeLongTaskThresholdMs: false + additionalConfiguration: {} } ) ).toMatchInlineSnapshot(` @@ -266,17 +263,18 @@ describe('DdSdkReactNativeConfiguration', () => { "bundleLogsWithTraces": true, "logEventMapper": null, }, - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, "applicationId": "", "errorEventMapper": null, - "longTaskThresholdMs": 200, + "longTaskThresholdMs": 0, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 0, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -286,16 +284,14 @@ describe('DdSdkReactNativeConfiguration', () => { "trackMemoryWarnings": true, "trackResources": false, "trackWatchdogTerminations": false, + "useAccessibilityLabel": false, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, "site": "US1", - "traceConfiguration": TraceConfiguration { - "resourceTraceSampleRate": 0, - }, + "traceConfiguration": TraceConfiguration {}, "trackingConsent": "granted", "uploadFrequency": "AVERAGE", - "useAccessibilityLabel": false, "verbosity": undefined, } `); diff --git a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx index 9f43410ef..f1c2e39fb 100644 --- a/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx +++ b/packages/core/src/sdk/DatadogProvider/__tests__/initialization.test.tsx @@ -83,17 +83,18 @@ describe('DatadogProvider', () => { "env": "fakeEnv", "firstPartyHosts": [], "logsConfiguration": undefined, - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, "applicationId": "fakeApplicationId", "errorEventMapper": null, - "longTaskThresholdMs": 200, + "longTaskThresholdMs": 0, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -103,6 +104,7 @@ describe('DatadogProvider', () => { "trackMemoryWarnings": true, "trackResources": false, "trackWatchdogTerminations": false, + "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, @@ -193,12 +195,11 @@ describe('DatadogProvider', () => { rumConfiguration: { trackErrors: true, trackResources: true, - trackInteractions: true - }, - firstPartyHosts: ['api.com'], - traceConfiguration: { + trackInteractions: true, resourceTraceSampleRate: 100 }, + firstPartyHosts: ['api.com'], + traceConfiguration: {}, logsConfiguration: {} } }); diff --git a/packages/core/src/sdk/DatadogProvider/__tests__/initializationModes.test.tsx b/packages/core/src/sdk/DatadogProvider/__tests__/initializationModes.test.tsx index e64779f91..06ac866bc 100644 --- a/packages/core/src/sdk/DatadogProvider/__tests__/initializationModes.test.tsx +++ b/packages/core/src/sdk/DatadogProvider/__tests__/initializationModes.test.tsx @@ -143,12 +143,11 @@ describe('DatadogProvider', () => { rumConfiguration: { trackErrors: true, trackResources: true, - trackInteractions: true - }, - firstPartyHosts: ['api.com'], - traceConfiguration: { + trackInteractions: true, resourceTraceSampleRate: 100 }, + firstPartyHosts: ['api.com'], + traceConfiguration: {}, logsConfiguration: {} } }); diff --git a/packages/core/src/sdk/FileBasedConfiguration/FileBasedConfiguration.ts b/packages/core/src/sdk/FileBasedConfiguration/FileBasedConfiguration.ts index 8de97c1b1..3bbd39a5f 100644 --- a/packages/core/src/sdk/FileBasedConfiguration/FileBasedConfiguration.ts +++ b/packages/core/src/sdk/FileBasedConfiguration/FileBasedConfiguration.ts @@ -36,8 +36,7 @@ export class FileBasedConfiguration extends DatadogProviderConfiguration { super( configuration.clientToken, configuration.env, - configuration.trackingConsent, - configuration.useAccessibilityLabel + configuration.trackingConsent ); this.verbosity = configuration.verbosity; @@ -62,6 +61,18 @@ export class FileBasedConfiguration extends DatadogProviderConfiguration { configuration.rumConfiguration.actionNameAttribute; } + if ( + configuration.rumConfiguration.useAccessibilityLabel !== + undefined + ) { + rumConfig.useAccessibilityLabel = + configuration.rumConfiguration.useAccessibilityLabel; + } + + rumConfig.resourceTraceSampleRate = + configuration.rumConfiguration.resourceTraceSampleRate || + DEFAULTS.resourceTraceSampleRate; + rumConfig.errorEventMapper = params?.errorEventMapper || DEFAULTS.errorEventMapper; rumConfig.resourceEventMapper = @@ -84,9 +95,6 @@ export class FileBasedConfiguration extends DatadogProviderConfiguration { if (configuration.traceConfiguration) { this.traceConfiguration = new TraceConfiguration(); - this.traceConfiguration.resourceTraceSampleRate = - configuration.traceConfiguration.resourceTraceSampleRate || - DEFAULTS.resourceTraceSampleRate; } } } @@ -116,12 +124,9 @@ export const getJSONConfiguration = ( trackingConsent?: TrackingConsent; verbosity?: SdkVerbosity; service?: string; - useAccessibilityLabel?: boolean; site?: string; batchSize?: string; batchProcessingLevel?: BatchProcessingLevel; - nativeCrashReportEnabled?: boolean; - nativeLongTaskThresholdMs?: number | false; proxyConfiguration?: ProxyConfiguration; uploadFrequency?: UploadFrequency; version?: string; @@ -129,6 +134,7 @@ export const getJSONConfiguration = ( firstPartyHosts?: FirstPartyHostsConfiguration; rumConfiguration?: { applicationId: string; + useAccessibilityLabel?: boolean; trackInteractions?: boolean; trackResources?: boolean; trackErrors?: boolean; @@ -137,10 +143,13 @@ export const getJSONConfiguration = ( appHangThreshold?: number; initialResourceThreshold?: number; trackMemoryWarnings?: boolean; + nativeCrashReportEnabled?: boolean; + nativeLongTaskThresholdMs?: number | false; nativeViewTracking?: boolean; nativeInteractionTracking?: boolean; customEndpoint?: string; sessionSampleRate?: number; + resourceTraceSampleRate?: number; trackBackgroundEvents?: boolean; trackFrustrations?: boolean; trackNonFatalAnrs?: boolean; @@ -148,7 +157,6 @@ export const getJSONConfiguration = ( vitalsUpdateFrequency?: VitalsUpdateFrequency; }; traceConfiguration?: { - resourceTraceSampleRate?: number; customEndpoint?: string; }; logsConfiguration?: { @@ -175,7 +183,6 @@ export const getJSONConfiguration = ( env: configuration.env, trackingConsent: buildTrackingConsent(configuration.trackingConsent), verbosity: buildSdkVerbosity(configuration.verbosity), - useAccessibilityLabel: configuration.useAccessibilityLabel, site: configuration.site, service: configuration.service, version: configuration.version, @@ -183,8 +190,6 @@ export const getJSONConfiguration = ( batchSize: configuration.batchSize, batchProcessingLevel: configuration.batchProcessingLevel, uploadFrequency: configuration.uploadFrequency, - nativeLongTaskThresholdMs: configuration.nativeLongTaskThresholdMs, - nativeCrashReportEnabled: configuration.nativeCrashReportEnabled, proxyConfiguration: configuration.proxyConfiguration, firstPartyHosts: buildFirstPartyHosts(configuration.firstPartyHosts) || @@ -192,10 +197,16 @@ export const getJSONConfiguration = ( ...(configuration.rumConfiguration !== undefined && { rumConfiguration: { applicationId: configuration.rumConfiguration.applicationId, + useAccessibilityLabel: + configuration.rumConfiguration.useAccessibilityLabel, trackInteractions: configuration.rumConfiguration.trackInteractions, trackResources: configuration.rumConfiguration.trackResources, trackErrors: configuration.rumConfiguration.trackErrors, + nativeLongTaskThresholdMs: + configuration.rumConfiguration.nativeLongTaskThresholdMs, + nativeCrashReportEnabled: + configuration.rumConfiguration.nativeCrashReportEnabled, longTaskThresholdMs: configuration.rumConfiguration.longTaskThresholdMs, actionNameAttribute: @@ -203,6 +214,8 @@ export const getJSONConfiguration = ( customEndpoint: configuration.rumConfiguration.customEndpoint, sessionSampleRate: configuration.rumConfiguration.sessionSampleRate, + resourceTraceSampleRate: + configuration.rumConfiguration.resourceTraceSampleRate, trackBackgroundEvents: configuration.rumConfiguration.trackBackgroundEvents, trackFrustrations: @@ -217,8 +230,6 @@ export const getJSONConfiguration = ( }), ...(configuration.traceConfiguration !== undefined && { traceConfiguration: { - resourceTraceSampleRate: - configuration.traceConfiguration.resourceTraceSampleRate, customEndpoint: configuration.traceConfiguration.customEndpoint } }), diff --git a/packages/core/src/sdk/FileBasedConfiguration/__tests__/FileBasedConfiguration.test.ts b/packages/core/src/sdk/FileBasedConfiguration/__tests__/FileBasedConfiguration.test.ts index 47826f030..fa26c0f13 100644 --- a/packages/core/src/sdk/FileBasedConfiguration/__tests__/FileBasedConfiguration.test.ts +++ b/packages/core/src/sdk/FileBasedConfiguration/__tests__/FileBasedConfiguration.test.ts @@ -44,8 +44,6 @@ describe('FileBasedConfiguration', () => { "bundleLogsWithTraces": true, "logEventMapper": null, }, - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, @@ -53,9 +51,12 @@ describe('FileBasedConfiguration', () => { "applicationId": "fake-app-id", "errorEventMapper": null, "longTaskThresholdMs": 44, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -65,16 +66,14 @@ describe('FileBasedConfiguration', () => { "trackMemoryWarnings": true, "trackResources": true, "trackWatchdogTerminations": false, + "useAccessibilityLabel": false, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, "site": "US5", - "traceConfiguration": TraceConfiguration { - "resourceTraceSampleRate": 33, - }, + "traceConfiguration": TraceConfiguration {}, "trackingConsent": "not_granted", "uploadFrequency": "AVERAGE", - "useAccessibilityLabel": false, "verbosity": "warn", } `); @@ -93,22 +92,21 @@ describe('FileBasedConfiguration', () => { const config = new FileBasedConfiguration({ configuration: { rumConfiguration: { + useAccessibilityLabel: false, trackInteractions: true, trackResources: true, trackErrors: true, applicationId: 'fake-app-id', longTaskThresholdMs: 44, - actionNameAttribute: 'action-name-attr' + actionNameAttribute: 'action-name-attr', + resourceTraceSampleRate: 33 }, env: 'fake-env', clientToken: 'fake-client-token', trackingConsent: 'NOT_GRANTED', site: 'US5', verbosity: 'WARN', - useAccessibilityLabel: false, - traceConfiguration: { - resourceTraceSampleRate: 33 - }, + traceConfiguration: {}, firstPartyHosts: [ { match: 'example.com', @@ -142,8 +140,6 @@ describe('FileBasedConfiguration', () => { }, ], "initializationMode": "SYNC", - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, @@ -151,9 +147,12 @@ describe('FileBasedConfiguration', () => { "applicationId": "fake-app-id", "errorEventMapper": null, "longTaskThresholdMs": 44, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 33, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -163,16 +162,14 @@ describe('FileBasedConfiguration', () => { "trackMemoryWarnings": true, "trackResources": true, "trackWatchdogTerminations": false, + "useAccessibilityLabel": false, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, "site": "US5", - "traceConfiguration": TraceConfiguration { - "resourceTraceSampleRate": 33, - }, + "traceConfiguration": TraceConfiguration {}, "trackingConsent": "not_granted", "uploadFrequency": "AVERAGE", - "useAccessibilityLabel": false, "verbosity": "warn", } `); @@ -197,17 +194,18 @@ describe('FileBasedConfiguration', () => { "env": "fake-env", "firstPartyHosts": [], "initializationMode": "SYNC", - "nativeCrashReportEnabled": false, - "nativeLongTaskThresholdMs": 200, "proxyConfiguration": undefined, "rumConfiguration": RumConfiguration { "actionEventMapper": null, "applicationId": "fake-app-id", "errorEventMapper": null, "longTaskThresholdMs": 0, + "nativeCrashReportEnabled": false, "nativeInteractionTracking": false, + "nativeLongTaskThresholdMs": 200, "nativeViewTracking": false, "resourceEventMapper": null, + "resourceTraceSampleRate": 100, "sessionSampleRate": 100, "telemetrySampleRate": 20, "trackBackgroundEvents": false, @@ -217,13 +215,13 @@ describe('FileBasedConfiguration', () => { "trackMemoryWarnings": true, "trackResources": false, "trackWatchdogTerminations": false, + "useAccessibilityLabel": true, "vitalsUpdateFrequency": "AVERAGE", }, "service": undefined, "site": "US1", "trackingConsent": "granted", "uploadFrequency": "AVERAGE", - "useAccessibilityLabel": true, "verbosity": undefined, } `); diff --git a/packages/core/src/sdk/FileBasedConfiguration/__tests__/__fixtures__/configuration-all-fields.json b/packages/core/src/sdk/FileBasedConfiguration/__tests__/__fixtures__/configuration-all-fields.json index 6322c3c7d..cbc0fb4bc 100644 --- a/packages/core/src/sdk/FileBasedConfiguration/__tests__/__fixtures__/configuration-all-fields.json +++ b/packages/core/src/sdk/FileBasedConfiguration/__tests__/__fixtures__/configuration-all-fields.json @@ -5,19 +5,18 @@ "clientToken": "fake-client-token", "rumConfiguration": { "applicationId": "fake-app-id", + "useAccessibilityLabel": false, "trackInteractions": true, "trackResources": true, "trackErrors": true, "longTaskThresholdMs": 44, - "actionNameAttribute": "action-name-attr" - }, - "traceConfiguration": { + "actionNameAttribute": "action-name-attr", "resourceTraceSampleRate": 33 }, + "traceConfiguration": {}, "logsConfiguration": {}, "trackingConsent": "NOT_GRANTED", "verbosity": "WARN", - "useAccessibilityLabel": false, "site": "US5", "firstPartyHosts": [ { diff --git a/packages/core/src/types.tsx b/packages/core/src/types.tsx index 20464838b..699d2fb2b 100644 --- a/packages/core/src/types.tsx +++ b/packages/core/src/types.tsx @@ -24,8 +24,6 @@ export class DdSdkNativeConfiguration { readonly site: string, readonly service: string | undefined, readonly verbosity: string | undefined, - readonly nativeCrashReportEnabled: boolean, - readonly nativeLongTaskThresholdMs: number, readonly trackingConsent: string, readonly uploadFrequency: string, readonly batchSize: string, @@ -63,8 +61,11 @@ export type RUMNativeConfiguration = { readonly trackFrustrations: boolean; readonly longTaskThresholdMs: number; readonly sessionSampleRate: number; + readonly resourceTraceSampleRate: number; readonly vitalsUpdateFrequency: string; readonly trackBackgroundEvents: boolean; + readonly nativeCrashReportEnabled: boolean; + readonly nativeLongTaskThresholdMs: number; readonly nativeViewTracking: boolean; readonly nativeInteractionTracking: boolean; readonly trackNonFatalAnrs: boolean | undefined; @@ -83,7 +84,6 @@ export type LogsNativeConfiguration = { }; export type TraceNativeConfiguration = { - readonly resourceTraceSampleRate: number; readonly customEndpoint: string; };