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.

Se si dispone di un'impostazione di sistema di trace distribuito esistente e si desidera passare a Application Performance Monitoring, è necessario eseguire i task riportati di seguito per assicurarsi che i dati raccolti mediante traccianti open source vengano trasferiti in Application Performance Monitoring.
  • 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:

Nota

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

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

Nota

  • 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'intestazione Content-Type, ma in genere questo viene eseguito automaticamente dalla libreria/collettore OTEL.
  • I collegamenti intervallo non sono supportati.

Esempi

Node.js Esempio

Di seguito è riportato un esempio del codice OpenTelemetry per Node.js. Vedere le modifiche per l'endpoint di caricamento dati APM in 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

Di seguito è riportato un esempio del codice OpenTelemetry per l'agente Java. Vedere le modifiche per l'endpoint di caricamento dati APM in 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:

  1. 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>
  2. 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();
     
    /* .... */
  3. Registrare B3TextMapCodec per utilizzare la propagazione B3, che è una specifica per l'intestazione b3. 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 ambiente JAEGER_PROPAGATION su b3c 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:

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

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

20200101

<observationType> Il tipo di osservazione da recuperare.

public-span durante l'invio di intervalli con una chiave dati pubblica.

private-span durante l'invio degli intervalli con una chiave dati privata.

metric durante l'invio delle metriche.

<dataFormat> Formato di dati dell'osservazione.

zipkin

otlp-metric

otlp-span

<dataFormatVersion> Versione del formato dei dati dell'osservazione.

Sono supportati i formati Zipkin V2, otlp-metric e otlp-span.

1 per otlp-metric e otlp-span.

2 per Zipkinv V2.

<dataKey> La chiave dei dati dell'osservazione.

È possibile ottenere questo valore dalla pagina Dettagli dominio APM.

Valore stringa.

Ad esempio: 1111OLQSUZ5Q7IGN

Esempio Zipkin

Il seguente URL Collector APM utilizza il tipo di osservazione 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
Nota

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

Il seguente URL Collector APM utilizza il tipo di osservazione 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ò essere public-span, private-span o metric.
  • Il parametro dataFormat deve essere otlp-metric o otlp-span a seconda dei dati.
  • Il parametro dataFormatVersion deve essere 1.

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:

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.