Home / Insights / QA and Software Testing
QA and Software Testing
Chaos Engineering: Testing Resilience Safely Before Real Failures Do It for You
Chaos engineering deliberately introduces failures to learn how systems behave and improve resilience. Done carelessly, it causes outages. This guide explains the principles, prerequisites, a safe experiment process with abort conditions and how to start small.
TopicsQA and Software TestingArchitecture and ModernizationWeb and SaaS Development
Key takeaways
- Chaos engineering is the practice of running controlled experiments that inject failures to build confidence in a system’s resilience.
- Prerequisites are good observability, defined steady-state metrics, automated rollback and team readiness.
- Every experiment needs a hypothesis, a limited blast radius, clear abort conditions and an owner watching it.
- Start in non-production or with a tiny share of traffic, and expand only as confidence grows.
- Findings matter only if they lead to fixes: timeouts, retries, fallbacks, capacity and runbooks.
On this page
Distributed systems fail in surprising ways: a slow dependency exhausts connection pools, a region outage reveals a hidden single point of failure, a retry storm turns a small problem into a large one. Chaos engineering exposes these weaknesses deliberately, under controlled conditions, so teams can fix them before customers are affected.
Principles
- Define steady state: measurable indicators of normal behaviour, such as successful checkout rate and latency.
- Form a hypothesis: “If one instance of the payment service fails, checkout success remains above 99.5%.”
- Introduce realistic failures: instance loss, latency, errors from dependencies, resource exhaustion.
- Minimise blast radius: limit the scope and duration of experiments.
- Observe and learn: compare actual behaviour with the hypothesis.
- Improve and repeat: fix weaknesses and rerun to confirm.
Prerequisites
- Observability to see the impact quickly — see our guide to observability with OpenTelemetry.
- Service level indicators that define acceptable behaviour.
- Automated rollback and the ability to stop experiments instantly.
- Incident processes and on-call readiness.
- Stakeholder agreement on when and where experiments run.
Designing a safe experiment
| Element | Example |
|---|---|
| — | — |
| Hypothesis | Losing one cache node increases latency by less than 20% and causes no errors |
| Scope | One cache node in staging; later, one node in production for 5% of traffic |
| Failure injected | Terminate the node |
| Steady-state metrics | Error rate, p95 latency, cache hit rate |
| Abort conditions | Error rate above 1% or p95 latency above 2 seconds for 2 minutes |
| Duration | 15 minutes |
| Owner and observers | Named engineer, on-call support, service owner |
| Rollback | Restore node; route traffic to healthy nodes |
Write experiments down and review them before running.
Common scenarios to test
- Loss of an instance, container or availability zone.
- Increased latency or errors from a dependency.
- Database failover.
- Exhausted connections, threads or disk space.
- Network partitions between services.
- Expired certificates or credentials.
- Sudden traffic spikes — often combined with load testing.
Game days
Game days are scheduled sessions where teams run experiments together, often simulating a realistic incident. They test not only systems but people and processes: alerts, runbooks, communication and decision-making. Debrief afterwards and track actions.
Worked example: a first game day
A hypothetical SaaS company runs its first game day on its staging environment for the order service. The team agrees steady-state metrics — order success rate and p95 latency — and three experiments: terminate one order-service instance, add two seconds of latency to the payment provider stub, and fail over the database.
- Instance loss: traffic shifts to healthy instances within seconds; no errors. Hypothesis confirmed.
- Payment latency: order requests pile up because the payment client has no timeout; thread pools exhaust and errors spike. The experiment is aborted after three minutes, as planned.
- Database failover: recovery takes four minutes instead of the expected one, because connection pools do not reconnect promptly.
Actions: add timeouts and a circuit breaker for the payment client, adjust connection pool settings and update the failover runbook. A month later, the team reruns the experiments in staging, then runs the instance-loss experiment in production for 5% of traffic.
Building a resilience programme
| Stage | Activities |
|---|---|
| — | — |
| Foundations | Observability, SLOs, timeouts and retries reviewed |
| Exploration | Staging experiments and first game days |
| Production experiments | Small blast radius, business hours, close monitoring |
| Automation | Scheduled experiments in pipelines or platforms |
| Culture | Blameless reviews, shared learning across teams |
Progress through stages as confidence and tooling mature.
Starting small
- Choose one critical service with good observability.
- Run in staging with simple failures such as terminating an instance.
- Fix findings: timeouts, retries with backoff, circuit breakers, fallbacks.
- Move to production with tiny blast radius and business-hours scheduling.
- Automate recurring experiments where confidence is high.
Common findings and fixes
| Finding | Fix |
|---|---|
| — | — |
| No timeouts on dependency calls | Set timeouts and propagate deadlines |
| Retry storms | Exponential backoff with jitter; retry budgets |
| Cascading failures | Circuit breakers and bulkheads |
| Missing fallbacks | Degraded modes such as cached data or simplified features |
| Alerts did not fire | Fix alert rules and test them |
| Runbooks outdated | Update and rehearse |
The value lies in these fixes, not in the experiment itself.
Frequently asked questions
Is chaos engineering only for large tech companies?
No. Any team running important services can benefit from small, controlled experiments, starting in staging.
Will it cause outages?
Poorly controlled experiments can. Limit blast radius, define abort conditions and run with people watching.
How is it different from load testing?
Load testing checks behaviour under traffic; chaos engineering checks behaviour when components fail. They complement each other.
How often should we run experiments?
Start with occasional game days, then automate regular experiments for critical failure modes.
Sources and methodology
Facts in this article were checked against the sources below on 6 November 2026. Directory data (ratings, review counts, rate bands and team sizes) changes over time and is shown as published on the date accessed. Illustrative examples are labelled as such and are not quotes.
- Google SRE book: Service Level Objectives — accessed 6 November 2026. Steady-state indicators and objectives used to judge experiments
Related reading
Continue your research
Not sure how your system behaves when things fail?
Share your architecture and incident history. We will help you design safe experiments, run game days and turn findings into improvements.
