Resumen
La integración de APM con RUM le permite vincular solicitudes de sus aplicaciones web y móviles con sus trazas de backend correspondientes. Esta combinación le permite ver todos sus datos de frontend y backend a través de una sola lente.
Utilice los datos de frontend de RUM, así como la información de backend, infraestructura y log de la inyección de ID de traza para identificar problemas en cualquier parte de su pila y comprender lo que están experimentando sus usuarios.
Para comenzar a enviar solo las trazas de su aplicación iOS a Datadog, consulte Colección de Trazas de iOS.
Uso
Requisitos previos
- Has configurado trazado de APM en los servicios dirigidos por tus aplicaciones RUM.
- Tus servicios utilizan un servidor HTTP.
- Tus servidores HTTP están utilizando una biblioteca que soporta trazado distribuido.
- Tienes lo siguiente configurado basado en tu SDK:
- Con el SDK de Navegador, has agregado los recursos XMLHttpRequest (XHR) o Fetch en el Explorador RUM a tu
allowedTracingUrls. - Con el SDK Móvil, has agregado el Native o XMLHttpRequest (XHR) a tu
firstPartyHosts.
- Tienes una traza correspondiente para las solicitudes a
allowedTracingUrls o firstPartyHosts.
Configura RUM
Nota: Configurar RUM y Trazas utiliza datos de APM de pago en RUM, lo que puede afectar tu facturación de APM.
Configura Monitoreo de Navegador RUM.
Inicializa el SDK de RUM. Configura el allowedTracingUrls parámetro de inicialización con la lista de orígenes internos y de primera parte llamados por tu aplicación de navegador.
Para npm install:
import { datadogRum } from '@datadog/browser-rum'
datadogRum.init({
clientToken: '<CLIENT_TOKEN>',
applicationId: '<APPLICATION_ID>',
site: 'datadoghq.com',
// service: 'my-web-application',
// env: 'production',
// version: '1.0.0',
allowedTracingUrls: [
"https://api.example.com",
// Matches any subdomain of my-api-domain.com, such as https://foo.my-api-domain.com
/^https:\/\/[^\/]+\.my-api-domain\.com/,
// You can also use a function for advanced matching:
(url) => url.startsWith("https://api.example.com")
],
sessionSampleRate: 100,
sessionReplaySampleRate: 100, // if not specified, defaults to 100
trackResources: true,
trackLongTasks: true,
trackUserInteractions: true,
})
Para instalación CDN:
window.DD_RUM.init({
clientToken: '<CLIENT_TOKEN>',
applicationId: '<APPLICATION_ID>',
site: 'datadoghq.com',
// service: 'my-web-application',
// env: 'production',
// version: '1.0.0',
allowedTracingUrls: [
"https://api.example.com",
// Matches any subdomain of my-api-domain.com, such as https://foo.my-api-domain.com
/^https:\/\/[^\/]+\.my-api-domain\.com/,
// You can also use a function for advanced matching:
(url) => url.startsWith("https://api.example.com")
],
sessionSampleRate: 100,
sessionReplaySampleRate: 100, // if not included, the default is 100
trackResources: true,
trackLongTasks: true,
trackUserInteractions: true,
})
To connect RUM to Traces, you need to specify your browser application in the service field.
allowedTracingUrls matches the full URL (<scheme>://<host>[:<port>]/<path>[?<query>][#<fragment>]). It accepts the following types:
string: matches any URL that starts with the value, so https://api.example.com matches https://api.example.com/v1/resource.RegExp: matches if any substring of the URL matches the provided RegExp. For example, /^https:\/\/[^\/]+\.my-api-domain\.com/ matches URLs like https://foo.my-api-domain.com/path, but not https://notintended.com/?from=guess.my-api-domain.com. Note: The RegExp is not anchored to the start of the URL unless you use ^. Be careful, as overly broad patterns can unintentionally match unwanted URLs and cause CORS errors.function: evaluates with the URL as parameter. Returning a boolean set to true indicates a match.
Al usar RegExp, el patrón se prueba contra toda la URL como una subcadena, no solo el prefijo. Para evitar coincidencias no intencionadas, ancla tu RegExp con `^` y sé lo más específico posible.
(Opcional) Configura el parámetro de inicialización traceSampleRate para mantener un porcentaje definido de los rastros del backend. Si no se establece, el 100 % de las trazas provenientes de solicitudes del navegador se envían a Datadog. Para mantener el 20 % de las trazas del backend, por ejemplo:
import { datadogRum } from '@datadog/browser-rum'
datadogRum.init({
...otherConfig,
traceSampleRate: 20
})
Nota: traceSampleRate no impacta el muestreo de sesiones RUM. Solo se muestrean los rastros del backend.
(Opcional) Si configuras un traceSampleRate, para asegurar que las decisiones de muestreo de los servicios del backend aún se apliquen, configura el parámetro de inicialización traceContextInjection a sampled (configurado a sampled por defecto).
Por ejemplo, si configuras el traceSampleRate al 20% en el SDK del Navegador:
- Cuando
traceContextInjection se establece en all, el 20 % de las trazas del backend se mantienen y el 80 % de las trazas del backend se descartan.
When traceContextInjection is set to sampled, 20% of backend traces are kept. For the remaining 80%, the browser SDK does not inject a sampling decision. The decision is made on the server side and is based on the SDK head-based sampling configuration. In the example below, the backend sample rate is set to 40%, and therefore 32% of the remaining backend traces are kept.
El trazado de extremo a extremo está disponible para las solicitudes realizadas después de que se inicializa el SDK del Navegador. El trazado de extremo a extremo del documento HTML inicial y de las primeras solicitudes del navegador no es compatible.
Configura Monitoreo RUM Android.
Configura Colección de Rastreo Android.
Agrega 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"
}
Configura el interceptor OkHttpClient con la lista de orígenes internos de primera parte llamados por tu aplicación de Android.
val tracedHosts = listOf("example.com", "example.eu")
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(DatadogInterceptor.Builder(tracedHosts).build())
.addNetworkInterceptor(TracingInterceptor.Builder(tracedHosts).build())
.eventListenerFactory(DatadogEventListener.Factory())
.build()
By default, all subdomains of listed hosts are traced. For instance, if you add example.com, you also enable the tracing for api.example.com and foo.example.com.
(Opcional) Configura el parámetro traceSampleRate para mantener un porcentaje definido de las trazas del backend. Si no se establece, el 100 % de las trazas provenientes de las solicitudes de la aplicación se envían a Datadog. Para mantener el 20 % de las trazas del backend:
val tracedHosts = listOf("example.com")
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(
DatadogInterceptor.Builder(tracedHosts)
.setTraceSampleRate(20f)
.build()
)
.build()
Nota:
traceSampleRate no impacta en el muestreo de sesiones RUM. Solo se muestrean las trazas del backend.- Si defines tipos de encabezados de traza personalizados en la configuración de Datadog y estás utilizando un trazador registrado con
GlobalTracer, asegúrate de que los mismos tipos de encabezados de traza estén configurados para el SDK en uso.
Configura Monitoreo RUM iOS.
Habilita RUM e instrumentación de URLSession con la configuración urlSessionTracking y el parámetro firstPartyHostsTracing:
RUM.enable(
with: RUM.Configuration(
applicationID: "<rum application id>",
urlSessionTracking: .init(
firstPartyHostsTracing: .trace(
hosts: [
"example.com",
"api.yourdomain.com"
]
)
)
)
)
Por defecto, todos los subdominios de los hosts listados son trazados. Por ejemplo, si agregas example.com, también habilitas el trazado para api.example.com y foo.example.com.
La inyección de ID de traza funciona cuando proporcionas un URLRequest al URLSession. El trazado distribuido no funciona cuando utilizas un objeto URL.
(Opcional) Para un desglose detallado del tiempo (resolución DNS, apretón de manos SSL, tiempo hasta el primer byte, tiempo de conexión y duración de la descarga), habilita URLSessionInstrumentation para tu tipo de SessionDelegate:
URLSessionInstrumentation.enableDurationBreakdown(
with: .init(
delegateClass: <YourSessionDelegate>.self
)
)
let session = URLSession(
configuration: ...,
delegate: <YourSessionDelegate>(),
delegateQueue: ...
)
El trazado distribuido funciona automáticamente, pero los tiempos de traza son más precisos después de habilitar URLSessionInstrumentation.
(Opcional) Establece el parámetro sampleRate para mantener un porcentaje definido de las trazas del backend. Si no se establece, el 100% de las trazas provenientes de las solicitudes de la aplicación se envían a Datadog.
Para mantener el 20% de las trazas del backend:
RUM.enable(
with: RUM.Configuration(
applicationID: "<rum application id>",
urlSessionTracking: .init(
firstPartyHostsTracing: .trace(
hosts: [
"example.com",
"api.yourdomain.com"
],
sampleRate: 20
)
)
)
)
Nota: sampleRate no impacta el muestreo de sesiones RUM. Solo se muestrean las trazas del backend.
Configura RUM React Native Monitoring.
Establece el parámetro de inicialización firstPartyHosts para definir la lista de orígenes internos y de primera parte llamados por tu aplicación React Native:
const config = new DatadogProviderConfiguration(
// ...
);
config.firstPartyHosts = ["example.com", "api.yourdomain.com"];
By default, all subdomains of listed hosts are traced. For instance, if you add example.com, you also enable tracing for api.example.com and foo.example.com.
(Opcional) Establece el parámetro de inicialización resourceTracingSamplingRate para mantener un porcentaje definido de las trazas del backend. Si no se establece, el 100% de las trazas provenientes de las solicitudes de la aplicación se envían a Datadog.
Para mantener el 20% de las trazas del backend:
const config = new DatadogProviderConfiguration(
// ...
);
config.resourceTracingSamplingRate = 20;
Note: resourceTracingSamplingRate does not impact RUM sessions sampling. Only backend traces are sampled out.
Configura RUM Flutter Monitoring.
Sigue las instrucciones en Rastrear recursos automáticamente para incluir el paquete del cliente HTTP de Datadog y habilitar el rastreo HTTP. Esto incluye los siguientes cambios en tu inicialización para agregar una lista de orígenes internos y de primera parte llamados por tu aplicación Flutter:
final configuration = DatadogConfiguration(
// ...
// added configuration
firstPartyHosts: ['example.com', 'api.yourdomain.com'],
)..enableHttpTracking()
RUM para Roku no está disponible en el sitio de Datadog.
Configura RUM Roku Monitoring.
Utiliza el componente datadogroku_DdUrlTransfer para realizar tus solicitudes de red.
ddUrlTransfer = datadogroku_DdUrlTransfer(m.global.datadogRumAgent)
ddUrlTransfer.SetUrl(url)
ddUrlTransfer.EnablePeerVerification(false)
ddUrlTransfer.EnableHostVerification(false)
result = ddUrlTransfer.GetToString()
Configura RUM Kotlin Multiplatform Monitoring.
Configura instrumentación de Ktor.
Establece el parámetro de inicialización tracedHosts en la configuración del plugin de Datadog Ktor para definir la lista de orígenes internos y de primera parte llamados por tu aplicación Kotlin Multiplatform:
val ktorClient = HttpClient {
install(
datadogKtorPlugin(
tracedHosts = mapOf(
"example.com" to setOf(TracingHeaderType.DATADOG),
"example.eu" to setOf(TracingHeaderType.DATADOG)
),
traceSampleRate = 100f
)
)
}
By default, all subdomains of listed hosts are traced. For instance, if you add example.com, you also enable tracing for api.example.com and foo.example.com.
(Opcional) Establece el parámetro de inicialización traceSampleRate para mantener un porcentaje definido de las trazas del backend. Si no se establece, el 20 % de las trazas provenientes de las solicitudes de la aplicación se envían a Datadog.
Para mantener el 100 % de las trazas del backend:
val ktorClient = HttpClient {
install(
datadogKtorPlugin(
tracedHosts = mapOf(
"example.com" to setOf(TracingHeaderType.DATADOG),
"example.eu" to setOf(TracingHeaderType.DATADOG)
),
traceSampleRate = 100f
)
)
}
Note: traceSampleRate does not impact RUM sessions sampling. Only backend traces are sampled out.
Verificando la configuración
Para verificar que has configurado la integración de APM con RUM, sigue los pasos a continuación según el SDK que instalaste con RUM.
- Visita una página en tu aplicación.
- En las herramientas de desarrollador de tu navegador, ve a la pestaña Red.
- Revisa los encabezados de la solicitud para una solicitud de recurso que esperas que esté correlacionada y contenga los encabezados de correlación de Datadog.
RUM Explorer a Trazas
Para ver las trazas desde el RUM Explorer:
- Navega a tu lista de sesiones y haz clic en una sesión que tenga trazas disponibles. También puedes consultar recursos con trazas usando
@_dd.trace_id:*.
Cuando seleccionas una sesión, el panel de sesión aparece con un desglose de la duración de la solicitud, un gráfico de llamas para cada tramo, y un enlace de Ver Traza en APM.
Trazas a RUM Explorer
Para ver el evento RUM desde Trazas:
- Dentro de una vista de traza, haz clic en VER para ver todas las trazas creadas durante la duración de la vista, o RECURSO para ver trazas asociadas con el recurso específico desde la pestaña de Resumen.
- Haz clic en Ver Vista en RUM o Ver Recurso en RUM para abrir el evento correspondiente en el RUM Explorer.
Bibliotecas soportadas
A continuación se muestra una lista de las bibliotecas de backend soportadas que deben estar en los servicios que reciben las solicitudes de red.
Soporte de OpenTelemetry
RUM admite varios tipos de propagadores para conectar recursos con backends que están instrumentados con bibliotecas de OpenTelemetry.
El estilo de inyección predeterminado es tracecontext, Datadog.
Nota: Si está utilizando un marco de backend como Next.js/Vercel que utiliza OpenTelemetry, siga estos pasos.
Configure RUM para conectarse con APM como se describió anteriormente.
Modifique allowedTracingUrls de la siguiente manera:
import { datadogRum } from '@datadog/browser-rum'
datadogRum.init({
...otherConfig,
allowedTracingUrls: [
{ match: "https://api.example.com", propagatorTypes: ["tracecontext"]}
]
})
match accepts the same parameter types (string, RegExp or function) as when used in its simple form, described above.
propagatorTypes accepts a list of strings for desired propagators:
Configure RUM para conectarse con APM como se describió anteriormente.
Utilice .traceWithHeaders(hostsWithHeaders:sampleRate:) en lugar de .trace(hosts:sampleRate:) de la siguiente manera:
RUM.enable(
with: RUM.Configuration(
applicationID: "<rum application id>",
urlSessionTracking: .init(
firstPartyHostsTracing: .traceWithHeaders(
hostsWithHeaders: [
"api.example.com": [.tracecontext]
],
sampleRate: 100
)
)
)
)
.traceWithHeaders(hostsWithHeaders:sampleRate:) takes Dictionary<String, Set<TracingHeaderType>> as a parameter, where the key is a host and the value is a list of supported tracing header types.
TracingHeaderType in an enum representing the following tracing header types:
Configure RUM para conectarse con APM como se describió anteriormente.
Configure el interceptor OkHttpClient con la lista de orígenes internos de primera parte y el tipo de encabezado de trazado a utilizar de la siguiente manera:
val tracedHosts = mapOf("example.com" to setOf(TracingHeaderType.TRACECONTEXT),
"example.eu" to setOf(TracingHeaderType.DATADOG))
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(DatadogInterceptor.Builder(tracedHosts).build())
.addNetworkInterceptor(TracingInterceptor.Builder(tracedHosts).build())
.eventListenerFactory(DatadogEventListener.Factory())
.build()
TracingHeaderType is an enum representing the following tracing header types:
Configure RUM para conectarse con APM.
Configure el SDK de RUM con la lista de orígenes internos de primera parte y el tipo de encabezado de trazado a utilizar de la siguiente manera:
const config = new DatadogProviderConfiguration(
// ...
);
config.firstPartyHosts = [{
match: "example.com",
propagatorTypes: [
PropagatorType.TRACECONTEXT,
PropagatorType.DATADOG
]
}];
PropagatorType is an enum representing the following tracing header types:
Configure RUM para conectarse con APM como se describió anteriormente.
Utilice firstPartyHostsWithTracingHeaders en lugar de firstPartyHosts de la siguiente manera:
final configuration = DatadogConfiguration(
// ...
// added configuration
firstPartyHostsWithTracingHeaders: {
'example.com': { TracingHeaderType.tracecontext },
},
)..enableHttpTracking()
firstPartyHostsWithTracingHeaders takes Map<String, Set<TracingHeaderType>> as a parameter, where the key is a host and the value is a list of supported tracing header types.
TracingHeaderType in an enum representing the following tracing header types:
Configure RUM para conectarse con APM.
Configure el SDK de RUM con la lista de orígenes internos de primera parte y el tipo de encabezado de trazado a utilizar de la siguiente manera:
val ktorClient = HttpClient {
install(
datadogKtorPlugin(
tracedHosts = mapOf(
"example.com" to setOf(TracingHeaderType.DATADOG),
"example.eu" to setOf(TracingHeaderType.DATADOG)
),
traceSampleRate = 100f
)
)
}
TracingHeaderType is an enum representing the following tracing header types:
Cómo se vinculan los recursos de RUM a las trazas
Datadog utiliza el protocolo de traza distribuida y configura los encabezados HTTP a continuación. Por defecto, se utilizan tanto el contexto de traza como los encabezados específicos de Datadog.
x-datadog-trace-id- Generado a partir del SDK de Real User Monitoring. Permite a Datadog vincular la traza con el recurso de RUM.
x-datadog-parent-id- Generado a partir del SDK de Real User Monitoring. Permite a Datadog generar el primer tramo a partir de la traza.
x-datadog-origin: rum- Generado a partir del SDK de Real User Monitoring. Permite a Datadog detectar la fuente de la traza.
x-datadog-sampling-priority- Establecido en
1 por el SDK de Real User Monitoring si la traza fue muestreada, o 0 si no lo fue.
traceparent: [Versión]-[ID de traza]-[ID de padre]-[banderas de traza]version: La especificación actual asume que la versión está establecida en 00.trace id: ID de traza de 128 bits, hexadecimal en 32 caracteres. El ID de traza de origen es de 64 bits para mantener la compatibilidad con APM.parent id: ID de tramo de 64 bits, hexadecimal en 16 caracteres.trace flags: Muestreado (01) o no muestreado (00)
Conversión de ID de traza: El ID de traza W3C de 128 bits se crea rellenando el ID de traza original de 64 bits con ceros a la izquierda. Esto asegura la compatibilidad con APM mientras se ajusta a la especificación del Contexto de traza W3C. El ID de traza original de 64 bits se convierte en los 64 bits inferiores del ID de traza W3C de 128 bits.
tracestate: dd=s:[sampling priority];o:[origin]dd: Prefijo de proveedor de Datadog.sampling priority: Establecido en 1 si la traza fue muestreada, o 0 si no lo fue.origin: Siempre configúrelo en rum para asegurarse de que las trazas generadas por Real User Monitoring no afecten los recuentos de APM Index Spans.
Ejemplos:
ID de traza de origen (64 bits): 8448eb211c80319c
Contexto de traza W3C (128 bits): 00000000000000008448eb211c80319c
La relación muestra que el ID de traza original de 64 bits 8448eb211c80319c está complementado con 16 ceros a la izquierda (0000000000000000) para crear el ID de traza W3C de 128 bits.
- Ejemplo completo de traceparent:
traceparent: 00-00000000000000008448eb211c80319c-b7ad6b7169203331-01tracestate: dd=s:1;o:rum
b3: [ID de traza]-[ID de tramo]-[muestreado]trace id: ID de traza de 64 bits, hexadecimal en 16 caracteres.span id: ID de tramo de 64 bits, hexadecimal en 16 caracteres.sampled: Verdadero (1) o Falso (0)- Ejemplo para encabezado único b3:
b3: 8448eb211c80319c-b7ad6b7169203331-1- Ejemplo para múltiples encabezados b3:
X-B3-TraceId: 8448eb211c80319cX-B3-SpanId: b7ad6b7169203331X-B3-Sampled: 1
Estos encabezados HTTP no están en la lista de seguridad CORS, por lo que debe configurar Access-Control-Allow-Headers en su servidor que maneja las solicitudes que el SDK está configurado para monitorear. El servidor también debe aceptar solicitudes de preflight (solicitudes OPTIONS), que son realizadas por el navegador antes de cada solicitud cuando se permite la traza en URLs de diferentes sitios.
Retención de trazas
Las trazas ingeridas están disponibles durante 15 minutos en el explorador de Live Search. Para retener las trazas por un período de tiempo más largo, cree filtros de retención de APM. Aplique estos filtros de retención en cualquier etiqueta de tramo para retener trazas de páginas críticas y acciones de usuario.
Si utiliza RUM Sin Límites, también puede usar filtros de retención de productos cruzados para retener trazas de APM asociadas a sesiones específicas de RUM, optimizando la correlación entre su frontend y su backend. Por defecto, el 1% de las sesiones de RUM y sus trazas son retenidas automáticamente sin costo adicional.
Efecto en las cuotas de APM
Conectar RUM y trazas puede aumentar significativamente los volúmenes ingeridos por APM. Utilice el parámetro de inicialización traceSampleRate para controlar una parte de las trazas del backend comenzando desde las solicitudes del navegador y móviles para ingerir.
Configurar filtros de retención de productos cruzados también puede aumentar los volúmenes indexados por APM. Utilice la tasa de retención de los filtros de retención de productos cruzados para controlar la parte de las trazas del backend a indexar.
Lecturas adicionales
Más enlaces, artículos y documentación útiles: