Configurar OpenTelemetry e Outros Rastreadores

O serviço Application Performance Monitoring suporta ferramentas de rastreamento OpenTelemetry e de código aberto, como Jaeger e Zipkin.

O Application Performance Monitoring (APM) pode ingerir intervalos e métricas OpenTelemetry (OTLP), bem como intervalos Zipkin e Jaeger.

O APM também suporta a propagação de contexto entre os agentes do APM e rastreadores de código-fonte aberto.

Para decisões de amostragem de rastreamento, que garantem que rastreamentos e intervalos sejam amostrados para manter os dados de rastreamento pequenos, mas representativos, o APM estará em conformidade com qualquer decisão de amostragem tomada pelos rastreadores de código-fonte aberto se o intervalo raiz for gerado pelo rastreador de código-fonte aberto. Se um rastreamento envolver o Agente do Browser do APM, cada rastreamento originado no Agente do Browser será amostrado.

Se você tiver uma configuração do sistema de rastreamento distribuído existente e quiser alternar para o serviço Application Performance Monitoring, execute as seguintes tarefas para garantir que os dados coletados usando rastreadores de código-fonte aberto fluam para o serviço Application Performance Monitoring:
  • Configure a propagação de contexto para que as informações de contexto de rastreamento sejam propagadas no formato apropriado e adicione-as a um ou mais cabeçalhos de solicitação HTTP.
  • Configure os rastreadores de código-fonte aberto para reportar intervalos no formato aceito para o serviço Application Performance Monitoring (o Protocolo OpenTelemetry e o Zipkin v2 codificado em JSON são suportados).
  • Configure os rastreadores de código-fonte aberto para se conectar e enviar dados de rastreamento para o URL do coletor do APM.

As seções a seguir explicam como configurar origens de dados de código-fonte aberto para enviar dados para o APM, configurar a propagação de contexto, se aplicável, e mais:

Configurar Origens de Dados OpenTelemetry

Veja informações sobre como configurar as origens de dados do OTEL (OpenTelemetry) (como bibliotecas de instrumentação e Coletor OpenTelemetry) para fazer upload de dados de monitoramento (métricas e rastreamentos) para o serviço Application Performance Monitoring.

Usar o Ponto Final Compatível com OTEL

Para usar OpenTelemetry para fazer upload de dados para o serviço Application Performance Monitoring, especifique o seguinte como ponto final de upload de dados do OTEL:

Observação

Dependendo do tipo de origem de dados, o ponto final de upload de dados OTEL pode ser especificado em um arquivo de configuração, variável de ambiente, código ou até mesmo na interface do usuário.
  1. Defina o ponto final de upload de dados do APM para fazer upload de rastreamentos para o serviço Application Performance Monitoring.

    Os rastreamentos podem ser autenticados com uma chave de dados pública ou privada.

    • Para rastreamentos autenticados com chave de dados pública, adicione o seguinte:

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

    • Para rastreamentos autenticados com chave de dados privada, adicione o seguinte:

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

    Por exemplo, se os rastreamentos forem autenticados com a chave de dados pública, o ponto final de upload de dados do APM terá a seguinte aparência:

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

  2. Adicione o seguinte ponto final de upload de dados do APM para fazer upload de métricas para o serviço Application Performance Monitoring:

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

    As métricas sempre são autenticadas com uma chave de dados privada.

Os pontos finais de upload de dados do APM acima fornecem o padrão OpenTelemetry para reportar os dados. Essas chamadas não aceitam parâmetros de consulta. A chave de dados é fornecida como um cabeçalho como o seguinte: “Authorization”: “dataKey aaaabbbbccc”

Observação

  • Alguns clientes OpenTelemetry adicionam automaticamente o sufixo /v1/traces ou /v1/metrics enquanto outros não. Se o sufixo não for adicionado, ele deverá ser especificado como parte do URL na configuração. O APM suporta dados codificados em Buffers de Protocolo e JSON (protobuf). Eles devem ser especificados explicitamente no cabeçalho Content-Type, mas isso geralmente é feito automaticamente pela biblioteca/coletor OTEL.
  • Links de extensão não são suportados.

Exemplos

Node.js Exemplo

Veja uma amostra do código OpenTelemetry para Node.js. Consulte as alterações do ponto final de upload de dados do APM em 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]$

Exemplo do Agente Java

Veja aqui uma amostra do código OpenTelemetry do agente Java. Consulte as alterações do ponto final de upload de dados do APM em 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

Exemplo de Cobrador OTEL

Veja uma amostra do coletor OpenTelemetry. Consulte as alterações do ponto final de upload de dados do APM em 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]

Configurar Origens de Dados Jaeger

Veja aqui as informações sobre as alterações que devem ser feitas no código de um aplicativo Java que utiliza o cliente Jaeger para rastreamento distribuído. Use-as para fazer upload de rastreamentos para o serviço Application Performance Monitoring.

Para usar o rastreador Jaeger para fazer upload de rastreamentos de um aplicativo Java para o serviço Application Performance Monitoring, configure o cliente Java Jaeger para compatibilidade com Zipkin (relatório no formato v2 Zipkin) e adicione o URL do coletor do serviço Application Performance Monitoring. Para isso, faça as seguintes alterações no código do seu serviço:

  1. Junto com as dependências de cliente Jaeger necessárias, adicione as dependências a seguir ao arquivo 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. Use o ZipkinV2Reporter para adaptar um relator Zipkin 2 à interface do relator Jaeger e converter intervalos Jaeger para o formato Zipkin v2 codificado em JSON. Certifique-se de ter especificado o URL do coletor do serviço Application Performance Monitoring para fazer upload de intervalos para o Application Performance Monitoring e o nome do seu serviço ou aplicativo.
    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. Registre B3TextMapCodec para usar a propagação B3, que é uma especificação para o cabeçalho b3. Esses cabeçalhos são usados para propagação do contexto de rastreamento entre os limites do serviço.
    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();
     
    /* .... */

    Observe que se o rastreador Jaeger for criado usando a configuração de ambiente (Configuration.fromEnv()), definir a variável de ambiente JAEGER_PROPAGATION como b3c definirá o modo de propagação de contexto Zipkin (B3) sem alterações de código.

Configurar Origens de Dados Zipkin

Veja aqui as informações sobre as alterações que devem ser feitas no código de um aplicativo Node.js que utiliza o cliente Zipkin para rastreamento distribuído. Use-as para fazer upload de rastreamentos para o serviço Application Performance Monitoring.

Para isso, faça as seguintes alterações no código de inicialização do rastreador Zipkin:

  1. Certifique-se de ter feito as alterações necessárias nos intervalos de relatórios no formato Zipkin v2 codificado em JSON.

    Para obter informações sobre o formato Zipkin v2, consulte Zipkin 2.

  2. Adicione o URL do coletor do serviço Application Performance Monitoring para fazer upload de intervalos para o Application Performance Monitoring e o nome do seu serviço ou aplicativo.
  3. Desative o recurso "junção de intervalos" do Zipkin, se ele estiver ativado. A especificação OpenTracing não permite o compartilhamento de ID do Intervalo entre diferentes intervalos dentro do mesmo rastreamento e esse recurso deve ser desativado.

Node.js Exemplo

Veja a seguir um exemplo do código de inicialização do rastreador Zipkin e as alterações detalhadas no procedimento estão em 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 de URL do Coletor do APM

O URL do coletor do serviço Application Performance Monitoring é necessário ao configurar rastreadores de código-fonte aberto para se comunicar com o serviço Application Performance Monitoring. Este tópico fornece detalhes sobre o formato do URL do Coletor do APM.

O URL do coletor do serviço Application Performance Monitoring tem o seguinte formato:

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

Obtenha o valor <dataUploadEndpoint> na página de detalhes do domínio do APM.

Parâmetro Descrição Valor Disponível

<dataUploadEndpoint>

Este é o mesmo valor que o valor "dataUploadEndpoint" do Domínio do APM. O usuário pode obter esse valor na página de detalhes do Domínio do APM. Valor da string.

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

<API version> Número da versão da API.

20200101

<observationType> O tipo de observação a ser recuperada.

public-span ao enviar intervalos com uma chave de dados pública.

private-span ao enviar intervalos com uma chave de dados privada.

metric ao enviar métricas.

<dataFormat> O formato de dados da observação.

zipkin

otlp-metric

otlp-span

<dataFormatVersion> A versão do formato de dados da observação.

Os formatos Zipkin V2, otlp-metric e otlp-span são suportados.

1 para otlp-metric e otlp-span.

2 para Zipkinv V2.

<dataKey> A chave de dados da observação.

Você pode obter esse valor na página de detalhes do Domínio do APM.

Valor da string.

Por exemplo: 1111OLQSUZ5Q7IGN

Exemplo de Zipkin

O seguinte URL do coletor do APM usa o tipo de observação public-span, o formato de dados zipkin, a versão do formato de dados 2 e a chave de dados 11115Q7IGN:
https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
Observação

Em alguns casos, o URL configurado do Zipkin pode precisar ser dividido no URL base e no caminho relativo. Por exemplo, os aplicativos que usam Spring Sleuth exigem que o URL acima seja definido da seguinte forma:
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 Exemplo

O seguinte URL do coletor do APM usa o tipo de observação private-span, o formato de dados otlp-span, a versão do formato de dados 1 e a chave de dados 11112222UZ5:
https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5

OpenTelemetry Considerações

  • O observationType pode ser public-span, private-span ou metric.
  • O parâmetro dataFormat deve ser otlp-metric ou otlp-span, dependendo dos dados.
  • O parâmetro dataFormatVersion deve ser 1.

APM e Interoperabilidade de Código-Fonte Aberto

Configure a propagação de contexto para que as informações de contexto de rastreamento sejam propagadas no formato apropriado e adicione-as a um ou mais cabeçalhos de solicitação HTTP. O contexto de rastreamento permite a correlação de intervalos provenientes de diferentes microservices, mas que pertencem à mesma transação (rastreamento) e são identificados por um ID de Rastreamento comum.

Agente/Rastreador do APM

O Agente/Rastreador Java do APM pode ser configurado para funcionar com outros rastreadores OpenTracing (como Jaeger e Zipkin) para formar um rastreamento completo.

Quando ocorrer uma chamada HTTP, o Agente/Rastreador Java do APM tentará adicionar cabeçalhos HTTP à chamada que poderá ser lida na outra extremidade para ajudar a conectar os intervalos.

Você pode alterar esse formato usando a propriedade com.oracle.apm.agent.tracer.propagation.type do arquivo AgentConfig.properties localizado no diretório oracle-apm-agent\config.

Você pode utilizar os seguintes tipos de propagação definindo a propriedade com o nome:

Defina o tipo de propagação apropriado para que seus diversos rastreadores possam trabalhar juntos para formar um rastreamento completo.

OpenTelemetry, Zipkin e Jaeger

  • OpenTelemetry: OpenTelemetry suporta propagação de contexto W3C e B3. Para obter detalhes, consulte Distribuição de Propagadores de Contexto.

  • Zipkin: O APM usa o formato Zipkin (B3) para propagar o contexto de rastreamento, de modo que o rastreador Zipkin não exija configuração adicional.

  • Jaeger: Você pode configurar o Jaeger para consumir e propagar o contexto de rastreamento no formato Zipkin (B3) ou configurar o Agente Java do APM para usar o contexto de propagação do Jaeger definindo a propriedade com.oracle.apm.tracer.propagation.type.