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.
- 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:
Je nach Datenquellentyp kann der OTEL-Datenuploadendpunkt in einer Konfigurationsdatei, einer Umgebungsvariablen, einem Code oder sogar der Benutzeroberfläche angegeben werden.
-
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
- Fügen Sie für Traces, die mit einem öffentlichen Datenschlüssel authentifiziert wurden, Folgendes hinzu:
-
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”
- 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 imContent-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
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
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:
- 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>
- 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(); /* .... */
- Registrieren Sie
B3TextMapCodec
, um die B3-Propagierung zu verwenden, eine Spezifikation für denb3
-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 UmgebungsvariablenJAEGER_PROPAGATION
aufb3c
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:
- 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.
- 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.
- 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. |
|
<observationType> | Der Typ der abzurufenden Beobachtung. |
|
<dataFormat> | Das Datenformat der Beobachtung. |
|
<dataFormatVersion> | Die Datenformatversion der Beobachtung.
Die Formate Zipkin V2, otlp-metric und otlp-span werden unterstützt. |
|
<dataKey> | Der Datenschlüssel der Beobachtung.
Sie können diesen Wert auf der Seite mit den APM-Domaindetails abrufen. |
Zeichenfolgenwert.
Beispiel: 1111OLQSUZ5Q7IGN |
Zipkin-Beispiel
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
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
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
kannpublic-span
,private-span
odermetric
sein.- Der Parameter
dataFormat
muss je nach Datenotlp-metric
oderotlp-span
lauten. - Der Parameter
dataFormatVersion
muss1
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:
- B3 : Wird standardmäßig verwendet. Das Standardheaderformat von Zipkin. Weitere Einzelheiten finden Sie unter https://github.com/openzipkin/b3-propagation.
- B3 Einzelner Header: Einzelne Headerversion des B3-Headerformats. Weitere Details finden Sie unter https://github.com/openzipkin/b3-propagation.
- Jaeger: Das Standardheaderformat von Jaeger. Weitere Einzelheiten finden Sie unter https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format.
- W3C: Das Tracekontext-Headerformat von W3C. Weitere Einzelheiten finden Sie unter https://www.w3.org/TR/trace-context/.
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.