
O que é observabilidade — e como aprendi a diferença de monitoramento
Em 2021 a diferença entre monitoramento e observabilidade ficou clara num incidente de produção. Monitoramento te diz que algo está errado. Observabilidade te diz por quê.
Incidente de produção às 14h uma terça-feira.
Alerta de CloudWatch disparou: latência de API acima de 3 segundos. Página de status: tudo verde. Erros: zero. CPU: 30%. Memória: 60%.
Sistema "saudável" pelos dashboards. Mas lento.
Passei uma hora olhando para gráficos que não me diziam nada. O sistema estava operacional — simplesmente devagar. Por quê?
Monitoramento te diz que algo está fora do normal. Observabilidade te diz por que.
A diferença prática:
Monitoramento = alertas em métricas predefinidas. CPU > 80%. Erro rate > 1%. Latência > 2s. Você define o que medir antes do incidente.
Observabilidade = capacidade de fazer perguntas que você não sabia que ia precisar fazer. "Por que a requisição para /api/leads/sync está demorando 4x mais do que as outras?" Essa pergunta não estava no dashboard.
O que eu não tinha em 2021: tracing distribuído (uma requisição passava por 3 serviços — eu tinha latência total, mas não sabia qual serviço estava lento), logs estruturados (meus logs eram strings — "Processing request for user 123" — impossível filtrar por user_id, agregar, correlacionar), e correlação (métrica mostrava latência alta, mas não conseguia ir da métrica para o log da requisição específica).
O incidente de terça foi resolvido quando um colega mostrou como ler as traces no X-Ray (serviço de tracing da AWS).
POST /api/leads/sync → 4.2s total
→ validate_payload → 0.02s
→ fetch_existing_leads → 3.8s ← aqui
→ sync_to_crm → 0.3s
A query de busca de leads existentes estava demorando 3.8 segundos. Com 30 segundos de investigação no trace, tinha a resposta que levou uma hora nos dashboards.
A query estava sem índice em um campo que virou filtro 3 sprints antes. Ninguém tinha medido o impacto até a tabela crescer o suficiente para ficar lenta.
O que implementei depois:
Logs estruturados (JSON em vez de strings):
logger.info("request processed", extra={
"user_id": user_id,
"endpoint": "/api/leads/sync",
"duration_ms": elapsed_ms,
"lead_count": len(leads)
})
Trace IDs correlacionados entre métricas e logs — toda requisição tem um ID único que aparece no log, na métrica, e no trace.
E o mais importante: alarmes não só em "está errado" mas em "está mudando de padrão". Latência que sobe gradualmente não dispara alarme de threshold absoluto — mas dispara alarme de anomalia.
Observabilidade não é sobre ter mais dashboards. É sobre ter a capacidade de responder perguntas que você não sabia que ia precisar fazer.
Sistema com boa observabilidade: você está investigando um incidente em minutos. Sistema sem: você está olhando para gráficos que não falam entre si, sem saber por onde começar.