Configurer OpenTelemetry et d'autres traceurs
Application Performance Monitoring prend en charge OpenTelemetry et les outils de suivi à code source libre tels que Jaeger et Zipkin.
Application Performance Monitoring (APM) peut ingérer des intervalles et des mesures OpenTelemetry (OTLP), ainsi que des intervalles Zipkin et Jaeger.
APM prend également en charge la propagation de contexte entre les agents APM et les traceurs à code source libre.
Pour les décisions d'échantillonnage de trace, qui assurent que les traces et les intervalles sont échantillonnés pour garder les données de trace petites, mais représentatives, APM respecte toute décision d'échantillonnage prise par les traceurs open-source si l'intervalle racine est généré par le traceur open-source. Si une trace implique l'agent de navigateur APM, chaque trace qui provient de l'agent de navigateur est échantillonnée.
- Configurer la propagation de contexte pour propager les informations de contexte de trace dans le format approprié et les ajouter à un ou plusieurs en-têtes de demande HTTP.
- Configurez les traceurs à code source libre pour signaler les intervalles dans le format accepté dans Application Performance Monitoring (OpenTelemetry Protocol et Zipkin v2 codés en JSON sont pris en charge).
- Configurer les traceurs à code source libre pour se connecter aux données de trace et les envoyer à l'URL du collecteur APM.
Les sections suivantes expliquent comment configurer des sources de données libres pour envoyer des données à APM, configurer la propagation du contexte, le cas échéant, et plus encore :
Configurer les sources de données OpenTelemetry
Voici des informations sur la configuration des sources de données OpenTelemetry (OTEL) (telles que les bibliothèques d'instrumentation et le collecteur OpenTelemetry) pour charger les données de surveillance (mesures et traces) dans Application Performance Monitoring.
Utiliser le point d'extrémité compatible OTEL
Pour utiliser OpenTelemetry pour charger des données dans Application Performance Monitoring, spécifiez ce qui suit en tant que point d'extrémité de chargement des données OTEL :
Selon le type de source de données, le point d'extrémité de chargement de données OTEL peut être spécifié dans un fichier de configuration, une variable d'environnement, un code ou même l'interface utilisateur.
-
Définissez le point d'extrémité de chargement des données APM pour charger les traces dans Application Performance Monitoring.
Les traces peuvent être authentifiées à l'aide d'une clé de données publique ou privée.
- Pour les traces authentifiées avec une clé de données publique, ajoutez ce qui suit :
https://<dataUploadEndpoint>/20200101/opentelemetry/public/v1/traces
- Pour les traces authentifiées avec une clé de données privée, ajoutez ce qui suit :
https://<dataUploadEndpoint>/20200101/opentelemetry/private/v1/traces
Par exemple, si les traces sont authentifiées avec une clé de données publique, le point d'extrémité de chargement des données APM se présente comme suit :
https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/public/v1/traces
- Pour les traces authentifiées avec une clé de données publique, ajoutez ce qui suit :
-
Ajoutez le point d'extrémité de chargement des données APM suivant pour charger des mesures dans Application Performance Monitoring :
https://<dataUploadEndpoint>/20200101/opentelemetry/
v1/metrics
Les mesures sont toujours authentifiées à l'aide d'une clé de données privée.
Les points d'extrémité de chargement de données APM ci-dessus fournissent la norme OpenTelemetry pour déclarer les données. Ces appels n'acceptent aucun paramètre d'interrogation. La clé de données est fournie comme en-tête comme suit : “Authorization”: “dataKey aaaabbbbccc”
- Certains clients OpenTelemetry ajoutent automatiquement le suffixe
/v1/traces
ou/v1/metrics
alors que d'autres ne le font pas. Si le suffixe n'est pas ajouté, il doit être spécifié dans l'URL de la configuration. APM prend en charge les données encodées JSON et Protocol Buffers (protobuf). Elles doivent être spécifiées explicitement dans l'en-têteContent-Type
, mais cela est généralement effectué automatiquement par la bibliothèque/le collecteur OTEL. - Les liens d'intervalle ne sont pas pris en charge.
Exemples
Exemple 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]$
Exemple d'agent 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
Exemple d'agent de recouvrement OTEL
Voici un exemple du collecteur OpenTelemetry. Voir les modifications apportées au point d'extrémité de chargement des données APM dans 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]
Configurer les sources de données Jaeger
Voici des informations sur les modifications à apporter au code d'une application Java qui utilise le client Jaeger pour le traçage réparti. Utilisez-le ensuite pour charger les traces dans le service de surveillance de la performance des applications.
Pour utiliser le traceur Jaeger pour charger des traces d'une application Java dans Application Performance Monitoring, vous devez configurer le client Java Jaeger pour la compatibilité Zipkin (rapport au format Zipkin v2) et ajouter l'URL du collecteur Application Performance Monitoring. Pour ce faire, vous devez apporter les modifications suivantes au code de votre service :
- En plus des dépendances requises du client Jaeger, ajoutez les dépendances suivantes au fichier
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>
- Utilisez
ZipkinV2Reporter
pour adapter un programme de rapport Zipkin 2 à l'interface du programme de rapport Jaeger et convertir les intervalles Jaeger au format Zipkin v2 encodé en JSON. Assurez-vous d'indiquer l'URL du programme de collecte APM pour charger les intervalles dans le service de surveillance de la performance des applications, ainsi que le nom de votre service ou application.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(); /* .... */
- Enregistrez
B3TextMapCodec
pour utiliser la propagation B3, qui est une spécification pour l'en-têteb3
. Ces en-têtes sont utilisés pour la propagation du contexte de trace au-delà des limites du service.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(); /* .... */
Notez que si le traceur Jaeger est créé à l'aide de la configuration d'environnement (
Configuration.fromEnv()
), le réglage de la variable d'environnementJAEGER_PROPAGATION
àb3c
définit le mode de propagation de contexte Zipkin (B3) sans modification de code.
Configurer les sources de données Zipkin
Voici des informations sur les modifications à apporter au code d'une application Node.js qui utilise le client Zipkin pour le traçage réparti. Utilisez-le ensuite pour charger les traces dans le service de surveillance de la performance des applications.
Pour ce faire, apportez les modifications suivantes au code d'initialisation du traceur Zipkin :
- Assurez-vous d'avoir apporté les modifications nécessaires pour que le rapport sur les intervalles soit dans le format Zipkin v2 encodé en JSON.
Pour plus d'informations sur le format Zipkin v2, voir Zipkin 2.
- Ajoutez l'URL du programme de collecte APM, pour charger les intervalles dans le service de surveillance de la performance des applications, ainsi que le nom de votre service ou application.
- Désactivez la fonction Zipkin de jointure d'intervalles (span joining) si elle est activée. La spécification OpenTracing n'autorise pas le partage d'ID intervalle entre différents intervalles dans la même trace et cette fonction doit être désactivée.
Exemple Node.js
Voici un exemple du code d'initialisation du traceur Zipkin et les modifications détaillées dans la procédure sont en caractères gras
:
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
});
Format de l'URL du programme de collecte APM
L'URL du programme de collecte APM est requise lors de la configuration des traceurs à code source libre pour communiquer avec le service de surveillance de la performance des applications. Cette rubrique fournit des détails sur le format de l'URL du programme de collecte APM.
L'URL du programme de collecte APM a le format suivant :
<dataUploadEndpoint>/<API version>/observations/<observationType>?dataFormat=<dataFormat>&dataFormatVersion=<dataFormatVersion>&dataKey=<dataKey>
Obtenez la valeur <dataUploadEndpoint>
à partir de la page des détails du domaine APM.
Paramètre | Description | Valeur disponible |
---|---|---|
<dataUploadEndpoint> |
Il s'agit de la même valeur que la valeur du paramètre "dataUploadEndpoint" du domaine APM. L'utilisateur peut obtenir cette valeur dans la page des détails du domaine APM. | Valeur de type chaîne.
Par exemple : https://aaaabbbb.apm-agt.us-ashburn-1.oci.oraclecloud.com |
<API version> | Numéro de version d'API. |
|
<observationType> | Type de l'observation à extraire. |
|
<dataFormat> | Format de données de l'observation. |
|
<dataFormatVersion> | Version du format de données de l'observation.
Les formats Zipkin V2, otlp-metric et otlp-span sont pris en charge. |
|
<dataKey> | Clé de données de l'observation.
Vous pouvez obtenir cette valeur dans la page des détails du domaine APM. |
Valeur de type chaîne.
Par exemple : 1111OLQSUZ5Q7IGN |
Exemple Zipkin
public-span
, le format de données zipkin
, la version de format de données 2
et la clé de données 11115Q7IGN
:https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
Dans certains cas, l'URL configurée par Zipkin peut devoir être fractionnée en URL de base et en chemin relatif. Par exemple, les applications qui utilisent Spring Sleuth exigent que l'URL ci-dessus soit définie comme suit :
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
Exemple OpenTelemetry
private-span
, le format de données otlp-span
, la version du format de données 1
et la clé de données 11112222UZ5
:https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5
OpenTelemetry Considérations
- La valeur
observationType
peut êtrepublic-span
,private-span
oumetric
. - Le paramètre
dataFormat
doit êtreotlp-metric
ouotlp-span
selon les données. - Le paramètre
dataFormatVersion
doit être1
.
Interopérabilité APM et Open Source
Configurer la propagation de contexte pour propager les informations de contexte de trace dans le format approprié et les ajouter à un ou plusieurs en-têtes de demande HTTP. Le contexte de trace permet de mettre en corrélation des intervalles provenant de différents microservices, mais appartenant à la même transaction (trace) et identifiés par un ID trace commun.
Agent/racteur APM
L'agent/le traceur Java APM peut être configuré pour fonctionner avec d'autres traceurs OpenTracing (tels que Jaeger et Zipkin) afin de former une trace complète.
Lorsqu'un appel HTTP se produit, l'agent/le traceur Java APM tente d'ajouter des en-têtes HTTP à l'appel, qui peuvent ensuite être lus à l'autre extrémité pour faciliter la connexion des intervalles.
Vous pouvez modifier ce format à l'aide de la propriété com.oracle.apm.agent.tracer.propagation.type
du fichier AgentConfig.properties
situé sous le répertoire oracle-apm-agent\config
.
Vous pouvez utiliser les types de propagation suivants en affectant la propriété au nom :
- B3 : Utilisé par défaut. Format d'en-tête par défaut de Zipkin. Pour plus de détails, voir https://github.com/openzipkin/b3-propagation.
- B3 En-tête unique : Version d'en-tête unique du format d'en-tête B3. Pour plus de détails, voir https://github.com/openzipkin/b3-propagation.
- Jaeger : Format d'en-tête par défaut de Jaeger. Pour plus de détails, voir https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format.
- W3C : Format d'en-tête de contexte de trace de W3C. Pour plus de détails, voir https://www.w3.org/TR/trace-context/.
Définissez le type de propagation approprié pour que vos différents traceurs puissent travailler ensemble afin de former une trace complète.
OpenTelemetry, Zipkin et Jaeger
-
OpenTelemetry : OpenTelemetry prend en charge la propagation du contexte W3C et B3. Pour plus de détails, voir Distribution des propagérateurs de contexte.
-
Zipkin : APM utilise le format Zipkin (B3) pour propager le contexte de trace afin que le traceur Zipkin ne nécessite pas de configuration supplémentaire.
-
Jaeger : Vous pouvez configurer Jaeger pour qu'il consomme et propage le contexte de trace dans le format Zipkin (B3) ou configurer l'agent Java APM pour qu'il utilise le contexte de propagation Jaeger en définissant la propriété
com.oracle.apm.tracer.propagation.type
.