Configurar OpenTelemetry y otros rastreadores

Application Performance Monitoring soporta OpenTelemetry y herramientas de rastreo de código abierto como Jaeger y Zipkin.

Application Performance Monitoring (APM) puede ingerir períodos y métricas de OpenTelemetry (OTLP), así como períodos de Zipkin y Jaeger.

APM también soporta la propagación de contexto entre los agentes de APM y los rastreadores de código abierto.

Para las decisiones de muestreo de rastreo, que garantizan que los rastreos y los períodos se muestreen para mantener los datos de rastreo pequeños, pero representativos, APM cumple con cualquier decisión de muestreo tomada por los rastreadores de código abierto si el trazador de código abierto genera el período raíz. Si un rastreo incluye el agente de explorador de APM, se muestrean todos los rastreos que se originan en el agente de explorador.

Si tiene una configuración de sistema de rastreo distribuido existente y desea cambiar a Application Performance Monitoring, debe realizar las siguientes tareas para asegurarse de que los datos recopilados mediante rastreadores de código abierto fluyan a Application Performance Monitoring:
  • Configure la propagación de contexto para que la información de contexto de rastreo se propague en el formato adecuado y agréguela a una o más cabeceras de solicitud HTTP.
  • Configure los rastreadores de código abierto para crear informes de períodos en el formato aceptado para Application Performance Monitoring (se soportan el protocolo OpenTelemetry y el Zipkin codificado JSON v2).
  • Configure los rastreadores de código abierto para conectarse y enviar datos de rastreo a la URL del recopilador de APM.

En las siguientes secciones se explica cómo configurar orígenes de datos de código abierto para enviar datos a APM, configurar la propagación de contexto si procede y mucho más:

Configurar orígenes de datos OpenTelemetry

A continuación, se muestra información sobre la configuración de los orígenes de datos OpenTelemetry (OTEL) (como bibliotecas de instrumentación y OpenTelemetry Collector) para cargar datos de supervisión (métricas y rastreos) en Application Performance Monitoring.

Uso del punto final compatible con OTEL

Para utilizar OpenTelemetry para cargar datos en Application Performance Monitoring, especifique lo siguiente como punto final de carga de datos de OTEL:

Nota

Según el tipo de origen de datos, el punto final de carga de datos de OTEL se puede especificar en un archivo de configuración, una variable de entorno, un código o incluso la interfaz de usuario.
  1. Defina el punto final de carga de datos de APM para cargar rastreos en Application Performance Monitoring.

    Los rastreos se pueden autenticar con una clave de datos pública o privada.

    • Para los rastreos autenticados con una clave de datos pública, agregue lo siguiente:

      https://<dataUploadEndpoint>/20200101/opentelemetry/public/v1/traces

    • Para los rastreos autenticados con una clave de datos privada, agregue lo siguiente:

      https://<dataUploadEndpoint>/20200101/opentelemetry/private/v1/traces

    Por ejemplo, si los rastreos se autentican con una clave de datos pública, el punto final de carga de datos de APM tiene el siguiente aspecto:

    https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/public/v1/traces

  2. Agregue el siguiente punto final de carga de datos de APM para cargar métricas en Application Performance Monitoring:

    https://<dataUploadEndpoint>/20200101/opentelemetry/v1/metrics

    Las métricas siempre se autentican con una clave de datos privada.

Los puntos finales de carga de datos de APM anteriores proporcionan el estándar OpenTelemetry para informar los datos. Estas llamadas no aceptan ningún parámetro de consulta. La clave de datos se proporciona como cabecera como la siguiente: “Authorization”: “dataKey aaaabbbbccc”

Nota

  • Algunos clientes OpenTelemetry agregan automáticamente el sufijo /v1/traces o /v1/metrics, mientras que otros no. Si no se agrega el sufijo, se debe especificar como parte de la URL en la configuración. APM admite datos codificados de buffers de protocolo y JSON (protobuf). Se deben especificar explícitamente en la cabecera Content-Type, pero esto suele realizar automáticamente la biblioteca o el recopilador de OTEL.
  • No se admiten enlaces de periodos.

Ejemplos

Ejemplo de Node.js

A continuación, se muestra un ejemplo del código OpenTelemetry para Node.js. Consulte los cambios para el punto final de carga de datos de APM en bold:
const opentelemetry = require("@opentelemetry/sdk-node");
const {
 getNodeAutoInstrumentations,
} = require("@opentelemetry/auto-instrumentations-node");
const {
 OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-http");

  const sdk = new opentelemetry.NodeSDK({
traceExporter: new OTLPTraceExporter({
  url: "https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces",
  headers: {"Authorization": "dataKey AAAAABBBBBCCCC"},
 }),

  instrumentations: [getNodeAutoInstrumentations()]
});

 sdk.start()
(base) [ssirajud@ssirajud node_with_opentelemetry]$

Ejemplo de agente Java

A continuación, se muestra un ejemplo del código OpenTelemetry para el agente Java. Consulte los cambios para el punto final de carga de datos de APM en bold:
export OTEL_TRACES_EXPORTER=otlp
export OTEL_SERVICE_NAME=my-service
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="authorization=dataKey 1111aaaabbbccc"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces/
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/v1/metrics
export OTEL_EXPORTER_OTLP_METRICS_HEADERS="authorization=dataKey 1111aaaabbbccc"
export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf

Ejemplo de recopilador OTEL

Aquí hay una muestra del colector OpenTelemetry. Consulte los cambios del punto final de carga de datos de APM en bold:

receivers:
  otlp:
    protocols:
      http:

exporters:
  logging:
    verbosity: detailed
  otlphttp:
    endpoint: https://aaaaXXXX.apm-agt.us-ashburn-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces/
    headers:
      Authorization: "dataKey XXX"

processors:
  batch:

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]

Configurar orígenes de datos de Jaeger

A continuación se muestra información sobre los cambios que se deben realizar en el código de una aplicación Java que utiliza el cliente de Jaeger para el rastreo distribuido y que debe utilizar para cargar rastreos en Application Performance Monitoring.

Para utilizar el rastreo de Jaeger para cargar rastreos de una aplicación Java en Application Performance Monitoring, debe configurar el cliente Java de Jaeger para la compatibilidad con Zipkin (informe en formato v2 de Zipkin) y agregar la URL del recopilador de Application Performance Monitoring. Para ello, debe realizar los siguientes cambios en el código de su servicio:

  1. Junto con las dependencias del cliente de Jaeger necesarias, agregue las siguientes dependencias al archivo pom.xml.
    <dependency>
        <groupId>io.zipkin.reporter2</groupId>
        <artifactId>zipkin-sender-urlconnection</artifactId>
        <version>2.15.0</version>
    </dependency>
    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-zipkin</artifactId>
        <version>1.3.2</version>
    </dependency>
  2. Utilice ZipkinV2Reporter para adaptar un generador de informes de Zipkin 2 a la interfaz del generador de informes de Jaeger y convertir los períodos de Jaeger al formato Zipkin v2 codificado con JSON. Asegúrese de haber especificado la URL del recopilador de Application Performance Monitoring para cargar los períodos en Application Performance Monitoring y el nombre del servicio o la aplicación.
    import io.jaegertracing.Configuration;
    import io.jaegertracing.zipkin.ZipkinV2Reporter;
    import zipkin2.reporter.AsyncReporter;
    import zipkin2.reporter.urlconnection.URLConnectionSender;
     
    /* .... */
     
    ZipkinV2Reporter reporter = new ZipkinV2Reporter(AsyncReporter.create(URLConnectionSender.create("<Application Performance Monitoring collector URL>")));
    JaegerTracer tracer = Configuration
        .fromEnv("<service-name>")
        .getTracerBuilder()
        .withReporter(reporter)
        .withSampler(new ConstSampler(true))
        .build();
     
    /* .... */
  3. Registre B3TextMapCodec para utilizar la propagación B3, que es una especificación de la cabecera b3. Estas cabeceras se utilizan para la propagación del contexto de rastreo entre los límites de servicio.
    import io.jaegertracing.Configuration;
    import io.jaegertracing.internal.propagation.B3TextMapCodec;
    import io.opentracing.propagation.Format;
     
    /* .... */
     
    B3TextMapCodec b3Codec = new B3TextMapCodec.Builder().build();       
    JaegerTracer tracer = Configuration
        .fromEnv("<service-name>")
        .getTracerBuilder()
        .registerInjector(Format.Builtin.HTTP_HEADERS, b3Codec)
        .registerExtractor(Format.Builtin.HTTP_HEADERS, b3Codec)
        .build();
     
    /* .... */

    Tenga en cuenta que si el rastreador de Jaeger se crea mediante la configuración de entorno (Configuration.fromEnv()), la definición de la variable de entorno JAEGER_PROPAGATION en b3c define el modo de propagación de contexto de Zipkin (B3) sin cambios de código.

Configurar orígenes de datos de Zipkin

A continuación se muestra información sobre los cambios que se deben realizar en el código de una aplicación Node.js que utiliza el cliente de Zipkin para el rastreo distribuido y se utiliza para cargar rastreos en Application Performance Monitoring.

Para ello, realice los siguientes cambios en el código de inicialización del rastreador de Zipkin:

  1. Asegúrese de haber realizado los cambios necesarios para los informes de períodos en el formato Zipkin v2 codificado con JSON.

    Para obtener información sobre el formato v2 de Zipkin, consulte Zipkin 2.

  2. Agregue la URL del recopilador de Application Performance Monitoring para cargar los períodos en Application Performance Monitoring, y el nombre del servicio o la aplicación.
  3. Desactive la función "span joining" de Zipkin, si está activada. La especificación OpenTracing no permite el uso compartido del identificador de período entre diferentes períodos dentro del mismo rastreo, por lo que esta función debe estar desactivada.

Ejemplo de Node.js

A continuación se incluye un ejemplo de código de inicialización del rastreador de Zipkin, y los cambios detallados en el procedimiento se encuentran en bold:

const {
  Tracer,
  BatchRecorder,
  jsonEncoder: {JSON_V2}
} = require('zipkin');
 
const CLSContext = require('zipkin-context-cls');
const {HttpLogger} = require('zipkin-transport-http');
 
// Setup the tracer
const tracer = new Tracer({
  ctxImpl: new CLSContext('zipkin'), // implicit in-process context
  recorder: new BatchRecorder({
    logger: new HttpLogger({
      endpoint: '<Application Performance Monitoring collector URL>', //Span collection endpoint URL setting
      jsonEncoder: JSON_V2 //Span format and encoding setting
    })
  }), // batched http recorder
  localServiceName: '<service-name>', // name of the application/service
  supportsJoin: false //Span join disable setting
});

Formato de URL del recopilador de APM

La URL del recopilador de Application Performance Monitoring es necesaria cuando se configuran rastreadores de código abierto para comunicarse con el servicio Application Performance Monitoring. En este tema se proporcionan detalles sobre el formato de URL del recopilador de APM.

La URL del recopilador de Application Performance Monitoring tiene el siguiente formato:

<dataUploadEndpoint>/<API version>/observations/<observationType>?dataFormat=<dataFormat>&dataFormatVersion=<dataFormatVersion>&dataKey=<dataKey>

Obtenga el valor <dataUploadEndpoint> de la página de detalles del dominio de APM.

Parámetro Descripción Valor disponible

<dataUploadEndpoint>

Es el mismo valor que el valor "dataUploadEndpoint" del dominio de APM. El usuario puede obtener este valor en la página de detalles del dominio de APM. Valor de cadena.

Por ejemplo: https://aaaabbbb.apm-agt.us-ashburn-1.oci.oraclecloud.com

<API version> Número de versión de API.

20200101

<observationType> Tipo de observación que se va a recuperar.

public-span al enviar períodos con una clave de datos pública.

private-span al enviar períodos con una clave de datos privada.

metric al enviar métricas.

<dataFormat> Formato de datos de la observación.

zipkin

otlp-metric

otlp-span

<dataFormatVersion> Versión de formato de datos de la observación.

Se admiten los formatos Zipkin V2, otlp-metric y otlp-span.

1 para otlp-metric y otlp-span.

2 para Zipkinv V2.

<dataKey> Clave de datos de la observación.

Puede obtener este valor en la página de detalles del dominio de APM.

Valor de cadena.

Por ejemplo: 1111OLQSUZ5Q7IGN

Ejemplo de Zipkin

La siguiente URL de recopilador de APM utiliza el tipo de observación public-span, el formato de datos zipkin, la versión de formato de datos 2 y la clave de datos 11115Q7IGN:
https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
Nota

En algunos casos, puede que la URL configurada de Zipkin deba dividirse en la URL base y la ruta relativa. Por ejemplo, las aplicaciones que utilizan Spring Sleuth necesitan que la URL anterior se defina como la siguiente:
spring.zipkin.baseUrl =  https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com
spring.zipkin.apiPath = /20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN

Ejemplo de OpenTelemetry

La siguiente URL de recopilador de APM utiliza el tipo de observación private-span, el formato de datos otlp-span, la versión de formato de datos 1 y la clave de datos 11112222UZ5:
https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5

OpenTelemetry Consideraciones

  • observationType puede ser public-span, private-span o metric.
  • El parámetro dataFormat debe ser otlp-metric o otlp-span según los datos.
  • El parámetro dataFormatVersion debe ser 1.

Interoperabilidad entre APM y código abierto

Configure la propagación de contexto para que la información de contexto de rastreo se propague en el formato adecuado y agréguela a una o más cabeceras de solicitud HTTP. El contexto de rastreo permite la correlación de períodos que provienen de distintos microservicios, pero pertenecen a la misma transacción (rastreo) y se identifican mediante un identificador de rastreo común.

Agente/seguidor de APM

El agente/rastreador Java de APM se puede configurar para que funcione con otros rastreadores OpenTracing (como Jaeger y Zipkin) con el fin de formar un rastreo completo.

Cuando se produce una llamada HTTP, el agente/rastreador Java de APM intentará agregar cabeceras HTTP a la llamada, la cual se podrá leer a continuación en el otro extremo para ayudar a conectar períodos.

Puede cambiar este formato mediante la propiedad com.oracle.apm.agent.tracer.propagation.type del archivo AgentConfig.properties ubicado en el directorio oracle-apm-agent\config.

Puede utilizar los siguientes tipos de propagación definiendo la propiedad en el nombre:

Defina el tipo de propagación adecuado de modo que los distintos rastreadores puedan funcionar juntos para formar un rastreo completo.

OpenTelemetry, Zipkin y Jaeger

  • OpenTelemetry: OpenTelemetry soporta la propagación de contexto W3C y B3. Para obtener más información, consulte Distribución de propagadores de contexto.

  • Zipkin: APM utiliza el formato Zipkin (B3) para propagar el contexto de rastreo, por lo que el trazador Zipkin no necesita ninguna configuración adicional.

  • Jaeger: puede configurar Jaeger para que consuma y propague el contexto de rastreo en formato Zipkin (B3), o bien configurar el agente Java de APM para que utilice el contexto de propagación de Jaeger definiendo la propiedad com.oracle.apm.tracer.propagation.type.