1. O que é observabilidade
Observabilidade é a capacidade de entender o que acontece dentro de um sistema olhando só o que ele emite para fora. Não é só "está no ar?" — é conseguir responder perguntas que você não previu: por que ficou lento às 14h? qual rota dá erro? qual fila encheu?
Monitoramento responde "está quebrado?". Observabilidade responde "por quê?".
2. Os pilares
- métricas números agregados ao longo do tempo (req/s, latência, CPU, tamanho de fila). Baratas, ótimas para gráficos e alertas. É aqui que entra o Prometheus.
- logs eventos textuais com contexto ("pedido 123 falhou: timeout"). Detalhados, para investigar um caso.
- traces o caminho de uma requisição atravessando vários serviços, com o tempo em cada passo (OpenTelemetry, Jaeger).
- error tracking agrupa exceções por "tipo de problema", com stack trace e frequência. Aqui usamos o GlitchTip (compatível com Sentry).
Os pilares se complementam: a métrica mostra que a taxa de erro subiu, o error tracking mostra qual exceção, o trace mostra onde no fluxo, o log dá o detalhe.
3. Métricas & Prometheus
O Prometheus é um banco de séries temporais com modelo pull: em vez de a
aplicação empurrar, o Prometheus raspa (scrape) um endpoint HTTP
/metrics de cada alvo, em intervalos regulares. O formato é texto:
# HELP http_requests_total Total de requisições HTTP
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 1027
http_requests_total{method="GET",status="500"} 3
Cada linha é uma série temporal: nome + labels + valor. Nome+labels identificam a série; a cada scrape guarda-se (timestamp, valor).
Labels são poderosos mas perigosos: cada combinação vira uma série. Nunca use alta cardinalidade (UUID, ID de usuário) como label.
4. Tipos de métrica
- counter só sobe (zera ao reiniciar). Ex.: total de mensagens. Olha-se a taxa com
rate(). - gauge sobe e desce. Ex.: backlog, conexões, memória.
- histogram distribui em faixas (buckets). Permite percentis (p95/p99) com
histogram_quantile(). - summary como o histogram, mas calcula quantis no cliente — menos flexível para agregar.
5. O que medir
Meça o que indica saúde. Dois roteiros:
- RED para serviços: Rate, Errors, Duration.
- USE para recursos: Utilization, Saturation, Errors.
Os "quatro sinais de ouro" do Google SRE: latência, tráfego, erros e saturação. Comece por esses.
6. PromQL na prática
Conceitos: instant vector (valor agora — pulsar_rate_in) e range vector (intervalo — pulsar_rate_in[5m], usado por rate()).
Consultas do dia a dia:
# taxa de requisições por segundo (counter -> rate)
rate(http_requests_total[5m])
# proporção de ERRO (0..1)
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# p95 de latência (histogram)
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
# --- com as métricas reais do Pulsar (nosso stack) ---
sum(pulsar_topics_count)
sum(rate(pulsar_in_messages_total[5m])) by (namespace)
rate() sempre sobre counters, nunca sobre gauges. Para gauges, agregue direto (sum, avg, max).
7. Expor & coletar
A aplicação expõe um /metrics; o Prometheus declara um scrape_config:
scrape_configs:
- job_name: pulsar
metrics_path: /metrics/ # a barra final importa: /metrics responde 301
static_configs:
- targets: ['pulsar-broker.pulsar.svc.cluster.local:8080']
No nosso ambiente, o Prometheus já vem configurado para raspar o broker Pulsar.
8. Alertas
Uma alerting rule é uma consulta PromQL que, verdadeira por um tempo, dispara um alerta (Alertmanager → e-mail/Slack):
- alert: TaxaDeErroAlta
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
for: 10m
annotations: { summary: "Mais de 5% de erro por 10 minutos" }
Alerte sobre sintomas que o usuário sente (erro, lentidão), não sobre causas (CPU alta).
9. Error tracking (GlitchTip)
Métricas dizem "a taxa de erro subiu"; o error tracking diz qual
erro. O GlitchTip é open-source e compatível com o Sentry:
aponta-se o SDK do Sentry para a DSN do GlitchTip e pronto. No nosso stack, o
test-mensageria reporta erros assim:
# config/packages/sentry.yaml (Symfony)
sentry:
dsn: '%env(SENTRY_DSN)%' # aponta para o GlitchTip
messenger: { enabled: true }
GlitchTip deste ambiente: https://glitchtip-pre-stage.thiagocavalcante.dev.br
10. O stack deste ambiente
Tudo o que este tutorial descreve está rodando aqui, conectado:
- Pulsar expõe
/metrics/com ~2.3k séries (pulsar_*). - Prometheus raspa o Pulsar — https://prometheus-pre-stage.thiagocavalcante.dev.br
- GlitchTip recebe os erros do app — https://glitchtip-pre-stage.thiagocavalcante.dev.br
- test-mensageria produz/consome no Pulsar e reporta erros ao GlitchTip.
Próximos passos: adicionar traces (OpenTelemetry) e um Grafana para dashboards sobre o Prometheus.