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.
- 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:
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.
-
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
- Para los rastreos autenticados con una clave de datos pública, agregue lo siguiente:
-
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”
- 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 cabeceraContent-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
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
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:
- 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>
- 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(); /* .... */
- Registre
B3TextMapCodec
para utilizar la propagación B3, que es una especificación de la cabecerab3
. 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 entornoJAEGER_PROPAGATION
enb3c
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:
- 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.
- 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.
- 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. |
|
<observationType> | Tipo de observación que se va a recuperar. |
|
<dataFormat> | Formato de datos de la observación. |
|
<dataFormatVersion> | Versión de formato de datos de la observación.
Se admiten los formatos Zipkin V2, otlp-metric y otlp-span. |
|
<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
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
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
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 serpublic-span
,private-span
ometric
.- El parámetro
dataFormat
debe serotlp-metric
ootlp-span
según los datos. - El parámetro
dataFormatVersion
debe ser1
.
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:
- B3 : se usa por defecto. Formato de cabecera por defecto de Zipkin. Para obtener más información, consulte https://github.com/openzipkin/b3-propagation.
- B3 Cabecera única: versión de cabecera única del formato de cabecera B3. Para obtener más información, consulte https://github.com/openzipkin/b3-propagation.
- Jaeger: formato de cabecera por defecto de Jaeger. Para obtener más información, consulte https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format.
- W3C: formato de cabecera de contexto de rastreo de W3C. Para obtener más información, consulte https://www.w3.org/TR/trace-context/.
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
.