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.
- 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:
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.
-
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
- Para rastreamentos autenticados com chave de dados pública, adicione o seguinte:
-
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”
- 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çalhoContent-Type
, mas isso geralmente é feito automaticamente pela biblioteca/coletor OTEL. - Links de extensão não são suportados.
Exemplos
Node.js Exemplo
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
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:
- 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>
- 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(); /* .... */
- Registre
B3TextMapCodec
para usar a propagação B3, que é uma especificação para o cabeçalhob3
. 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 ambienteJAEGER_PROPAGATION
comob3c
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:
- 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.
- 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.
- 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. |
|
<observationType> | O tipo de observação a ser recuperada. |
|
<dataFormat> | O formato de dados da observação. |
|
<dataFormatVersion> | A versão do formato de dados da observação.
Os formatos Zipkin V2, otlp-metric e otlp-span são suportados. |
|
<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
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
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
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 serpublic-span
,private-span
oumetric
. - O parâmetro
dataFormat
deve serotlp-metric
ouotlp-span
, dependendo dos dados. - O parâmetro
dataFormatVersion
deve ser1
.
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:
- B3 : É usado por padrão. O formato de cabeçalho padrão do Zipkin. Para obter detalhes, consulte https://github.com/openzipkin/b3-propagation.
- B3 Cabeçalho Único: Versão de cabeçalho único do formato de cabeçalho B3. Para obter mais detalhes, consulte https://github.com/openzipkin/b3-propagation.
- Jaeger : formato do cabeçalho padrão do Jaeger. Para obter detalhes, consulte https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format.
- W3C : formato do cabeçalho do Contexto de Rastreamento do W3C. Para obter detalhes, consulte https://www.w3.org/TR/trace-context/.
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
.