Apostila completa de Observabilidade & SRE
Observabilidade é conseguir responder qualquer pergunta sobre o comportamento do sistema em produção sem fazer deploy de código novo. SRE é tratar operação como um problema de engenharia — com SLOs no lugar de "está no ar?", error budgets no lugar de brigas entre dev e ops, e postmortems sem culpa no lugar de caça ao culpado. Esta apostila vai dos três pilares (logs, métricas, traces) e do OpenTelemetry aos SLOs, ao on-call sustentável e à gestão de incidentes.
Observabilidade e SRE: o que são
Objetivo: distinguir observabilidade de monitoramento, entender o que a disciplina de SRE propõe, e por que as duas coisas andam juntas.
1.1 Monitoramento × observabilidade
| Monitoramento (monitoring) | Observabilidade |
|---|---|
| Coletar sinais predefinidos e alertar quando cruzam limiares | Ter dados ricos o suficiente para responder perguntas que você não previu |
| Responde "known unknowns": "o disco vai encher?" | Responde "unknown unknowns": "por que essas requisições de esse cliente em essa região estão lentas só depois do deploy de ontem?" |
| Dashboards e alertas fixos | Exploração ad-hoc: fatiar por qualquer dimensão, do agregado ao trace individual |
Um sistema é observável se você consegue entender qualquer estado interno dele — inclusive estados novos, nunca vistos — apenas a partir dos seus outputs (telemetria), sem precisar fazer deploy de código novo para adicionar instrumentação. Monitoramento é um subconjunto: os alertas e dashboards que você já sabe que precisa. Observabilidade é a capacidade de investigar o inesperado.
1.2 O que é SRE
Site Reliability Engineering nasceu na Google (formalizado no livro de 2016) a partir de uma ideia: "o que acontece quando você pede a um engenheiro de software para projetar uma função de operações". Os princípios:
- Confiabilidade é a feature mais importante — um produto que não está no ar não tem features.
- Confiabilidade tem um alvo, não é "100%" — 100% é o alvo errado (caro, impossível, e o usuário não percebe a diferença acima de certo ponto). Define-se um SLO (Módulo 6).
- Error budget: a diferença entre 100% e o SLO é um "orçamento" de falha que o time pode gastar lançando features. Alinha dev (quer velocidade) e ops (quer estabilidade) num único número.
- Eliminar toil: trabalho manual, repetitivo, automatizável e sem valor duradouro deve ser reduzido com engenharia — meta clássica: ≤ 50% do tempo em toil.
- Postmortems sem culpa: incidentes são falhas de sistema/processo, não de pessoas; aprende-se, não se pune.
- Automação e release engineering como parte do trabalho.
1.3 SRE × DevOps × Platform
- DevOps é uma cultura/movimento (quebrar o muro entre dev e ops). SRE é uma implementação prescritiva dela, com práticas concretas (SLO, error budget, on-call estruturado). "SRE implementa DevOps."
- Platform Engineering constrói a plataforma interna (golden paths) que os times usam; SRE frequentemente contribui, e a observabilidade costuma ser um produto da plataforma (Módulo 9).
SRE e "Observability Engineer" são vagas de alta demanda e bem pagas. Perguntas de abertura: "Qual a diferença entre monitoramento e observabilidade?" (predefinido vs responder o inesperado sem redeploy), "O que é SRE e o que é um error budget?", "Por que 100% de disponibilidade é o alvo errado?". Demonstrar a mentalidade de "operação é engenharia" e de dados/SLO em vez de "está no ar?" é o que distingue.
✏️ Exercício 1 — Monitoramento ou observabilidade?
Classifique cada necessidade: (a) alertar quando a CPU passa de 85% por 10 min; (b) descobrir por que 3% das requisições de checkout começaram a dar timeout há 40 min; (c) um dashboard fixo de requisições/s por serviço; (d) investigar se a lentidão de ontem foi causada por um cliente específico fazendo queries pesadas.
Gabarito: (a) e (c) são monitoramento — sinais predefinidos, dashboards fixos. (b) e (d) exigem observabilidade — você não previu essas perguntas e precisa fatiar a telemetria por dimensões arbitrárias (endpoint, cliente, região, versão) e chegar até traces individuais, sem adicionar código novo. Um bom sistema tem os dois.
Os pilares: logs, métricas, traces
Objetivo: entender o que cada tipo de telemetria responde bem, seus custos, o conceito de cardinalidade, e por que a fronteira entre eles está se dissolvendo.
2.1 Os três (mais um)
| Sinal | O que é | Responde bem | Custo |
|---|---|---|---|
| Métricas | Números agregados ao longo do tempo (contadores, medidores, histogramas), com labels | "O sistema está saudável agora? A tendência?" Alertas, dashboards, SLOs | Barato e constante (agregado); explode com cardinalidade alta |
| Logs | Registros de eventos discretos, idealmente estruturados (JSON), com timestamp e contexto | "O que exatamente aconteceu neste evento?" Auditoria, detalhe, erros | Caro e cresce com o tráfego — costuma ser a maior linha da fatura de observabilidade |
| Traces | A árvore de spans de uma requisição atravessando serviços | "Onde o tempo foi gasto? Qual serviço na cadeia falhou?" Debugging distribuído | Médio; controlado por amostragem |
| Profiles (o "4º pilar") | Amostragem contínua de CPU/memória/alocação por linha de código | "Qual função está queimando CPU/memória em produção?" | Baixo (amostragem) |
2.2 Cardinalidade — o conceito que decide o custo
Cardinalidade = número de séries temporais distintas, dado pelas combinações únicas de labels. Uma métrica http_requests_total com labels method (5 valores), status (10), endpoint (50) = 2.500 séries. Adicione user_id (1 milhão) e você tem 2,5 bilhões de séries — o sistema de métricas colapsa.
user_id, request_id, trace_id, e-mail, URL completa com query string — em métricas, isso é "cardinality explosion" e derruba o Prometheus (ou multiplica a fatura de um vendor). Alta cardinalidade pertence a logs e traces, onde cada registro é individual. Métricas são para agregados por dimensões de baixa cardinalidade.
2.3 Structured logging
// RUIM: log de texto livre — impossível de consultar bem [2026-08-30 14:00:01] ERROR user ana@x.com failed to pay order o1 - card declined // BOM: log estruturado — filtrável, agregável, correlacionável { "ts": "2026-08-30T14:00:01Z", "level": "error", "msg": "pagamento recusado", "user_id": "u_123", "order_id": "o1", "reason": "card_declined", "service": "payments", "trace_id": "abc123", "span_id": "def456" }
Sempre inclua trace_id e span_id nos logs — é o que liga log ↔ trace ↔ métrica (correlação).
2.4 A convergência
Os três pilares como silos separados (ferramenta de log, ferramenta de métrica, ferramenta de trace) geram troca de contexto constante durante um incidente. A tendência: telemetria unificada com o mesmo contexto (labels/atributos consistentes via semantic conventions), correlacionada, e frequentemente derivando métricas e logs a partir de eventos ricos ("wide events"). O OpenTelemetry (Módulo 4) é o padrão que viabiliza isso.
Perguntas: "O que cada um dos três pilares responde melhor?", "O que é cardinalidade e por que ela importa?" (custo de métricas; IDs vão em logs/traces, não em labels), "Por que structured logging?" (consultável, agregável, correlacionável), "Como você correlaciona um log a um trace?" (trace_id no log).
✏️ Exercício 2 — Onde vai cada dado?
Para cada informação, diga se pertence a métrica (com que labels), log ou trace: (a) latência p99 do endpoint /checkout; (b) o corpo exato da requisição que causou um erro 500; (c) quanto tempo a chamada ao serviço de estoque levou dentro de uma requisição de checkout; (d) taxa de erros por versão de deploy; (e) o user_id de quem sofreu o erro.
Gabarito: (a) Métrica — histograma de latência com labels endpoint, method, status (baixa cardinalidade). (b) Log — evento individual com o payload (cuidado com PII). (c) Trace — um span "chamada estoque" filho do span de checkout. (d) Métrica — contador de erros com label version (deploys são baixa cardinalidade). (e) Log e/ou atributo de span — nunca label de métrica.
Métricas: Prometheus, RED, USE e os golden signals
Objetivo: os tipos de métrica, o modelo do Prometheus e PromQL básico, e os três métodos que dizem o que medir em qualquer sistema.
3.1 Tipos de métrica
| Tipo | O que é | Exemplo |
|---|---|---|
| Counter | Só cresce (ou zera no restart); você olha a taxa | http_requests_total, errors_total |
| Gauge | Sobe e desce; um valor instantâneo | memory_used_bytes, queue_depth, temperature |
| Histogram | Distribuição em buckets predefinidos; permite calcular percentis (aproximados) no servidor | http_request_duration_seconds |
| Summary | Percentis calculados no cliente; não agregável entre instâncias — prefira histogram | (uso decrescente) |
3.2 O modelo Prometheus
- Pull: o Prometheus raspa (scrapes) um endpoint
/metricsde cada alvo a cada X segundos. (Push existe via Pushgateway para jobs batch efêmeros, mas pull é o padrão.) - Service discovery: descobre os alvos dinamicamente (Kubernetes, Consul, arquivos).
- TSDB local + armazenamento de longo prazo (Thanos, Mimir, Cortex) para retenção e escala horizontal.
- Alertmanager recebe alertas do Prometheus e cuida de roteamento, agrupamento, silenciamento, deduplicação.
- Grafana para visualização; exporters (node_exporter, cAdvisor, blackbox) para infra que não expõe métricas nativas.
# PromQL essencial rate(http_requests_total[5m]) # req/s nos últimos 5 min sum by (endpoint) (rate(http_requests_total[5m])) # agregado por endpoint # taxa de erro (%) sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) # latência p95 a partir do histograma histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
3.3 RED, USE e os Golden Signals — o que medir
| Método | Para quê | Métricas |
|---|---|---|
| RED (Weave) | Serviços / o que atende requisições | Rate (req/s), Errors (% que falham), Duration (distribuição de latência) |
| USE (Brendan Gregg) | Recursos (CPU, disco, memória, rede, pools) | Utilization (% ocupado), Saturation (fila de trabalho pendente), Errors |
| Four Golden Signals (Google SRE) | Sistemas voltados ao usuário | Latência, Tráfego, Erros, Saturação |
Para cada serviço, tenha um painel RED (taxa, erros, latência p50/p95/p99). Para cada recurso (banco, fila, cluster), tenha USE. Alerte com base em sintomas voltados ao usuário (erros e latência do RED, ou queima de SLO — Módulo 6), não em causas de infra ("CPU a 90%" nem sempre é problema). Latência: sempre percentis (p50, p95, p99), nunca média — a média esconde a cauda que dói.
3.4 Boas práticas de métrica
- Nomes consistentes com unidade no sufixo (
_seconds,_bytes,_totalpara counters) — seguir as semantic conventions do OpenTelemetry. - Recording rules para pré-calcular queries caras e frequentes.
- Exemplars: anexar um
trace_idde exemplo a um bucket de histograma — clicar no pico de latência e pular para um trace real daquele momento. - Instrumentar na borda (middleware HTTP/gRPC) para o RED sair "de graça"; instrumentação de negócio (pedidos/min, receita/min) além do técnico.
Perguntas: "Diferença entre counter, gauge e histogram", "Como você calcula p95 de latência no Prometheus?" (histogram_quantile sobre o rate dos buckets), "O que são RED e USE e quando usar cada um?", "Por que percentis e não média para latência?", "Por que Prometheus é pull e não push?" (health check de graça, controle de scraping, sem cliente sobrecarregar o servidor).
✏️ Exercício 3 — Monte a instrumentação
Um serviço novo processa pagamentos de forma síncrona e chama uma API externa de antifraude. Que métricas RED e USE você instrumenta, e qual você usaria para alertar?
Gabarito: RED do serviço: rate de requisições de pagamento por status; errors (% de 5xx e de pagamentos recusados por erro técnico, separado de recusa de negócio); duration (histograma, p50/p95/p99). RED da dependência antifraude: rate/errors/duration das chamadas a ela (é o gargalo provável). USE: saturação da fila/pool de conexões HTTP para o antifraude; utilização de CPU e do pool de conexões do banco. Alertar: por sintoma — taxa de erro do serviço acima de X% por N min, e p99 acima do SLO; ou, melhor, por queima de error budget (Módulo 6). Não alertar em "CPU alta" isolada.
Tracing distribuído e OpenTelemetry
Objetivo: spans e propagação de contexto, o padrão OpenTelemetry (API, SDK, Collector), estratégias de amostragem, e como o trace vira ferramenta de debug.
4.1 O modelo de trace
trace (id = abc123) ── uma requisição do usuário, ponta a ponta
└─ span: GET /checkout [gateway] 0──────────────────────520ms
├─ span: auth [auth-svc] 5──25ms
├─ span: carregar carrinho [cart-svc] 30──90ms
│ └─ span: SELECT ... [postgres] 35──85ms
├─ span: antifraude [fraud-svc] 95──400ms ← o gargalo
└─ span: criar pedido [order-svc] 410──515ms
└─ span: INSERT ... [postgres] 420──510ms
- Um span = uma unidade de trabalho, com nome, tempo de início/fim, atributos (chave-valor), eventos, status, e o
span_iddo pai. - Todos os spans de uma requisição compartilham o
trace_id. - Propagação de contexto: o
trace_id+span_iddo pai viajam entre serviços num header padrão (traceparent— W3C Trace Context). Sem propagação, você tem spans soltos, não um trace.
4.2 OpenTelemetry (OTel) — o padrão
OpenTelemetry (projeto CNCF, resultado da fusão de OpenTracing + OpenCensus) é o padrão vendor-neutral para gerar telemetria (traces, métricas, logs). Componentes:
| Parte | Função |
|---|---|
| API | O que seu código chama para criar spans/métricas (estável, sem dependência de vendor) |
| SDK | A implementação: sampling, processamento em lote, exportação |
| Instrumentação automática | Bibliotecas que instrumentam frameworks conhecidos (HTTP, gRPC, SQL, Kafka) sem você escrever spans — em algumas linguagens (Java, .NET, Node, Python) via agente, sem tocar o código |
| Semantic Conventions | Nomes padronizados de atributos (http.request.method, db.system, gen_ai.request.model…) — o que torna a telemetria de times/linguagens diferentes comparável |
| OTLP | O protocolo de exportação (gRPC/HTTP) |
| Collector | Um proxy/pipeline: recebe (OTLP e outros), processa (batch, filtro, redação de PII, tail sampling, enriquecimento) e exporta para um ou vários backends. Desacopla a app do vendor |
Antes do OTel, mudar de vendor de observabilidade significava re-instrumentar tudo. Com OTel, a instrumentação é padrão e portável; você troca o destino no Collector. É por isso que praticamente todo vendor (Datadog, Grafana, Honeycomb, New Relic, Dynatrace) e todo backend open source (Jaeger, Tempo, Prometheus) fala OTLP hoje. Instrumente com OTel, não com o SDK proprietário.
4.3 Amostragem (sampling)
| Estratégia | Como | Trade-off |
|---|---|---|
| Head sampling | Decide no início do trace (ex.: "guardar 5%"), de forma consistente por trace | Simples, barato; mas pode descartar justamente o trace com erro/lentidão |
| Tail sampling | Decide depois que o trace terminou, com base no resultado (guardar 100% dos que têm erro ou p99, 1% dos normais) | Guarda o que interessa; exige buffer de todos os spans no Collector até o trace fechar (mais recursos) |
4.4 O trace como ferramenta de debug
- "Onde foi o tempo?" — o span mais longo no caminho crítico salta aos olhos.
- "Qual serviço falhou?" — o span com status de erro, com o stack/mensagem nos eventos.
- Comparar traces lentos vs rápidos do mesmo endpoint para achar a diferença (uma chamada extra, um lock, um cache miss).
- Exemplars ligam o pico de um histograma de métrica a um trace real (Módulo 3).
- Service map gerado a partir de traces: quem chama quem, com latências e taxas de erro nas arestas.
Perguntas: "O que é propagação de contexto e o que acontece sem ela?" (spans soltos, sem trace), "O que é OpenTelemetry e quais suas partes?" (API/SDK/auto-instrumentação/semantic conventions/OTLP/Collector), "Head vs tail sampling" (tail guarda erros/lentidão mas custa mais recursos), "Como você usaria um trace para investigar latência?". OTel é praticamente obrigatório em vagas de observabilidade hoje.
✏️ Exercício 4 — Desenhe a coleta
Você tem 30 microserviços em 3 linguagens, hoje cada um manda telemetria direto para um vendor caro. Quer: reduzir custo, poder trocar de vendor, redigir PII, e guardar 100% dos traces com erro. Desenhe a arquitetura de coleta.
Gabarito: (1) Instrumentar todos com OpenTelemetry (auto-instrumentação onde possível), exportando via OTLP para um OTel Collector local (sidecar ou DaemonSet) → um Collector de gateway central. (2) No gateway: processadores de batch, redação de atributos (remover/mascarar PII), tail sampling (100% dos traces com erro ou acima do p99, ~1–5% dos normais), e filtro de ruído. (3) Exportar: métricas → Prometheus/Mimir; traces → um backend próprio (Tempo/Jaeger) e/ou o vendor com volume reduzido; logs → Loki. Trocar de vendor = mudar um exportador no Collector, sem tocar as apps. Economia vem do sampling + agregação no Collector antes de sair.
Logs, custo e o OTel Collector como hub
Objetivo: tratar logs com disciplina — níveis, correlação, e sobretudo custo, a linha que mais cresce em observabilidade — e usar o Collector como ponto central de controle.
5.1 Níveis e disciplina
- ERROR: algo falhou e precisa de atenção (ou já virou métrica/alerta). WARN: anormal, mas tratado. INFO: eventos de negócio significativos (pedido criado, deploy). DEBUG: detalhe para desenvolvimento — desligado em produção, ou ligável por serviço/temporariamente.
- Um evento, um log estruturado com todo o contexto (Módulo 2), não cinco linhas de texto solto.
- Sempre
trace_idespan_idno log — a ponte para o trace. - Nunca logar segredos, tokens, PII sem necessidade e sem redação; logs vão para sistemas com acesso amplo.
- Log em stdout (o coletor recolhe); não gerencie arquivos de log na aplicação (12-factor).
5.2 O custo dos logs
Ingestão + indexação + retenção de logs, num vendor, custa por GB e escala linearmente com o tráfego. Um serviço chatty (log por requisição, stack traces, debug esquecido ligado) pode gerar terabytes por dia. Controles: (1) nível certo em produção (INFO/WARN/ERROR); (2) amostragem de logs de alto volume e baixo valor (ex.: 1 de cada 100 logs de acesso 200 OK, 100% dos erros); (3) retenção por criticidade (7 dias hot, 90 dias em storage barato, arquivo depois); (4) derivar métricas de logs em vez de guardar todos ("quantos 500 por minuto" é uma métrica, não 1M de logs); (5) redação e drop no Collector antes de sair.
5.3 Backends de log
| Opção | Nota |
|---|---|
| Grafana Loki | Indexa só labels (não o conteúdo) → barato; consulta por label + grep. Casa com Prometheus/Grafana |
| Elastic (ELK / OpenSearch) | Índice full-text poderoso; caro em armazenamento e operação |
| Vendors (Datadog, Splunk, New Relic…) | Recursos e integração; custo por GB pode escalar rápido |
| ClickHouse (via ferramentas como SigNoz) | Colunar, barato em escala, cada vez mais usado para logs+traces+métricas juntos |
5.4 O Collector como ponto de controle
# pipeline conceitual do OTel Collector receivers: [otlp, filelog, prometheus, kafka] processors: [ batch, # eficiência memory_limiter, # não estourar attributes/redact-pii, # remover email, cpf, tokens filter/drop-health-checks, # cortar ruído tail_sampling, # só traces interessantes transform/derive-metrics, # log de erro -> contador resourcedetection # enriquecer com região, cluster, versão ] exporters: [prometheusremotewrite, otlp/tempo, loki, otlp/vendor]
Ter o Collector no meio significa que políticas de custo, privacidade e roteamento vivem num lugar central, versionado como código — não espalhadas por 30 apps.
Perguntas: "Por que a fatura de logs explode e como controlar?" (nível certo, amostragem, retenção por criticidade, derivar métricas, redação/drop no Collector), "Loki vs Elastic" (indexa labels vs full-text; custo), "O que o OTel Collector faz por você?" (hub de processamento, sampling, redação, roteamento multi-backend, desacopla do vendor).
✏️ Exercício 5 — Corte a fatura de logs
A fatura de observabilidade é R$ 80k/mês, 70% em logs. Investigando: um serviço loga cada requisição em nível INFO com o corpo inteiro (inclui PII); há DEBUG ligado em 3 serviços; a retenção é 90 dias hot para tudo; e há 200 GB/dia de logs de health check 200 OK. Proponha.
Gabarito: (1) Desligar DEBUG em produção (ligável sob demanda). (2) O serviço chatty: baixar para WARN/ERROR o log por requisição; se precisar de trilha, amostrar (1/100 dos 2xx, 100% dos erros) e remover o corpo/PII (redação no Collector). (3) Filtrar os logs de health check no Collector (não ingerir). (4) Retenção: 7–14 dias hot, resto em object storage barato com política de expiração; arquivar o que for exigência legal. (5) Substituir "contar erros pelos logs" por uma métrica derivada. Economia plausível: 50–70% da linha de logs, sem perder capacidade de investigação real.
SLI, SLO, SLA e error budgets
Objetivo: definir bons indicadores e objetivos de confiabilidade, calcular o error budget, e transformá-lo em decisões de engenharia via burn-rate alerts.
6.1 As três siglas
| Sigla | O que é |
|---|---|
| SLI (Service Level Indicator) | Uma medida quantitativa de um aspeto do serviço: "% de requisições HTTP com status < 500 e latência < 300ms" |
| SLO (Service Level Objective) | Um alvo para o SLI num período: "99,9% ao longo de 28 dias". É interno, define "bom o suficiente" |
| SLA (Service Level Agreement) | Um contrato com o cliente, com penalidade se violado. Sempre mais frouxo que o SLO interno (você quer descobrir o problema antes de o cliente cobrar) |
6.2 O que faz um bom SLI
- Voltado ao usuário: mede o que o usuário sente (a requisição foi atendida rápido e sem erro?), não uma causa interna (CPU).
- Uma razão "bom / total", entre 0 e 100%.
- Medido onde o usuário está quando possível (no load balancer / gateway, não no fundo do backend — senão você ignora as requisições que nem chegaram).
- Categorias comuns: disponibilidade (% de sucesso), latência (% abaixo do limiar), qualidade/correção (% de respostas corretas), frescor (dados atualizados dentro de X), throughput, cobertura.
6.3 A matemática dos "noves" e o error budget
| SLO de disponibilidade | Downtime permitido / 30 dias | / ano |
|---|---|---|
| 99% ("dois noves") | ~7,2 horas | ~3,65 dias |
| 99,9% ("três noves") | ~43 minutos | ~8,77 horas |
| 99,95% | ~22 minutos | ~4,38 horas |
| 99,99% ("quatro noves") | ~4,3 minutos | ~52,6 minutos |
O error budget = 100% − SLO. Com SLO de 99,9% num mês, você "pode" falhar 0,1% das requisições (ou ~43 min de indisponibilidade). Esse orçamento é gasto por incidentes, deploys ruins, degradações.
O poder do error budget está na política acordada de antemão: "enquanto houver orçamento, o time lança features livremente; se o orçamento acabar (SLO violado no período), congela-se o lançamento de features não essenciais e o time foca 100% em confiabilidade até recuperar." Isso transforma "dev vs ops" numa decisão objetiva baseada num número que os dois lados aceitaram.
6.4 Burn-rate alerts
Alertar quando "o SLO foi violado" é tarde demais. Alerte pela velocidade de consumo do orçamento (burn rate): burn rate = 1 significa consumir o orçamento exatamente no ritmo que o esgota ao fim do período; burn rate = 14,4 esgota o orçamento de 30 dias em ~2 dias.
Multi-window, multi-burn-rate (recomendação do SRE Workbook):
PÁGINA (acorda alguém) se:
burn rate > 14,4 na janela de 1h E burn rate > 14,4 na janela de 5m
(queima rápida — 2% do orçamento mensal em 1h)
OU
burn rate > 6 na janela de 6h E burn rate > 6 na janela de 30m
TICKET (não acorda) se:
burn rate > 3 na janela de 24h E ... na janela curta
burn rate > 1 na janela de 3d E ...
A janela curta em conjunto evita alertar por um pico já resolvido; a janela longa evita ignorar uma degradação lenta e persistente.
6.5 SLO como contrato entre times
Quando o serviço A depende do serviço B, o SLO de B (e seu histórico de cumprimento) informa quanto A pode prometer. SLOs publicados criam uma linguagem comum: "seu serviço precisa de 99,95% para eu conseguir dar 99,9%". E evitam o "over-delivery" perigoso (um serviço que sempre entrega 99,999% cria dependência oculta e some quando finalmente cai).
SLO é o tema de entrevista de SRE. Perguntas: "Diferença entre SLI, SLO e SLA", "O que faz um bom SLI?" (voltado ao usuário, razão bom/total, medido onde o usuário está), "O que é um error budget e para que serve a policy?" (alinhar dev/ops num número; congelar features se acabar), "Por que alertar por burn rate e não por 'SLO violado'?", "Quanto downtime dá 99,9% ao mês?" (~43 min).
✏️ Exercício 6 — Defina o SLO
Uma API de busca de produtos de um e-commerce. Defina um SLI de disponibilidade e um de latência, um SLO para cada, o error budget mensal, e o que a policy diz se ele acabar.
Gabarito (exemplo): SLI disponibilidade: (requisições a /search com status < 500) / (total), medido no gateway. SLI latência: (requisições a /search com duração < 400 ms) / (total). SLO: disponibilidade ≥ 99,9% e latência ≥ 99% abaixo de 400 ms, em janela de 28 dias. Error budget: 0,1% das requisições podem falhar (≈ 43 min equivalentes/mês) e 1% podem passar de 400 ms. Policy: com orçamento disponível, o time lança normalmente; se qualquer SLO for violado na janela, congelam-se lançamentos não essenciais, faz-se um postmortem e o time prioriza correções de confiabilidade até o orçamento voltar ao positivo; mudanças de risco alto passam a exigir aprovação extra.
Alerting e on-call sustentável
Objetivo: alertas que valem a interrupção, combate à fadiga de alerta, runbooks, e um modelo de plantão que não queima as pessoas.
7.1 O que merece um alerta que acorda alguém
Um alerta que página (acorda uma pessoa) deve ser: urgente (precisa de ação humana agora, não pode esperar a manhã), acionável (a pessoa sabe o que fazer — há um runbook), e real (reflete um problema para o usuário, não um sintoma que se resolve sozinho). Se qualquer um dos três falha, não é página — é ticket, ou é ruído para deletar.
- Alerte por sintoma, não por causa: "taxa de erro do checkout acima do SLO" (sintoma, sempre relevante) > "CPU do pod X a 92%" (causa, pode ser normal). Causa vira contexto no runbook, não alerta.
- Baseie no error budget / burn rate (Módulo 6) quando possível — é o alerta mais alinhado ao que importa.
- Dois níveis: page (urgente, acorda) e ticket/warn (importante, horário comercial). Não pague tudo.
7.2 Fadiga de alerta
O maior inimigo do on-call. Sintomas: alertas que sempre se auto-resolvem, alertas que ninguém investiga, "isso é normal, ignora". Consequências: a pessoa perde a confiança e ignora o alerta importante. Combate:
- Toda página deve gerar um pós-fato: foi útil? Se não, ajustar o limiar, agrupar, ou deletar.
- Métrica de saúde do on-call: páginas por turno (alvo típico ≤ 2), % de páginas acionáveis, % fora do horário.
- Agrupamento e deduplicação no Alertmanager/PagerDuty (um incidente = uma página, não 40).
- Silenciamento durante manutenções planejadas.
- Revisão periódica de todos os alertas ("alert review") — deletar os mortos é trabalho legítimo.
7.3 Runbooks
Todo alerta que página tem um runbook linkado: o que este alerta significa, como confirmar o problema, os primeiros passos de mitigação (reverter deploy, escalar, drenar tráfego, ligar feature flag de degradação), quando e para quem escalar. Runbook bom é executável às 3h por alguém sonolento — específico, com comandos, sem "investigue".
7.4 On-call sustentável
- Rotação com gente suficiente (mínimo ~6–8 pessoas para não sobrecarregar); turnos de duração razoável (semana); follow-the-sun entre fusos elimina plantão noturno.
- Compensação (folga, pagamento) pelo tempo de plantão — não é "de graça".
- Primário + secundário (backup se o primário não responde).
- Handoff documentado entre turnos: o que está aberto, o que observar.
- Tempo protegido para trabalho de confiabilidade (corrigir as causas dos alertas) — senão o plantão só apaga incêndio e nunca melhora.
- Ferramentas: PagerDuty, Opsgenie, Grafana OnCall, incident.io.
7.5 Dashboards que servem
- Um dashboard por serviço com RED + saturação + versão em deploy + links para runbooks — o primeiro lugar que o on-call abre.
- Um dashboard de SLO por serviço: SLI atual, orçamento restante, burn rate.
- Evitar "wall of graphs" (50 gráficos que ninguém lê) e vanity metrics. Cada painel responde a uma pergunta.
Perguntas: "O que caracteriza um bom alerta?" (urgente + acionável + real; sintoma, não causa), "O que é fadiga de alerta e como combater?" (revisar/deletar alertas, métrica de páginas por turno, agrupamento), "O que tem num runbook?", "Como você desenharia uma rotação de on-call sustentável?" (gente suficiente, compensação, follow-the-sun, tempo protegido para consertar as causas).
✏️ Exercício 7 — Limpe os alertas
Um time recebe ~30 páginas por semana de plantão. Auditoria: 12 são "CPU alta" que sempre normaliza sozinha; 8 são de um job batch que "falha e o retry resolve"; 6 são duplicatas do mesmo incidente; 4 são erros reais de produção. O que você faz com cada grupo?
Gabarito: (1) "CPU alta" que auto-resolve: deletar como página — não é acionável nem urgente; virar, no máximo, um painel/ticket, e investigar se há um problema de capacity real por trás. (2) Job batch com retry que resolve: não paginar — só alertar (ticket) se o job falhar após todos os retries; corrigir a flakiness do job. (3) Duplicatas: configurar agrupamento/deduplicação (um incidente = uma página). (4) Os 4 erros reais: manter, garantir runbook, e priorizar corrigir as causas. Resultado: de ~30 para ~4 páginas/semana, todas acionáveis.
Gestão de incidentes e postmortems
Objetivo: o processo de responder a um incidente (papéis, comunicação, ciclo) e a prática de aprender com ele sem procurar culpados.
8.1 O ciclo de um incidente
DETECTAR ──► TRIAR ──► MITIGAR ──► RESOLVER ──► APRENDER
(alerta/SLO) (severidade, (parar a dor (corrigir a (postmortem
declarar, do usuário: causa) sem culpa,
acionar) reverter, ações)
failover,
feature flag)
Durante um incidente, a prioridade é parar a dor do usuário, não descobrir a causa raiz. Reverter o último deploy, drenar a região doente, ligar o modo degradado, escalar recursos — mitigações rápidas primeiro. A investigação da causa raiz vem depois, com o sistema estável. "Entender antes de agir" é para o postmortem, não para as 3h da manhã.
8.2 Papéis
| Papel | Faz |
|---|---|
| Incident Commander (IC) | Coordena, decide, mantém a visão geral. Não mete a mão no teclado. Delegar é o trabalho dele |
| Operations / Responders | Investigam e aplicam mitigações, sob direção do IC |
| Communications Lead | Atualiza stakeholders internos e a status page externa em cadência fixa |
| Scribe | Registra a timeline (o que foi feito, quando, com que efeito) — ouro para o postmortem |
Em incidentes pequenos, uma pessoa acumula papéis; o importante é que alguém é o IC e todos sabem quem.
8.3 Severidade e comunicação
- Níveis (ex.: SEV1 = indisponibilidade total / perda de dados / impacto grave; SEV2 = degradação séria; SEV3 = impacto menor) — definem quem é acionado, a cadência de comunicação e se há postmortem obrigatório.
- Comunicação em cadência fixa (ex.: a cada 30 min), mesmo que seja "ainda investigando" — o silêncio gera pânico e enxame de gente perguntando.
- Status page externa honesta e rápida; clientes perdoam falha, não perdoam sentir que foram enganados.
8.4 Postmortem sem culpa (blameless)
- Premissa: as pessoas agiram com boa intenção e com a informação que tinham. Se alguém "errou", a pergunta é por que o sistema/processo permitiu esse erro e não o pegou — não "quem foi".
- Conteúdo: resumo do impacto (quanto tempo, quantos usuários, error budget gasto), timeline detalhada, análise da causa (raiz e contribuintes), o que correu bem, o que correu mal, e ações concretas com dono e prazo.
- Além dos "5 whys": incidentes complexos têm múltiplas causas contribuintes e nenhuma "raiz" única. Técnicas melhores: análise de fatores contribuintes, "e se" na timeline, olhar o sistema sociotécnico (por que a detecção demorou? por que o rollback foi difícil?).
- Métricas de aprendizado: MTTD (tempo para detectar), MTTR/MTTM (tempo para mitigar/resolver), % de ações de postmortem concluídas. Um postmortem cujas ações nunca são feitas é teatro.
8.5 Testar a resiliência de propósito
- Chaos engineering: injetar falhas controladas em produção (matar instâncias, adicionar latência, particionar rede) para validar que a resiliência projetada funciona antes do incidente real. Ferramentas: Chaos Mesh, Gremlin, LitmusChaos, o clássico Chaos Monkey.
- Game days: exercícios simulados de incidente para treinar o processo, os runbooks e as pessoas.
- DiRT (Disaster Recovery Testing): testar failover de região, restauração de backup — "backup não testado não é backup".
Perguntas: "Descreva o processo de resposta a um incidente" (detectar→triar→mitigar→resolver→aprender; mitigar antes de entender), "O que faz um Incident Commander?" (coordena, não digita), "O que é um postmortem blameless e por que blameless?" (culpar esconde a informação; foca em sistema/processo), "O que é chaos engineering?", "MTTD e MTTR".
✏️ Exercício 8 — Conduza o incidente
3h da manhã: o SLO de disponibilidade do checkout está queimando a burn rate 20. Você é paginado. Descreva seus primeiros 15 minutos.
Gabarito: (1) Reconhecer a página e abrir o incidente (canal dedicado, declarar severidade — provável SEV1/2). Assumir o papel de IC (ou nomear um). (2) Confirmar o impacto no dashboard de SLO e RED do checkout: taxa de erro, latência, desde quando. (3) Buscar mudança recente: houve deploy? mudança de config? pico de tráfego? incidente de uma dependência? (o service map / o dashboard de deploys). (4) Mitigar já, sem esperar a causa raiz: se houve deploy recente, reverter; se é uma região/AZ, drenar; se é uma dependência, ligar o modo degradado / circuit breaker. (5) Comunicar: status page + update interno ("checkout com erros elevados desde 2h55, mitigação em andamento, próximo update em 30 min"). (6) Designar um scribe para a timeline. Investigação de causa raiz e postmortem: depois de estabilizar.
SRE em escala: toil, release, plataforma e temas atuais
Objetivo: eliminar toil com automação, entregar mudanças com segurança (progressive delivery), o papel da plataforma, e o que há de novo (eBPF, observabilidade de IA, AIOps).
9.1 Toil e sua eliminação
- Toil = trabalho operacional manual, repetitivo, automatizável, tático, sem valor duradouro, que escala linearmente com o serviço (reiniciar um serviço travado, aprovar um acesso, aplicar um certificado, responder o mesmo alerta).
- Meta clássica do SRE Google: ≤ 50% do tempo em toil; o resto é engenharia (automação, melhorias de confiabilidade).
- Medir o toil (pesquisas, tracking de tickets) e atacar os maiores geradores com automação e self-healing (o sistema se recupera sozinho: auto-restart, auto-scaling, auto-failover, auto-remediação de alertas conhecidos).
9.2 Release engineering e progressive delivery
| Técnica | Ideia |
|---|---|
| Canary | Nova versão recebe 1–5% do tráfego; observabilidade compara SLIs canary vs baseline; promove ou reverte automaticamente |
| Blue-green | Duas versões prontas; troca instantânea; rollback imediato |
| Rolling | Substitui instâncias aos poucos |
| Feature flags | Deploy desacoplado de release; ligar a feature para % de usuários; matar sem redeploy |
| Automated rollback | Se os SLIs pós-deploy degradam além do limiar, reverter sem humano |
Ferramentas: Argo Rollouts, Flagger, Spinnaker; LaunchDarkly/Unleash para flags. Deploy frequente e pequeno reduz o risco por deploy — é contraintuitivo mas é o que os dados de DORA (DevOps Research) mostram: quem entrega mais vezes tem menos incidentes e recupera mais rápido.
9.3 Capacity planning
- Previsão de demanda (orgânica + eventos: Black Friday, campanhas) × capacidade atual × headroom de segurança.
- Load testing / stress testing para conhecer o ponto de quebra e a curva de degradação.
- Autoscaling cobre a variação; o planejamento cobre o crescimento estrutural e os picos previsíveis.
- Cruza com FinOps (a apostila irmã) — capacidade ociosa é custo, capacidade insuficiente é incidente.
9.4 O modelo organizacional de SRE
- Central / consultivo: um time de SRE que define práticas, ferramentas e faz onboarding de serviços; os times de produto operam com apoio.
- Embedded: SREs dentro dos times de produto.
- Platform: SRE contribui para a plataforma interna que provê observabilidade, CI/CD, runtime e SLOs "de fábrica" — o golden path. O time de produto ganha observabilidade por padrão, sem montar do zero.
- You build it, you run it (Amazon): quem escreve, opera — SRE ajuda a capacitar, não assume o pager de todo mundo.
9.5 Temas atuais
- eBPF: instrumentação no kernel Linux sem tocar a aplicação — visibilidade de rede, syscalls, latência, profiling contínuo "de graça". Ferramentas: Cilium/Hubble, Pixie, Parca, Grafana Beyla. Reduz a necessidade de instrumentação manual.
- Observabilidade de IA/LLM: traces de chamadas a modelos, tokens, custo, avaliações online, drift — cobre-se na apostila de LLMOps & Avaliação; o OTel tem semantic conventions para GenAI.
- AIOps: ML aplicado à operação — detecção de anomalia, correlação de alertas, agrupamento de incidentes, sugestão de causa provável. Útil como copiloto; não substitui o julgamento.
- Observabilidade como código: dashboards, alertas e SLOs versionados (Terraform providers, Grafana as code, OpenSLO) — revisáveis, reproduzíveis.
- Custo de observabilidade como disciplina própria (ver FinOps): a telemetria pode custar uma fração significativa da infra.
Perguntas sénior: "O que é toil e como você o reduz?", "Por que deploy frequente e pequeno reduz risco?" (menos mudança por deploy, rollback trivial, dados DORA), "Como funciona um canary automatizado?" (comparar SLIs canary vs baseline, promover/reverter), "O que é eBPF e o que ele muda para observabilidade?" (instrumentação no kernel, sem tocar a app), "Como a plataforma entrega observabilidade 'de fábrica'?".
✏️ Exercício 9 — Reduza o toil
Uma pesquisa mostra que o time de SRE gasta 65% do tempo em toil. Os três maiores itens: (a) restaurar manualmente um serviço que trava ~3×/dia; (b) provisionar acessos (dezenas de tickets/semana); (c) rodar um runbook de 20 passos toda vez que um cliente novo é onboarded. Proponha para cada.
Gabarito: (a) Self-healing: liveness probe que reinicia o pod automaticamente, e um alerta (ticket, não página) para investigar a causa da trava — e priorizar corrigi-la. (b) Automação com aprovação: um fluxo self-service (formulário → política → provisão automática) com aprovação só onde o risco exige; RBAC por grupo em vez de acesso individual. (c) Codificar o runbook: transformar os 20 passos num script/pipeline idempotente (um comando ou um clique), com verificação ao final. Meta: derrubar o toil de 65% para < 50% e liberar tempo para engenharia de confiabilidade.
Mercado de trabalho: roadmap, entrevistas e portfólio
Objetivo: converter o conteúdo dos módulos anteriores em aprovação — perfis, roadmap, banco de perguntas com respostas e projetos que geram entrevista.
10.1 Os perfis que contratam
| Perfil | Foco |
|---|---|
| Site Reliability Engineer | SLOs, on-call, incidentes, automação, capacity, release; forte em código |
| Observability Engineer | Plataforma de telemetria: OTel, Prometheus, backends, custo, adoção pelos times |
| Platform Engineer | Golden paths incluindo observabilidade e SLOs de fábrica |
| DevOps Engineer | CI/CD, IaC, e cada vez mais SLO/observabilidade |
| Production Engineer | Nome usado por algumas empresas (Meta) para SRE-adjacente |
10.2 Roadmap de estudo (8–10 semanas)
| Semanas | Foco | Prática |
|---|---|---|
| 1 | Conceitos: observabilidade vs monitoring, SRE, os pilares (Módulos 1–2) | Instrumentar uma app de exemplo com logs estruturados + trace_id |
| 2–3 | Métricas: Prometheus, PromQL, RED/USE, Grafana (Módulo 3) | Stack Prometheus+Grafana local; painéis RED para 2–3 serviços; recording rules |
| 4–5 | Tracing e OpenTelemetry: SDK, auto-instrumentação, Collector, sampling (Módulo 4) | Instrumentar 3 serviços com OTel; Collector com tail sampling; Jaeger/Tempo |
| 6 | Logs, correlação e custo; OTel Collector como hub (Módulo 5) | Loki + correlação log↔trace; um processador de redação de PII no Collector |
| 7 | SLI/SLO/error budget/burn rate (Módulo 6) | Definir SLOs para os serviços; alertas multi-window multi-burn-rate; dashboard de SLO |
| 8 | Alerting e on-call; incidentes e postmortems (Módulos 7–8) | Escrever 3 runbooks; simular um incidente (game day) e redigir o postmortem blameless |
| 9–10 | SRE em escala: toil, progressive delivery, eBPF, plataforma (Módulo 9); portfólio | Um canary automatizado (Flagger/Argo Rollouts); estudo de caso publicado |
Base: Linux, redes, um provedor de nuvem, Kubernetes, um pouco de código (Go/Python), IaC (Terraform), CI/CD.
10.3 Banco de perguntas de entrevista (com a resposta que aprova)
Júnior/pleno — "Observabilidade vs monitoramento"
Monitoramento coleta sinais predefinidos e alerta em limiares — responde perguntas que você já sabia fazer ("o disco vai encher?"). Observabilidade é ter telemetria rica o suficiente (logs, métricas, traces correlacionados) para responder perguntas novas, não previstas, sobre o comportamento do sistema — sem fazer deploy de código para adicionar instrumentação. Monitoramento é um subconjunto da observabilidade.
Pleno — "Os três pilares e o que cada um responde"
Métricas: números agregados no tempo — saúde e tendência, alertas, SLOs; baratas mas sofrem com cardinalidade alta. Logs: eventos discretos com contexto — "o que exatamente aconteceu"; caros, costumam ser a maior fatura. Traces: a árvore de spans de uma requisição entre serviços — "onde o tempo foi, qual serviço falhou". IDs de alta cardinalidade vão em logs/traces, nunca em labels de métrica.
Pleno — "O que é OpenTelemetry e por que usar?"
Padrão CNCF vendor-neutral para gerar telemetria (traces, métricas, logs): API estável, SDKs, auto-instrumentação, semantic conventions (nomes de atributos padronizados), protocolo OTLP e o Collector (pipeline de processamento e roteamento). Vale porque a instrumentação fica portável — trocar de backend/vendor é mudar o Collector, não re-instrumentar; e a telemetria de times/linguagens diferentes fica comparável.
Pleno/sénior — "Explique SLI, SLO, error budget"
SLI: uma medida de qualidade do serviço voltada ao usuário, como razão bom/total (ex.: % de requisições rápidas e sem erro). SLO: o alvo do SLI num período (ex.: 99,9% em 28 dias), define "bom o suficiente". Error budget = 100% − SLO: o quanto de falha é tolerável; é gasto por incidentes e deploys. A error budget policy: com orçamento, lança-se features; sem orçamento, congela-se feature e foca-se em confiabilidade. Alinha dev e ops num número acordado.
Sénior — "Por que alertar por burn rate?"
Alertar só quando "o SLO já foi violado" é tarde. Burn rate mede a velocidade de consumo do error budget; um multi-window multi-burn-rate alerta (ex.: burn > 14,4 em 1h e em 5m → página; burn > 3 em 24h → ticket) pega tanto a queima rápida (incidente agudo) quanto a lenta e persistente (degradação), com a janela curta evitando alertar por um pico já resolvido.
Sénior — "Descreva a resposta a um incidente e o postmortem"
Detectar (alerta/SLO) → triar (severidade, declarar, nomear IC) → mitigar (parar a dor do usuário: reverter, failover, feature flag — antes de entender a causa) → resolver (corrigir a causa) → aprender. Papéis: IC coordena (não digita), responders investigam/mitigam, comms atualiza stakeholders em cadência fixa, scribe registra a timeline. Postmortem blameless: assume boa intenção, pergunta por que o sistema permitiu o erro, produz ações com dono e prazo; blameless porque culpar faz as pessoas esconderem informação.
Armadilha — "Vamos mirar 100% de disponibilidade"
É o alvo errado: cada "nove" adicional custa exponencialmente mais, é praticamente inatingível em sistemas distribuídos, e acima de certo ponto o usuário não percebe a diferença (a rede dele, o dispositivo, o DNS já introduzem mais falha que isso). Define-se um SLO adequado ao produto (ex.: 99,9%), e a folga vira error budget para inovar. Um serviço que "sempre entrega 99,999%" ainda cria dependência oculta e falta de prática de recuperação.
10.4 Projetos de portfólio que geram entrevista
- Stack de observabilidade completa (âncora): um conjunto de microserviços de exemplo, instrumentados com OpenTelemetry (traces + métricas + logs correlacionados), OTel Collector com tail sampling e redação de PII, Prometheus+Grafana com painéis RED, Loki, Tempo/Jaeger. README explicando as decisões e os custos.
- SLOs e burn-rate alerts: definir SLIs/SLOs para os serviços acima, implementar alertas multi-window multi-burn-rate, e um dashboard de error budget. Bônus: OpenSLO / SLO as code.
- Game day documentado: injetar uma falha (chaos), conduzir o incidente com papéis, e publicar o postmortem blameless com timeline e ações.
- Canary automatizado: Argo Rollouts/Flagger comparando SLIs canary vs baseline, com rollback automático — demonstrado com um deploy "ruim".
- Otimização de custo de observabilidade: um "antes/depois" de fatura com sampling, retenção e métricas derivadas de logs.
10.5 Fontes para continuar
- Livros SRE (Google, gratuitos online): Site Reliability Engineering, The Site Reliability Workbook, Building Secure & Reliable Systems.
- Observabilidade: Observability Engineering (Majors, Fong-Jones, Miranda — Honeycomb); Distributed Systems Observability (Cindy Sridharan).
- Incidentes: o material do Learning from Incidents e de John Allspaw sobre postmortems; Seeking SRE (coletânea).
- Prática: a documentação do OpenTelemetry e do Prometheus; o "PromLabs" para PromQL; DORA reports para métricas de entrega; o "Google SRE" YouTube.
Quatro ideias sustentam observabilidade e SRE: (1) observabilidade é responder o inesperado sem redeploy — logs, métricas e traces correlacionados, com cardinalidade no lugar certo; (2) confiabilidade tem um alvo — o SLO — e a folga é um error budget que alinha dev e ops num número; (3) alerte por sintoma e por queima de orçamento, não por causa de infra, e proteja o on-call da fadiga; (4) incidentes são falhas de sistema — mitigue antes de entender, aprenda sem culpar, e corrija as causas. Operação é engenharia.