Engenharia do Caos
Engenharia do Caos (Chaos Engineering) é a disciplina de fazer experimentos em um sistema para ganhar confiança na sua capacidade de suportar condições turbulentas em produção1. Em vez de esperar que as falhas aconteçam naturalmente, os praticantes injetam falhas controladas de propósito — e usam os resultados para encontrar e corrigir fraquezas antes que incidentes reais o façam.
"A forma de tornar os sistemas mais confiáveis é fazê-los falhar o tempo todo." — Jesse Robbins, cofundador da Chef e um dos primeiros praticantes de Engenharia do Caos na Amazon2
Origem: a Netflix e o Simian Army
Em abril de 2011, uma falha da Amazon Web Services na região us-east-1 causou uma indisponibilidade de várias horas em boa parte da internet. A Netflix, que havia migrado recentemente para a AWS, sofreu uma degradação significativa — apesar de ter investido pesadamente em um projeto tolerante a falhas.
O incidente revelou uma lacuna crítica: a Netflix havia projetado para a falha, mas nunca havia testado se esses projetos realmente funcionavam em condições reais. A resposta da equipe de engenharia foi o Chaos Monkey: um serviço que encerra aleatoriamente instâncias EC2 em produção durante o horário comercial, obrigando os engenheiros a construir sistemas capazes de sobreviver à perda arbitrária de instâncias.
O Chaos Monkey se tornou o primeiro membro do Simian Army (exército de símios) — um conjunto de ferramentas que introduziam diferentes cenários de falha:
| Ferramenta | Falha injetada |
|---|---|
| Chaos Monkey | Encerra instâncias EC2 aleatórias |
| Latency Monkey | Introduz atrasos artificiais em chamadas REST |
| Conformity Monkey | Desliga instâncias que violam as boas práticas |
| Doctor Monkey | Monitora health checks e isola instâncias não saudáveis |
| Janitor Monkey | Limpa recursos de nuvem não utilizados |
| Security Monkey | Encontra e reporta violações de políticas de segurança |
| Chaos Gorilla | Simula a falha de uma Availability Zone inteira da AWS |
A percepção foi transformadora: a falha não é um caso especial a ser evitado; é o ambiente em que os sistemas de produção vivem, e a única forma de saber se o seu sistema sobrevive a ela é testá-lo lá.
Princípios da Engenharia do Caos
Os Principles of Chaos Engineering1 definem a disciplina em cinco ideias centrais:
1. Construa uma hipótese em torno do comportamento em estado estável : Defina como é o "normal" antes de injetar falhas — em termos de saídas mensuráveis (taxa de requisições, taxa de erros, latência). A hipótese é: "Este sistema continuará exibindo o estado estável mesmo quando a condição X for introduzida."
2. Varie eventos do mundo real : Simule eventos que realmente acontecem: queda de servidores, partição de rede, disco cheio, desvio de relógio, timeout de dependências, pico de tráfego. Falhas sintéticas ou artificiais que nunca ocorrem na prática produzem uma confiança enganosa.
3. Execute os experimentos em produção : Ambientes de staging não reproduzem fielmente a carga de produção, a distribuição dos dados nem o comportamento das dependências. Fraquezas visíveis apenas em condições de produção ficam invisíveis em staging. Comece com um raio de impacto pequeno e amplie à medida que a confiança cresce.
4. Automatize os experimentos para rodarem continuamente : Um experimento único produz um resultado único. Os sistemas mudam constantemente; novos deploys podem reintroduzir fraquezas. Experimentos de caos contínuos rodam automaticamente (muitas vezes de forma agendada), de modo que as regressões sejam detectadas imediatamente.
5. Minimize o raio de impacto : Controle com cuidado o escopo de cada experimento. Afete o número mínimo de usuários necessário para validar a hipótese. Amplie o escopo apenas depois que experimentos menores não produzirem impacto observável.
O ciclo de vida de um experimento
flowchart LR
H["1. Formular hipótese\nDefinir o estado estável\ne o comportamento esperado"]
D["2. Projetar\nEscolher o tipo de falha\ne o raio de impacto"]
I["3. Injetar\nIntroduzir a\nfalha controlada"]
O["4. Observar\nMedir os SLIs\ne o comportamento do sistema"]
A["5. Analisar\nComparar o comportamento real\ncom o da hipótese"]
R["6. Melhorar\nCorrigir fraquezas;\natualizar runbooks"]
H --> D --> I --> O --> A --> R
R -->|"rodar de novo\ncom escopo maior"| H Um experimento de caos que confirma a hipótese (o sistema se comporta como esperado) aumenta a confiança naquele modo de falha. Um experimento que refuta a hipótese é uma descoberta: o sistema não trata essa falha corretamente, e a equipe agora sabe disso antes que um incidente real ensine.
Tipos de injeção de falhas
| Categoria | Exemplos | Ferramentas |
|---|---|---|
| Processo / instância | Matar um container, matar um processo por OOM, encerrar uma VM | Chaos Monkey, LitmusChaos |
| Rede | Adicionar latência, descartar pacotes, corromper pacotes, particionar um segmento de rede | Toxiproxy, Gremlin, Chaos Mesh |
| Recursos | Saturar a CPU, encher o disco, esgotar a memória, encher a tabela de descritores de arquivo | Stress-ng, Gremlin |
| Dependência | Retornar HTTP 500, injetar timeouts, retornar respostas malformadas | Wiremock, Toxiproxy |
| Estado | Corromper registros do banco de dados, fazer rollback de um deploy, expirar certificados TLS | Manual, Gremlin |
| Infraestrutura | Derrubar uma Availability Zone, perder uma região, simular a falha de uma CDN | Chaos Gorilla, AWS Fault Injection Simulator |
Controle do raio de impacto
O raio de impacto (blast radius) de um experimento de caos é o conjunto de usuários e sistemas afetados pela falha injetada. Controlá-lo é o que separa a prática de engenharia da imprudência.
flowchart TD
S1["Etapa 1\nTestes unitários / de integração\n(nenhum usuário afetado)"]
S2["Etapa 2\nAmbiente de staging / canary\n(apenas usuários internos)"]
S3["Etapa 3\n1% do tráfego de produção\n(pequeno grupo de usuários)"]
S4["Etapa 4\nProdução completa\n(todo o tráfego, todas as regiões)"]
S1 -->|a confiança aumenta| S2
S2 -->|nenhuma descoberta| S3
S3 -->|os SLIs se mantêm| S4 Controles práticos:
- Feature flags: habilitar a injeção de caos apenas para uma porcentagem das requisições.
- Janelas de tempo: rodar os experimentos apenas no horário comercial, quando a equipe está disponível para abortar.
- Condições automáticas de aborto: se um SLI cair abaixo de um limite, interromper o experimento automaticamente.
- Dark reads / tráfego sombra: rodar os experimentos contra uma cópia dos dados de produção, e não no caminho principal.
GameDay
Um GameDay é um exercício de caos planejado, envolvendo toda a equipe, em que os engenheiros introduzem falhas deliberadamente e observam se o sistema e a equipe respondem corretamente. Diferentemente dos experimentos de caos contínuos e automatizados, os GameDays são eventos colaborativos focados tanto no processo quanto na tecnologia.
Um GameDay típico:
- Briefing: o cenário é descrito para a equipe (por exemplo, "O banco de dados primário falha às 10h00"). Alternativamente, o cenário é mantido em segredo (um GameDay surpresa) para testar uma resposta a incidentes realista.
- Execução: a falha é injetada. Os engenheiros monitoram os dashboards, executam os procedimentos de resposta a incidentes e se comunicam como fariam em um incidente real.
- Observação: a equipe registra quanto tempo leva a detecção, quanto tempo leva a recuperação e quais runbooks foram eficazes.
- Debriefing: um post-mortem sem culpados identifica o que deu certo, o que falhou e quais melhorias fazer no sistema e nos runbooks.
Uma cultura sem culpados é pré-requisito
GameDays só funcionam se os engenheiros se sentirem seguros para expor problemas. Se as descobertas levam a culpa ou punição, a equipe vai evitar relatar com honestidade — e as fraquezas continuam escondidas. O resultado de um GameDay é uma lista de melhorias, não uma lista de culpados.
Ferramentas
| Ferramenta | Mantida por | Pontos fortes |
|---|---|---|
| Chaos Monkey | Netflix | Encerramento de instâncias; a original |
| Gremlin | Gremlin Inc. | SaaS; ampla biblioteca de falhas; operada por interface gráfica |
| LitmusChaos | CNCF | Nativa do Kubernetes; compatível com GitOps |
| Chaos Mesh | CNCF | Nativa do Kubernetes; ampla biblioteca de falhas |
| Toxiproxy | Shopify | Proxy TCP; adiciona latência/descarta pacotes; ideal para testes de integração |
| AWS FIS | Amazon | Integração nativa com a AWS; controlada por IAM; condições de aborto seguras |
Pré-requisito: observabilidade primeiro
Engenharia do caos sem observabilidade é perigosa e improdutiva. Antes de rodar qualquer experimento, a equipe precisa ser capaz de:
- Medir o estado estável: dashboards de SLI devem existir e mostrar os valores de referência.
- Detectar desvios: os alertas devem disparar poucos segundos após a queda de um SLI.
- Atribuir causalidade: o rastreamento distribuído deve permitir à equipe identificar qual componente introduziu a latência ou os erros.
- Abortar com segurança: um kill switch automatizado deve ser capaz de interromper o experimento imediatamente se ele ultrapassar o raio de impacto definido.
Comece pela observabilidade. Depois, adicione os padrões de resiliência. Por fim, rode experimentos de caos para validar que os padrões realmente funcionam.
-
Principles of Chaos Engineering. principlesofchaos.org. ↩↩
-
BASIRI, A. et al. Chaos Engineering. ACM Queue, 2016. ↩
-
ROSENTHAL, C.; JONES, N. Chaos Engineering: System Resiliency in Practice. O'Reilly, 2020. ↩
-
CASEY, J. Resilience Engineering: Learning to Embrace Failure. Netflix Tech Blog, 2012. ↩