Correlación de logs y trazas de Java
Antes de empezar
Asegúrate de que la recopilación de log está configurada. Consulta Recopilación de log de Java para obtener instrucciones sobre Log4j, Log4j 2 o Logback.
Inyección automática
A partir de la versión 0.74.0, el rastreador de Java inyecta automáticamente identificadores de correlación de traza en logs con formato JSON. Para versiones anteriores, activa la inyección automática en el rastreador de Java añadiendo dd.logs.injection=true como propiedad del sistema, o a través de la variable de entorno DD_LOGS_INJECTION=true. Los detalles completos de configuración pueden encontrarse en la página de configuración del rastreador de Java.
Para un enfoque más universal, basado en la configuración, también puedes utilizar appenders de logs de OpenTelemetry’. Consulta Correlación de traces (trazas) y logs de OpenTelemetry para obtener instrucciones de configuración.
Notas:
- La inserción automática de la correlación de traces (trazas) está disponible para Log4j2, Log4j o SLF4J y Logback.
- Si la
attribute.path de tu ID de traza no es dd.trace_id, asegúrate de que la configuración de atributos reservados de tu ID de trace (traza) tenga en cuenta la attribute.path. Para obtener más información, consulta Los logs correlacionados no aparecen en el panel de ID de traces (trazas).
Inserción manual
Si prefieres añadir manualmente identificadores de correlación a tus logs, puedes utilizar una API de rastreo. Datadog recomienda utilizar la API estándar de OpenTelemetry para la neutralidad del proveedor y una mayor compatibilidad. También puedes utilizar la API específica de Datadog.
API de OpenTelemetry (recomendada)
Para correlacionar logs y traces (trazas) con la API de OpenTelemetry, añade primero la dependencia OpenTelemetry-api a tu project (proyecto).
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.40.0</version> <scope>provided</scope>
</dependency>
compileOnly 'io.opentelemetry:opentelemetry-api:1.40.0'
compileOnly("io.opentelemetry:opentelemetry-api:1.40.0")
Después de añadir la dependencia, utiliza la clase Span de OpenTelemetry para acceder a los ID actuales de trace (traza) y span (tramo) y añadirlos a tu contexto de logging.
Por ejemplo:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import org.slf4j.MDC;
// ...
SpanContext spanContext = Span.current().getSpanContext();
if (spanContext.isValid()) {
try {
MDC.put("dd.trace_id", spanContext.getTraceId());
MDC.put("dd.span_id", spanContext.getSpanId());
// Log something
} finally {
MDC.remove("dd.trace_id");
MDC.remove("dd.span_id");
}
}
Nota: Si no hay ningún span (tramo) activo, spanContext.isValid() devuelve false y no se añade ningún ID a los logs.
API de Datadog
Para correlacionar manualmente logs y traces (trazas) con la API de Datadog, añade la dependencia dd-trace-api a tu project (proyecto).
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>dd-trace-api</artifactId>
<version>LATEST_VERSION</version>
</dependency>
implementation 'com.datadoghq:dd-trace-api:LATEST_VERSION'
implementation("com.datadoghq:dd-trace-api:LATEST_VERSION")
Sustituye LATEST_VERSION por la misma versión que tu rastreador de Java de Datadog (dd-java-agent).
Después de añadir la dependencia, utiliza CorrelationIdentifier.getTraceId() y CorrelationIdentifier.getSpanId() para recuperar e insertar los ID en tu contexto de logging, como se muestra en los siguientes ejemplos.
Si no hay ningún span (tramo) activo, CorrelationIdentifier.getTraceId() y getSpanId() devuelven "0". Asegúrate de que los spans (tramos) se inicien antes de ejecutar este código.
import org.apache.logging.log4j.ThreadContext;
import datadog.trace.api.CorrelationIdentifier;
// There must be spans started and active before this block.
try {
ThreadContext.put("dd.trace_id", CorrelationIdentifier.getTraceId());
ThreadContext.put("dd.span_id", CorrelationIdentifier.getSpanId());
// Log something
} finally {
ThreadContext.remove("dd.trace_id");
ThreadContext.remove("dd.span_id");
}
import org.slf4j.MDC;
import datadog.trace.api.CorrelationIdentifier;
// There must be spans started and active before this block.
try {
MDC.put("dd.trace_id", CorrelationIdentifier.getTraceId());
MDC.put("dd.span_id", CorrelationIdentifier.getSpanId());
// Log something
} finally {
MDC.remove("dd.trace_id");
MDC.remove("dd.span_id");
}
import org.tinylog.ThreadContext;
import datadog.trace.api.CorrelationIdentifier;
// There must be spans started and active before this block.
try {
ThreadContext.put("dd.trace_id", CorrelationIdentifier.getTraceId());
ThreadContext.put("dd.span_id", CorrelationIdentifier.getSpanId());
// Log something
} finally {
ThreadContext.remove("dd.trace_id");
ThreadContext.remove("dd.span_id");
}
Nota: Si no utilizas la integración de log de Datadog para analizar tus logs, las reglas personalizadas de parseo de log deben asegurar que dd.trace_id y dd.span_id se analicen como cadenas. Para obtener más información, consulta Los logs correlacionados no aparecen en el panel de ID de trace (traza).
Consulta la documentación de la recopilación de log de Java para obtener más detalles sobre el despliegue específico del registrador e instrucciones para el registro en formato JSON.
Referencias adicionales
Más enlaces, artículos y documentación útiles: