OpenTelemetry und andere Tracer konfigurieren

Application Performance Monitoring unterstützt OpenTelemetry und Open-Source-Tracingtools wie Jaeger und Zipkin.

Application Performance Monitoring (APM) kann OpenTelemetry-(OTLP-)Spans und -Metriken sowie Zipkin- und Jaeger-Spans aufnehmen.

APM unterstützt auch die Kontextpropagierung zwischen den APM-Agents und Open-Source-Tracern.

Bei Trace-Sampling-Entscheidungen, die sicherstellen, dass Traces und Spans gesampelt werden, um die Tracedaten klein, aber repräsentativ zu halten, entspricht APM jeder Samplingentscheidung der Open-Source-Tracer, wenn der Root-Span vom Open-Source-Tracer generiert wird. Wenn ein Trace den APM-Browser-Agent umfasst, wird jedes Trace, das aus dem Browser-Agent stammt, gesampelt.

Wenn Sie ein vorhandenes verteiltes Tracing-System eingerichtet haben und zu Application Performance Monitoring wechseln möchten, müssen Sie die folgenden Aufgaben ausführen, um sicherzustellen, dass die mit Open-Source-Tracer erfassten Daten in Application Performance Monitoring fließen:
  • Konfigurieren Sie die Kontextpropagierung, um die Tracekontextinformationen abzurufen, die im entsprechenden Format propagiert wurden, und fügen Sie sie einem oder mehreren HTTP-Anforderungsheadern hinzu.
  • Konfigurieren Sie die Open-Source-Tracer, um Spans im akzeptierten Format an Application Performance Monitoring zu melden (OpenTelemetry-Protokoll und JSON-codiertes Zipkin v2 werden unterstützt).
  • Konfigurieren Sie die Open-Source-Tracer, um eine Verbindung zu herzustellen und Tracedaten an die APM-Collector-URL zu senden.

In den folgenden Abschnitten wird erläutert, wie Sie Open-Source-Datenquellen konfigurieren, um Daten an APM zu senden, gegebenenfalls die Kontextpropagierung zu konfigurieren usw.

OpenTelemetry-Datenquellen konfigurieren

Im Folgenden finden Sie Informationen zum Konfigurieren der OpenTelemetry-(OTEL-)Datenquellen (wie Instrumentierungsbibliotheken und OpenTelemetry Collector), um Überwachungsdaten (Metriken und Traces) in Application Performance Monitoring hochzuladen.

OTEL-kompatiblen Endpunkt verwenden

Um OpenTelemetry zum Hochladen von Daten in Application Performance Monitoring zu verwenden, geben Sie Folgendes als OTEL-Datenuploadendpunkt an:

Hinweis

Je nach Datenquellentyp kann der OTEL-Datenuploadendpunkt in einer Konfigurationsdatei, einer Umgebungsvariablen, einem Code oder sogar der Benutzeroberfläche angegeben werden.
  1. Legen Sie den APM-Datenuploadendpunkt fest, um Traces in Application Performance Monitoring hochzuladen.

    Traces können mit einem öffentlichen oder privaten Datenschlüssel authentifiziert werden.

    • Fügen Sie für Traces, die mit einem öffentlichen Datenschlüssel authentifiziert wurden, Folgendes hinzu:

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

    • Fügen Sie für Traces, die mit einem privaten Datenschlüssel authentifiziert wurden, Folgendes hinzu:

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

    Beispiel: Wenn die Traces mit einem öffentlichen Datenschlüssel authentifiziert werden, sieht der APM-Datenuploadendpunkt wie folgt aus:

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

  2. Fügen Sie den folgenden APM-Datenuploadendpunkt hinzu, um Metriken in Application Performance Monitoring hochzuladen:

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

    Metriken werden immer mit einem privaten Datenschlüssel authentifiziert.

Die oben genannten APM-Datenuploadendpunkte stellen den OpenTelemetry-Standard für den Bericht der Daten bereit. Diese Aufrufe akzeptieren keine Abfrageparameter. Datenschlüssel werden wie folgt als Header angegeben: “Authorization”: “dataKey aaaabbbbccc”

Hinweis

  • Einige OpenTelemetry-Clients fügen automatisch das Suffix /v1/traces oder /v1/metrics hinzu, andere hingegen nicht. Wenn das Suffix nicht hinzugefügt wird, muss es als Teil der URL in der Konfiguration angegeben werden. APM unterstützt JSON- und Protokollpuffer-(protobuf-)codierte Daten. Sie müssen explizit im Content-Type-Header angegeben werden, dies erfolgt jedoch in der Regel automatisch durch die OTEL-Bibliothek/-kollektor.
  • Span-Links werden nicht unterstützt.

Beispiele

Node.js-Beispiel

Im Folgenden finden Sie ein Beispiel für den OpenTelemetry-Code für Node.js. Informationen zu den Änderungen für den APM-Datenuploadendpunkt finden Sie unter 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]$

Java-Agent - Beispiel

Im Folgenden finden Sie ein Beispiel für den OpenTelemetry-Code für den Java-Agent. Informationen zu den Änderungen für den APM-Datenuploadendpunkt finden Sie unter 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

OTEL Collector – Beispiel

Im Folgenden finden Sie ein Beispiel für den Collector OpenTelemetry. Siehe die Änderungen für den APM-Datenuploadendpunkt in 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]

Jaeger-Datenquellen konfigurieren

Nachfolgend finden Sie Informationen zu den Änderungen, die am Code einer Java-Anwendung vorgenommen werden müssen, die den Jaeger-Client für das verteilte Tracing und zum Hochladen von Traces in Application Performance Monitoring verwendet.

Um den Jaeger-Tracer zum Hochladen von Traces aus einer Java-Anwendung in Application Performance Monitoring zu verwenden, müssen Sie den Jaeger-Java-Client für die Kompatibilität mit Zipkin (Bericht im Zipkin-Format v2) konfigurieren und die Collector-URL von Application Performance Monitoring hinzufügen. Dazu müssen Sie die folgenden Änderungen am Code des Service vornehmen:

  1. Fügen Sie der Datei pom.xml neben den erforderlichen Jaeger-Clientabhängigkeiten die folgenden Abhängigkeiten hinzu.
    <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. Verwenden Sie ZipkinV2Reporter, um einen Zipkin 2-Reporter an die Jaeger-Reporterschnittstelle anzupassen und Jaeger-Spans in das JSON-codierte Zipkin v2-Format zu konvertieren. Stellen Sie sicher, dass Sie die Collector-URL von Application Performance Monitoring zum Hochladen von Spans in Application Performance Monitoring sowie den Namen des Service oder der Anwendung angegeben haben.
    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. Registrieren Sie B3TextMapCodec, um die B3-Propagierung zu verwenden, eine Spezifikation für den b3-Header. Diese Header werden für die Propagierung des Tracekontexts über Servicegrenzen hinweg verwendet.
    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();
     
    /* .... */

    Hinweis: Wenn der Jaeger-Tracer mit der Umgebungskonfiguration (Configuration.fromEnv()) erstellt wird, wird durch Setzen der Umgebungsvariablen JAEGER_PROPAGATION auf b3c der Zipkin-Kontextpropagierungsmodus (B3) ohne Codeänderungen festgelegt.

Zipkin-Datenquellen konfigurieren

Nachfolgend finden Sie Informationen zu den Änderungen, die am Code einer Node.js-Anwendung vorgenommen werden müssen, die den Zipkin-Client für das verteilte Tracing und zum Hochladen von Traces in Application Performance Monitoring verwendet.

Nehmen Sie dazu die folgenden Änderungen am Initialisierungscode des Zipkin-Tracers vor:

  1. Stellen Sie sicher, dass Sie die erforderlichen Änderungen vorgenommen haben, damit Spans im JSON-codierten Zipkin v2-Format gemeldet werden.

    Informationen zum Zipkin-Format v2 finden Sie unter Zipkin 2.

  2. Fügen Sie die Collector-URL von Application Performance Monitoring zum Hochladen von Spans in Application Performance Monitoring sowie den Namen des Service oder der Anwendung hinzu.
  3. Deaktivieren Sie das Zipkin-Feature "span joining", wenn es aktiviert ist. Die OpenTracing-Spezifikation lässt die gemeinsame Verwendung von Span-IDs für verschiedene Spans innerhalb desselben Trace nicht zu. Daher muss dieses Feature deaktiviert werden.

Node.js-Beispiel

Nachfolgend finden Sie ein Beispiel für den Initialisierungscode des Zipkin-Tracers. Die in der Prozedur beschriebenen Änderungen sind fett formatiert:

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 der APM-Collector-URL

Die Collector-URL von Application Performance Monitoring ist erforderlich, wenn Open-Source-Tracer für die Kommunikation mit dem Application Performance Monitoring-Service konfiguriert werden. Dieses Thema enthält Details zum Format der APM-Collector-URL.

Die Collector-URL von Application Performance Monitoring hat das folgende Format:

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

Rufen Sie den Wert <dataUploadEndpoint> auf der Seite mit den APM-Domaindetails ab.

Parameter Beschreibung Verfügbarer Wert

<dataUploadEndpoint>

Dies ist derselbe Wert wie der Wert von "dataUploadEndpoint" aus der APM-Domain. Der Benutzer kann diesen Wert auf der Seite mit den APM-Domaindetails abrufen. Zeichenfolgenwert.

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

<API version> API-Versionsnummer.

20200101

<observationType> Der Typ der abzurufenden Beobachtung.

public-span beim Senden von Spans mit einem öffentlichen Datenschlüssel.

private-span beim Senden von Spans mit einem privaten Datenschlüssel.

metric beim Senden von Metriken.

<dataFormat> Das Datenformat der Beobachtung.

zipkin

otlp-metric

otlp-span

<dataFormatVersion> Die Datenformatversion der Beobachtung.

Die Formate Zipkin V2, otlp-metric und otlp-span werden unterstützt.

1 für otlp-metric und otlp-span.

2 für Zipkinv V2.

<dataKey> Der Datenschlüssel der Beobachtung.

Sie können diesen Wert auf der Seite mit den APM-Domaindetails abrufen.

Zeichenfolgenwert.

Beispiel: 1111OLQSUZ5Q7IGN

Zipkin-Beispiel

Die folgende APM-Collector-URL verwendet den Beobachtungstyp public-span, das Datenformat zipkin, die Datenformatversion 2 und den Datenschlüssel 11115Q7IGN:
https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
Hinweis

In einigen Fällen muss die konfigurierte Zipkin-URL möglicherweise in die Basis-URL und den relativen Pfad aufgeteilt werden. Für Anwendungen, die Spring Sleuth verwenden, muss die obige URL wie folgt festgelegt werden:
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

OpenTelemetry-Beispiel

Die folgende APM-Collector-URL verwendet den Beobachtungstyp private-span, das Datenformat otlp-span, die Datenformatversion 1 und den Datenschlüssel 11112222UZ5:
https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5

Überlegungen zu OpenTelemetry

  • observationType kann public-span, private-span oder metric sein.
  • Der Parameter dataFormat muss je nach Daten otlp-metric oder otlp-span lauten.
  • Der Parameter dataFormatVersion muss 1 lauten.

APM- und Open-Source-Interoperabilität

Konfigurieren Sie die Kontextpropagierung, um die Tracekontextinformationen abzurufen, die im entsprechenden Format propagiert wurden, und fügen Sie sie einem oder mehreren HTTP-Anforderungsheadern hinzu. Der Tracekontext ermöglicht die Korrelation von Spans, die aus verschiedenen Microservices stammen, aber zu derselben Transaktion (Transaktion) gehören und eine gemeinsame Trace-ID haben.

APM-Agent/Tracer

Der APM-Java-Agent/Tracer kann so konfiguriert werden, dass er mit anderen OpenTracing-Tracern (wie Jaeger und Zipkin) zusammenarbeitet, um ein vollständiges Trace zu bilden.

Wenn ein HTTP-Aufruf erfolgt, versucht der APM-Java-Agent/Tracer, dem Aufruf HTTP-Header hinzuzufügen, die dann auf der anderen Seite gelesen werden können, um Spans miteinander zu verbinden.

Sie können dieses Format mit der Eigenschaft com.oracle.apm.agent.tracer.propagation.type aus der Datei AgentConfig.properties im Verzeichnis oracle-apm-agent\config ändern.

Sie können die folgenden Propagierungstypen verwenden, indem Sie die Eigenschaft auf den Namen setzen:

Legen Sie den entsprechenden Propagierungstyp fest, damit die verschiedenen Tracer zusammenarbeiten können, um einen vollständigen Trace zu bilden.

OpenTelemetry, Zipkin und Jaeger

  • OpenTelemetry: OpenTelemetry unterstützt die Kontextpropagierung W3C und B3. Details finden Sie unter Kontextpropagatorenverteilung.

  • Zipkin: APM verwendet das Zipkin-Format (B3), um den Tracekontext zu propagieren, sodass der Zipkin-Tracer keine zusätzliche Konfiguration erfordert.

  • Jaeger: Sie können Jaeger entweder so konfigurieren, dass der Tracekontext im Zipkin-Format (B3) konsumiert und propagiert wird, oder den APM-Java-Agent so konfigurieren, dass er den Jaeger-Propagierungskontext verwendet, indem Sie die Eigenschaft com.oracle.APM.tracer.propagation.type festlegen.