Instrumentação com Bibliotecas OpenTelemetry
O envio de sinais para o Priax pode ser realizado através de instrumentação própria, alterando o código da aplicação a ser observada sem inserir componentes de terceiros à sua infraestrutura. Este processo, no entanto pode ser custoso e levar algum tempo. Para que se possa acelerar esse processo, recomendamos, apesar de não ser a única opção, as bibliotecas e SDKs open-source do OpenTelemetry. Tais bibliotecas seguem os padrões OpenTracing e se tornaram a mais difundida solução de instrumentação para o mercado de Observabilidade.
Como o OpenTelemetry facilita a instrumentação
Para tornar um sistema observável, é necessário instrumentá-lo: ou seja, o código dos componentes do sistema deve emitir traces, métricas e logs.
Com o OpenTelemetry, você pode instrumentar seu código de duas maneiras principais:
-
Soluções baseadas em código
Utilizando APIs e SDKs oficiais disponíveis para a maioria das linguagens de programação. -
Soluções sem código
Ideais para casos em que você não pode ou não deseja modificar o aplicativo que precisa de telemetria.
Soluções baseadas em código
Essas soluções permitem uma telemetria mais profunda e detalhada, gerada diretamente pela sua aplicação. Elas utilizam a API do OpenTelemetry para produzir telemetria personalizada, complementando as informações coletadas por soluções sem código.
Soluções sem código
Perfeitas para começar rapidamente ou quando o aplicativo não pode ser modificado. Essas soluções oferecem uma telemetria rica baseada em bibliotecas utilizadas ou no ambiente em que a aplicação está sendo executada. Elas fornecem dados sobre o que está acontecendo nas "bordas" da aplicação, como interações externas e dependências.
Nota: É possível usar ambas as abordagens ao mesmo tempo para maximizar a observabilidade.
Benefícios adicionais do OpenTelemetry
O OpenTelemetry vai além de oferecer soluções com e sem código. Ele também inclui os seguintes recursos:
- Bibliotecas compatíveis: Bibliotecas podem usar a API do OpenTelemetry como dependência, sem impactar aplicações que não importem o SDK.
- Sinais flexíveis: Para cada tipo de sinal (traces, métricas, logs), existem várias formas de criá-los, processá-los e exportá-los.
- Correlação de sinais: Com a propagação de contexto integrada, é possível correlacionar sinais, independentemente de onde foram gerados.
- Recursos e Escopos de Instrumentação: Permitem agrupar sinais por diferentes entidades, como o host, sistema operacional ou cluster Kubernetes.
- Padrões e especificações: Cada implementação de linguagem do OpenTelemetry segue os requisitos e expectativas definidos pela especificação oficial.
- Convenções semânticas: Fornecem um esquema de nomenclatura comum para padronizar métricas, logs e traces entre diferentes bases de código e plataformas.
Formas de Instrumentação
Instrumentação sem código
A instrumentação sem código adiciona as capacidades da API e SDK do OpenTelemetry à sua aplicação, geralmente por meio de uma instalação de agente ou algo semelhante a um agente. Os mecanismos específicos variam conforme a linguagem, incluindo manipulação de bytecode, monkey patching ou eBPF, para injetar chamadas à API e ao SDK do OpenTelemetry diretamente na aplicação.
Como funciona
Normalmente, a instrumentação sem código adiciona suporte para bibliotecas que sua aplicação utiliza. Isso significa que requisições e respostas, chamadas a bancos de dados, chamadas de filas de mensagens, entre outros, serão instrumentados automaticamente. No entanto, o código da sua aplicação geralmente não é instrumentado. Para isso, é necessário utilizar instrumentação baseada em código.
Além disso, a instrumentação sem código permite configurar as bibliotecas de instrumentação e os exportadores que serão carregados.
Configuração
Você pode configurar a instrumentação sem código por meio de variáveis de ambiente e outros mecanismos específicos da linguagem, como propriedades do sistema ou argumentos passados para métodos de inicialização. Para começar, é necessário apenas configurar o nome do serviço para identificá-lo no backend de observabilidade escolhido.
Outras opções de configuração incluem:
- Configuração específica para fontes de dados.
- Configuração de exportadores.
- Configuração de propagadores.
- Configuração de recursos.
Suporte de linguagens para instrumentação automática
A instrumentação automática está disponível para as seguintes linguagens:
- .NET
- Go
- Java
- JavaScript
- PHP
- Python
Para realizar a instrumentação de sua aplicação, utilizando o método Zero Code, siga as instruções da página do OpenTelemetry.
Instrumentação Baseada em Código
A instrumentação baseada em código permite criar telemetria personalizada diretamente no código da sua aplicação. Abaixo estão os passos essenciais para configurar essa abordagem:
1. Importar a API e o SDK do OpenTelemetry
- Serviços: Dependem da API e do SDK do OpenTelemetry.
- Bibliotecas: Apenas dependem da API.
Para mais detalhes sobre a API e o SDK, consulte a especificação do OpenTelemetry.
2. Configurar a API do OpenTelemetry
-
Fornecedores de Tracer e Meter:
- Crie um TracerProvider para gerar traços.
- Crie um MeterProvider para gerar métricas.
-
Nomeação:
- Use um nome que identifique o componente sendo instrumentado.
- Exemplo: para uma biblioteca, use algo como
com.example.myLibrary
. - Inclua uma versão no formato semver (ex.:
semver:1.0.0
).
3. Configurar o SDK do OpenTelemetry
- Exportação de dados: Configure o SDK para exportar telemetria a um backend de análise.
- Opções específicas da linguagem: Verifique as opções de ajuste disponíveis para a sua linguagem.
A configuração pode ser feita programaticamente, por meio de arquivos de configuração ou outros mecanismos.
4. Criar Dados de Telemetria
- Traços e Métricas:
- Gere traços e eventos de métricas com os objetos
Tracer
eMeter
.
- Gere traços e eventos de métricas com os objetos
- Bibliotecas de Instrumentação:
- Use bibliotecas de instrumentação disponíveis para suas dependências.
- Consulte o repositório ou registro da sua linguagem para obter mais informações.
5. Exportar Dados de Telemetria
- Métodos de Exportação:
-
Exportação no processo:
- Importe e use exportadores para traduzir os objetos de telemetria do OpenTelemetry em formatos apropriados para ferramentas de análise (ex.: Jaeger ou Prometheus).
-
Exportação via OTLP e Collector:
- Use o protocolo OTLP para enviar dados ao OpenTelemetry Collector, que pode atuar como um proxy, sidecar ou processo separado.
- O Collector encaminha os dados para ferramentas de análise.
-
Para realizar a instrumentação de sua aplicação, utilizando o método baseado em código siga as instruções da página do OpenTelemetry.
Instrumentação de Bibliotecas
A instrumentação nativa de bibliotecas com OpenTelemetry oferece uma experiência aprimorada tanto para desenvolvedores quanto para usuários finais, eliminando a necessidade de expor e documentar hooks personalizados. Aqui está como funciona e os benefícios associados:
Como Adicionar Instrumentação Nativa
- Instrumentação via Hooks ou dynamic runtime patching:
OpenTelemetry fornece bibliotecas de instrumentação para várias linguagens, que tipicamente utilizam hooks de bibliotecas ou dynamic runtime patching do código.
Vantagens da Instrumentação Nativa
-
Melhoria na Observabilidade e Experiência do Usuário:
- Remove a necessidade de hooks personalizados, facilitando a integração.
- APIs do OpenTelemetry são fáceis de usar e consistentes para os usuários finais.
-
Telemetria Consistente e Correlação Aprimorada:
- Traços, logs e métricas provenientes do código da biblioteca e da aplicação são correlacionados, criando uma visão coesa dos eventos.
- Convenções comuns garantem uniformidade entre tecnologias, bibliotecas e linguagens.
-
Extensibilidade e Ajustes Fáceis:
- Sinais de telemetria podem ser ajustados (filtrados, processados, agregados) para atender a diferentes cenários de consumo.
- OpenTelemetry oferece extensibilidade bem documentada para personalização.
Para realizar a instrumentação de sua aplicação, utilizando as bibliotecas nativas OpenTelemetry, siga as instruções da página do OpenTelemetry.
Instrumentação com Kubernetes Operator
A instrumentação de aplicações que rodam em workloads Kubernetes é facilitada pelo Opentelemetry Kubernetes Operator que é uma implementação de um Operador Kubernetes que gerencia coletores e a auto-instrumentação das cargas de trabalho usando bibliotecas de instrumentação do OpenTelemetry.
Introdução
O Operador OpenTelemetry é uma implementação de um Operador Kubernetes.
O operador gerencia:
- Coletor OpenTelemetry
- Auto-instrumentação das cargas de trabalho (pods) usando bibliotecas de instrumentação do OpenTelemetry
Início Rápido
Para instalar o operador em um cluster existente, certifique-se de ter o cert-manager instalado e execute:
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
Assim que a implantação do opentelemetry-operator
estiver pronta, crie uma instância do Coletor OpenTelemetry (otelcol) como o exemplo abaixo:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: simplest
spec:
config: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
exporters:
# NOTA: Antes da versão v0.86.0, use `logging` ao invés de `debug`.
debug:
service:
pipelines:
traces:
receivers: [otlp]
processors: []
exporters: [debug]
EOF
Para mais opções de configuração e para configurar a injeção de auto-instrumentação das cargas de trabalho usando as bibliotecas de instrumentação do OpenTelemetry, continue lendo aqui.
Injeção de Auto-instrumentação
Configurar Instrumentação Automática
Para gerenciar a instrumentação automática, o operador precisa ser configurado para identificar quais pods instrumentar e qual instrumentação automática usar nesses pods. Isso é feito por meio do CRD de Instrumentação.
A criação correta do recurso de Instrumentação é fundamental para que a instrumentação automática funcione. Certifique-se de que todos os endpoints e variáveis de ambiente estejam configurados corretamente.
.NET
O seguinte comando criará um recurso básico de Instrumentação configurado especificamente para serviços .NET:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
exporter:
endpoint: http://demo-collector:4318
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"
EOF
Por padrão, o recurso de Instrumentação para serviços .NET usa OTLP com o protocolo HTTP/Protobuf. O endpoint configurado deve ser capaz de receber OTLP via HTTP/Protobuf, como no exemplo: http://demo-collector:4318
.
Excluindo bibliotecas de instrumentação
Se você não quiser usar determinadas bibliotecas, configure as variáveis de ambiente OTEL_DOTNET_AUTO_[SIGNAL]_[NAME]_INSTRUMENTATION_ENABLED=false
.
Exemplo:
dotnet:
env:
- name: OTEL_DOTNET_AUTO_TRACES_GRPCNETCLIENT_INSTRUMENTATION_ENABLED
value: false
- name: OTEL_DOTNET_AUTO_METRICS_PROCESS_INSTRUMENTATION_ENABLED
value: false
Java
O seguinte comando criará um recurso básico de Instrumentação para serviços Java:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
exporter:
endpoint: http://demo-collector:4318
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"
EOF
Por padrão, a instrumentação Java usa OTLP com HTTP/Protobuf.
Excluindo bibliotecas de instrumentação
Para desativar bibliotecas específicas:
- Use
OTEL_INSTRUMENTATION_[NAME]_ENABLED=false
. - Para desativar todas por padrão e ativar somente algumas:
OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=false
OTEL_INSTRUMENTATION_[NAME]_ENABLED=true
Configurar Instrumentação Automática
Para gerenciar a instrumentação automática, o operador precisa ser configurado para identificar quais pods instrumentar e qual instrumentação automática usar nesses pods. Isso é feito por meio do CRD de Instrumentação.
A criação correta do recurso de Instrumentação é fundamental para que a instrumentação automática funcione. Certifique-se de que todos os endpoints e variáveis de ambiente estejam configurados corretamente.
.NET
O seguinte comando criará um recurso básico de Instrumentação configurado especificamente para serviços .NET:
Por padrão, o recurso de Instrumentação para serviços .NET usa OTLP com o protocolo HTTP/Protobuf. O endpoint configurado deve ser capaz de receber OTLP via HTTP/Protobuf, como no exemplo: http://demo-collector:4318
.
Excluindo bibliotecas de instrumentação
Se você não quiser usar determinadas bibliotecas, configure as variáveis de ambiente OTEL_DOTNET_AUTO_[SIGNAL]_[NAME]_INSTRUMENTATION_ENABLED=false
.
Exemplo:
Java
O seguinte comando criará um recurso básico de Instrumentação para serviços Java:
Por padrão, a instrumentação Java usa OTLP com HTTP/Protobuf.
Excluindo bibliotecas de instrumentação
Para desativar bibliotecas específicas:
Node.js
O seguinte comando criará um recurso básico de Instrumentação para serviços Node.js:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
exporter:
endpoint: http://demo-collector:4317
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"
EOF
Por padrão, a instrumentação Node.js usa OTLP com gRPC.
Gerenciar bibliotecas de instrumentação
- Para ativar bibliotecas específicas:
nodejs:
env:
- name: OTEL_NODE_ENABLED_INSTRUMENTATIONS
value: http,nestjs-core
- Para desativar específicas:
nodejs:
env:
- name: OTEL_NODE_DISABLED_INSTRUMENTATIONS
value: fs,grpc
Python
O seguinte comando criará um recurso básico de Instrumentação para serviços Python:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: python-instrumentation
spec:
exporter:
endpoint: http://demo-collector:4318
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"
EOF
Por padrão, Python usa OTLP com HTTP/Protobuf.
Logs em Python
Para ativar a instrumentação automática de logs:
python:
env:
- name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
value: 'true'
Excluindo bibliotecas de instrumentação
Defina OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
com os pacotes a serem excluídos.
Go
Para serviços Go, crie o recurso básico de Instrumentação:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: demo-instrumentation
spec:
exporter:
endpoint: http://demo-collector:4318
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "1"
EOF
A instrumentação Go usa um agente eBPF em um sidecar, que requer permissões elevadas.
Adicione anotações para ativar a instrumentação automática:
instrumentation.opentelemetry.io/inject-go: 'true'
instrumentation.opentelemetry.io/otel-go-auto-target-exe: '/path/to/executable'
Habilitar Instrumentação Automática
Adicione anotações ao seu deployment para ativar a instrumentação automática:
- .NET:
instrumentation.opentelemetry.io/inject-dotnet: "true"
- Java:
instrumentation.opentelemetry.io/inject-java: "true"
- Node.js:
instrumentation.opentelemetry.io/inject-nodejs: "true"
- Python:
instrumentation.opentelemetry.io/inject-python: "true"
- Go:
instrumentation.opentelemetry.io/inject-go: "true"