Engenharia do caos no CI para validar timeouts, queda de servicos e degradacao de conexoes com tratamento robusto de erros.
CI e a pratica de integrar codigo com frequencia e validar automaticamente build + testes a cada commit/merge.
.gitlab-ci.ymlstages:
- validate
- test
- chaos
- quality_gate
default:
image: mcr.microsoft.com/dotnet/sdk:8.0
variables:
DOTNET_CLI_TELEMETRY_OPTOUT: "1"
lint:
stage: validate
script:
- dotnet format --verify-no-changes
unit_tests:
stage: test
script:
- dotnet test tests/Unit
chaos_timeout:
stage: chaos
script:
- dotnet test tests/Chaos --filter "Category=Timeout"
quality_gate:
stage: quality_gate
script:
- ./scripts/check-slo.sh --max-error-rate 1 --max-p95 350Engenharia do caos e provocar falhas controladas para validar se o sistema continua seguro, previsivel e recuperavel.
Amplifica falha e derruba dependencia.
Threads ocupadas e fila acumulando.
Falha em cascata por toda a cadeia.
| Estado | Comportamento | Meta operacional |
|---|---|---|
| Closed | Fluxo normal, monitorando taxa de falha | Operacao plena |
| Open | Bloqueia chamadas para dependencia instavel | Evitar saturacao e cascata |
| Half-open | Permite poucas chamadas de teste | Validar recuperacao gradual |
builder.Services.AddHttpClient("orders-api", client =>
{
client.BaseAddress = new Uri("https://orders.internal");
client.Timeout = TimeSpan.FromSeconds(2);
})
.AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(2))
.AddPolicyHandler(Policy
.Handle<HttpRequestException>()
.OrResult(r => (int)r.StatusCode >= 500)
.WaitAndRetryAsync(3, retry => TimeSpan.FromMilliseconds(200 * Math.Pow(2, retry))))
.AddPolicyHandler(Policy
.Handle<HttpRequestException>()
.OrResult(r => (int)r.StatusCode >= 500)
.CircuitBreakerAsync(
handledEventsAllowedBeforeBreaking: 5,
durationOfBreak: TimeSpan.FromSeconds(30)));
// Fallback pode devolver resposta degradada com cache/local snapshot.jobs:
chaos-tests:
steps:
- run: dotnet test tests/Unit
- run: dotnet test tests/Integration
- run: dotnet test tests/Chaos --filter "Category=Timeout"
- run: dotnet test tests/Chaos --filter "Category=ServerDown"
- run: dotnet test tests/Chaos --filter "Category=ConnectionFlaky"
- run: ./scripts/check-slo.sh --max-error-rate 1 --max-p95 350| Tipo de operacao | Politica minima | Fallback |
|---|---|---|
| Leitura nao critica | Timeout curto + retry baixo | Cache com staleness controlado |
| Comando critico | Timeout + breaker + idempotencia | Fila para reprocessamento seguro |
| Integracao externa | Retry com jitter + breaker | Resposta degradada + alerta |
| Operacao longa | Assincrono + DLQ + observabilidade | Status pendente e notificacao posterior |
Plano de execucao do teste de caos
| Etapa | O que fazer | Evidencia esperada |
|---|---|---|
| 1. Definir alvo | Escolher uma rota/operacao e dependencia critica (DB, API externa, broker). | Descricao do caso de uso e do comportamento esperado sem falha. |
| 2. Definir hipotese | Especificar como o sistema deve reagir (timeout, retry, fallback, breaker). | Criterio objetivo de sucesso/falha. |
| 3. Injetar falha | Executar chaos test (timeout, server down ou conexao intermitente). | Log/print do experimento e erro provocado. |
| 4. Validar resiliencia | Comprovar degradacao segura e recuperacao controlada. | Resposta funcional ao usuario + estado do breaker/retry/fallback. |
| 5. Mostrar metricas | Apresentar indicadores de gate no CI. | Error rate, p95/p99 e pelo menos 1 metrica de resiliencia. |