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
- Déclarez le SDK en tant que dépendance.
- Ajoutez les détails de l’application dans l’interface utilisateur.
- Initialisez la bibliothèque avec le contexte de l’application.
- 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
- Accédez à UX Monitoring > RUM Applications > New Application.
- 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.
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: