Configurare OpenTelemetry e altri trace
Application Performance Monitoring supporta OpenTelemetry e gli strumenti di trace open source come Jaeger e Zipkin.
Application Performance Monitoring (APM) può includere intervalli e metriche OpenTelemetry (OTLP), nonché intervalli Zipkin e Jaeger.
APM supporta anche la propagazione del contesto tra gli agenti APM e i traccianti open source.
Per le decisioni di campionamento delle tracce, che garantiscono che le tracce e gli intervalli siano campionati per mantenere i dati di traccia piccoli, ma rappresentativi, APM è conforme a qualsiasi decisione di campionamento presa dai traccianti open-source se l'intervallo radice è generato dal tracciante open-source. Se una traccia coinvolge l'agente browser APM, viene campionata ogni traccia originata nell'agente browser.
- Configurare la propagazione del contesto per propagare le informazioni del contesto di trace nel formato appropriato e aggiungerle a una o più intestazioni di richiesta HTTP.
- Configurare i traccianti open source per segnalare gli intervalli nel formato accettato in Application Performance Monitoring (sono supportati il protocollo OpenTelemetry e Zipkin v2 con codifica JSON).
- Configurare i traccianti open source per connettersi e inviare i dati di trace all'URL del Collector APM.
Nelle sezioni riportate di seguito viene descritto come configurare le origini dati open source per inviare i dati ad APM, configurare la propagazione del contesto, se applicabile, e molto altro ancora.
Configura origini dati OpenTelemetry
Di seguito sono riportate informazioni sulla configurazione delle origini dati OpenTelemetry (OTEL) (come le librerie di strumentazione e il Collector OpenTelemetry) per caricare i dati di monitoraggio (metriche e trace) in Application Performance Monitoring.
Utilizzare l'endpoint compatibile con OTEL
Per utilizzare OpenTelemetry per caricare i dati in Application Performance Monitoring, specificare quanto segue come endpoint di caricamento dati OTEL:
A seconda del tipo di origine dati, l'endpoint di caricamento dati OTEL può essere specificato in un file di configurazione, una variabile di ambiente, un codice o anche nell'interfaccia utente.
-
Impostare l'endpoint di caricamento dati APM per caricare i trace in Application Performance Monitoring.
I trace possono essere autenticati con una chiave dati pubblica o privata.
- Per i trace autenticati con chiave dati pubblica, aggiungere quanto segue:
https://<dataUploadEndpoint>/20200101/opentelemetry/public/v1/traces
- Per i trace autenticati con chiave dati privata, aggiungere quanto segue:
https://<dataUploadEndpoint>/20200101/opentelemetry/private/v1/traces
Ad esempio, se i trace vengono autenticati con una chiave dati pubblica, l'endpoint di caricamento dati APM avrà il seguente aspetto:
https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/public/v1/traces
- Per i trace autenticati con chiave dati pubblica, aggiungere quanto segue:
-
Aggiungere il seguente endpoint di caricamento dati APM per caricare le metriche in Application Performance Monitoring:
https://<dataUploadEndpoint>/20200101/opentelemetry/
v1/metrics
Le metriche vengono sempre autenticate con una chiave dati privata.
Gli endpoint di caricamento dati APM riportati sopra forniscono lo standard OpenTelemetry per il report dei dati. Queste chiamate non accettano parametri di query. La chiave dati viene fornita come intestazione, ad esempio: “Authorization”: “dataKey aaaabbbbccc”
- Alcuni client OpenTelemetry aggiungono automaticamente il suffisso
/v1/traces
o/v1/metrics
, mentre altri no. Se il suffisso non viene aggiunto, deve essere specificato come parte dell'URL nella configurazione. APM supporta i dati con codifica JSON e Protocol Buffer (protobuf). Devono essere esplicitamente specificati nell'intestazioneContent-Type
, ma in genere questo viene eseguito automaticamente dalla libreria/collettore OTEL. - I collegamenti intervallo non sono supportati.
Esempi
Node.js Esempio
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]$
Esempio di agente 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
Esempio di Collector OTEL
Ecco un esempio del raccoglitore OpenTelemetry. Vedere le modifiche per l'endpoint di caricamento dati APM 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]
Configura origini dati Jaeger
Di seguito sono riportate informazioni sulle modifiche da apportare al codice di un'applicazione Java che utilizza il client Jaeger per il trace distribuito e utilizzarlo per caricare i trace in Application Performance Monitoring.
Per utilizzare il Tracer Jaeger per caricare i trace da un'applicazione Java in Application Performance Monitoring, è necessario configurare il client Java Jaeger per la compatibilità Zipkin (report in formato v2 Zipkin) e aggiungere l'URL del Collector di Application Performance Monitoring. A tale scopo, è necessario apportare le seguenti modifiche al codice del servizio:
- Insieme alle dipendenze del client Jaeger richieste, aggiungere le seguenti dipendenze al file
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>
- Utilizzare
ZipkinV2Reporter
per adattare un reporter Zipkin 2 all'interfaccia di Jaeger Reporter e convertire gli intervalli Jaeger nel formato Zipkin v2 con codifica JSON. Assicurarsi di aver specificato l'URL del Collector di Application Performance Monitoring per caricare gli intervalli in Application Performance Monitoring e il nome del servizio o dell'applicazione.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(); /* .... */
- Registrare
B3TextMapCodec
per utilizzare la propagazione B3, che è una specifica per l'intestazioneb3
. Queste intestazioni vengono utilizzate per la propagazione del contesto di trace oltre i confini del servizio.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(); /* .... */
Tenere presente che se il tracciatore Jaeger viene creato utilizzando la configurazione dell'ambiente (
Configuration.fromEnv()
), l'impostazione della variabile di ambienteJAEGER_PROPAGATION
sub3c
imposta la modalità di propagazione del contesto Zipkin (B3) senza modifiche al codice.
Configura origini dati Zipkin
Di seguito sono riportate informazioni sulle modifiche da apportare al codice di un'applicazione Node.js che utilizza il client Zipkin per il trace distribuito e utilizzarlo per caricare i trace in Application Performance Monitoring.
A tale scopo, apportare le seguenti modifiche al codice di inizializzazione del tracciante Zipkin:
- Assicurarsi di aver apportato le modifiche necessarie agli intervalli di report nel formato v2 Zipkin con codifica JSON.
Per informazioni sul formato v2 Zipkin, vedere Zipkin 2.
- Aggiungere l'URL del Collector di Application Performance Monitoring per caricare gli intervalli in Application Performance Monitoring e il nome del servizio o dell'applicazione.
- Disabilitare la funzione Zipkin "span join", se abilitata. La specifica OpenTracing non consente la condivisione dell'ID intervallo tra intervalli diversi all'interno dello stesso trace e questa funzione deve essere disabilitata.
Node.js Esempio
Di seguito è riportato un esempio del codice di inizializzazione del tracciante Zipkin e le modifiche dettagliate nella procedura sono disponibili in bold
:
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
});
Formato URL Collector APM
L'URL del Collector di Application Performance Monitoring è obbligatorio quando si configurano i trace open source per comunicare con il servizio Application Performance Monitoring. Questo argomento fornisce dettagli sul formato dell'URL del Collector APM.
L'URL del Collector di Application Performance Monitoring ha il formato seguente:
<dataUploadEndpoint>/<API version>/observations/<observationType>?dataFormat=<dataFormat>&dataFormatVersion=<dataFormatVersion>&dataKey=<dataKey>
Ottenere il valore <dataUploadEndpoint>
dalla pagina dei dettagli del dominio APM.
Parametro | descrizione; | Valore disponibile |
---|---|---|
<dataUploadEndpoint> |
Questo è lo stesso valore del valore "dataUploadEndpoint" del dominio APM. L'utente può ottenere questo valore dalla pagina Dettagli dominio APM. | Valore stringa.
Ad esempio: https://aaaabbbb.apm-agt.us-ashburn-1.oci.oraclecloud.com |
<Versione API> | Numero di versione dell'API. |
|
<observationType> | Il tipo di osservazione da recuperare. |
|
<dataFormat> | Formato di dati dell'osservazione. |
|
<dataFormatVersion> | Versione del formato dei dati dell'osservazione.
Sono supportati i formati Zipkin V2, otlp-metric e otlp-span. |
|
<dataKey> | La chiave dei dati dell'osservazione.
È possibile ottenere questo valore dalla pagina Dettagli dominio APM. |
Valore stringa.
Ad esempio: 1111OLQSUZ5Q7IGN |
Esempio Zipkin
public-span
, il formato dati zipkin
, la versione del formato dati 2
e la chiave dati 11115Q7IGN
:https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
In alcuni casi, potrebbe essere necessario suddividere l'URL configurato Zipkin nell'URL di base e nel percorso relativo. Ad esempio, le applicazioni che utilizzano Spring Sleuth richiedono l'impostazione dell'URL sopra riportato come segue:
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 Esempio
private-span
, il formato dati otlp-span
, la versione del formato dati 1
e la chiave dati 11112222UZ5
:https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5
OpenTelemetry Considerazioni
- Il valore
observationType
può esserepublic-span
,private-span
ometric
. - Il parametro
dataFormat
deve essereotlp-metric
ootlp-span
a seconda dei dati. - Il parametro
dataFormatVersion
deve essere1
.
Interoperabilità APM e open source
Configurare la propagazione del contesto per propagare le informazioni del contesto di trace nel formato appropriato e aggiungerle a una o più intestazioni di richiesta HTTP. Il contesto di traccia consente la correlazione degli intervalli provenienti da microservizi diversi, ma appartenenti alla stessa transazione (traccia) e identificati da un ID traccia comune.
Agente/tracer APM
L'agente/tracer APM Java può essere configurato per funzionare con altri traccianti OpenTracing (come Jaeger e Zipkin) al fine di formare un trace completo.
Quando si verifica una chiamata HTTP, APM Java Agent/Tracer tenterà di aggiungere intestazioni HTTP alla chiamata che potranno essere lette dall'altra parte per facilitare la connessione degli intervalli.
Per modificare questo formato, utilizzare la proprietà com.oracle.apm.agent.tracer.propagation.type
del file AgentConfig.properties
situato nella directory oracle-apm-agent\config
.
È possibile utilizzare i seguenti tipi di propagazione impostando la proprietà sul nome:
- B3 : viene utilizzata per impostazione predefinita. Formato di intestazione predefinito di Zipkin. Per maggiori dettagli, vedere https://github.com/openzipkin/b3-propagation.
- B3 Singola intestazione: versione a singola intestazione del formato di intestazione B3. Per maggiori dettagli, vedere https://github.com/openzipkin/b3-propagation.
- Jaeger: formato di intestazione predefinito di Jaeger. Per maggiori dettagli, vedere https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format.
- W3C: formato dell'intestazione Contesto traccia di W3C. Per maggiori dettagli, vedere https://www.w3.org/TR/trace-context/.
Impostare il tipo di propagazione appropriato per consentire ai vari traccianti di lavorare insieme per formare una traccia completa.
OpenTelemetry, Zipkin e Jaeger
-
OpenTelemetry: OpenTelemetry supporta la propagazione del contesto W3C e B3. Per ulteriori informazioni, vedere Distribuzione dei propagatori di contesto.
-
Zipkin: APM utilizza il formato Zipkin (B3) per propagare il contesto di trace in modo che il tracciante Zipkin non richieda una configurazione aggiuntiva.
-
Jaeger: è possibile configurare Jaeger per utilizzare e propagare il contesto di trace nel formato Zipkin (B3) oppure configurare l'agente Java APM per utilizzare il contesto di propagazione Jaeger impostando la proprietà
com.oracle.apm.tracer.propagation.type
.