Instrumentación automática basada en OpenTelemetry de Azure Monitor para aplicaciones Java

En este artículo se describe cómo habilitar y configurar la oferta de Java de Azure Monitor basada en OpenTelemetry. Cuando termine de leer las instrucciones de este artículo, podrá usar Application Insights de Azure Monitor para supervisar la aplicación.

Introducción

La instrumentación automática de Java se puede habilitar sin cambios en el código.

Prerrequisitos

Habilitación de Azure Monitor Application Insights

1. Descarga del archivo JAR de instrumentación automática

1. Descargar el archivo JAR.

Descargue el archivo applicationinsights-agent-3.2.3.jar.

Advertencia

  • Si va actualizar desde la versión preliminar 3.0

    Revise todas las opciones de configuración cuidadosamente. La estructura json ha cambiado por completo. El nombre de archivo ahora está todo en minúsculas.

  • Si va actualizar desde la versión 3.0.x

    Los nombres de operación y los nombres de telemetría de solicitudes ahora tienen el método HTTP como prefijo (GET, POST, etc.). Este cambio puede afectar a los paneles o las alertas personalizados si se basaban en los valores anteriores. Para obtener detalles, vea las notas de la versión 3.1.0.

  • Si va actualizar desde la versión 3.1.x

    Los nombres de dependencias de bases de datos ahora son más concisos y siguen teniendo la consulta completa (saneada) en el campo data. Los nombres de dependencias HTTP ahora son más descriptivos. Este cambio puede afectar a los paneles o las alertas personalizados si se basaban en los valores anteriores. Para obtener detalles, vea las notas de la versión 3.2.0.

2. Apuntar la JVM al archivo JAR.

Agregue -javaagent:path/to/applicationinsights-agent-3.2.3.jar a los argumentos de JVM de la aplicación.

Sugerencia

Para obtener ayuda con la configuración de los argumentos de JVM de la aplicación, consulte Sugerencias para actualizar los argumentos de JVM.

3. Establecer la cadena de conexión de Application Insights.

Apunte el archivo jar al recurso de Application Insights, ya sea estableciendo una variable de entorno:

APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=...

O creando un archivo de configuración denominado applicationinsights.json y colocándolo en el mismo directorio que applicationinsights-agent-3.2.3.jar, con el siguiente contenido:

{
  "connectionString": "InstrumentationKey=..."
}

Busque la cadena de conexión en el recurso de Application Insights.

Cadena de conexión de Application Insights

4. Confirmar que los datos fluyen.

Ejecute la aplicación y abra la pestaña Recurso de Application Insights en Azure Portal. Los datos pueden tardar unos minutos en aparecer en el portal.

Nota

Si no puede ejecutar la aplicación o no obtiene datos según lo esperado, vaya a la sección Solución de problemas.

Captura de pantalla de la pestaña Información general de Application Insights con las solicitudes de servidor y el tiempo de respuesta del servidor resaltados.

Importante

Si tiene dos o más servicios que emiten telemetría al mismo recurso de Application Insights, debe establecer nombres de rol en la nube para representarlos correctamente en el mapa de aplicación.

Nota

Como parte del uso de la instrumentación de Application Insights, se recopilan y envían datos de diagnóstico a Microsoft. Estos datos ayudan a ejecutar y mejorar Application Insights. Tiene la opción de deshabilitar la recopilación de datos no esenciales. Más información.

Opciones de configuración

En el archivo applicationinsights.json también puede configurar estos valores:

  • Nombre del rol en la nube
  • Instancia de rol en la nube
  • muestreo
  • Métricas JMX
  • Dimensiones personalizadas
  • Procesadores de telemetría (versión preliminar)
  • Registros recopilados automáticamente
  • Métricas de Micrometer recopiladas automáticamente (incluidas las métricas del accionador de Spring Boot)
  • Latido
  • Proxy HTTP
  • Diagnóstico automático

Para obtener detalles, vea las opciones de configuración.

Bibliotecas de instrumentación

Java 3.X incluye las siguientes bibliotecas de instrumentación.

Solicitudes recopiladas automáticamente

  • Consumidores de JMS
  • Consumidores de Kafka
  • Netty/WebFlux
  • Servlets
  • Programación de Spring

Dependencias recopiladas automáticamente

Dependencias recopiladas automáticamente más la propagación de seguimiento distribuido de bajada:

  • Apache HttpClient
  • Apache HttpAsyncClient
  • AsyncHttpClient
  • Google HttpClient
  • gRPC
  • java.net.HttpURLConnection
  • Java 11 HttpClient
  • JAX-RS Client
  • Jetty HttpClient
  • JMS
  • Kafka
  • Cliente Netty
  • OkHttp

Dependencias recopiladas automáticamente (sin propagación de seguimiento distribuido de bajada):

  • Cassandra
  • JDBC
  • MongoDB (asincrónico y sincrónico)
  • Redis (Lettuce y Jedis)

Registros recopilados automáticamente

  • java.util.logging
  • Log4j (incluidas las propiedades de MDC)
  • SLF4J/Logback (incluidas las propiedades de MDC)

Métricas recopiladas automáticamente

  • Micrometer (incluidas las métricas del actuador de Spring Boot)
  • Métricas JMX

SDK de Azure

La telemetría emitida por estos SDK de Azure se recopila automáticamente de forma predeterminada:

Modificación de la telemetría

Incorporación de atributos de intervalo

Puede usar opentelemetry-api para agregar atributos a intervalos. Estos atributos pueden incluir la incorporación de una dimensión empresarial personalizada a la telemetría. También puede usar atributos para establecer campos opcionales en el esquema de Application Insights, como Id. de usuario o IP de cliente.

Adición de dimensiones personalizadas

Al agregar una o más dimensiones personalizadas, se rellena el campo customDimensions de la tabla de solicitudes, dependencias o excepciones.

Nota

Esta característica solo está disponible en la versión 3.2.0 y posteriores.

Agregue opentelemetry-api-1.6.0.jar a la aplicación:

<dependency>
  <groupId>io.opentelemetry</groupId>
  <artifactId>opentelemetry-api</artifactId>
  <version>1.6.0</version>
</dependency>

Agregue dimensiones personalizadas al código:

import io.opentelemetry.api.trace.Span;

Span.current().setAttribute("mycustomdimension", "myvalue1");

Establecimiento del identificador de usuario

Rellene el campo Id. de usuario de la tabla de solicitudes, dependencias o excepciones.

Importante

Consulte las leyes de privacidad aplicables antes de establecer el identificador de usuario autenticado.

Nota

Esta característica solo está disponible en la versión 3.2.0 y posteriores.

Agregue opentelemetry-api-1.6.0.jar a la aplicación:

<dependency>
  <groupId>io.opentelemetry</groupId>
  <artifactId>opentelemetry-api</artifactId>
  <version>1.6.0</version>
</dependency>

Establezca user_Id en el código:

import io.opentelemetry.api.trace.Span;

Span.current().setAttribute("enduser.id", "myuser");

Obtención del identificador de seguimiento o el identificador de intervalo

Puede usar opentelemetry-api para obtener el identificador de seguimiento o el identificador de intervalo. Esta acción sirve para agregar estos identificadores a la telemetría de registro existente a fin de mejorar la correlación al depurar y diagnosticar problemas.

Nota

Esta característica solo está disponible en la versión 3.2.0 y posteriores.

Agregue opentelemetry-api-1.6.0.jar a la aplicación:

<dependency>
  <groupId>io.opentelemetry</groupId>
  <artifactId>opentelemetry-api</artifactId>
  <version>1.6.0</version>
</dependency>

Obtenga el identificador de seguimiento de la solicitud y el identificador de intervalo del código:

import io.opentelemetry.api.trace.Span;

String traceId = Span.current().getSpanContext().getTraceId();
String spanId = Span.current().getSpanContext().getSpanId();

Telemetría personalizada

Nuestro objetivo con Application Insights para Java 3.x es permitirle enviar telemetría personalizada mediante API estándar.

En este momento se admiten Micrometer, marcos de registro populares y el SDK de Application Insights para Java 2.x. Application Insights para Java 3.x capturará automáticamente la telemetría, la enviará a través de las API y la correlacionará con la telemetría recopilada automáticamente.

Telemetría personalizada admitida

En la tabla siguiente se representan los tipos de telemetría personalizados admitidos actualmente que se pueden habilitar para complementar el agente Java 3.x. En resumen, las métricas personalizadas se admiten a través de un micrómetro, las excepciones y seguimientos personalizados se pueden habilitar a través de las plataformas de registro, las solicitudes personalizadas, las dependencias y las excepciones se pueden habilitar a través de opentelemetry-api y cualquier tipo de telemetría personalizada se admite mediante el SDK de Java 2.x para Application Insights.

Micrómetro Log4j, logback, JUL SDK 2.x opentelemetry-api
Eventos personalizados
Métricas personalizadas
Dependencias
Excepciones
Vistas de página
Solicitudes
Traces

No tenemos previsto publicar ningún SDK con Application Insights 3.x en este momento.

Application Insights para Java 3.x ya escucha la telemetría que se envía al SDK de Application Insights para Java 2.x. Esta funcionalidad es una parte importante de la historia de actualización de los usuarios existentes de 2.x y llena una brecha importante en la compatibilidad con la telemetría personalizada hasta que OpenTelemetry API ofrezca disponibilidad general.

Envío de métricas personalizadas mediante Micrometer

Agregue Micrometer a la aplicación:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-core</artifactId>
  <version>1.6.1</version>
</dependency>

Use el registro global de Micrometer para crear un medidor:

static final Counter counter = Metrics.counter("test_counter");

Use el contador para registrar métricas:

counter.increment();

Envío de seguimientos y excepciones personalizados mediante su plataforma de registro favorita

Log4j, Logback y java.util.logging se instrumentan automáticamente y los registros creados mediante estas plataformas de registro se recopilan automáticamente como telemetría de seguimiento y excepciones.

De forma predeterminada, los registros solo se recopilan cuando se crean en el nivel INFO o superior. Para cambiar este nivel, vea las opciones de configuración.

Si quiere adjuntar dimensiones personalizadas a los registros, puede usar Log4j 1.2 MDC, Log4j 2 MDC o Logback MDC. Application Insights para Java 3.x captura automáticamente esas propiedades de MDC como dimensiones personalizadas en la telemetría de seguimiento y excepciones.

Envío de telemetría personalizada mediante el SDK 2.x

Agregue applicationinsights-core-2.6.3.jar a la aplicación (todas las versiones 2.x son compatibles con Application Insights para Java 3.x, pero merece la pena usar la más reciente si es posible):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-core</artifactId>
  <version>2.6.3</version>
</dependency>

Cree un elemento TelemetryClient:

static final TelemetryClient telemetryClient = new TelemetryClient();

Use el cliente para enviar telemetría personalizada:

Eventos
telemetryClient.trackEvent("WinGame");
Métricas
telemetryClient.trackMetric("queueLength", 42.0);
Dependencias
boolean success = false;
long startTime = System.currentTimeMillis();
try {
    success = dependency.call();
} finally {
    long endTime = System.currentTimeMillis();
    RemoteDependencyTelemetry telemetry = new RemoteDependencyTelemetry();
    telemetry.setSuccess(success);
    telemetry.setTimestamp(new Date(startTime));
    telemetry.setDuration(new Duration(endTime - startTime));
    telemetryClient.trackDependency(telemetry);
}
Registros
telemetryClient.trackTrace(message, SeverityLevel.Warning, properties);
Excepciones
try {
    ...
} catch (Exception e) {
    telemetryClient.trackException(e);
}

Solución de problemas

Vea el artículo Solución de problemas.

Soporte técnico

Comentarios de OpenTelemetry

Pasos siguientes