Surveillance Android avec RUM

Présentation

Le Real User Monitoring (RUM) de Datadog vous permet de visualiser et d’analyser les performances en temps réel et les parcours des utilisateurs de votre application.

Le SDK Datadog pour Android prend en charge la version 4.4 d’Android (niveau d’API 19) et les versions ultérieures ainsi qu’Android TV.

Configuration

  1. Déclarez le SDK en tant que dépendance.
  2. Ajoutez les détails de l’application dans l’interface utilisateur.
  3. Initialisez la bibliothèque avec le contexte de l’application.
  4. Initialisez le monitor RUM ainsi que l’intercepteur et commencez à envoyer des données.

Déclarer le SDK en tant que dépendance

Déclarez dd-sdk-android et le plug-in Gradle en tant que dépendance dans le fichier build.gradle du module de votre application.

buildscript {
    dependencies {
        classpath("com.datadoghq:dd-sdk-android-gradle-plugin:x.x.x")
    }
}
plugins {
    id("com.datadoghq.dd-sdk-android-gradle-plugin")
    //(...)
}
android {
    //(...)
}
dependencies {
    implementation "com.datadoghq:dd-sdk-android:x.x.x" 
    //(...)
}

Ajouter les détails de l’application dans l’interface utilisateur

  1. Accédez à UX Monitoring > RUM Applications > New Application.
  2. Sélectionnez le type d’application android et attribuez un nom à l’application, afin de générer un ID d’application Datadog unique ainsi qu’un token client.
Créer une application RUM dans un workflow Datadog

Pour assurer la sécurité de vos données, vous devez utiliser un token client. Si vous vous contentez d’utiliser des clés d’API Datadog pour configurer la bibliothèque dd-sdk-android, ces clés seront exposées côté client dans le bytecode de l’APK de l’application Android.

Pour en savoir plus sur la configuration d’un token client, consultez la documentation à ce sujet.

Initialiser la bibliothèque avec le contexte de l’application

Familiarisez-vous avec le fonctionnement de l’option ViewTrackingStrategy pour activer automatiquement le suivi de toutes vos vues (activités, fragments, etc.), de l’option trackingConsent pour implémenter la conformité au RGPD pour vos utilisateurs européens, et d’autres options de configuration pour initialiser la bibliothèque.

    class SampleApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val configuration = Configuration.Builder(
                    logsEnabled = true,
                    tracesEnabled = true,
                    crashReportsEnabled = true,
                    rumEnabled = true
                )
                .useSite(DatadogSite.US1)
                .trackInteractions()
                .trackLongTasks(durationThreshold)
                .useViewTrackingStrategy(strategy)
                .build()
            val credentials = Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>)
            Datadog.initialize(this, credentials, configuration, trackingConsent)
        }
    }
    public class SampleApplication extends Application { 
        @Override 
        public void onCreate() { 
            super.onCreate();
            final Configuration configuration = 
                    new Configuration.Builder(true, true, true, true)
                            .trackInteractions()
                            .trackLongTasks(durationThreshold)
                            .useViewTrackingStrategy(strategy)
                            .useSite(DatadogSite.US1)
                            .build();
               final Credentials credentials = new Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>);
               Datadog.initialize(this, credentials, configuration, trackingConsent); 
        }
    }

    class SampleApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val configuration = Configuration.Builder(
                    logsEnabled = true,
                    tracesEnabled = true,
                    crashReportsEnabled = true,
                    rumEnabled = true
                )
                .useSite(DatadogSite.EU1)
                .trackInteractions()
                .trackLongTasks(durationThreshold)
                .useViewTrackingStrategy(strategy)
                .build()
            val credentials = Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>)
            Datadog.initialize(this, credentials, configuration, trackingConsent)
        }
    }
    public class SampleApplication extends Application { 
        @Override 
        public void onCreate() { 
            super.onCreate();
            final Configuration configuration = 
                    new Configuration.Builder(true, true, true, true)
                            .trackInteractions()
                            .trackLongTasks(durationThreshold)
                            .useViewTrackingStrategy(strategy)
                            .useSite(DatadogSite.EU1)
                            .build();
            Credentials credentials = new Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>);
            Datadog.initialize(this, credentials, configuration, trackingConsent); 
        }
    }

    class SampleApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val configuration = Configuration.Builder(
                    logsEnabled = true,
                    tracesEnabled = true,
                    crashReportsEnabled = true,
                    rumEnabled = true
                )
                .useSite(DatadogSite.US3)
                .trackInteractions()
                .trackLongTasks(durationThreshold)
                .useViewTrackingStrategy(strategy)
                .build()
            val credentials = Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>)
            Datadog.initialize(this, credentials, configuration, trackingConsent)
        }
    }
    public class SampleApplication extends Application { 
        @Override 
        public void onCreate() { 
            super.onCreate();
            final Configuration configuration = 
                    new Configuration.Builder(true, true, true, true)
                            .trackInteractions()
                            .trackLongTasks(durationThreshold)
                            .useViewTrackingStrategy(strategy)
                            .useSite(DatadogSite.US3)
                            .build();
            Credentials credentials = new Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>);
            Datadog.initialize(this, credentials, configuration, trackingConsent); 
        }
    }

    class SampleApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val configuration = Configuration.Builder(
                    logsEnabled = true,
                    tracesEnabled = true,
                    crashReportsEnabled = true,
                    rumEnabled = true
                )
                .useSite(DatadogSite.US5)
                .trackInteractions()
                .trackLongTasks(durationThreshold)
                .useViewTrackingStrategy(strategy)
                .build()
            val credentials = Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>)
            Datadog.initialize(this, credentials, configuration, trackingConsent)
        }
    }
    public class SampleApplication extends Application { 
        @Override 
        public void onCreate() { 
            super.onCreate();
            final Configuration configuration = 
                    new Configuration.Builder(true, true, true, true)
                            .trackInteractions()
                            .trackLongTasks(durationThreshold)
                            .useViewTrackingStrategy(strategy)
                            .useSite(DatadogSite.US5)
                            .build();
            Credentials credentials = new Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>);
            Datadog.initialize(this, credentials, configuration, trackingConsent); 
        }
    }

    class SampleApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val configuration = Configuration.Builder(
                    logsEnabled = true,
                    tracesEnabled = true,
                    crashReportsEnabled = true,
                    rumEnabled = true
                )
                .useSite(DatadogSite.US1_FED)
                .trackInteractions()
                .trackLongTasks(durationThreshold)
                .useViewTrackingStrategy(strategy)
                .build()
            val credentials = Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION>)
            Datadog.initialize(this, credentials, configuration, trackingConsent)
        }
    }
    public class SampleApplication extends Application { 
        @Override 
        public void onCreate() { 
            super.onCreate();
            final Configuration configuration = 
                    new Configuration.Builder(true, true, true, true)
                            .trackInteractions()
                            .trackLongTasks(durationThreshold)
                            .useViewTrackingStrategy(strategy)
                            .useSite(DatadogSite.US1_FED)
                            .build();
            Credentials credentials = new Credentials(<TOKEN_CLIENT>, <NOM_ENVIRONNEMENT>, <NOM_VARIANTE_APPLICATION>, <ID_APPLICATION_>);
            Datadog.initialize(this, credentials, configuration, trackingConsent); 
        }
    }

Pour fournir les identifiants requis pour l’initialisation, vous devez spécifier le nom de variante de votre application. Pour ce faire, utilisez votre valeur BuildConfig.FLAVOR, ou une chaîne vide si vous n’avez pas de variante. Cette étape permet d’importer automatiquement le bon fichier mapping.txt ProGuard au moment du build, afin d’afficher les stack traces des erreurs RUM désobfusquées. Pour en savoir plus, consultez le guide d’importation de fichiers de mapping source Android.

Initialiser le monitor RUM et l’intercepteur

Configurez et enregistrez le monitor RUM. Cette opération, qui doit être effectuée une seule fois, s’effectue dans la méthode onCreate() de votre application.

     val monitor = RumMonitor.Builder().build()
     GlobalRum.registerIfAbsent(monitor)
     final RumMonitor monitor = new RumMonitor.Builder().build();
     GlobalRum.registerIfAbsent(monitor);

Pour effectuer le suivi de vos requêtes OkHttp en tant que ressources, ajoutez l’intercepteur fourni :

     val okHttpClient =  OkHttpClient.Builder()
         .addInterceptor(DatadogInterceptor())
         .build()
     final OkHttpClient okHttpClient =  new OkHttpClient.Builder()
         .addInterceptor(new DatadogInterceptor())
         .build();

Cette approche permet d’enregistrer chaque requête traitée par le client OkHttpClient en tant que ressource dans RUM. Toutes les informations pertinentes sont automatiquement renseignées (URL, méthode, code de statut, erreur). Seules les requêtes réseau commençant au moment où une vue est active font l’objet d’un suivi. Si vous souhaitez surveiller des requêtes lorsque votre application est en arrière-plan, créez manuellement une vue.

Remarque : si vous utilisez plusieurs intercepteurs, appelez d’abord DatadogInterceptor.

Vous pouvez également ajouter un EventListener pour le client OkHttpClient afin d’effectuer automatiquement le suivi des durées de ressources pour les fournisseurs tiers et les requêtes réseau.

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles: