“`html
Observabilidade com OpenTelemetry e Prometheus
Eu gosto de pensar em observabilidade como um conjunto de sinais que responde perguntas do tipo:
o que está acontecendo?, onde está acontecendo? e por que está acontecendo?.
Aqui eu mostro uma abordagem prática para integrar OpenTelemetry (OTel) com Prometheus, organizando
métricas, traces e expectativas reais de operação.
1 O que você ganha ao combinar OpenTelemetry + Prometheus
OpenTelemetry padroniza como instrumentar aplicações e coletar sinais (traces, métricas e logs).
Já o Prometheus é um motor de métricas com modelo de coleta por scrape, ótimo para alertas e
painéis baseados em séries temporais.
Na prática, eu vejo esta divisão bem clara:
- Métricas: latência, taxa de erros, throughput, filas, uso de recursos.
- Traces: o “caminho” da requisição e os pontos de falha (causalidade).
- Logs (opcional): contexto do evento; quando correlacionado aos traces, acelera o debug.
Regra de ouro
Use métricas para detectar regressões e tendências, e traces
para explicar “por que” elas estão acontecendo.
Quando a instrumentação é bem feita, você consegue navegar do alerta para a causa raiz:
um spike de erro aparece no Prometheus, e o trace mostra exatamente onde a cadeia quebrou.
2 Arquitetura recomendada: coleta, exportação e ingestão
Em ambientes reais, a arquitetura mais estável costuma separar
instrumentação da aplicação do tráfego e transformações do backend.
Com OpenTelemetry, você normalmente passa por um Collector que centraliza decisões e exporta para destinos diferentes.
- Aplicação: gera sinais (traces/métricas) via SDK OTel.
- OpenTelemetry Collector: recebe, aplica processamento e exporta.
- Prometheus: coleta/recebe métricas e armazena séries temporais.
- Tracing backend (opcional, mas comum): visualiza e busca traces.
Por que o Collector?
Porque você evita acoplar cada serviço a cada destino, controla taxas e faz ajustes
(ex.: normalização de nomes, exclusão de atributos, agregações).
Um ponto operacional importante: métricas tendem a exigir consistência.
Nomes, rótulos (labels) e cardinalidade precisam estar sob controle desde o desenho.
Traces toleram mais variação, mas ainda exigem disciplina nos atributos essenciais.
3 Instrumentação com métricas: nomes, labels e cardinalidade
Métrica é “contrato”. Eu sigo um conjunto de práticas para manter o sistema saudável:
evitar explosão de labels, reduzir custo de armazenamento e manter queries simples.
Nomes
- Prefira prefixos e unidades consistentes (ex.:
http_server_request_duration_seconds). - Use convenções de semântica (contador, histograma, gauge) de forma correta.
Labels
- Use labels que “agregam” investigação:
service.name,http.method,http.status_code. - Evite labels com alta cardinalidade como IDs de usuário, tokens, URLs completas com parâmetros variáveis.
- Para rotas, prefira template (ex.:
/users/{id}) ao invés de caminho literal.
Cardinalidade e custo
Prometheus armazena séries por combinação de labels. Se você injeta um label de alta cardinalidade,
você transforma observabilidade em um problema de escala.
Eu sempre reviso: “qual consulta eu preciso fazer, e quais labels são realmente necessários para isso?”
Dica prática
Crie um “mapa de métricas” no time: quais perguntas você quer responder e quais séries correspondem a cada pergunta.
Isso evita métricas redundantes e reduz churn na instrumentação.
4 Exemplo técnico: Collector exportando métricas para Prometheus
Abaixo vai um exemplo realista de configuração do OpenTelemetry Collector para receber OTLP,
processar recursos e exportar métricas via Prometheus.
Ajuste nomes/portas de acordo com seu ambiente.
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
memory_limiter:
check_interval: 1s
limit_percentage: 75
batch: {}
# Opcional: reduza/normalize atributos (mantém consistência e controla cardinalidade).
# Exemplo simples: limite de atributos não essenciais.
attributes:
actions:
- key: service.instance.id
action: delete
- key: k8s.pod.uid
action: delete
exporters:
prometheus:
endpoint: 0.0.0.0:9464
# Quando habilitado, o Collector expõe um endpoint /metrics para o Prometheus fazer scrape.
# As métricas exportadas devem vir como MetricData do pipeline do OTel.
service:
pipelines:
metrics:
receivers: [otlp]
processors: [memory_limiter, batch, attributes]
exporters: [prometheus]
Agora, no Prometheus, você aponta para o endpoint do Collector.
A ideia é simples: o Prometheus faz scrape no endereço do Collector, e o resto do ecossistema
consome as métricas normalmente.
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 15s
static_configs:
- targets: ['collector:9464']
O que verificar depois de colocar em produção:
- Consistência dos nomes das métricas e dos labels entre serviços.
- Cardinalidade (quantas séries estão sendo criadas) antes de escalar carga.
- Latência de observabilidade: tempo entre gerar evento e aparecer no Prometheus.
- Erros do pipeline: se o Collector estiver descartando dados, você precisa entender por quê.
Pronto para aprofundar?
Agora que você já entendeu como estruturar observabilidade com OpenTelemetry e Prometheus,
vale a pena continuar evoluindo no que mais dá retorno no dia a dia: alertas com boa prática,
correlação trace↔métrica e padrões de instrumentação consistentes.
“`
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!