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.

Si vous disposez d'un système de traçage distribué existant et que vous souhaitez passer à Application Performance Monitoring, vous devez effectuer les tâches suivantes pour vous assurer que les données collectées à l'aide de traceurs à code source libre alimentent Application Performance Monitoring :
  • 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 :

Note

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.
  1. 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

  2. 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”

Note

  • 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ête Content-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

Voici un exemple de code OpenTelemetry pour Node.js. Voir les modifications apportées au point d'extrémité de chargement de données APM dans 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

Voici un exemple de code OpenTelemetry pour l'agent Java. Voir les modifications apportées au point d'extrémité de chargement de données APM dans 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 :

  1. 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>
  2. 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();
     
    /* .... */
  3. Enregistrez B3TextMapCodec pour utiliser la propagation B3, qui est une spécification pour l'en-tête b3. 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'environnement JAEGER_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 :

  1. 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.

  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.
  3. 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.

20200101

<observationType> Type de l'observation à extraire.

public-span lors de l'envoi d'intervalles avec une clé de données publique.

private-span lors de l'envoi d'intervalles avec une clé de données privée.

metric lors de l'envoi des mesures.

<dataFormat> Format de données de l'observation.

zipkin

otlp-metric

otlp-span

<dataFormatVersion> Version du format de données de l'observation.

Les formats Zipkin V2, otlp-metric et otlp-span sont pris en charge.

1 pour otlp-metric et otlp-span.

2 pour Zipkinv V2.

<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

L'URL de programme de collecte APM suivante utilise le type d'observation 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
Note

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

L'URL du collecteur APM suivante utilise le type d'observation 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 être public-span, private-span ou metric.
  • Le paramètre dataFormat doit être otlp-metric ou otlp-span selon les données.
  • Le paramètre dataFormatVersion doit être 1.

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 :

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.