Configuración de monitorización de RUM Android y Android TV
Esta página describe cómo instrumentar tus aplicaciones tanto para Real User Monitoring (RUM) como para Error Tracking con el SDK de Android. Puedes seguir los pasos que se indican a continuación para instrumentar tus aplicaciones para RUM (que incluye Error Tracking) o Error Tracking, si lo adquiriste como producto independiente.
El SDK de Datadog Android es compatible con Android 5.0+ (nivel de la API 21) y Android TV.
Configuración
Especificar los detalles de la aplicación en la interfaz de usuario
- Declara el SDK de SDK como dependencia.
- Especificar los detalles de la aplicación en la interfaz de usuario
- Inicializa el SDK de Datadog con el contexto de la aplicación.
- Activa la función para iniciar el envío de datos.
- Inicializa el interceptor para el seguimiento de eventos de red.
Declarar el SDK de Datadog como dependencia
Declara dd-sdk-android-rum y el complemento Gradle como dependencias en el archivo build.gradle
de tu módulo de aplicación.
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-rum:x.x.x"
//(...)
}
Especificar los detalles de la aplicación en la interfaz de usuario
Para garantizar la seguridad de tus datos, debes utilizar un token de cliente. Si solo utilizas claves de API Datadog para configurar el SDK de Datadog, estas se exponen del lado del cliente en el código de bytes APK de la aplicación Android.
Para obtener más información sobre cómo configurar un token de cliente, consulta la Documentación sobre el token de cliente.
Inicializar el SDK de Datadog con el contexto de la aplicación
En el fragmento de inicialización, define un nombre de entorno, un nombre de servicio y un número de versión. En los ejemplos siguientes, APP_VARIANT_NAME
especifica la variante de la aplicación que genera los datos. Para obtener más información, consulta Uso de etiquetas (tags).
Consulta trackingConsent
para añadir el cumplimiento de GDPR para tus usuarios de la UE. Para inicializar la biblioteca, consulta otras opciones de configuración.
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
).build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
)
.useSite(DatadogSite.EU1)
.build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.useSite(DatadogSite.EU1)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
)
.useSite(DatadogSite.US3)
.build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.useSite(DatadogSite.US3)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
)
.useSite(DatadogSite.US5)
.build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.useSite(DatadogSite.US5)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
)
.useSite(DatadogSite.US1_FED)
.build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.useSite(DatadogSite.US1_FED)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
val configuration = Configuration.Builder(
clientToken = <CLIENT_TOKEN>,
env = <ENV_NAME>,
variant = <APP_VARIANT_NAME>
)
.useSite(DatadogSite.AP1)
.build()
Datadog.initialize(this, configuration, trackingConsent)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration =
new Configuration.Builder(<CLIENT_TOKEN>, <ENV_NAME>, <APP_VARIANT_NAME>)
.useSite(DatadogSite.AP1)
.build();
Datadog.initialize(this, configuration, trackingConsent);
}
}
Las credenciales de inicialización requieren el nombre de variante de tu aplicación y utilizan el valor de BuildConfig.FLAVOR
. Con la variante, el SDK puede hacer coincidir los errores informados desde tu aplicación con los archivos de asignación cargados por el complemento Gradle. Si no tienes variantes, las credenciales utilizan una cadena vacía.
El complemento Gradle carga automáticamente el archivo ProGuard mapping.txt
correspondiente en el momento de la compilación para que puedas ver las trazas (traces) de error de stack tecnológico desofuscadas. Para obtener más información, consulta el seguimiento de errores de Android.
Muestreo de sesiones
La configuración de la frecuencia de muestreo de sesiones no se aplica a Error Tracking.
Para controlar los datos que tu aplicación envía a Datadog, puedes especificar una frecuencia de muestreo para las sesiones al inicializar RUM. La frecuencia es un porcentaje entre 0 y 100. Por defecto, sessionSamplingRate
se define en 100 (mantener todas las sesiones).
val rumConfig = RumConfiguration.Builder(applicationId)
// Here 75% of the RUM sessions are sent to Datadog
.setSessionSampleRate(75.0f)
.build()
Rum.enable(rumConfig)
Configurar el consentimiento de rastreo (cumplimiento de GDPR)
Para cumplir con la normativa GDPR, el SDK requiere el valor de consentimiento de seguimiento en el momento de la inicialización.
El consentimiento de seguimiento puede ser uno de los siguientes valores:
TrackingConsent.PENDING
: (Predeterminado) El SDK comienza a recopilar los datos y a procesarlos por lotes, pero no los envía al
endpoint de recopilación. El SDK espera el nuevo valor del consentimiento de rastreo para decidir qué hacer con los datos procesados por lotes.TrackingConsent.GRANTED
: el SDK comienza a recopilar los datos y los envía al endpoint de recopilación de datos.TrackingConsent.NOT_GRANTED
: El SDK no recopila ningún dato. No puedes enviar manualmente ningún log, traza o evento.
Para actualizar el consentimiento de rastreo después de inicializar el SDK, llama a Datadog.setTrackingConsent(<NEW CONSENT>)
. El SDK cambia de comportamiento de acuerdo con el nuevo consentimiento. Por ejemplo, si el consentimiento de rastreo actual es TrackingConsent.PENDING
y lo actualizas a:
TrackingConsent.GRANTED
: el SDK envía todos los datos actuales procesados por lotes y los datos futuros directamente al endpoint de recopilación de datos.TrackingConsent.NOT_GRANTED
: el SDK borra todos los datos procesados por lotes y no recopila datos futuros.
Activar la función para iniciar el envío de datos
Para permitir que el SDK Android comience a enviar datos:
val rumConfig = RumConfiguration.Builder(applicationId)
.trackInteractions()
.trackLongTasks(durationThreshold) // Not applicable to Error Tracking
.useViewTrackingStrategy(strategy)
.build()
Rum.enable(rumConfig)
RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
.trackInteractions()
.trackLongTasks(durationThreshold) // Not applicable to Error Tracking
.useViewTrackingStrategy(strategy)
.build();
Rum.enable(rumConfig);
Consulta ViewTrackingStrategy
para activar el seguimiento automático de todas tus vistas (actividades, fragmentos, etc.).
Inicializar el interceptor para el seguimiento de eventos de red
Para inicializar un interceptor para el seguimiento de eventos de red:
Si quieres aplicar el rastreo distribuido, añade y activa la función de rastreo.
Añade la dependencia de Gradle a la biblioteca dd-sdk-android-okhttp
en el archivo build.gradle
a nivel de módulo:
dependencies {
implementation "com.datadoghq:dd-sdk-android-okhttp:x.x.x"
}
Para el seguimiento de tus solicitudes OkHttp como recursos, añade el interceptor proporcionado:
val tracedHostsWithHeaderType = mapOf(
"example.com" to setOf(
TracingHeaderType.DATADOG,
TracingHeaderType.TRACECONTEXT),
"example.eu" to setOf(
TracingHeaderType.DATADOG,
TracingHeaderType.TRACECONTEXT))
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(DatadogInterceptor.Builder(tracedHostsWithHeaderType).build())
.build()
final Map<String, Set<TracingHeaderType>> tracedHostsWithHeaderType = new HashMap<>();
final Set<TracingHeaderType> datadogAndW3HeadersTypes = new HashSet<>(Arrays.asList(TracingHeaderType.DATADOG, TracingHeaderType.TRACECONTEXT));
tracedHostsWithHeaderType.put("example.com", datadogAndW3HeadersTypes);
tracedHostsWithHeaderType.put("example.eu", datadogAndW3HeadersTypes);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new DatadogInterceptor.Builder(tracedHostsWithHeaderType).build())
.build();
Esto registra cada solicitud procesada por OkHttpClient
como un recurso, con toda la información relevante (URL, método, código de estado y error) rellenada automáticamente. Sólo se realiza un seguimiento de las solicitudes de red que se iniciaron cuando una vista estaba activa. Para realizar un seguimiento de las solicitudes cuando tu aplicación está en segundo plano, crea una vista manualmente.
Nota: Si también utilizas varios interceptores, añade primero DatadogInterceptor
.
También puedes añadir un EventListener
para que OkHttpClient
realice un seguimiento automático de la temporización de los recursos para proveedores de terceros y solicitudes de red.
Rastrear eventos en segundo plano
Puedes rastrear eventos como bloqueos y solicitudes de red cuando tu aplicación esté en segundo plano (por ejemplo, si no hay una vista activa disponible).
Añade el siguiente fragmento durante la configuración:
.trackBackgroundEvents(true)
.trackBackgroundEvents(true)
Extensiones de Kotlin
extensión Closeable
Puedes monitorizar el uso de instancias Closeable
con el método useMonitored
, que informa de los errores a Datadog y a continuación cierra el recurso.
val closeable: Closeable = ...
closeable.useMonitored {
// Your code here
}
Seguimiento de recursos locales
Puedes rastrear el acceso a los activos mediante la utilización del método de extensión getAssetAsRumResource
:
val inputStream = context.getAssetAsRumResource(fileName)
El uso de los recursos locales puede rastrearse utilizando el método de extensión getRawResAsRumResource
:
val inputStream = context.getRawResAsRumResource(id)
Envío de datos cuando el dispositivo está desconectado
El SDK de Android garantiza la disponibilidad de los datos cuando el dispositivo de tu usuario está desconectado. En caso de zonas con poca conexión de red o cuando el nivel de carga de la batería del dispositivo es demasiado bajo, todos los eventos se almacenan primero en el dispositivo local en lotes.
Cada lote sigue la especificación de admisión. Los lotes se envían en cuanto la red está disponible y el nivel de batería es lo suficientemente alto como para garantizar que el SDK de Datadog no afectará a la experiencia del usuario final. Si la red no está disponible mientras tu aplicación está en primer plano, o si falla una carga de datos, el lote se conserva hasta que pueda enviarse con éxito.
Esto significa que incluso si los usuarios abren tu aplicación mientras están desconectados, no se pierde ningún dato. Para garantizar que el SDK no utilice demasiado espacio de disco, los datos del disco se descartan automáticamente si son demasiado antiguos.
Para leer más
Más enlaces, artículos y documentación útiles: