Chaos Engineering and Resilience Testing

Chaos engineering explained: steady-state hypotheses, fault injection, blast radius, game days and building confidence that a system survives failure.

Advanced 3 min read · Updated

Chaos engineering is the practice of deliberately injecting failures into a system, carefully and in a controlled way, to find weaknesses before they cause real outages. Instead of hoping that failover, retries and timeouts work, you run experiments that prove they do: kill an instance, add network latency, fail a dependency, and check whether users notice. It turns resilience from an assumption into evidence.

holdsbreaksre-runSteady stateSLO metricsHypothesisit should holdInject a faultsmall blast radiusObservedashboards, alertsWiden the radiusmore traffic, more hostsFix the weaknessthen re-run
A chaos experiment: state what normal looks like, inject one fault with a small blast radius, and either widen the experiment or fix the weakness it found.

The experiment loop

  1. Define steady state in user-facing terms: "checkout success rate stays above 99.5% and p99 latency below 800 ms".
  2. Form a hypothesis: "if one of three payment-service instances is terminated, steady state holds because the load balancer routes around it within 10 seconds".
  3. Inject a realistic fault with a limited blast radius.
  4. Observe steady-state metrics and the system's behaviour.
  5. Stop automatically if steady state breaks beyond a threshold.
  6. Learn and fix: if the hypothesis failed, you found a weakness cheaply. Fix it and run the experiment again, then automate it.

Faults worth injecting

CategoryExamplesWhat it tests
Instance and processKill a pod or VM, crash a process, fill a diskRedundancy, restart policies, health checks
NetworkAdd latency, drop packets, partition a zone, break DNSTimeouts and retries, circuit breakers
DependenciesMake a downstream service return errors or respond slowlyFallbacks, graceful degradation, load shedding
ResourcesExhaust CPU, memory or connection poolsLimits, bulkheads, autoscaling
InfrastructureFail over a database, lose an availability zone or regionDisaster recovery plans, RTO and RPO
Time and stateClock skew, expired certificates, corrupted cache entriesAssumptions about clocks, certificate rotation

Controlling the blast radius

  • Start in staging, then in production with a tiny scope: one instance, one percent of traffic, one internal user group.
  • Run during working hours with the owning team present and incident tooling ready.
  • Define abort conditions that stop the experiment automatically when steady-state metrics degrade.
  • Announce experiments and keep a log, so they're not confused with real incidents.
  • Widen the scope only after the system passes at the smaller one.

Chaos engineering in production without good observability is just causing outages. You need clear steady-state metrics and the ability to stop instantly before you start.

Game days

A game day is a planned exercise where a team simulates a major failure, such as losing a database primary or a whole region, and practises the response: detection, communication, runbooks and recovery. Game days test people and processes as much as software, and often reveal stale runbooks, missing permissions, and alerts that never fire. They're the best way to know whether a disaster recovery plan would actually work.

Growing the practice

  • Begin with experiments against known risks from past incidents, since postmortems are a ready list of hypotheses.
  • Automate passing experiments to run continuously, so regressions in resilience are caught like failing tests.
  • Track findings and fixes; the value is in the weaknesses found and removed, not the number of experiments run.

Where it’s used

Streaming and e-commerce platforms

Instances and dependencies are routinely terminated or slowed in production to verify that customers aren't affected.

Disaster recovery validation

Regular region-evacuation game days prove that failover meets the stated RTO.

Platform teams

Automated experiments in staging check that every new service has working timeouts and health checks.

In an interview

  • Define steady state in user-facing metrics before injecting anything.
  • Write a hypothesis and an automatic abort condition.
  • Start small and widen the blast radius gradually.
  • Use game days to test people, runbooks and DR plans.

Further reading