Observabilidade desde o início
Se você só instrumenta depois do primeiro grande incidente, vai depurar no escuro. Afinal, quem quer caçar a causa raiz às 3 da manhã só com um console.log("aqui")?
32 min de leitura

Nesta página
- Introdução
- Por que o MTTR é a métrica que importa
- Monitoramento vs Observabilidade
- Os Sinais
- Logs
- Métricas
- Traces
- Eventos e profiles
- IDs de correlação e propagação de contexto
- OpenTelemetry: instrumente uma vez, envie para qualquer lugar
- O que medir: RED, USE e os Golden Signals
- RED (para serviços)
- USE (para recursos)
- Os Quatro Golden Signals (Google SRE)
- SLIs, SLOs e alertas por sintoma
- Alerte por sintoma, não por causa
- Dashboards por público
- Observabilidade para aplicações de LLM e IA
- Cardinalidade, custo e amostragem
- Cardinalidade
- Amostragem: head vs tail
- Mantendo a conta sob controle
- PII e segredos na telemetria
- Colocando em prática: observabilidade como parte do "pronto"
- 1. Instrumente junto com a funcionalidade
- 2. Padronize o básico
- 3. Defina SLOs antes do go-live
- 4. Teste sua observabilidade
- 5. Revise depois de cada incidente
- Tradeoffs
- Tradeoffs com Otimização de Custos (Cost Optimization)
- Tradeoffs com Segurança (Security)
- Tradeoffs com Eficiência de Performance (Performance Efficiency)
- Tradeoffs com Confiabilidade e Excelência Operacional
- Conclusão
- Próximos Passos
Introdução
Imagina a cena: são 3 da manhã, o celular não para de vibrar e o checkout está falhando para alguns clientes. Não todos, só alguns. Você abre os logs e encontra esta obra-prima:
aqui
aqui 2
aqui
chegou aqui!!!
undefinedPois é. É raro, mas acontece bastante... Quem nunca? O código foi escrito na correria, "depois a gente coloca log decente", e o depois chegou às 3 da manhã em forma de incidente. Agora você está reconstruindo na cabeça o que aconteceu, chutando hipóteses, subindo deploy com mais console.log e rezando para o problema aparecer de novo.
Observabilidade desde o início (Observability First) é o princípio que diz: instrumentação faz parte da funcionalidade, desde o primeiro dia. A meta é simples: quando algo der errado (e vai dar), o time precisa conseguir responder o que quebrou, onde, para quem e por quê em minutos, não em horas. Em outras palavras, manter o MTTR (Mean Time To Recovery, tempo médio de recuperação) o mais baixo possível.
Quando o time ignora esse princípio, os sintomas são sempre os mesmos:
- Incidentes descobertos pelos clientes, nas redes sociais, antes de qualquer alerta disparar;
- Logs em texto solto, impossíveis de filtrar, sem como seguir uma requisição entre serviços;
- Todo incidente vira arqueologia: "qual serviço foi? qual versão? qual cliente?";
- Dashboards cheios de gráficos bonitos que ninguém olha e que não respondem a pergunta do dia;
- Centenas de alertas por semana, a maioria ruído, então aquele que importa é ignorado;
- Uma conta de telemetria que cresce mais rápido que o tráfego, porque tudo é logado e nada é útil;
- Dados de clientes (e-mails, tokens, números de cartão) em texto puro nos arquivos de log;
Calma aí, Júnior! Ter dados não é a mesma coisa que ter respostas. Um console.log("aqui") diz que o código passou por uma linha; não diz qual usuário, qual requisição, qual versão, quanto tempo levou nem o que aconteceu nos outros três serviços envolvidos. E CPU em 40% não diz nada sobre os clientes estarem conseguindo pagar ou não. Observabilidade é conseguir fazer perguntas novas ao sistema sem precisar subir código novo para respondê-las.
Observabilidade não é uma ferramenta que você compra depois do go-live. É uma propriedade de design do sistema, assim como segurança ou testabilidade. Se não for planejada desde o início, vai ter que ser remendada depois, sob pressão, normalmente no meio de um incidente.
Por que o MTTR é a métrica que importa
Todo incidente tem uma linha do tempo. Algo quebra, alguém (ou alguma coisa) percebe, alguém assume, o time entende o que está acontecendo e, finalmente, o serviço volta. Cada um desses trechos tem nome, e cada um pode ser encurtado, ou esticado, pela qualidade da instrumentação do sistema.
- MTTD (Mean Time To Detect): quanto tempo entre o início da falha e alguém ficar sabendo. Sem bons alertas, isso é medido em "quanto tempo até um cliente reclamar".
- MTTA (Mean Time To Acknowledge): quanto tempo até alguém assumir o problema. Depende muito do processo de plantão e da qualidade dos alertas.
- Diagnóstico: o trecho que ninguém nomeia, mas todo mundo sofre. É aqui que o time do
console.log("aqui")perde horas. - MTTR (Mean Time To Recovery/Restore): a viagem inteira, da falha ao serviço restabelecido. A definição varia entre empresas (algumas começam a contar na detecção), então combinem uma e sigam com ela.
Repare numa coisa: a correção costuma ser a parte curta. Fazer rollback de um deploy ou desligar uma feature flag leva minutos. O que consome a madrugada é não saber. E é exatamente essa parte que a observabilidade ataca.
A escala de plantão, os runbooks, os postmortems e toda a cultura em torno de incidentes pertencem à Excelência Operacional. Aqui o foco é a base técnica que faz essas práticas funcionarem: os sinais que o seu sistema emite.
Monitoramento vs Observabilidade
As duas palavras são usadas como sinônimos, mas respondem perguntas diferentes.
Monitoramento lida com os problemas conhecidos (known unknowns): você já sabe o que pode dar errado, então fica de olho. "Me avisa se o disco passar de 90%", "me avisa se a taxa de erro passar de 2%". É essencial, mas só cobre as falhas que você imaginou antes.
Observabilidade lida com os problemas desconhecidos (unknown unknowns): as falhas que ninguém previu. "Por que só os clientes do Nordeste, no app Android, usando um cupom específico, estão tomando timeout desde o deploy de terça?" Nenhum dashboard foi construído para essa pergunta. Um sistema observável permite fatiar a telemetria por qualquer dimensão (região, versão do app, cupom, cliente, feature flag) e achar a resposta explorando, não subindo deploy.
| Aspecto | Monitoramento | Observabilidade |
|---|---|---|
| Tipo de pergunta | Conhecida de antemão | Descoberta durante a investigação |
| Artefato típico | Dashboards e alertas por limiar | Telemetria rica em contexto e consultável |
| Responde | "Está quebrado?" | "Por que está quebrado, e para quem?" |
| Depende de | Escolher as métricas certas | Contexto rico em cada evento (IDs, versões, atributos) |
Monitoramento é um subconjunto de observabilidade, não um concorrente. Você continua precisando dos seus alertas; só precisa que eles sejam o ponto de partida de uma investigação, não o fim dela.
Os Sinais
A telemetria vem em alguns sabores. Cada um é bom em uma coisa e ruim em outra, e a mágica acontece quando eles estão conectados.
Logs
Eventos discretos com contexto: "o pedido 123 foi recusado porque o cartão foi negado". Ótimos para detalhe, caros em volume. A regra de ouro é o log estruturado (structured logging): emita JSON (ou outro formato chave/valor), não texto livre. Compare:
Pagamento falhou para o usuário [email protected], valor 150.00{
"timestamp": "2026-09-26T03:12:45.123Z",
"level": "error",
"service": "checkout",
"version": "2.14.1",
"event": "payment.declined",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"user_id": "u_81723",
"order_id": "ord_5521",
"amount_cents": 15000,
"provider": "acme-pay",
"reason": "insufficient_funds",
"duration_ms": 842
}O segundo pode ser filtrado, agregado e cruzado com outros sinais. E também não tem e-mail nenhum (já já falamos disso). Repare no trace_id: é ele o fio que amarra tudo.
Métricas
Números agregados ao longo do tempo: requisições por segundo, taxa de erro, latência p99, tamanho de fila. Baratas para armazenar, rápidas de consultar, perfeitas para alertas e tendências. O ponto fraco: perdem o detalhe individual. A métrica diz "a latência p99 subiu"; não diz qual requisição nem por quê.
Traces
Um trace acompanha uma requisição por todos os serviços que ela toca. Cada salto é um span, com horário de início, duração, atributos e status. Traces respondem "para onde foi o tempo?" e "qual dependência falhou?", perguntas quase impossíveis de responder só com logs em um sistema distribuído.
Eventos e profiles
Dois sinais que completam o quadro:
- Eventos: registros estruturados de coisas relevantes (um deploy, a mudança de uma feature flag, uma alteração de configuração). Sobrepor marcadores de deploy nos gráficos responde sozinho metade das perguntas de um incidente: "começou logo depois do release?"
- Profiling contínuo: amostras de para onde estão indo CPU e memória, até o nível de função. Quando o trace diz "esse span levou 2 segundos no nosso próprio código", o profile diz qual função queimou esse tempo.
O valor real não está em um sinal isolado. Está no salto: o alerta dispara em uma métrica, um exemplar leva você a um trace lento, o trace mostra o span que falhou, e o trace_id desse span leva direto aos logs daquela requisição exata. Sem correlação, cada sinal é uma ilha.
IDs de correlação e propagação de contexto
Em um monólito, uma requisição vive em um processo e em um arquivo de log. Em um sistema distribuído, um único clique pode passar por um API gateway, três microsserviços, uma fila, um worker e dois bancos de dados. Se cada um loga por conta própria, você fica com seis pilhas de linhas sem relação nenhuma.
A solução é a propagação de contexto (context propagation): um ID é criado na borda e viaja com a requisição por todos os saltos, seja em cabeçalhos HTTP, metadados de mensagens, metadados gRPC, qualquer que seja o transporte. O padrão da indústria é o W3C Trace Context, que define o cabeçalho traceparent:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01São quatro campos separados por hífen: a versão (00), o trace ID que identifica a requisição inteira, o ID do span pai de quem chamou e as flags (01 significa "amostrado").
Existe também o cabeçalho tracestate, para dados específicos de fornecedor, e o Baggage, para o contexto de negócio que você quer carregar junto (cliente, plano, região). Use baggage com moderação: tudo que está nele viaja em todas as chamadas e pode vazar para terceiros se você não tomar cuidado.
Algumas regras práticas:
- Gere o ID na borda. API gateway, load balancer ou o primeiro serviço que recebe a requisição.
- Propague através das fronteiras assíncronas. Filas e barramentos de eventos são onde o contexto costuma morrer. Coloque o
traceparentnos cabeçalhos da mensagem e restaure-o no consumidor. - Registre o trace ID em toda linha de log. A maioria das bibliotecas de log consegue injetá-lo automaticamente a partir do contexto ativo.
- Devolva o ID para o cliente. Um
X-Request-Id(ou o próprio trace ID) na resposta permite que o suporte pergunte "qual é o código que aparece na tela de erro?" e vá direto para o trace.
Cuidado com as fronteiras com terceiros. Aceitar um traceparent vindo da internet pública é ok para correlação, mas não deixe chamadores externos forçarem decisões de amostragem nem injetarem baggage em que seus serviços confiem cegamente.
OpenTelemetry: instrumente uma vez, envie para qualquer lugar
Durante anos, instrumentar significava instalar o agente de um fornecedor, usar o SDK desse fornecedor e ficar preso a ele para sempre. Trocar de ferramenta era reinstrumentar a base de código inteira. O OpenTelemetry (OTel), projeto da CNCF, resolveu isso padronizando a cadeia toda:
- API e SDKs para as principais linguagens, para criar spans, métricas e logs;
- Autoinstrumentação para frameworks e bibliotecas populares (servidores HTTP, drivers de banco, clientes de mensageria), então você ganha traces úteis quase sem escrever código;
- OTLP, o protocolo de transporte que todo backend sério já aceita;
- Convenções semânticas (semantic conventions), para que um status HTTP tenha o mesmo nome em qualquer linguagem e qualquer ferramenta;
- O Collector, um processo independente que recebe, processa e exporta a telemetria.
Começar em Node.js leva poucas linhas, e a autoinstrumentação cobre HTTP, Express, drivers de banco e muito mais:
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
const sdk = new NodeSDK({
serviceName: "checkout",
traceExporter: new OTLPTraceExporter({ url: "http://otel-collector:4318/v1/traces" }),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();A autoinstrumentação entrega o esqueleto. A carne vem dos atributos de negócio que você mesmo adiciona: order.id, payment.provider, tenant.id, feature_flag.new_checkout. São exatamente essas as dimensões que você vai querer fatiar às 3 da manhã.
const span = trace.getActiveSpan();
span?.setAttributes({
"order.id": order.id,
"payment.provider": provider,
"cart.items": cart.items.length,
});Dá, Júnior, e num sistema pequeno pode até funcionar no começo. Mas pensa no que acontece ano que vem, quando a renovação do contrato vier com 40% de aumento, ou quando o jurídico disser que certos dados não podem sair da região. Com SDKs de fornecedor espalhados por cinquenta serviços, trocar vira um projeto de reinstrumentação. Com OTel no código e um Collector no meio, trocar é uma mudança de configuração. O Collector também te dá um lugar só para descartar dados ruidosos, mascarar PII, amostrar traces e rotear sinais para backends diferentes (armazenamento barato para logs de debug, ferramenta premium para traces). Isso é arquitetura: manter opções abertas onde o custo de mudar é alto.
O que medir: RED, USE e os Golden Signals
"Instrumentar tudo" não é estratégia. Você precisa de uma lista curta de métricas que diga, de relance, se as coisas estão saudáveis. Três frameworks conhecidos cobrem a maioria dos casos.
RED (para serviços)
Para todo serviço orientado a requisições (APIs, microsserviços, endpoints):
- Rate (taxa): requisições por segundo;
- Errors (erros): requisições com falha por segundo (ou em percentual);
- Duration (duração): distribuição de latência (p50, p95, p99, nunca só a média).
USE (para recursos)
Proposto por Brendan Gregg, para todo recurso (CPU, memória, discos, pools de conexão, filas):
- Utilization (utilização): o quanto o recurso está ocupado;
- Saturation (saturação): quanto trabalho está esperando (tamanho de fila, conexões pendentes);
- Errors (erros): eventos de erro naquele recurso.
Os Quatro Golden Signals (Google SRE)
Do livro de SRE do Google: latência, tráfego, erros e saturação. Basicamente RED mais saturação, com uma nuance importante sobre latência: meça a latência das requisições bem-sucedidas e das que falharam separadamente, porque um erro rápido continua sendo erro e pode deixar suas médias lindas enquanto os clientes sofrem.
| Framework | Melhor para | Pergunta-chave |
|---|---|---|
| RED | Serviços e endpoints | "Meus usuários estão sendo bem atendidos?" |
| USE | Recursos de infraestrutura | "Tem alguma coisa ficando sem capacidade?" |
| Golden Signals | Qualquer sistema voltado ao usuário | "O serviço está saudável, do ponto de vista de quem usa?" |
Use percentis, não médias. Uma latência média de 200ms pode esconder que 1% das requisições leva 8 segundos. E esse 1% muitas vezes são os seus maiores clientes, os de carrinho mais cheio ou com mais dados.
SLIs, SLOs e alertas por sintoma
As métricas ficam realmente úteis quando estão ligadas ao que o usuário vive. É aí que entram os SLIs e SLOs.
- SLI (Service Level Indicator): uma medida da experiência do usuário, normalmente uma razão entre eventos bons e eventos totais. Exemplo: "percentual de requisições de checkout que dão certo em menos de 1 segundo".
- SLO (Service Level Objective): a meta para esse SLI em uma janela de tempo. Exemplo: "99,5% em 30 dias".
- Error budget (orçamento de erro): o que sobra. Com 99,5%, você pode "gastar" 0,5% das requisições com falhas. Orçamento saudável? Entregue mais rápido. Orçamento queimando? Desacelere e invista em confiabilidade. (A relação com SLAs e o desenho de disponibilidade ficam em Confiabilidade.)
Alerte por sintoma, não por causa
Essa é a regra de alertas mais importante, e a mais ignorada. Alertas por causa ("CPU acima de 80%", "pod reiniciou", "disco em 85%") disparam o tempo todo sem nenhum impacto no usuário e, mesmo assim, deixam passar as falhas que você não imaginou. Alertas por sintoma ("taxa de erro do checkout acima do SLO", "latência p99 queimando o error budget") disparam quando o usuário está de fato sofrendo, seja qual for a causa.
O SRE Workbook recomenda alertas por taxa de consumo (burn rate): acione alguém quando o error budget estiver sendo consumido rápido o bastante para acabar logo (por exemplo, 2% do orçamento mensal em uma hora) e abra um chamado para consumos lentos. Isso pega tanto as quedas repentinas quanto as degradações lentas, com muito menos ruído que limiares fixos.
Todo acionamento deveria passar por um teste simples:
- É urgente? Se pode esperar até de manhã, é chamado, não acionamento.
- É acionável? Se quem está de plantão não pode fazer nada, não deveria ser acordado.
- Reflete impacto no usuário? Se o usuário não sente, questione por que está acionando alguém.
- Tem link para runbook e dashboard? Alerta sem contexto só dá início a uma caça ao tesouro.
Essa é a armadilha, Júnior! O nome disso é fadiga de alertas (alert fatigue). Quando o canal recebe 300 alertas por dia, o pessoal silencia, e aquele único alerta que importava se afoga junto com o resto. É o efeito alarme de carro: quando todo carro da rua dispara o tempo todo, ninguém nem olha mais pela janela. Poucos alertas, cada um com significado, ganham de uma mangueira de incêndio todas as vezes. Uma meta saudável é que quase todo acionamento gere uma ação real; se a maioria é "ignora, volta sozinho", esses alertas precisam ir embora.
Dashboards por público
Um dashboard que tenta atender todo mundo não atende ninguém. Monte por público:
| Público | O que mostra | Pergunta que responde |
|---|---|---|
| Negócio / produto | Pedidos por minuto, conversão, receita em risco | "O negócio está funcionando agora?" |
| Donos do serviço | SLOs, error budget, RED por endpoint, marcadores de deploy | "Meu serviço está saudável, e o último release piorou algo?" |
| Plantão / investigação | Detalhamento por região, versão, cliente; links para traces e logs | "Onde exatamente está o problema?" |
| Plataforma / infra | USE por recurso, saturação, tendência de capacidade | "Tem algo prestes a acabar?" |
Reserve o topo de todo dashboard para os sintomas que o usuário sente, e os detalhes embaixo. Se um painel não é olhado há seis meses, apague.
Observabilidade para aplicações de LLM e IA
Funcionalidades de IA trazem a sua própria versão do "na minha máquina funciona". O mesmo prompt pode gerar respostas diferentes, a latência varia muito, o custo é por token, e as falhas muitas vezes são silenciosas: a chamada devolve 200 OK com uma resposta confiante e errada. A telemetria tradicional não basta.
O que capturar em cada chamada ao modelo:
- Tokens de entrada e saída, por requisição, por funcionalidade e por cliente. Tokens são o seu driver de custo, e um prompt que dobrou de tamanho sem ninguém perceber aparece aqui primeiro (ligue isso à Transparência de Custos);
- Latência separada: tempo até o primeiro token e tempo total de geração. Em interfaces com streaming, o tempo até o primeiro token é o que o usuário sente;
- Versão do modelo e do prompt, para comparar qualidade e custo antes e depois de uma mudança;
- Chamadas de ferramentas e etapas de recuperação como spans filhos (em fluxos de RAG ou agentes), para ver qual etapa está lenta ou falhando;
- Erros, recusas, rate limits e truncamentos (o modelo parou porque atingiu o máximo de tokens);
- Sinais de qualidade: feedback do usuário (joinha para cima ou para baixo), notas de avaliação, disparos de guardrails.
O OpenTelemetry já tem convenções semânticas de GenAI exatamente para isso (atributos para nome do modelo, uso de tokens, operação), então você não precisa inventar seu próprio esquema.
Prompts e respostas costumam conter dados pessoais, documentos confidenciais e segredos que o usuário colou ali. Não logue tudo por padrão. Amostre um percentual pequeno, remova PII antes de armazenar, restrinja quem pode ler, defina uma retenção curta e respeite o que a sua política de privacidade promete. Capturar conteúdo deve ser uma decisão explícita e revisada, não um efeito colateral de ligar o modo debug.
Cardinalidade, custo e amostragem
Chegou a parte que ninguém menciona na demo do fornecedor: telemetria custa dinheiro, às vezes muito. Não é raro ver a conta de observabilidade brigando de igual para igual com a conta de computação.
Cardinalidade
Em métricas, cada combinação única de valores de labels vira uma série temporal separada. http_requests_total{route, status} com 50 rotas e 10 status é igual a 500 séries. Adicione user_id com um milhão de usuários e você acabou de criar 500 milhões de séries, e uma fatura bem desagradável.
- Métricas: use labels com valores limitados (template da rota, classe do status, região, versão). Nunca IDs crus, URLs completas, e-mails ou texto livre.
- Traces e logs: é aqui que dado de alta cardinalidade deve morar.
user_id,order_idetenant_idcomo atributos de span são perfeitamente aceitáveis, e é exatamente isso que deixa as investigações rápidas.
Amostragem: head vs tail
Você raramente precisa de 100% dos traces de um sistema saudável que atende milhares de requisições por segundo. A amostragem (sampling) guarda um subconjunto representativo. A questão é quando você decide.
- Head sampling: decidido no início da requisição, normalmente de forma aleatória (guarda 10%), e propagado pela flag do
traceparentpara que todos os serviços concordem. Barato e simples, mas é cara ou coroa: aquele pagamento com falha de que você precisava pode estar nos 90% descartados. - Tail sampling: o Collector guarda todos os spans de um trace e decide depois que ele termina: mantém todo erro, todo trace acima de 2 segundos, toda requisição do cliente VIP, mais uma pequena amostra aleatória de base. Bem mais inteligente, mas precisa de memória, de uma camada de roteamento para que todos os spans de um trace cheguem ao mesmo Collector e de mais cuidado operacional.
Uma combinação comum e pragmática: head sampling com uma taxa generosa no SDK para limitar o overhead, tail sampling no Collector para guardar o que interessa e métricas calculadas antes da amostragem, para que os números de RED continuem precisos.
Mantendo a conta sob controle
| Abordagem | Benefício |
|---|---|
| Níveis de log por ambiente (debug desligado em produção, ajustável em tempo de execução) | Detalhe quando você precisa, sem pagar por ele todo dia. |
| Retenção por sinal (métricas por meses, traces por dias, logs de debug por horas) | Guarda cada sinal pelo tempo em que ele é realmente útil. |
| Descarte e filtro no Collector (health checks, arquivos estáticos, bibliotecas tagarelas) | Corta volume antes de chegar ao backend pago. |
| Armazenamento em camadas (quente para o recente, object storage barato para arquivo) | Compliance e perícia sem preço premium. |
| Showback do custo de telemetria por time | Os times veem quanto a sua verbosidade custa e se corrigem sozinhos. |
PII e segredos na telemetria
Logs são um dos lugares mais comuns de vazamento de dados sensíveis. Eles são copiados para vários sistemas, lidos por muita gente, guardados por meses e raramente tratados com o mesmo cuidado que o banco de produção. O OWASP Top 10 tem até uma categoria dedicada a falhas de log e monitoramento de segurança.
Faz, e muito, Júnior. Esse corpo de requisição tem senha, número de cartão, CPF, endereço. Os headers têm tokens de Authorization e cookies de sessão. Logue isso e você criou uma segunda cópia dos seus dados mais sensíveis, com controle de acesso mais fraco, em um sistema que ninguém audita. Com a LGPD, isso é um incidente esperando para acontecer, e qualquer pessoa com acesso aos logs consegue sequestrar uma sessão com um token copiado.
Regras práticas:
- Logue IDs, não identidades.
user_id: u_81723em vez de nome e e-mail. Você consegue descobrir quem é a pessoa quando realmente precisar, com o acesso adequado. - Lista de permissão, não de bloqueio. Decida quais campos entram nos logs; não despeje tudo tentando filtrar as partes ruins depois.
- Nunca logue segredos. Tokens, senhas, chaves de API, números completos de cartão, headers
AuthorizationeCookie. Mascare na configuração do logger e de novo no Collector, como segunda rede de proteção. - Classifique a telemetria como dado. Restrinja quem pode ler logs e traces crus, criptografe e defina a retenção de acordo com as suas políticas de dados.
- Teste. Adicione verificações no CI ou na revisão de código que apontem campos suspeitos em instruções de log. É exatamente o espírito do Security Shift-Left.
Mais sobre proteção de dados no sistema como um todo em Segurança.
Colocando em prática: observabilidade como parte do "pronto"
O coração deste princípio é o timing. Observabilidade adicionada depois do fato é sempre incompleta, porque quem adiciona já não é quem conhece melhor o código. Então faça dela parte da definição de pronto.
1. Instrumente junto com a funcionalidade
Meta: toda nova funcionalidade vai para produção com a telemetria necessária para operá-la.
Antes do merge, pergunte: "se isso quebrar às 3 da manhã, o que eu precisaria ver?" Adicione os atributos de negócio, os eventos de log relevantes e a métrica que diz se a funcionalidade está funcionando.
Benefício: o conhecimento do que importa é capturado por quem o tem, enquanto ainda o tem.
2. Padronize o básico
Meta: todo serviço fala a mesma língua de telemetria.
Uma biblioteca ou template compartilhado com OTel configurado, log estruturado com trace ID, atributos de recurso padrão (service.name, service.version, deployment.environment) e métricas RED prontas.
Benefício: um serviço novo já nasce observável, e quem está de plantão navega por qualquer serviço do mesmo jeito.
3. Defina SLOs antes do go-live
Meta: combinar o que é "saudável" antes de os usuários chegarem.
Escolha de um a três SLIs por jornada crítica do usuário, defina metas realistas e crie alertas de burn rate. Revise depois de algumas semanas de dados reais.
Benefício: os alertas refletem impacto no usuário desde o início, e o time ganha uma forma objetiva de equilibrar funcionalidades e confiabilidade.
4. Teste sua observabilidade
Meta: garantir que a telemetria realmente responde perguntas.
Em game days ou experimentos de caos (veja Padrões de Resiliência), quebre coisas de propósito e verifique: o alerta disparou? O dashboard mostrou? Alguém que não escreveu o código conseguiu achar a causa usando só a telemetria?
Benefício: você descobre os pontos cegos numa terça à tarde, não durante um incidente de verdade.
5. Revise depois de cada incidente
Meta: cada incidente deixa o sistema mais observável.
Em todo postmortem, inclua a pergunta: "que sinal teria permitido detectar ou diagnosticar isso mais rápido?" E adicione esse sinal.
Benefício: a observabilidade melhora exatamente onde a realidade provou que ela faltava.
Tradeoffs
A Observabilidade desde o início encurta incidentes, acelera diagnósticos e dá ao time confiança para entregar com frequência. Mas, como todo princípio, ela puxa a corda de outros pilares.
Tradeoffs com Otimização de Custos (Cost Optimization)
O volume de telemetria cresce com o tráfego, com o número de serviços e com a verbosidade. Ingestão, indexação e retenção podem virar um dos maiores itens da conta de nuvem.
Métricas de alta cardinalidade e captura total de traces multiplicam o custo de armazenamento.
O equilíbrio vem da amostragem, das políticas de retenção, do descarte de ruído no Collector e de mostrar a cada time quanto custa a sua telemetria (veja Otimização de Custos).
Tradeoffs com Segurança (Security)
A telemetria é uma cópia do que o sistema faz, e pode conter dados pessoais, segredos e informações de negócio → mais um repositório de dados para proteger.
Collectors, agentes e backends de observabilidade são componentes extras com acesso à rede e credenciais → superfície de ataque maior.
Ferramentas SaaS de terceiros significam dados saindo do seu perímetro, o que levanta questões de residência de dados e compliance.
Tradeoffs com Eficiência de Performance (Performance Efficiency)
Instrumentação tem overhead: criar spans, serializar logs e exportar dados consome CPU, memória e rede. Normalmente é pouco, mas não é zero, principalmente em caminhos críticos.
Log síncrono em disco ou rede pode adicionar latência. Prefira exportadores assíncronos e em lote, e mantenha a instrumentação fora dos laços mais apertados.
Tradeoffs com Confiabilidade e Excelência Operacional
O pipeline de observabilidade é, ele mesmo, um sistema que pode falhar. Se o Collector cair, você perde visibilidade justamente quando mais precisa. Ele deve ser desenhado e monitorado como qualquer outro componente crítico.
Mais sinais podem significar mais ruído. Sem disciplina em alertas e dashboards, a observabilidade vira fadiga de alertas e o time começa a ignorar justamente o que deveria protegê-lo.
Ferramentas, convenções e SLOs precisam de dono e de manutenção, tempo que compete com o desenvolvimento de funcionalidades.
O objetivo não é o máximo de telemetria. É a telemetria mínima que responde as perguntas que o seu time vai ter, a um custo que o negócio consegue sustentar, sem expor dados que não deveria.
Conclusão
Observabilidade desde o início é a decisão de tratar "como vamos saber o que está acontecendo?" como uma pergunta de design, respondida ao mesmo tempo que "o que essa funcionalidade deve fazer?". Ela se apoia em alguns pilares: sinais estruturados e correlacionados; contexto propagado em todos os saltos; uma base neutra de fornecedor como o OpenTelemetry; métricas que refletem a experiência do usuário; alertas por sintoma, não por causa; e uma abordagem consciente de custo e privacidade.
Quando bem feita, incidente deixa de ser arqueologia. O alerta dispara antes de o cliente perceber, o dashboard aponta o serviço certo, o trace aponta o span certo e o log conta o porquê. O MTTR cai, o plantão deixa de ser temido e o time ganha confiança para entregar com mais frequência.
E a ligação das 3 da manhã? Pode ser que ainda aconteça. Mas, desta vez, você vai ter muito mais do que um console.log("aqui") para trabalhar.
Próximos Passos
-
Escolha uma jornada crítica do usuário Checkout, login, cadastro: escolha uma, mapeie os serviços que ela toca e instrumente de ponta a ponta com OpenTelemetry e trace IDs nos logs.
-
Migre para log estruturado Adote logs em JSON com um conjunto padrão de campos (serviço, versão, ambiente, trace ID) e proíba logs em texto livre no código novo.
-
Defina seus primeiros SLOs De um a três SLIs para essa jornada, metas realistas e alertas de burn rate. No caminho, apague pelo menos um alerta ruidoso baseado em causa.
-
Coloque um Collector no meio Roteie a telemetria por um OTel Collector e use-o para descartar ruído, mascarar campos sensíveis e aplicar amostragem.
-
Audite seus logs atrás de PII e segredos Procure e-mails, tokens e números de documentos nos logs existentes. Corrija as origens e defina políticas de retenção alinhadas às suas regras de dados.
-
Faça da observabilidade parte do "pronto" Inclua "como vamos saber que está funcionando em produção?" no template de pull request e no checklist de postmortem.
Conteúdos relacionados
- PrincípioSegurança desde o inícioSegurança que só aparece no fim do projeto chega como conta a pagar. Traga para o começo e ela chega como hábito.
- PrincípioDesign evolutivoArquitetura que muda em passos pequenos e medidos, em vez de apostar tudo num plano gigante. Afinal, quem consegue prever o que o negócio vai precisar daqui a três anos?
- PrincípioPadrões de resiliênciaTudo falha uma hora ou outra, então projete seu código para dobrar em vez de quebrar. Afinal, quem quer que uma API lenta derrube o checkout inteiro junto com ela?
Comentários
Dúvidas, correções ou sua própria visão são todas bem-vindas. Entre com o GitHub para participar.