Si la fonctionnalité RUM pour React Native de Datadog se comporte de manière inattendue, consultez ce guide pour résoudre les problèmes rapidement. Si ceux-ci persistent, contactez l’assistance Datadog pour obtenir de l’aide.

Aucune donnée n’est envoyée à Datadog

Suivez ces instructions si aucune donnée n’est envoyée à Datadog alors que le SDK a été installé et que l’application a été compilée correctement.

Vérifier la configuration

Dans certains cas, aucune donnée n’est envoyée en raison d’une petite erreur lors de la configuration.

Voici quelques points à vérifier :

  • Assurez-vous que votre clientToken et votre applicationId sont corrects.
  • Assurez-vous d’avoir bien défini sessionSamplingRate sur 100 (il s’agit de la valeur par défaut). Autrement, votre session risque d’être envoyée.
  • Si vous avez défini un Proxy pendant la configuration de Datadog, vérifiez qu’il a été configuré correctement.
  • Vérifiez que vous suivez les vues (les événements doivent tous être associés à une vue) et que vous envoyez les événements.

Examiner les logs du SDK dans React Native

  • Définissez config.verbosity = SdkVerbosity.DEBUG pour importer SdkVerbosity à partir de @datadog/mobile-react-native.

  • Les logs commenceront alors à apparaître dans la console JavaScript, comme suit :

    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)
    

    Remarque : dans cet exemple, les quatre premiers logs indiquent que le SDK a été configuré correctement et les deux dernières lignes correspondent aux événements ayant été envoyés.

Cause possible

Si vous utilisez iOS et que des logs DEBUG indiquent que des logs ou événements RUM ont été envoyés avant les logs d’initialisation, il peut s’agir de la raison pour laquelle le SDK n’envoie aucun événement.

Vous ne pouvez pas envoyer d’événements avant l’initialisation. Procéder de la sorte empêche le SDK d’envoyer des données.

Solution

Avec DdSdkReactNative.initialize :

Si vous utilisez DdSdkReactNative.initialize pour démarrer le SDK Datadog, appelez cette fonction dans votre fichier index.js de premier niveau de manière à ce que le SDK soit initialisé avant l’envoi de vos événements.

Avec DatadogProvider :

Depuis la version 1.2.0 du SDK, vous pouvez initialiser celui-ci à l’aide du composant DatadogProvider. Ce composant comprend un buffer d’événements RUM qui garantit l’initialisation du SDK avant l’envoi de données à Datadog, ce qui permet d’éviter ce problème.

Pour l’utiliser, consultez le guide de migration vers le fournisseur Datadog.

Examiner les logs natifs

L’examen des logs natifs peut vous aider à mieux cerner la nature du problème.

Sous iOS

  • Exécutez xed ios pour ouvrir votre projet dans Xcode.

  • Créez un build de votre projet pour un simulateur ou un appareil.

  • Les logs natifs commenceront à apparaître dans le coin inférieur droit :

    L'examen des logs natifs peut vous aider à comprendre la raison pour laquelle aucune donnée n'est envoyée

Vous pouvez appliquer le filtre « DATADOG » aux logs et rechercher des erreurs.

S’il s’avère que vous envoyez bien des événements, vous devriez voir les logs suivants :

[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]

Le premier log indique qu’un certain nombre de données sont envoyées, tandis que le second indique que les données ont bien été reçues.

Cause possible

Si le log ci-dessous s’affiche, cela signifie que vous avez appelé une méthode RUM avant d’initialiser le 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

Avec DdSdkReactNative.initialize :

Si vous utilisez DdSdkReactNative.initialize pour démarrer le SDK Datadog, appelez cette fonction dans votre fichier index.js de premier niveau de manière à ce que le SDK soit initialisé avant l’envoi de vos événements.

Avec DatadogProvider :

Depuis la version 1.2.0 du SDK, vous pouvez initialiser celui-ci à l’aide du composant DatadogProvider. Ce composant comprend un buffer d’événements RUM qui garantit l’initialisation du SDK avant l’envoi de données à Datadog, ce qui permet d’éviter ce problème.

Pour l’utiliser, consultez le guide de migration vers le fournisseur Datadog.

Sous Android

  • Pour une meilleure expérience de debugging, Datadog recommande l’installation de Pidcat.

    • pidcat filtre les logs de l’appareil (obtenus via adb logcat) afin d’afficher uniquement ceux issus de votre application.
    • Consultez la solution à ce problème si vous utilisez une machine dotée d’une puce M1 et ne possédez pas Python 2.
  • Modifiez node_modules/@datadog/mobile-react-native/android/src/main/kotlin/com/datadog/reactnative/DdSdk.kt pour activer la journalisation détaillée à partir du SDK natif :

    fun initialize(configuration: ReadableMap, promise: Promise) {
        // ...
    
        datadog.initialize(appContext, credentials, nativeConfiguration, trackingConsent)
        datadog.setVerbosity(Log.VERBOSE) // Add this line
    
        // ...
    }
    
  • Exécutez l’app sur un téléphone connecté à votre ordinateur portable en mode debugging (ce dernier devrait s’afficher lors de l’exécution de adb devices) ou à partir d’un émulateur.

  • Exécutez my.app.package.name ou adb logcat de pidcat à partir de votre ordinateur portable.

  • Recherchez des erreurs mentionnant Datadog.

Le résultat pidcat ressemblera à ce qui suit :

Exemple d'un résultat pidcat

Dans cet exemple, le dernier log indique que le lot de données RUM a été envoyé correctement.

Symboles non définis : Swift

Si le message d’erreur suivant s’affiche :

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)
...

Ouvrez Xcode, accédez aux Build Settings de votre projet (et non pas de l’application cible), puis assurez-vous que les chemins de recherche de bibliothèques comportent les paramètres suivants :

LIBRARY_SEARCH_PATHS = (
  "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
  "\"/usr/lib/swift\"",
  "\"$(inherited)\"",
);

Symboles non définis : _RCTModule

Si un symbole _RCTModule non défini s’affiche, l’erreur peut être liée à ce changement effectué dans le changelog de la version 0.63 de React Native.

Vous pouvez apporter la modification suivante pour corriger le problème :

// DdSdk.m
// au lieu de
#import <React/RCTBridgeModule.h>
// peut-être ça :
@import React // ou @import React-Core

Messages d’erreur affichés en boucle

Si vous constatez que votre projet React Native affiche une boucle de messages d’erreur qui entraîne une utilisation plus intensive de votre CPU, essayez de créer un autre projet React Native.

Échecs de build Android avec la version 2.* du SDK

Unable to make field private final java.lang.String java.io.File.path accessible

Si une erreur d’échec de votre build Android similaire à ce qui suit s’affiche :

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

Vous utilisez Java 17, qui n’est pas compatible avec votre version de React Native. Repassez à Java 11 pour résoudre le problème.

java.lang.UnsupportedClassVersionError

Si une erreur d’échec de votre build Android similaire à ce qui suit s’affiche :

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

Vous utilisez une version obsolète de Java. Passez à Java 17 pour résoudre le problème.

Unsupported class file major version 61

Si une erreur d’échec de votre build Android similaire à ce qui suit s’affiche :

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.)

Vous utilisez une version du plug-in Android Gradle antérieure à la 5.0. Pour résoudre le problème, Ajoutez ce qui suit à votre fichier android/gradle.properties :

android.jetifier.ignorelist=dd-sdk-android-core

Duplicate class kotlin.collections.jdk8.*

Si une erreur d’échec de votre build Android similaire à ce qui suit s’affiche :

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)

Vous devez définir une version Kotlin pour votre projet afin d’éviter les conflits entre les dépendances Kotlin. Dans votre fichier android/build.gradle, spécifiez la kotlinVersion :

buildscript {
    ext {
        // targetSdkVersion = ...
        kotlinVersion = "1.8.21"
    }
}

Sinon, vous pouvez ajouter les règles suivantes au script de votre build dans votre fichier android/app/build.gradle :

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")
        }
    }
}

Pour aller plus loin