Overview
If you experience unexpected behavior with Datadog Browser RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance. Regularly update to the latest version of the RUM Browser SDK, as each release contains improvements and fixes.
Missing data
If you can't see any RUM data or if data is missing for some users:
| Common causes | Recommended fix |
|---|---|
| Ad blockers prevent the RUM Browser SDK from being downloaded or sending data to Datadog. | Some ad blockers extend their restrictions to performance and marketing tracking tools. See the Install the RUM Browser SDK with npm and forward the collected data through a proxy docs. |
| Network rules, VPNs, or antivirus software can prevent the RUM Browser SDK from being downloaded or sending data to Datadog. | Grant access to the endpoints required to download the RUM Browser SDK or to send data. The list of endpoints is available in the Content Security Policy documentation. |
Scripts, packages, and clients initialized before the RUM Browser SDK can lead to missed logs, resources, and user actions. For example, initializing ApolloClient before the RUM Browser SDK may result in graphql requests not being logged as XHR resources in the RUM Explorer. | Check where the RUM Browser SDK is initialized and consider moving this step earlier in the execution of your application code. |
If you've set trackViewsManually: true and notice that no sessions are present, the application may have suddenly stopped sending RUM information even though there are no network errors. | Be sure to start an initial view after you've initialized RUM to prevent any data loss. See Advanced Configuration for more information. |
Read the Content Security Policy guidelines and make sure your website grants access to the RUM Browser SDK CDN and the intake endpoint.
Issues running multiple RUM tools in the same application
Datadog supports only one SDK per application. For optimal data collection and full functionality of all Datadog RUM SDK features, use only the Datadog RUM SDK.
The RUM Browser SDK is initialized
Check if the RUM Browser SDK is initialized by running window.DD_RUM.getInternalContext() in your browser console and verify an application_id, session_id, and view object are returned:
If the RUM Browser SDK is not installed, or if it is not successfully initialized, you may see the following ReferenceError: DD_RUM is not defined error:
You can also check your browser developer tools console or network tab if you notice any errors related to the loading of the RUM Browser SDK.
Note: For accurate results, set sessionSampleRate to 100. For more information, see Configure Your Setup For Browser RUM and Browser RUM & Session Replay Sampling.
Data to the Datadog intake
The RUM SDK sends batches of event data to Datadog's intake every time one of these conditions has been met:
- Every 30 seconds
- When 50 events have been reached
- When the payload is >16 kB
- On
visibility:hiddenorbeforeUnload
If data is being sent, you should see network requests targeting api/v2/rum (the URL origin part may differ due to RUM configuration) in the Network section of your browser developer tools:
After the data reaches the intake, availability in the Datadog UI depends on your retention filter configuration. If the session is retained, events typically appear in the RUM Explorer within a few seconds after the retention decision is made. Otherwise, it may take a few minutes.
RUM cookies
The RUM Browser SDK relies on cookies to store session information and follow a user session across different pages. The cookies are first-party (they are set on your domain) and are not used for cross-site tracking. Here are the cookies set by the RUM Browser SDK:
| Cookie name | Details |
|---|---|
_dd_s | Cookie used to group all events generated from a unique user session across multiple pages. It contains the current session ID, whether the session is excluded due to sampling, and the expiration date of the session. The cookie is extended for an extra 15 minutes every time the user interacts with the website, up to the maximum user session duration (4 hours). |
dd_site_test_* | Temporary cookie used to test for cookie support. Expires instantly. |
dd_cookie_test_* | Temporary cookie used to test for cookie support. Expires instantly. |
Note: The _dd_l, _dd_r, and _dd cookies have been replaced with _dd_s in recent versions of the RUM Browser SDK.
Session IDs, cookies, and RUM applications
There is a one-to-one relation between a RUM session and the RUM application it belongs to. Therefore, the domain set for the _dd_s cookie is fully dedicated to the RUM application it is monitoring and cannot monitor any additional applications.
"No cookie support detected" error with EUA authentication
If your application uses Enterprise User Administration (EUA) with a redirect to CMS IDM for authentication, the login flow fails when it occurs inside an iframe. During the redirect, the CSRF token is dropped, which is expected security behavior. Because CSRF protection cannot function correctly when the authentication sequence begins within an iframe, the application returns a No cookie support detected error.
To record the browser test successfully:
- Record using the popup window mode: When starting the browser test recording, select Open in Popup instead of recording inside the iframe. This allows the authentication flow to complete without losing the CSRF token.
- Log out before recording: Make sure there is no active session or saved cookies. Start the recording with a completely clean session.
- Use incognito/private browsing mode: This prevents cached credentials or cookies from interfering with the authentication flow.
- Record once using the popup window: After the test is recorded through the popup, it runs correctly from the private location.
Technical limitations
Each event sent by the RUM Browser SDK is built with the following:
- RUM global context
- Event context (if any)
- Attributes specific to the event
Example:
window.DD_RUM && window.DD_RUM.setGlobalContextProperty('global', {'foo': 'bar'})
window.DD_RUM && window.DD_RUM.addAction('hello', {'action': 'qux'})
The example code creates the following action event:
{
"type": "action",
"context": {
"global": {
"foo": "bar"
},
"action": "qux"
},
"action": {
"id": "xxx",
"target": {
"name": "hello"
},
"type": "custom"
},
...
}
If an event or a request goes beyond any of the listed RUM technical limitations, it is rejected by the Datadog intake.
"Customer data exceeds the recommended threshold" warning
The RUM Browser SDK allows you to set global context, user information, and feature flags, which are then included with the collected events.
To minimize the user bandwidth impact, the RUM Browser SDK throttles the data sent to the Datadog intake. However, sending large volumes of data can still impact the performance for users on slow internet connections.
For the best user experience, Datadog recommends keeping the size of the global context, user information, and feature flags below 3KiB. If the data exceeds this limit, a warning is displayed: The data exceeds the recommended 3KiB threshold.
Since v5.3.0, the RUM Browser SDK supports data compression through the compressIntakeRequest initialization parameter. When enabled, this recommended limit is extended from 3KiB to 16KiB.
Cross origin read blocking warning
On Chromium-based browsers, when the RUM Browser SDK sends data to the Datadog intake, a CORB warning is printed in the console: Cross-Origin Read Blocking (CORB) blocked cross-origin response.
The warning is shown because the intake returns a non-empty JSON object. This behavior is a reported Chromium issue. It does not impact the RUM Browser SDK and can safely be ignored.
"Deobfuscation failed" warning
A warning appears when deobfuscation fails for a stack trace. If the stack trace is not obfuscated to begin with, you can ignore this warning. Otherwise, use the RUM Debug Symbols page to view all your uploaded source maps. See Investigate Obfuscated Stack Traces with RUM Debug Symbols.
Overview
If you experience unexpected behavior with Datadog RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Check if Datadog RUM is initialized
Use the utility method isInitialized to check if the SDK is properly initialized:
if (Datadog.isInitialized()) {
// your code here
}
Debugging
When writing your application, you can enable development logs by calling the setVerbosity method. All internal messages in the library with a priority equal to or higher than the provided level are then logged to Android's Logcat:
Datadog.setVerbosity(Log.INFO)
RUM Debug Widget
The RUM Debug Widget provides a floating overlay that displays key metrics such as memory usage, CPU load, and RUM events in real time. It is intended for debugging and development purposes only.
See the module README for setup instructions.
Migrating to 3.0.0
If you've been using the SDK v2 or SDK v1, there are some breaking changes introduced in version 3.0.0. See the migration guide for more information.
"Deobfuscation failed" warning
A warning appears when deobfuscation fails for a stack trace. If the stack trace is not obfuscated to begin with, you can ignore this warning. Otherwise, use the RUM Debug Symbols page to view all your uploaded mapping files. See Investigate Obfuscated Stack Traces with RUM Debug Symbols.
Overview
If you experience unexpected behavior with Datadog RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Check if Datadog SDK is properly initialized
After you configure Datadog SDK and run the app for the first time, check your debugger console in Xcode. The SDK implements several consistency checks and outputs relevant warnings if something is misconfigured.
Debugging
When writing your application, you can enable development logs by setting the verbosityLevel value. Relevant messages from the SDK with a priority equal to or higher than the provided level are output to the debugger console in Xcode:
Datadog.verbosityLevel = .debug
You should then see output similar to the following, indicating that a batch of RUM data was properly uploaded:
[DATADOG SDK] 🐶 → 17:23:09.849 [DEBUG] ⏳ (rum) Uploading batch...
[DATADOG SDK] 🐶 → 17:23:10.972 [DEBUG] → (rum) accepted, won't be retransmitted: success
Recommendation: Use Datadog.verbosityLevel in the DEBUG configuration, and unset it in RELEASE.
"Deobfuscation failed" warning
A warning appears when deobfuscation fails for a stack trace. If the stack trace is not obfuscated to begin with, you can ignore this warning. Otherwise, use the RUM Debug Symbols page to view all your uploaded dSYMs. See Investigate Obfuscated Stack Traces with RUM Debug Symbols.
Overview
If you experience unexpected behavior with Datadog RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Duplicate interface (iOS)
If you see this error while building iOS after upgrading to datadog_flutter_plugin v2.0:
Semantic Issue (Xcode): Duplicate interface definition for class 'DatadogSdkPlugin'
/Users/exampleuser/Projects/test_app/build/ios/Debug-iphonesimulator/datadog_flutter_plugin/datadog_flutter_plugin.framework/Headers/DatadogSdkPlugin.h:6:0
Try performing flutter clean && flutter pub get and rebuilding. This usually resolves the issue.
Duplicate classes (Android)
If you see this error while building Android after the upgrading to datadog_flutter_plugin v2.0:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
Make sure that you've updated your version of Kotlin to at least 1.8 in your build.gradle file.
CocoaPods issues
If you have trouble building your iOS application after adding the Datadog SDK because of errors being thrown by CocoaPods, check which error you are getting. The most common error is an issue getting the most up-to-date native library from CocoaPods, which can be solved by running the following in your ios directory:
pod install --repo-update
Another common error is an issue loading the FFI library on Apple Silicon Macs. If you see an error similar to the following:
LoadError - dlsym(0x7fbbeb6837d0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_c.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:6:in `rescue in <top (required)>'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:3:in `<top (required)>'
Follow the instructions in the Flutter documentation for working with Flutter on Apple Silicon.
Undefined symbol (iOS)
If you use Flutter's build ios-framework command, you may see errors similar to the following:
Undefined symbol: _OBJC_CLASS_$_PLCrashReport
Undefined symbol: _OBJC_CLASS_$_PLCrashReportBinaryImageInfo
Undefined symbol: _OBJC_CLASS_$_PLCrashReportStackFrameInfo
...
This occurs because the build ios-framework command does not properly include PLCrashReporter, which the Datadog Flutter SDK depends on. To resolve this issue, Datadog recommends manually including the PLCrashReporter dependency. The framework and instructions for including it are available on its GitHub page.
Set sdkVerbosity
If you're able to run your app, but you are not seeing the data you expect on the Datadog site, try adding the following to your code before calling DatadogSdk.initialize:
DatadogSdk.instance.sdkVerbosity = CoreLoggerLevel.debug;
This causes the SDK to output additional information about what it's doing and what errors it's encountering, which may help you and Datadog Support narrow down your issue.
Not seeing errors
If you do not see any errors in RUM, it's likely no view has been started. Make sure you have started a view with DatadogSdk.instance.rum?.startView or, if you are using DatadogRouteObserver make sure your current Route has a name.
Issues with automatic resource tracking and distributed tracing
The Datadog tracking HTTP client package works with most common Flutter networking packages that rely on dart:io, including http and Dio.
If you are seeing resources in your RUM Sessions, then the tracking HTTP client is working, but other steps may be required to use distributed tracing.
By default, the Datadog RUM Flutter SDK samples distributed traces at only 20% of resource requests. While determining if there is an issue with your setup, you should set this value to 100% of traces by modifying your initialization with the following lines:
final configuration = DdSdkConfiguration(
//
rumConfiguration: DatadogRumConfiguration(
applicationId: '<RUM_APPLICATION_ID>',
tracingSamplingRate: 100.0
),
);
If you are still having issues, check that your firstPartyHosts property is set correctly. These should be hosts only, without schemas or paths, and they do not support regular expressions or wildcards. For example:
✅ Good - 'example.com', 'api.example.com', 'us1.api.sample.com' ❌ Bad - 'https://example.com', '.example.com', 'us1.sample.com/api/', 'api.sample.com/api'
"Deobfuscation failed" warning
A warning appears when deobfuscation fails for a stack trace. If the stack trace is not obfuscated to begin with, you can ignore this warning. Otherwise, use the RUM Debug Symbols page to view all your uploaded symbol files, dSYMs, and mapping files. See Investigate Obfuscated Stack Traces with RUM Debug Symbols.
Overview
If you experience unexpected behavior with Datadog React Native RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
No data is being sent to Datadog
Follow these instructions in order when the SDK has been installed and the app compiles, but no data is received by Datadog.
Check the configuration
Sometimes, no data is sent due to a small misstep in the configuration.
Here are some common things to check for:
- Make sure your
clientTokenandapplicationIdare correct. - Make sure you have not set
sessionSamplingRateto something other than 100 (100 is the default value), or else your session might not be sent. - If you've set up a
Proxyin the Datadog configuration, check that it has been correctly configured. - Check that you are tracking views (all events must be attached to a view) and sending events.
Review SDK logs in React Native
Set
config.verbosity = SdkVerbosity.DEBUG, which importsSdkVerbosityfrom@datadog/mobile-react-native.Logs start appearing in the JavaScript console, like the following output:
INFO DATADOG: Datadog SDK was initialized INFO DATADOG: Datadog SDK is tracking interactions INFO DATADOG: Datadog SDK is tracking XHR resources INFO DATADOG: Datadog SDK is tracking errors DEBUG DATADOG: Starting RUM View "Products" #Products-oaZlP_FVwGM5vtPoup_rT DEBUG DATADOG: Adding RUM Action "RCTView" (TAP)Note: In this example, the first four logs indicate that the SDK has been correctly configured and the last two lines are events that were sent.
Possible cause
If you are on iOS and see some DEBUG logs indicating that logs or RUM events were sent before the initialization logs, this may be why the SDK is not sending events.
You cannot send events before initialization, and attempting to do so puts the SDK in a state where it cannot send any data.
Solution
If you use DdSdkReactNative.initialize to start the Datadog SDK, call this function in your top-level index.js file so that the SDK is initialized before your other events are sent.
Starting from SDK version 1.2.0, you can initialize the SDK using the DatadogProvider component. This component includes a RUM events buffer that makes sure the SDK is initialized before sending any data to Datadog, which prevents this issue from happening.
To use it, see the Migrate to the Datadog Provider guide.
Review native logs
Reviewing native logs can give you more input on what could be going wrong.
On iOS
Open your project in Xcode by running
xed ios.Build your project for a simulator or a device.
Native logs start appearing on the bottom right corner:
You can filter logs by "DATADOG" and look for any error.
If you are indeed sending events, you should see the following logs:
[DATADOG SDK] 🐶 → 10:02:47.398 [DEBUG] ⏳ (rum) Uploading batch...
[DATADOG SDK] 🐶 → 10:02:47.538 [DEBUG] → (rum) accepted, won't be retransmitted: [response code: 202 (accepted), request ID: AAAABBBB-1111-2222-3333-777788883333]
The first log indicates that some data is being sent, and the second log indicates that the data has been received.
Possible cause
If you see the log below, it means that you have called a RUM method before initializing the SDK.
[DATADOG SDK] 🐶 → 10:09:13.621 [WARN] The `Global.rum` was called but no `RUMMonitor` is registered. Configure and register the RUM Monitor globally before invoking the feature:
Solution
If you use DdSdkReactNative.initialize to start the Datadog SDK, call this function in your top-level index.js file so the SDK is initialized before your other events are sent.
Starting from SDK version 1.2.0, you can initialize the SDK using the DatadogProvider component. This component includes a RUM events buffer that makes sure the SDK is initialized before sending any data to Datadog, which prevents this issue from happening.
To use it, see the Migrate to the Datadog Provider guide.
On Android
For a better debugging experience, Datadog recommends installing pidcat.
- pidcat filters the device logs (obtained by
adb logcat) to only show the one from your application. - See this issue for M1 users who don't have Python 2.
- pidcat filters the device logs (obtained by
Modify
node_modules/@datadog/mobile-react-native/android/src/main/kotlin/com/datadog/reactnative/DdSdk.ktto enable verbose logging from the native SDK:fun initialize(configuration: ReadableMap, promise: Promise) { // ... datadog.initialize(appContext, credentials, nativeConfiguration, trackingConsent) datadog.setVerbosity(Log.VERBOSE) // Add this line // ... }Run the app on a phone connected in debug mode to your laptop (should appear when running
adb devices), or from an emulator.Run pidcat
my.app.package.nameoradb logcatfrom your laptop.Look for any error mentioning Datadog.
Pidcat output looks like this:
In this example, the last log indicates that the batch of RUM data was sent successfully.
Undefined symbols: Swift
If you see the following error message:
Undefined symbols for architecture x86_64:
"static Foundation.JSONEncoder.OutputFormatting.withoutEscapingSlashes.getter : Foundation.JSONEncoder.OutputFormatting", referenced from:
static (extension in Datadog):Foundation.JSONEncoder.default() -> Foundation.JSONEncoder in libDatadogSDK.a(JSONEncoder.o)
...
Open Xcode, go to the Build Settings of your project (not your app target), and make sure Library Search Paths have the following settings:
LIBRARY_SEARCH_PATHS = (
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
"\"/usr/lib/swift\"",
"\"$(inherited)\"",
);
Undefined symbols: _RCTModule
If you see an undefined _RCTModule symbol, it may be related to this change in the react-native v0.63 changelog.
You can make the following change to fix it:
// DdSdk.m
// instead of
#import <React/RCTBridgeModule.h>
// maybe that:
@import React // or @import React-Core
Infinite loop-like error messages
If you run into an issue where your React Native project displays a stream of error messages and significantly raises your CPU usage, try creating a new React Native project.
Android build failures with SDK version 2.*
Unable to make field private final java.lang.String java.io.File.path accessible
If your Android build fails with an error like:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processReleaseMainManifest'.
> Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @1bbf7f0e
You are using Java 17, which is not compatible with your React Native version. Switch to Java 11 to solve the issue.
java.lang.UnsupportedClassVersionError
If your Android build fails with an error like:
java.lang.UnsupportedClassVersionError: com/datadog/android/lint/DatadogIssueRegistry has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
You are using a version of Java that is too old. Switch to Java 17 to solve the issue.
Unsupported class file major version 61
If your Android build fails with an error like:
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':app:lintVitalRelease'.
> Could not resolve all artifacts for configuration ':app:debugRuntimeClasspath'.
> Failed to transform dd-sdk-android-core-2.0.0.aar (com.datadoghq:dd-sdk-android-core:2.0.0) to match attributes {artifactType=android-manifest, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-runtime}.
> Execution failed for JetifyTransform: /Users/me/.gradle/caches/modules-2/files-2.1/com.datadoghq/dd-sdk-android-core/2.0.0/a97f8a1537da1de99a86adf32c307198b477971f/dd-sdk-android-core-2.0.0.aar.
> Failed to transform '/Users/me/.gradle/caches/modules-2/files-2.1/com.datadoghq/dd-sdk-android-core/2.0.0/a97f8a1537da1de99a86adf32c307198b477971f/dd-sdk-android-core-2.0.0.aar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 61. (Run with --stacktrace for more details.)
You are using a version of Android Gradle Plugin below 5.0. To fix the issue, add in your android/gradle.properties file:
android.jetifier.ignorelist=dd-sdk-android-core
Duplicate class kotlin.collections.jdk8.*
If your Android build fails with an error like:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:checkReleaseDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
> Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20)
You need to set a Kotlin version for your project to avoid clashes among Kotlin dependencies. In your android/build.gradle file, specify the kotlinVersion:
buildscript {
ext {
// targetSdkVersion = ...
kotlinVersion = "1.8.21"
}
}
Alternatively, you can add the following rules to your build script in your android/app/build.gradle file:
dependencies {
constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21") {
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
}
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21") {
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
}
}
}
"Deobfuscation failed" warning
A warning appears when deobfuscation fails for a stack trace. If the stack trace is not obfuscated to begin with, you can ignore this warning. Otherwise, use the RUM Debug Symbols page to view all your uploaded source maps, dSYMs, and mapping files. See Investigate Obfuscated Stack Traces with RUM Debug Symbols.
Overview
If you experience unexpected behavior with the Datadog Kotlin Multiplatform SDK, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Check if Datadog RUM is initialized
Use the utility method isInitialized to check if the SDK is properly initialized:
if (Datadog.isInitialized()) {
// your code here
}
Debugging
When writing your application, you can enable development logs by calling the setVerbosity method. All internal messages in the library with a priority equal to or higher than the provided level are then logged either to Android's Logcat or to the debugger console in Xcode:
Datadog.setVerbosity(SdkLogVerbosity.DEBUG)
Set tracking consent (GDPR compliance)
To be compliant with GDPR, the SDK requires the tracking consent value at initialization. Tracking consent can be one of the following values:
TrackingConsent.PENDING: (Default) The SDK starts collecting and batching the data but does not send it to the collection endpoint. The SDK waits for the new tracking consent value to decide what to do with the batched data.TrackingConsent.GRANTED: The SDK starts collecting the data and sends it to the data collection endpoint.TrackingConsent.NOT_GRANTED: The SDK does not collect any data. You are not able to manually send any logs, traces, or RUM events.
To update the tracking consent after the SDK is initialized, call Datadog.setTrackingConsent(<NEW CONSENT>). The SDK changes its behavior according to the new consent. For example, if the current tracking consent is TrackingConsent.PENDING and you update it to:
TrackingConsent.GRANTED: The SDK sends all current batched data and future data directly to the data collection endpoint.TrackingConsent.NOT_GRANTED: The SDK wipes all batched data and does not collect any future data.
Common problems
iOS binary linking
Missing PLCrashReporter symbols
If there is an error during the linking step about missing PLCrashReporter symbols in the linker search paths, like the following:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_PLCrashReport", referenced from:
in DatadogCrashReporting[arm64][15](PLCrashReporterIntegration.o)
"_OBJC_CLASS_$_PLCrashReportBinaryImageInfo", referenced from:
in DatadogCrashReporting[arm64][7](CrashReport.o)
"_OBJC_CLASS_$_PLCrashReportStackFrameInfo", referenced from:
in DatadogCrashReporting[arm64][7](CrashReport.o)
"_OBJC_CLASS_$_PLCrashReportThreadInfo", referenced from:
in DatadogCrashReporting[arm64][7](CrashReport.o)
"_OBJC_CLASS_$_PLCrashReporter", referenced from:
in DatadogCrashReporting[arm64][15](PLCrashReporterIntegration.o)
"_OBJC_CLASS_$_PLCrashReporterConfig", referenced from:
in DatadogCrashReporting[arm64][15](PLCrashReporterIntegration.o)
Then you need to explicitly pass the CrashReporter framework name to the linker:
targets.withType(KotlinNativeTarget::class.java) {
compilations.getByName("main").compileTaskProvider {
compilerOptions {
freeCompilerArgs.addAll(
listOf(
"-linker-option",
"-framework CrashReporter"
)
)
}
}
}
Missing swiftCompatibility symbols
If there is an error during the linking step about missing swiftCompatibility symbols in the linker search paths, like the following:
Undefined symbols for architecture arm64:
"__swift_FORCE_LOAD_$_swiftCompatibility56", referenced from:
__swift_FORCE_LOAD_$_swiftCompatibility56_$_DatadogCrashReporting in DatadogCrashReporting[arm64][4](BacktraceReporter.o)
"__swift_FORCE_LOAD_$_swiftCompatibilityConcurrency", referenced from:
__swift_FORCE_LOAD_$_swiftCompatibilityConcurrency_$_DatadogCrashReporting in DatadogCrashReporting[arm64][4](BacktraceReporter.o)
Then you can suppress this error:
targets.withType(KotlinNativeTarget::class.java) {
compilations.getByName("main").compileTaskProvider {
compilerOptions {
freeCompilerArgs.addAll(
listOf(
"-linker-option",
"-U __swift_FORCE_LOAD_\$_swiftCompatibility56",
"-linker-option",
"-U __swift_FORCE_LOAD_\$_swiftCompatibilityConcurrency"
)
)
}
}
}
Overview
If you experience unexpected behavior with the Datadog C++ SDK, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Enable diagnostic logging
The SDK outputs Warning and Error messages to stderr by default. To see more verbose output during development, lower the diagnostic threshold on your CoreConfig before creating the core:
datadog::CoreConfig config("<client_token>", "<service_name>", "<environment>");
config.SetDiagnosticThreshold(datadog::DiagnosticLevel::Debug);
auto core = datadog::Core::Create(config, datadog::TrackingConsent::Granted);
You should see output similar to the following when data is successfully uploaded:
[DATADOG STATUS] Upload cycle finished with all uploads successful
Recommendation: Remove the SetDiagnosticThreshold call in production builds to revert to the default (Warning) and avoid unnecessary log volume.
To route diagnostic output somewhere other than stderr, supply a custom handler. The msg.text pointer is only valid for the duration of the call, so copy the string if you need to store it:
config.SetDiagnosticHandler([](const datadog::DiagnosticMessage& msg) {
my_logger.write(msg.text);
});
Pass nullptr to SetDiagnosticHandler to suppress all diagnostic output entirely.
Runtime Issues
No data appears in Datadog
If your application runs but data does not appear in the Datadog UI, check the following:
- Tracking consent: Confirm that tracking consent is set to
Granted. If the core was initialized withPendingorNotGranted, no data is uploaded. Start()was called: The SDK does not collect or upload data untilcore->Start()is called after all features are registered.- Active view: RUM errors, resources, and actions are attached to the active view. If no view has been started with
StartView(), those events may be dropped. Start a view before recording other events. - Network connectivity: The SDK requires outbound HTTPS access to Datadog intake endpoints on port 443. Verify that your network allows these connections.
- Diagnostic output: Lower the diagnostic threshold (see above) and look for messages indicating upload failures or configuration errors.
Storage directory is not writable
If diagnostic output shows storage errors, verify that the storage directory exists and is writable by the application process. The SDK uses the directory set with SetApplicationStoragePath(), or the current working directory by default.
Crash reports are not appearing after a crash
Crash reports are uploaded on the next application launch after the crash, not immediately (since the process is terminated at crash time). After triggering a test crash, relaunch the application and wait for the upload to complete.
If reports still do not appear:
- Confirm that
CrashReporting::Register()is called after creating the core but beforecore->Start(). - Verify that the application has write access to its storage directory.
- Check that the
crashpad_handlerexecutable is present in the same directory as your application binary (if using Crashpad mode). Usedatadog_enable(your_target)in CMake to copy it automatically.
Overview
If you encounter issues while using the Datadog .NET MAUI SDK, check the open issues on GitHub for known problems and solutions. If you continue to have trouble, contact Datadog Support for further assistance.
Enable verbose SDK logging
You can enable verbose SDK logging to help diagnose issues. Set Verbosity on the SDK configuration — all internal messages at or above the provided level are written to Logcat (Android) and to the Xcode debugger console (iOS):
using Datadog.Maui;
using Datadog.Maui.Configuration;
DdSdk.Initialize(new DdSdkConfiguration
{
ClientToken = "<CLIENT_TOKEN>",
Environment = "<ENV_NAME>",
TrackingConsent = TrackingConsent.Granted,
Verbosity = SdkVerbosity.DEBUG,
});
Supported levels: DEBUG, INFO, WARN, ERROR. The same property can be set via JSON (File-based configuration):
{ "Verbosity": "DEBUG" }
Enable verbose logging only while diagnosing — the additional log volume can affect application performance on debug devices.
No RUM events appear in Datadog
Work through the checks below in order.
1. Confirm the SDK is initialized
DdSdk.Initialize (Pattern 2) and .UseDatadog(...) (Pattern 1) must run before any other Datadog API call. If you initialize from a non-default location (for example, a feature flag–gated startup path), make sure that code runs on every cold launch.
With verbose logging enabled, the SDK prints a startup message confirming the active site, environment, and feature set.
2. Confirm tracking consent is Granted
If TrackingConsent is Pending or NotGranted, the SDK does not send any data. Update the consent at runtime after the user accepts your privacy dialog:
DdSdk.SetTrackingConsent(TrackingConsent.Granted);
See Set tracking consent (GDPR compliance) for the full state machine.
3. Confirm the right Datadog site
The default site is Us1. If your organization is on a different site (Us3, Us5, Eu1, Ap1, Ap2, Us1Fed), set Site accordingly on DdSdkConfiguration. The site selector at the top of these documentation pages updates code samples to match.
4. Confirm the application ID and client token
A wrong application ID silently drops events server-side. Double-check the values against the application you created in Digital Experience > Add an Application.
Events appear, but stack traces are not symbolicated
For native iOS and Android crashes, dSYMs (iOS) and mapping.txt (Android) must be uploaded to Datadog. See Get deobfuscated stack traces for the full pipeline.
For managed C# stack traces, Portable PDB files must be bundled in the published app. See Bundle Portable PDB files for C# stack traces.
C# errors and native crashes appear twice
When NativeCrashReportEnabled = true, an unhandled C# exception that crashes the app is reported both as a managed C# error (via AppDomain.UnhandledException) and as a native crash (via the platform crash reporter). This is intentional — the two events share a session and view so you can correlate them. To keep only one, filter with ErrorEventMapper.
Automatic actions are bucketed under the wrong view
TapGestureRecognizer.Tapped and SwipeGestureRecognizer.Swiped only fire on completion, so a tap or swipe that triggers a navigation is recorded against the destination view rather than the source. This is a known limitation that affects only Views with explicit gesture recognizers; Button and ImageButton taps are not affected. See Known limitation: gesture-driven navigation.
View attributes attach to the wrong view
DdRum.AddViewAttribute runs against the view that is active in the SDK at the time of the call. If you call it from a page constructor or OnAppearing, the SDK has not yet called StartView for the new page, and the attribute lands on the previous view.
Call AddViewAttribute from OnNavigatedTo instead — by then the SDK has started the destination view. See Add view attributes.
dotnet publish finishes but symbols are not uploaded
The MSBuild target skips silently when datadog-ci is missing or DATADOG_API_KEY is unset. The terminal logger hides those messages by default — add -v n -tl:off to dotnet publish to see them:
dotnet publish -c Release -f net10.0-ios -r ios-arm64 \
-p:DatadogUploadSymbols=true -v n -tl:off
See Symbol upload troubleshooting for the full diagnostic list.
Overview
If you experience unexpected behavior with the Datadog Roku SDK, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
SDK not sending data to Datadog
If your channel is running but no data appears in Datadog, verify that the site parameter in your initialization matches the datacenter for your Datadog organization:
datadogroku_initialize({
clientToken: "<CLIENT_TOKEN>",
applicationId: "<APPLICATION_ID>",
site: "datadoghq.com", ' Update this value to match your organization's datacenter
env: "<ENV_NAME>",
sessionSampleRate: 100,
launchArgs: args
})
The default value (datadoghq.com) routes data to the US1 datacenter. If your organization is on EU1, AP1, or another region, update this value accordingly. See the Roku Channel Monitoring Setup for the correct site value for your region.
Overview
If you experience unexpected behavior with Datadog RUM, use this guide to resolve issues. If you continue to have trouble, contact Datadog Support for further assistance.
Set sdkVerbosity for easier debugging
If you're able to run your app, but you are not seeing the data you expect on the Datadog site, try adding the following to your code as part of initialization:
DatadogSdk.Instance.SetSdkVerbosity(CoreLoggerLevel.Debug);
This causes the SDK to output additional information about what it's doing and what errors it's encountering, which may help you and Datadog Support narrow down your issue.
The SDK is not sending data
Datadog does not support sending data from the Unity Editor, only from iOS and Android simulators, emulators, and devices.
If you're not seeing any data in Datadog:
Make sure you are running your app on an iOS or Android simulator, emulator, or device, and not from the editor.
Check that you have set the
TrackingConsentas part of your initialization. Tracking consent is set toTrackingConsent.Pendingduring initialization, and needs to be set toTrackingConsent.Grantedbefore Datadog sends any information.DatadogSdk.Instance.SetTrackingConsent(TrackingConsent.Granted);











