Observabilidade para SaaS: logs, métricas e tracing distribuído na prática
Em um SaaS em produção, a pergunta que realmente importa quando algo dá errado não é "o sistema está no ar?", e sim "por que aquele cliente específico está vendo lentidão agora?". Responder a isso rápido é a diferença entre um incidente de cinco minutos e um de cinco horas. É exatamente esse o trabalho da observabilidade.
Este guia explica os três pilares da observabilidade, como o OpenTelemetry os unifica, o papel de SLOs e SLIs e os erros mais comuns que tornam um sistema difícil de operar. O foco é prático: o que instrumentar, por quê e como evitar afogar o time em dados inúteis.
O que é observabilidade (e como difere de monitoramento)
Monitoramento e observabilidade são parentes, mas não sinônimos. Monitoramento responde a perguntas que você já sabia fazer: a CPU passou de 80%? O número de erros subiu? Você define os alertas com antecedência, para problemas que já antecipou.
Observabilidade é a capacidade de fazer perguntas que você não tinha previsto, a partir dos dados que o sistema emite. Quando um comportamento novo e inesperado aparece, um sistema observável permite investigar e chegar à causa sem precisar adicionar código e esperar o problema acontecer de novo.
A distinção importa porque sistemas distribuídos modernos falham de formas que ninguém previu. Microsserviços, filas, caches e integrações de terceiros criam combinações de estado impossíveis de antecipar uma a uma. Observabilidade é projetar o sistema para que ele conte, por conta própria, o que está acontecendo por dentro.
Os três pilares da observabilidade
A observabilidade se apoia em três tipos de sinal, complementares entre si. Nenhum deles, sozinho, conta a história completa.
Logs
Logs são registros de eventos discretos, com carimbo de tempo, descrevendo algo que aconteceu. São o sinal mais antigo e mais detalhado: "usuário X tentou pagar e recebeu erro Y às 14h03". O cuidado central é usar logs estruturados (em JSON, por exemplo), e não texto livre. Um log estruturado é pesquisável e agregável; um log em texto solto é apenas ruído difícil de consultar.
{
"timestamp": "2026-06-11T14:03:21Z",
"level": "error",
"service": "billing",
"tenant_id": "8f3b-e21",
"trace_id": "a1b2c3d4",
"message": "falha ao processar pagamento",
"provider": "stripe",
"status_code": 402
}
Repare nos campos tenant_id e trace_id: são eles que transformam um log isolado em algo correlacionável com o resto do sistema.
Métricas
Métricas são valores numéricos agregados ao longo do tempo: requisições por segundo, latência no percentil 95, taxa de erro, uso de memória. São baratas de armazenar e ótimas para dashboards e alertas, porque resumem o comportamento do sistema em séries temporais. A limitação é que métricas dizem o que está acontecendo (a latência subiu), mas raramente por quê. Elas apontam o sintoma; o diagnóstico vem dos outros pilares.
Traces (rastreamento distribuído)
Um trace acompanha uma única requisição enquanto ela atravessa vários serviços, registrando quanto tempo cada etapa levou. Em uma arquitetura distribuída, é o trace que responde "onde foram os 800ms?": no serviço de autenticação, na consulta ao banco ou na chamada a uma API externa. Cada etapa é um span, e o conjunto de spans forma a árvore que conta a jornada completa da requisição.
Os três pilares se reforçam: a métrica acende o alerta, o trace mostra qual etapa está lenta, e o log explica o motivo exato naquela etapa.
OpenTelemetry: o padrão que unifica os pilares
Historicamente, cada pilar exigia uma ferramenta e um formato diferente, e trocar de fornecedor significava reinstrumentar tudo. O OpenTelemetry (OTel) resolveu isso: é um padrão aberto e neutro que define como gerar e exportar logs, métricas e traces de forma unificada.
A vantagem prática é o desacoplamento. Você instrumenta a aplicação uma vez, com a API do OpenTelemetry, e decide depois para onde mandar os dados (um backend open source, um serviço gerenciado, ou vários ao mesmo tempo), sem mexer no código.
// Instrumentação básica com OpenTelemetry em Node.js
const { NodeSDK } = require("@opentelemetry/sdk-node");
const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node");
const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-http");
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({ url: "http://collector:4318/v1/traces" }),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start(); // a partir daqui, requisições HTTP e queries são rastreadas
A instrumentação automática já cobre boa parte das bibliotecas comuns (HTTP, banco de dados, filas). Spans manuais entram apenas onde a lógica de negócio precisa de visibilidade extra.
Tabela comparativa dos pilares
| Pilar | Responde | Custo de armazenamento | Melhor para |
|---|---|---|---|
| Logs | O que aconteceu em detalhe | Alto (volume grande) | Investigação profunda de um evento |
| Métricas | O que está acontecendo, agregado | Baixo | Dashboards e alertas |
| Traces | Onde o tempo foi gasto na requisição | Médio | Diagnóstico em sistemas distribuídos |
Nenhum pilar substitui o outro. Uma estratégia madura usa métricas para detectar, traces para localizar e logs para explicar.
SLOs, SLIs e orçamento de erro
Coletar sinais é meio caminho. O outro meio é definir o que significa "estar saudável", e isso se faz com três conceitos:
- SLI (Service Level Indicator): a métrica concreta que mede a experiência, por exemplo, o percentual de requisições com latência abaixo de 300ms.
- SLO (Service Level Objective): a meta para esse indicador, por exemplo, 99,9% das requisições dentro do limite no mês.
- Orçamento de erro (error budget): o complemento do SLO. Se a meta é 99,9%, sobra 0,1% de falhas "permitidas". Esse orçamento vira uma ferramenta de decisão: enquanto há saldo, o time investe em features; quando o orçamento estoura, a prioridade passa a ser confiabilidade.
O orçamento de erro é o que transforma observabilidade em decisão de negócio, em vez de um amontoado de gráficos bonitos. Ele dá ao time uma régua objetiva para equilibrar velocidade de entrega e estabilidade.
Observabilidade por tenant: o detalhe que mais ajuda
Em um SaaS multi-tenant, "o sistema está lento" é uma frase quase inútil. O que o time precisa saber é para qual cliente está lento. Por isso, carregue o tenant_id em todo log, métrica e trace. Sem essa dimensão, diagnosticar um incidente que afeta um único cliente vira adivinhação, e o mesmo dado ainda alimenta análise de uso e de churn.
Boas práticas e erros comuns
Algumas lições que separam uma operação tranquila de um plantão caótico:
- Instrumente desde o dia 1. Adicionar observabilidade durante um incidente é tarde demais.
- Use logs estruturados sempre. Texto livre não escala e não se correlaciona.
- Correlacione os pilares com IDs.
trace_idno log conecta o evento à requisição inteira. - Alerte sobre sintomas, não sobre causas. Alerte quando o cliente sente dor (latência, erro), não a cada flutuação interna de CPU.
- Evite o excesso de ruído. Alerta que dispara o tempo todo é alerta que ninguém lê. Cada alerta deve exigir uma ação.
- Controle o custo. Logs e traces de alto volume custam caro; use amostragem inteligente para manter sinal sem explodir a conta.
O erro mais comum não é coletar de menos, e sim coletar de tudo sem critério, criando um mar de dados onde a informação relevante se afoga. Observabilidade boa é sobre fazer as perguntas certas rápido, não sobre guardar o máximo de bytes.
Opere seu SaaS com confiança, não com adivinhação
Construir um SaaS que escala exige enxergar dentro dele em produção: saber, em segundos, qual cliente está sofrendo, onde o tempo foi gasto e por quê. Observabilidade bem feita transforma incidentes em diagnósticos rápidos e decisões orientadas a dados. Se você quer um produto instrumentado para crescer com SLA real e plantão tranquilo, fale com a nossa engenharia e saia da conversa com um diagnóstico técnico da sua operação.