Engineering Atlas › Problem Solving & Incidents (AI era)

Chaos Engineering and Game Days

11 min read · last reviewed 2026-10-17

Open in the interactive app: practice, quiz, mock interview →

In one minute

How it works

Why break things on purpose

Systems have failure modes nobody has seen yet: a timeout that is too long, a retry that amplifies load, a cache that becomes a single point of failure, a fallback that was never exercised. You will discover them either during an incident, at 3 a.m., with customers affected, or during an experiment, at 2 p.m., with a stop button and the team watching. Netflix popularised the idea with Chaos Monkey, which randomly terminates production instances so engineers build services that tolerate it; it is configured per application through Spinnaker (Chaos Monkey docs). Google runs annual DiRT (Disaster Recovery Testing) drills that push production to its limits and cause real outages, on the principle that hope is not a strategy (SRE book, ch. 33). The same chapter notes that other industries rely on live drills too, and that "what if" thought exercises alone are not considered enough.

The experiment loop

The Principles of Chaos Engineering describe the method:

  1. Define steady state as measurable output: request success rate, latency percentiles, orders per minute. Not "CPU is fine", but what users experience. The Principles say to focus on the system's measurable output rather than internal attributes.
  2. Hypothesise that steady state continues in both a control group and an experimental group.
  3. Introduce real-world faults: instance termination, network latency or packet loss, a dependency returning errors, a disk filling up, clock skew, a region becoming unreachable.
  4. Look for a difference between control and experiment. A difference is a finding.
  5. Minimise blast radius: affect a small fraction of traffic or hosts, have automatic abort conditions, and be able to stop instantly.

The Principles add three "advanced" practices on top. Run experiments in production, because systems behave differently under real traffic and the Principles say chaos "strongly prefers" production traffic. Automate experiments to run continuously, so a fix cannot silently rot. And vary the events you inject, as any event that can disrupt steady state is a candidate. This is why the advice below to start in staging is a way to build confidence and tooling, not the end state.

Game days

A game day is a planned session, often half a day, where a team runs one or more scenarios. A facilitator injects the failure (or announces a simulated one), the on-call responds as they would for real, and observers note what happens: time to detect, time to diagnose, confusion, missing access, wrong documentation. Afterwards, a short review turns observations into action items, exactly like a postmortem. Scenarios can be technical ("the primary database fails over") or organisational ("the only engineer who knows the billing system is unreachable").

Safety first

Experiments in production need guardrails: a clear owner, a time window, stakeholders informed, abort conditions tied to steady-state metrics (for example, stop if checkout success drops below 99 percent for 1 minute), automatic rollback of the fault, and a small starting blast radius. Never run an experiment you cannot stop, and do not run chaos experiments during an ongoing incident or a big launch.

Game days for the AI era

Agents and LLM features add scenarios worth practising: the model provider is down or slow (does the feature degrade gracefully?), an agent is prompt-injected (do the guardrails hold?), an agent runs a destructive command (does the kill switch work, and how long does restore take?). These are cheap to simulate and expensive to discover live.

The same shape everywhere

Fire drills, flight simulators and military exercises follow the same logic: rehearse failure in controlled conditions, measure the response, fix what failed. The goal is that the real event feels familiar.

Down the stack

Layer 1The contract

A chaos programme promises: every experiment has a written hypothesis, blast radius, abort conditions and owner; experiments run with monitoring and the ability to stop within seconds; findings are tracked like postmortem action items; and critical failure modes (instance loss, zone loss, dependency failure, database failover) are exercised on a regular schedule.

Layer 2The mechanism

Fault injection tools work at different layers. Instance and process faults: terminate VMs or pods (Chaos Monkey, kubectl delete pod). Network faults: add latency or loss with Linux traffic control (tc qdisc add dev eth0 root netem delay 200ms loss 1%), or block traffic with security groups. Application faults: service meshes such as Envoy can inject HTTP errors or delays for a percentage of requests by route. Envoy's fault filter can abort or delay requests with chosen status codes, scoped to an upstream cluster or to requests carrying certain headers (Envoy docs). Managed tools such as AWS Fault Injection Service orchestrate these with stop conditions bound to CloudWatch alarms, so an experiment halts automatically when a metric crosses a threshold; a stopped experiment cannot be resumed (AWS FIS docs).

Layer 3The machine

netem works in the kernel's queueing discipline layer: outgoing packets are held in a queue and released after the configured delay, or dropped with the configured probability, before reaching the network card's driver. Applications see real TCP behaviour as a result: dropped segments trigger retransmissions after the retransmission timeout, congestion windows shrink, and latency tails grow far more than the injected average suggests. That is why a "small" 1 percent loss experiment often reveals large effects: timeouts tuned for the average case fail on the tail that retransmissions create.

Why it's built this way

  1. Complex systems have failure modes that only appear under real faults.
  2. Finding them in an incident is costly; finding them in an experiment is cheap.
  3. Experiments in production find what staging cannot, but need strict blast-radius control.
  4. Responders also need practice, which game days provide.
  5. Findings matter only if they become fixes, so they are tracked like incident actions.

Diagram

flowchart TD
  H["Steady-state hypothesis"] --> P["Plan: fault, blast radius, abort conditions"]
  P --> R["Run on small slice with team watching"]
  R --> M{"Abort condition hit?"}
  M -->|yes| S["Stop fault, restore"]
  M -->|no| C{"Steady state held?"}
  C -->|yes| E["Expand blast radius next time"]
  C -->|no| F["Finding: fix and retest"]
  S --> F

Worked example

A team runs its first game day on the order service: 3 API pods, a Postgres primary with one replica, and Redis for sessions. Hypothesis: if one API pod is terminated, order success stays above 99.5 percent and p99 latency below 800 ms. Abort if success drops below 98 percent for 60 seconds.

Experiment 1, terminate one pod: success stays at 99.9 percent; p99 rises briefly to 650 ms. Hypothesis holds. Experiment 2, inject 300 ms latency on Redis for 25 percent of connections: success falls to 97 percent within 40 seconds and the abort fires. Finding: the session lookup has a 250 ms timeout with three retries and no fallback, so slow Redis turned into failed orders. Experiment 3, fail over Postgres: the failover completes in 35 seconds, but the on-call engineer cannot find the runbook (it moved to a new wiki), and the alert for replica lag points to a dashboard that no longer exists.

Action items: a single retry with a 400 ms budget and a fallback to re-authenticate via the token for session lookups; fix runbook links and add them to alerts; repair the dashboard. A follow-up game day a month later reruns experiment 2 and holds at 99.6 percent.

In the wild

Trade-offs

ApproachStrengthsWeaknessesChoose when
Staging experimentsSafe, easy to startStaging differs from productionLearning, new systems
Production, small blast radiusReal traffic and dependenciesSome user riskMature monitoring and rollback
Automated continuous chaosConstant pressure to stay resilientNeeds strong safeguardsLarge, mature platforms
Tabletop game day (simulated)No system risk, tests people and processDoes not test softwareEarly stage, sensitive systems
Full game day with real faultsTests everything togetherPlanning effortCritical systems, quarterly

Pitfalls in production

Leadership lens

Check yourself

  1. Why define steady state as user-facing output rather than CPU or memory?

    Show answer

    User-facing metrics show whether the system still does its job; internal metrics may change without affecting users, or stay normal while users suffer.

  2. What is the purpose of a control group in a chaos experiment?

    Show answer

    To compare against the experimental group at the same time, so changes caused by the fault are separated from normal variation in traffic.

  3. Why can 1 percent injected packet loss cause much larger latency effects?

    Show answer

    Lost segments wait for retransmission timeouts, and congestion control slows the connection, so the latency tail grows far beyond the average delay.

  4. What should you do if an experiment's abort condition fires?

    Show answer

    Stop the fault immediately, confirm recovery, and treat it as a finding to investigate and fix, not a failed experiment.

Sources and further study

Primary

Systems docs

Books

Other curricula

Free resources

Open in the interactive app: practice, quiz, mock interview →