Observabilidade com OpenTelemetry e Prometheus: Guia Completo

Observabilidade com OpenTelemetry e Prometheus: Guia Completo

“`html





Observabilidade com OpenTelemetry e Prometheus


Observabilidade • Métricas • Traces • Logs

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.

yurideveloper.com.br • Observabilidade que ajuda a decidir rápido, com menos ruído.



“`