El generador de perfiles se incluye en las bibliotecas de rastreo de Datadog. Si ya estás utilizando APM para recopilar trazas (traces) para tu aplicación, puedes omitir la instalación de biblioteca e ir directamente a habilitar el generador de perfiles.

Requisitos

Para obtener un resumen de las versiones mínimas y recomendadas del tiempo de ejecución y del rastreador en todos los lenguajes, consulta Versiones de lenguaje y rastreadores compatibles.

A partir de dd-trace-java 1.0.0, tienes dos opciones para el motor que genera datos de perfil para las aplicaciones de Java: Java Flight Recorder (JFR) o el Datadog Profiler. A partir de dd-trace-java 1.7.0, Datadog Profiler es el predeterminado. Cada motor de perfil tiene diferentes efectos secundarios, requisitos, configuraciones disponibles y limitaciones, y esta página describe cada uno. Puedes activar uno o ambos motores. Activando ambos se capturan los dos tipos de perfil al mismo tiempo.

Sistemas operativos compatibles:

  • Linux

Versiones mínimas de JDK:

  • OpenJDK 8u352+, 11.0.17+, 17.0.5+ (incluidas las versiones basadas en él: Amazon Corretto, Azul Zulu y otras)
  • Oracle JDK 8u352+, 11.0.17+, 17.0.5+
  • OpenJ9 JDK 8u372+, 11.0.18+, 17.0.6+ (utilizado en Eclipse OpenJ9, IBM JDK, IBM Semeru Runtime). El generador de perfiles está deshabilitado por defecto para OpenJ9 debido a la posibilidad de que la JVM se bloquee a causa de un sutil error en la implementación de JVTMI. Si no experimentas ningún error, puedes activar el generador de perfiles añadiendo -Ddd.profiling.ddprof.enabled=true.
  • Azul Platform Prime 23.05.0.0+ (antes Azul Zing)

Datadog Profiler utiliza la función AsyncGetCallTrace de JVMTI, en la que existe un problema conocido anterior a la versión 17.0.5 del JDK. Esta corrección se ha trasladado a la versión 11.0.17 y 8u352. Datadog Profiler no está habilitado a menos que la JVM en la que se despliega el generador de perfiles tenga esta corrección. Actualiza al menos a 8u352, 11.0.17, 17.0.5 o a la última versión de JVM que no sea LTS para utilizar Datadog Profiler.

Sistemas operativos compatibles:

  • Linux
  • Windows

Versiones mínimas de JDK:

  • OpenJDK 1.8.0.262/8u262+, 11+ (incluidas las versiones basadas en él: Amazon Corretto y otras)
  • Oracle JDK 11+ (la activación del JFR puede requerir una licencia comercial de Oracle. Ponte en contacto con tu representante de Oracle para confirmar si esto forma parte de tu licencia).
  • Azul Zulu 8 (versión 1.8.0.212/8u212+), 11+
  • GraalVM 17+ - ambas versiones, JIT y AOT (imagen nativa)

Dado que las versiones de JDK que no son LTS pueden no contener correcciones de estabilidad y rendimiento relacionadas con la biblioteca de Datadog Profiler, utiliza las versiones 8, 11 y 17 del JDK de soporte a largo plazo.

Requisitos adicionales para la generación de perfiles de Hotspots de código:

  • OpenJDK 11+ y dd-trace-java versión 0.65.0+
  • OpenJDK 8 8u282+ y dd-trace-java versión 0.77.0+

Todos los lenguajes basados en JVM, como Java, Scala, Groovy, Kotlin y Clojure son compatibles.

Continuous Profiler no es compatible con las plataformas serverless, como AWS Lambda.

Instalación

Para empezar a crear perfiles de aplicaciones:

  1. Asegúrate de que Datadog Agent v6+ está instalado y en ejecución. Datadog recomienda utilizar Datadog Agent v7+. Si no tienes APM habilitado para configurar tu aplicación para enviar datos a Datadog, en tu Agent, configura la variable de entorno DD_APM_ENABLED en true y escuchando en el puerto 8126/TCP.

  2. Descarga dd-java-agent.jar, que contiene los archivos de clase de Java Agent:

    wget -O dd-java-agent.jar 'https://dtdg.co/latest-java-tracer'
    
    curl -Lo dd-java-agent.jar 'https://dtdg.co/latest-java-tracer'
    
    ADD 'https://dtdg.co/latest-java-tracer' dd-java-agent.jar
    

    Nota: El generador de perfiles está disponible en la biblioteca dd-java-agent.jar para las versiones 0.55+.

  3. Habilita el generador de perfiles configurando el indicador -Ddd.profiling.enabled o la variable de entorno DD_PROFILING_ENABLED en true. Especifica dd.service, dd.env y dd.version para poder filtrar y agrupar tus perfiles a través de estas dimensiones:

    Invoca tu servicio:

    java \
        -javaagent:dd-java-agent.jar \
        -Ddd.service=<YOUR_SERVICE> \
        -Ddd.env=<YOUR_ENVIRONMENT> \
        -Ddd.version=<YOUR_VERSION> \
        -Ddd.profiling.enabled=true \
        -jar <YOUR_SERVICE>.jar <YOUR_SERVICE_FLAGS>
    
    export DD_SERVICE=<YOUR_SERVICE>
    export DD_ENV=<YOUR_ENV>
    export DD_VERSION=<YOUR_VERSION>
    export DD_PROFILING_ENABLED=true
    java \
        -javaagent:dd-java-agent.jar \
        -jar <YOUR_SERVICE>.jar <YOUR_SERVICE_FLAGS>
    

Sigue las Instrucciones de configuración de rastreadores para crear tu imagen nativa con Datadog Java Profiler.

Cuando se crea el archivo binario de servicio, puedes utilizar variables de entorno para habilitar y configurar el Datadog Java Profiler:

DD_PROFILING_ENABLED=true DD_PROFILING_DIRECTALLOCATION_ENABLED=true ./my_service

Nota: Solo se admiten los perfiles basados en JFR para las aplicaciones de imagen nativa de GraalVM. Ninguna de las opciones de configuración relacionadas con DDPROF son efectivas.

Nota: El argumento -javaagent debe estar antes de -jar. Esto lo añade como una opción de JVM en lugar de como un argumento de aplicación. Por ejemplo, java -javaagent:dd-Java-Agent.jar ... -jar my-servicio.jar -more-flags. Para más información, consulta la documentación de Oracle.

  1. Opcional: configura la integración de código fuente para conectar tus datos de perfiles con tus repositorios Git.

  2. Después de uno o dos minutos, visualizarás tus perfiles en la página Datadog APM > Perfiles.

Activación de las opciones de motor del generador de perfiles de CPU

Desde la versión 1.5.0 de dd-trace-java, tienes dos opciones para el generador de perfiles de CPU utilizado, Datadog o Java Flight Recorder (JFR). Desde la versión 1.7.0, Datadog es el predeterminado, pero también puedes habilitar opcionalmente JFR para los perfiles de CPU. Puedes activar uno o ambos motores. Activando ambos se capturan los dos tipos de perfiles al mismo tiempo.

El Datadog Profiler registra el tramo activo en cada muestra, lo que mejora la fidelidad de las funciones de perfil de Hotspots de código y Endpoint. La activación de este motor permite mejorar mucho la integración con el rastreo de APM.

El Datadog Profiler consta de varios motores de perfiles, incluidos los generadores de perfiles de CPU, tiempo real, asignación y fugas de memoria.

Requiere JDK 11+.

El Datadog Profiler está activado por defecto en las versiones 1.7.0+ de dd-trace-java. El perfil de CPU de Datadog se programa a través de eventos perf y es más preciso que el perfil de CPU de JFR. Para habilitar la generación de perfiles de CPU:

export DD_PROFILING_DDPROF_ENABLED=true # predeterminado en v1.7.0+
export DD_PROFILING_DDPROF_CPU_ENABLED=true

o:

-Ddd.profiling.ddprof.enabled=true # predeterminado en v1.7.0+
-Ddd.profiling.ddprof.cpu.enabled=true

Para los usuarios de JDK Mission Control (JMC), el evento de ejemplo de CPU de Datadog es datadog.ExecutionSample.

Configuración de Linux

El motor de CPU funciona en la mayoría de los sistemas, pero si el valor de /proc/sys/kernel/perf_event_paranoid se establece en 3, el generador de perfiles no puede utilizar eventos perf para programar el muestreo de la CPU. Esto da como resultado una calidad de perfil degradada, volviendo a utilizar itimer. Establece /proc/sys/kernel/perf_event_paranoid en 2 o inferior con el siguiente comando:

sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid'

Para la versión 1.7.0+, para cambiar del perfil por defecto de Datadog al perfil de CPU de JFR:

export DD_PROFILING_DDPROF_CPU_ENABLED=false

o:

-Ddd.profiling.ddprof.cpu.enabled=false

Para los usuarios de JDK Mission Control (JMC), el evento de ejemplo de CPU de JFR es jdk.ExecutionSample.

Motor de tiempo real del Datadog Profiler

El motor de perfil de tiempo real es útil para perfilar la latencia y se integra estrechamente con el rastreo de APM. El motor muestrea todos los subprocesos, dentro o fuera de la CPU, con actividad de rastreo activa y puede utilizarse para diagnosticar la latencia de traza o tramo. El motor está activado por defecto desde la versión 1.7.0.

-Ddd.profiling.ddprof.enabled=true # predeterminado en v1.7.0+
-Ddd.profiling.ddprof.wall.enabled=true

Para la versión 1.7.0+, para desactivar el perfil de tiempo real:

export DD_PROFILING_DDPROF_WALL_ENABLED=false

o:

-Ddd.profiling.ddprof.wall.enabled=false

Para los usuarios de JMC, el evento datadog.MethodSample se emite para las muestras de tiempo real.

El motor de tiempo real no depende de la configuración de /proc/sys/kernel/perf_event_paranoid.

Motor de asignación de perfiles

El motor de perfiles de asignación basado en JFR está habilitado por defecto desde JDK 16. La razón por la que no está habilitado por defecto para JDK 8 y 11 es que varias asignaciones puede llevar a una gran sobrecarga y grandes tamaños de registro. Para habilitarlo para JDK 8 y 11, añade lo siguiente:

export DD_PROFILING_ENABLED_EVENTS=jdk.ObjectAllocationInNewTLAB,jdk.ObjectAllocationOutsideTLAB

o:

-Ddd.profiling.enabled.events=jdk.ObjectAllocationInNewTLAB,jdk.ObjectAllocationOutsideTLAB

El motor de perfiles de asignación de Datadog contextualiza los perfiles de asignación, lo que admite perfiles de asignación filtrados por endpoint. En dd-java-agent anterior a v1.28.0 está deshabilitado por defecto. El generador de perfiles de asignación se basa en APIs de JVMTI que podrían fallar antes de OpenJDK 21.0.3 y está deshabilitado en versiones de JDK más antiguas. Habilítalo con:

export DD_PROFILING_DDPROF_ENABLED=true # predeterminado en v1.7.0+
export DD_PROFILING_DDPROF_ALLOC_ENABLED=true # predeterminado en v1.28.0+ en OpenJDK 21.0.3+

o:

-Ddd.profiling.ddprof.enabled=true # predeterminado en v1.7.0+
-Ddd.profiling.ddprof.alloc.enabled=true # predeterminado en v1.17.0+

Para los usuarios de JMC, los eventos de asignación de Datadog son datadog.ObjectAllocationInNewTLAB y datadog.ObjectAllocationOutsideTLAB.

El motor de perfiles de asignación no depende de la configuración de /proc/sys/kernel/perf_event_paranoid.

Motor de perfiles de heap en directo (alfa)

Desde: v1.17.0. Requiere JDK 11+.

Esta es una función alfa, no es recomendada para activar esta función en entornos de producción.

El motor de perfiles de heap en directo es útil para investigar el uso general de memoria de tu servicio e identificar posibles fugas de memoria. El motor muestrea las asignaciones y mantiene un registro de si esas muestras sobrevivieron al ciclo de recopilación de elementos no usados más reciente. El número de muestras que sobreviven se utiliza para estimar el número de objetos activos en el stack. El número de muestras rastreadas está limitado para evitar un crecimiento ilimitado del uso de memoria del generador de perfiles.

El motor está desactivado por defecto, pero puedes activarlo con:

export DD_PROFILING_DDPROF_LIVEHEAP_ENABLED=true

o:

-Ddd.profiling.ddprof.liveheap.enabled=true

Para los usuarios de JMC, el evento de heap en directo de Datadog es datadog.HeapLiveObject.

El motor de asignación no depende de la configuración de /proc/sys/kernel/perf_event_paranoid.

Recopilación de stack traces nativas

Si los motores de CPU o tiempo real de Datadog Profiler están activados, puedes recopilar stack traces nativas. Estas incluyen cosas como las internas de la JVM, las bibliotecas nativas utilizadas por tu aplicación o la JVM, y syscalls.

Las stack traces nativas no se recopilan de forma predeterminada porque normalmente no proporcionan información procesable y analizarlas puede afectar potencialmente a la estabilidad de la aplicación. Prueba esta configuración en un entorno que no sea de producción antes de intentar utilizarla en producción.

Para habilitar la recopilación de stack traces nativas, entendiendo que puede desestabilizar tu aplicación, establece:

export DD_PROFILING_DDPROF_ENABLED=true # predeterminado en v1.7.0+
export DD_PROFILING_DDPROF_CSTACK=dwarf

o:

-Ddd.profiling.ddprof.enabled=true # predeterminado en v1.7.0+
-Ddd.profiling.ddprof.cstack=dwarf

Configuración

Puedes configurar el generador de perfiles utilizando las siguientes variables de entorno:

Variable de entornoTipoDescripción
DD_PROFILING_ENABLEDBooleanoAlternativa para el argumento -Ddd.profiling.enabled. Establece la opción en true para habilitar el generador de perfiles.
DD_PROFILING_ALLOCATION_ENABLEDBooleanoAlternativa para el argumento -Ddd.profiling.allocation.enabled. Establece la opción en true para habilitar el perfil de asignación. Requiere que el generador de perfiles ya esté habilitado.
DD_ENVCadenaEl nombre de entorno, por ejemplo: production.
DD_SERVICECadenaEl nombre de servicio, por ejemplo, web-backend.
DD_VERSIONCadenaLa versión de tu servicio.
DD_TAGSCadenaLas etiquetas para aplicar a un perfil cargado. Debe ser una lista de <key>:<value> separados por comas como: layer:api, team:intake.

¿No sabes qué hacer a continuación?

La guía Empezando con el generador de perfiles toma un ejemplo de servicio con un problema de rendimiento y te muestra cómo utilizar Continuous Profiler para comprender y solucionar el problema.

Referencias adicionales

PREVIEWING: rtrieu/product-analytics-ui-changes