Configurer OpenTelemetry et d'autres traceurs

Application Performance Monitoring prend en charge OpenTelemetry et les outils de trace open source tels que Jaeger et Zipkin.

Application Performance Monitoring (APM) peut ingérer des étendues et des mesures OpenTelemetry (OTLP), ainsi que des étendues Zipkin et Jaeger.

APM prend également en charge la propagation du contexte entre les agents APM et les traceurs open source.

Pour les décisions d'échantillonnage de trace, qui garantissent que les traces et les étendues sont échantillonnées afin de limiter la taille des données de trace, mais représentatives, APM respecte toute décision d'échantillonnage prise par les traceurs open source si l'étendue racine est générée par le traceur open source. Si une trace implique l'agent de navigateur APM, chaque trace provenant de l'agent de navigateur est échantillonnée.

Si vous disposez d'une configuration système de trace distribuée existante 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 des traceurs open source sont transmises à Application Performance Monitoring :
  • Configurez la propagation du contexte pour que les informations de contexte de trace soient propagées dans le format approprié et ajoutez-les à des en-têtes de demande HTTP.
  • Configurez les traceurs open source de sorte qu'ils génèrent des rapports sur les étendues au format accepté dans Application Performance Monitoring (le protocole OpenTelemetry et le code Zipkin v2 encodé en JSON sont pris en charge).
  • Configurez les traceurs open source pour vous connecter et envoyer des données de trace à l'URL du collecteur APM.

Les sections suivantes expliquent comment configurer des sources de données open source pour envoyer des données à APM, configurer la propagation du contexte, le cas échéant, etc.

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) afin de télécharger des données de surveillance (mesures et traces) vers Application Performance Monitoring.

Utiliser l'adresse compatible OTEL

Pour utiliser OpenTelemetry afin de télécharger des données vers Application Performance Monitoring, indiquez l'adresse de téléchargement de données OTEL comme suit :

Remarque

Selon le type de source de données, l'adresse de téléchargement de données OTEL peut être indiquée dans un fichier de configuration, une variable d'environnement, un code ou même l'interface utilisateur.
  1. Définissez l'adresse de téléchargement de données APM pour télécharger les traces vers 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, l'adresse de téléchargement de données APM ressemble à ce qui suit :

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

  2. Ajoutez l'adresse de téléchargement de données APM suivante pour télécharger des mesures vers Application Performance Monitoring :

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

    Les mesures sont toujours authentifiées avec une clé de données privée.

Les adresses de téléchargement de données APM ci-dessus fournissent la norme OpenTelemetry pour signaler les données. Ces appels n'acceptent aucun paramètre de requête. La clé de données est fournie en tant qu'en-tête comme suit : “Authorization”: “dataKey aaaabbbbccc”

Remarque

  • Certains clients OpenTelemetry ajoutent automatiquement le suffixe /v1/traces ou /v1/metrics, contrairement à d'autres. 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 codées JSON et Protocol Buffers (protobuf). Elles doivent être explicitement spécifiées dans l'en-tête Content-Type, mais cette opération est généralement effectuée automatiquement par la bibliothèque/le collecteur OTEL.
  • Les liens d'étendue ne sont pas pris en charge.

Exemples

Exemple avec Node.js

Voici un exemple de code OpenTelemetry pour Node.js. Reportez-vous aux modifications apportées à l'adresse de télé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. Reportez-vous aux modifications apportées à l'adresse de télé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 de collecteur OTEL

Voici un exemple du collecteur OpenTelemetry. Reportez-vous aux modifications apportées à l'adresse de téléchargement de 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 la trace distribuée et le téléchargement des traces vers Application Performance Monitoring.

Pour utiliser le traceur Jaeger afin de télécharger des traces d'une application Java vers Application Performance Monitoring, vous devez configurer le client Java Jaeger de sorte qu'il soit compatible Zipkin (rapport au format v2 Zipkin) 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 générateur de rapports Zipkin 2 à l'interface du générateur de rapports Jaeger et convertir les étendues Jaeger au format Zipkin v2 encodé JSON. Veillez à indiquer l'URL du collecteur Application Performance Monitoring pour télécharger les étendues vers Application Performance Monitoring, 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. Inscrivez B3TextMapCodec afin d'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 de 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();
     
    /* .... */

    Si le traceur Jaeger est créé à l'aide de la configuration d'environnement (Configuration.fromEnv()), la définition de la variable d'environnement JAEGER_PROPAGATION sur b3c définit le mode de propagation du contexte Zipkin (B3) sans modification du 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 la trace distribuée et le téléchargement des traces vers Application Performance Monitoring.

Pour ce faire, apportez les modifications suivantes au code d'initialisation du traceur Zipkin :

  1. Veillez à avoir apporté les modifications nécessaires pour générer des rapports sur les étendues au format Zipkin v2 encodé JSON.

    Pour plus d'informations sur le format Zipkin v2, reportez-vous à la section Zipkin 2.

  2. Ajoutez l'URL du collecteur Application Performance Monitoring pour télécharger les étendues vers Application Performance Monitoring, ainsi que le nom de votre service ou application.
  3. Désactivez la fonctionnalité Zipkin de jointure des étendues, si elle est activée. La spécification OpenTracing n'autorise pas le partage des ID d'étendue entre les étendues d'une même trace. Cette fonctionnalité doit donc être désactivée.

Exemple avec Node.js

Voici un exemple de code d'initialisation du traceur Zipkin (les modifications détaillées dans la procédure sont en 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 collecteur APM

L'URL du collecteur Application Performance Monitoring est requise lors de la configuration des traceurs open source pour assurer la communication avec le service Application Performance Monitoring. Cette rubrique fournit des détails sur le format de l'URL du collecteur APM.

L'URL du collecteur Application Performance Monitoring se présente au format suivant :

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

Obtenez la valeur <dataUploadEndpoint> à partir de la page de détails du domaine APM.

Paramètre Description Valeur disponible

<dataUploadEndpoint>

Il s'agit de la même valeur que la valeur "dataUploadEndpoint" du domaine APM. L'utilisateur peut obtenir cette valeur sur la page des détails du domaine APM. Valeur de chaîne.

Par exemple : https://aaaabbbb.apm-agt.us-ashburn-1.oci.oraclecloud.com

<API version> Numéro de version de l'API.

20200101

<observationType> Type de l'observation à extraire.

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

private-span lors de l'envoi d'étendues 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 sur la page des détails du domaine APM.

Valeur de chaîne.

Par exemple : 1111OLQSUZ5Q7IGN

Exemple avec Zipkin

L'URL suivante du collecteur APM 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
Remarque

Dans certains cas, il peut être nécessaire de fractionner l'URL configurée Zipkin en URL de base et en chemin relatif. Par exemple, les applications qui utilisent Spring Sleuth nécessitent 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 avec OpenTelemetry

L'URL de collecteur APM suivante utilise le type d'observation private-span, le format de données otlp-span, la version de 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 Remarques

  • observationType peut être public-span, private-span ou metric.
  • Le paramètre dataFormat doit être otlp-metric ou otlp-span en fonction des données.
  • Le paramètre dataFormatVersion doit être 1.

APM et Interopérabilité Open Source

Configurez la propagation du contexte pour que les informations de contexte de trace soient propagées dans le format approprié et ajoutez-les à des en-têtes de demande HTTP. Le contexte de trace permet d'établir une corrélation entre les étendues issues de plusieurs microservices, mais appartenant à la même transaction (trace) et identifiées par un ID de trace commun.

Agent/traceur APM

L'agent ou 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 est lancé, l'agent ou le traceur Java APM tente de lui ajouter des en-têtes HTTP, qui peuvent ensuite être lus à l'autre extrémité pour faciliter la connexion des étendues.

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 définissant la propriété sur leur nom :

Définissez le type de propagation approprié pour permettre à vos différents traceurs d'oeuvrer ensemble à la formation une trace complète.

OpenTelemetry, Zipkin et Jaeger

  • OpenTelemetry : OpenTelemetry prend en charge la propagation du contexte W3C et B3. Pour plus d'informations, reportez-vous à Distribution des propagateurs 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 utilise et propage le contexte de trace au 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.