OPERAÇÕES & QUALIDADE · TEMPLATE 12

Postmortem + SLO Definition

Postmortem blameless após qualquer incidente Tier 1/2 (Google SRE / Allspaw); SLO definition ao desenhar serviço novo. Aprender do erro, contratar qualidade.

Quando usar Postmortem após incidente Tier 1/2; SLO ao desenhar serviço novo
Quem lê Postmortem é público no time/empresa; SLO é contrato com produto
Tamanho Postmortem 5–10 páginas; SLO 1–2 páginas
Origem Google SRE Book, Allspaw/Etsy 2012

Postmortem blameless foi formalizado pelo Google SRE Book (capítulo 15, John Lunney) e popularizado por John Allspaw (Etsy) em 2012. A premissa: erros são oportunidades de aprender sobre o sistema, não de punir indivíduos. SLO (Service Level Objective) é o contrato mensurável que define qualidade aceitável — ferramenta central de SRE moderno. Os dois templates abaixo se complementam: SLO articulado antes de o sistema viver, postmortem articulado quando o sistema falha.

Template — Postmortem (Blameless)

# Postmortem — [Incidente / título descritivo]

**Status:** Draft / Final
**Author:** [seu nome]
**Reviewers:** [tech lead, EM, on-call do incidente]
**Date of incident:** [YYYY-MM-DD HH:MM TZ]
**Date of postmortem:** [YYYY-MM-DD]
**Severity:** SEV1 / SEV2 / SEV3
**Duration:** [N minutos/horas]

> ⚠️ Este postmortem é **blameless**. O foco é entender o sistema e
> melhorá-lo — não atribuir culpa individual. Engenheiros agem com
> a melhor informação disponível no momento; falhas são propriedade
> do sistema, não da pessoa.

---

## Resumo executivo
[2-3 parágrafos. O que aconteceu, quem foi afetado, por quanto
tempo, qual o impacto.]

## Impacto
- **Usuários afetados:** [número, % do total]
- **Receita afetada:** [estimativa em $]
- **Funcionalidades degradadas:** [lista]
- **SLO impact:** error budget consumido = [X% / Y minutos]
- **Ticket count durante incidente:** [N]

## Timeline (em UTC ou TZ definida)

| Hora | Evento | Quem agiu |
|------|--------|-----------|
| 14:32 | Deploy de v2.4.0 ao production | @alice (CI automatizado) |
| 14:38 | Alerta HighErrorRate dispara | PagerDuty → @bob |
| 14:39 | @bob recebe e começa investigação | @bob |
| 14:44 | @bob identifica deploy como suspeita | @bob |
| 14:46 | Rollback iniciado | @bob |
| 14:51 | Rollback completo, error rate volta ao normal | @bob |
| 14:55 | @bob declara incidente resolvido | @bob |
| 15:00 | Início da investigação de causa raiz | @bob, @alice |
| 16:30 | Causa raiz identificada (regex em validador) | @alice |

## Causa raiz
[Análise técnica detalhada. O que efetivamente causou o problema?
Por que não foi pego antes? Os "5 porquês" se útil.]

### "5 porquês" do incidente
1. **Por quê** o serviço retornou 500? — A função X lançou exceção
   não-tratada
2. **Por quê** lançou exceção? — Regex de validação não suportava
   um caso de input específico
3. **Por quê** o regex não suportava? — Foi escrito assumindo
   somente caracteres ASCII; input em UTF-8 multi-byte falhou
4. **Por quê** chegou a produção? — Testes não cobriam input
   multi-byte
5. **Por quê** os testes não cobriam? — Cobrir todos os casos de
   input não estava em nossa lista de cenários canônicos

## O que funcionou bem
- Alerta disparou em < 30s (resposta rápida)
- @bob diagnosticou e mitigou em 13 min (excelente RTO)
- Rollback automatizado funcionou sem incidente

## O que poderia ter ido melhor
- Não tínhamos teste para input multi-byte → bug em produção
- Dashboard não tinha breakdown por tipo de input → diagnóstico
  levou alguns minutos a mais que o ideal
- Não tínhamos canary deploy → todos os usuários afetados, não só
  uma fração

## Onde tivemos sorte
- Incidente em horário de baixa carga (3h da manhã UTC) — impacto
  menor que poderia ter sido
- @bob estava de plantão e tem experiência específica neste serviço

## Action items

| ID | Item | Owner | Severidade | Prazo |
|----|------|-------|------------|-------|
| AI-01 | Adicionar suite de testes para input multi-byte | @alice | P0 | 2 semanas |
| AI-02 | Configurar canary deploy (5% de tráfego por 30 min) | @bob | P1 | 1 mês |
| AI-03 | Adicionar breakdown por encoding no dashboard | @charlie | P2 | 1 mês |
| AI-04 | Documentar "tipos de input testáveis" no PR template | @alice | P2 | 2 semanas |

## Lições aprendidas (para o time)
- [Lição 1 — algo que vamos lembrar e aplicar]
- [Lição 2]

Template — SLO Definition

# SLO Definition — [Nome do serviço]

**Owner:** [time]
**Última revisão:** [YYYY-MM-DD]
**Próxima revisão:** [trimestral]

## Service Level Indicators (SLI)

### SLI-1: Disponibilidade
**Definição:** % de requests bem-sucedidas (HTTP 2xx ou 3xx) sobre
total de requests, exclusos requests inválidas (4xx por culpa do
cliente).

**Como medir:**
\`\`\`
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
  /
sum(rate(http_requests_total{status!~"4.."}[5m]))
\`\`\`

### SLI-2: Latência
**Definição:** % de requests respondidas em < 200 ms (P99).

**Como medir:**
\`\`\`
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
  < 0.2
\`\`\`

## Service Level Objectives (SLO)
| SLI | Target | Janela | Error Budget |
|-----|--------|--------|--------------|
| Disponibilidade | 99.9% | 30 dias | 43.2 min |
| Latência P99 | 99% das requests < 200ms | 30 dias | 1% |

## Error Budget Policy
- **> 50% restante:** modo normal — features novas seguem
- **25-50% restante:** alerta amarelo — feature work segue mas
  PRs de risco passam por revisão extra
- **< 25% restante:** alerta vermelho — feature work pausa;
  prioridade vira reduzir ações que consomem budget
- **0% (estourou):** freeze de mudanças não-essenciais até
  budget reset; postmortem dedicado obrigatório

## Alertas baseados em SLO
- **Page (acorda alguém):** burn rate > 14× (vai consumir mês de
  budget em < 1 dia se sustentar)
- **Notify (canal slack):** burn rate > 6× (vai consumir budget em
  < 1 semana)

## Stakeholders
- **Produto:** PM aceita SLO como contrato
- **SRE:** mantém dashboards e alertas
- **Engenharia:** escreve código respeitando SLO; postmortem se viola
postmortem blameless — princípio

"Blameless" não significa "não há accountability". Significa que a accountability está no sistema, não no indivíduo. O engenheiro que apertou o botão errado não é a causa raiz; a causa raiz é por que o sistema permitia apertar o botão errado. Postmortem que culpa pessoa esconde falha sistêmica. Postmortem que olha sistema melhora sistema — e o time inteiro aprende.

heurística — error budget

SLO sem error budget articulado vira "tentamos ser bons"; SLO com error budget vira contrato. Quando o time consome o budget, mudanças param até reset. Essa fricção é a feature, não bug — força disciplina. Times que articulam error budget entregam consistência; times sem, oscilam entre "tudo permitido" e "nada pode quebrar".

Referências