Cloud & Infrastructure · Reliability
Chaos Engineering Explained: Breaking Things on Purpose, Safely
Chaos engineering means deliberately injecting failure into a running system to find weaknesses before an outage does. Here's what it actually involves, what tools make it practical, and when a smaller team should and shouldn't bother.
Abhishek Gupta
5 min read
Sponsored
Most teams find out how their system handles a dependency going down when the dependency actually goes down, in production, during business hours, with customers watching. Chaos engineering is the alternative: you cause that failure yourself, on your own schedule, with your own hand on the abort switch, and find out the answer before a real outage forces it on you.
What it actually is
Chaos engineering is the discipline of deliberately injecting failure into a system, killing a process, adding artificial network latency, making a dependency return errors or time out, and observing how the system responds. The term comes out of Netflix’s engineering org, which built and open-sourced the original Chaos Monkey tool for randomly terminating instances in production to verify the rest of the fleet handled the loss gracefully.
The important detail that gets lost when people hear “chaos” is that it’s not random destruction for its own sake. A well-run chaos experiment starts with a specific hypothesis: “if the payments service becomes unavailable, checkout should degrade to a queued state instead of failing the whole request.” You inject that specific failure, observe whether the system behaves the way you predicted, and you now have evidence instead of an assumption.
Why this isn’t the same thing as testing
A unit test or integration test verifies behavior against known, controlled inputs, usually in isolation from the rest of the running system. A chaos experiment verifies behavior in the actual deployed environment, with real network topology, real load balancers, real retry and circuit-breaker logic all interacting the way they will in production. Some of the most damaging failure modes, a retry storm that overwhelms an already-struggling dependency, a timeout configured too generously for how the caller actually behaves under load, only show up when the whole system is running together under realistic conditions. No amount of unit testing catches those, because unit tests don’t exercise the interaction between components under stress.
The prerequisite almost everyone skips
Before running any chaos experiment, you need solid observability already in place: metrics, error rates, latency percentiles, and ideally distributed tracing across the services involved. Without it, injecting a failure just produces confusion. Something broke, users are seeing errors, but you can’t tell which component failed first, how the failure propagated, or whether the blast radius matched what you expected.
This is the step teams skip most often, usually because they’re excited to run their first experiment and observability feels like unrelated groundwork. It isn’t. A chaos experiment without good observability is just an outage you caused on purpose and can’t learn much from.
Starting small: the blast radius discipline
The right way to start is with the smallest experiment that still teaches you something, and the safest environment that still resembles production closely enough for the results to transfer:
# A minimal, single-variable chaos experiment definition
experiment:
name: "checkout-degrades-when-payments-times-out"
hypothesis: "Checkout falls back to a queued state within 5s when the
payments service response time exceeds 3s"
target:
service: payments-service
environment: staging
action:
type: inject_latency
duration_ms: 3500
scope: 10% # only a fraction of requests, not all of them
rollback:
automatic: true
condition: "error_rate > 5%"
observe:
- checkout_success_rate
- checkout_fallback_rate
- payments_service_error_rate
Notice the shape of that experiment: one dependency, one failure type, a defined scope, and an automatic rollback condition. That’s the opposite of the mental image “chaos” conjures. The goal on your first several experiments isn’t to cause the most dramatic failure you can imagine; it’s to build confidence in the process, in your ability to observe what happens, and in your ability to stop the experiment cleanly if it goes worse than predicted.
Once a few small experiments have gone well, and your team trusts both the process and the tooling, blast radius can grow: multiple simultaneous failures, production instead of staging, a larger percentage of traffic. That escalation should be earned through a track record, not assumed on day one.
Tools that make this practical without building your own platform
Netflix’s original tooling has since spawned an open ecosystem: Chaos Mesh and LitmusChaos for Kubernetes-native fault injection, Gremlin as a managed commercial platform, and AWS Fault Injection Service for teams already on AWS who want failure injection integrated with their existing infrastructure tooling. For a team without dedicated SRE headcount, a managed platform or a Kubernetes-native tool is usually a faster path to a real first experiment than building custom tooling, the same tradeoff that applies to most build-versus-buy infrastructure decisions.
When a small team should and shouldn’t bother
If your system has a small number of critical dependencies and you’ve never deliberately tested what happens when one of them fails, that’s the highest-value starting point regardless of team size: pick your riskiest dependency, run one small, scoped experiment against staging, and see what you learn. This connects to the same reliability thinking behind patterns like the circuit breaker: a circuit breaker is a mechanism for degrading gracefully, and a chaos experiment is how you find out whether the mechanism you built actually works the way you designed it to.
Where it stops being worth the investment is a system that’s still changing shape weekly, hasn’t stabilized its architecture, or doesn’t yet have basic monitoring in place. In that state, engineering time is better spent on observability and architectural stability first. Chaos engineering answers “does my resilience mechanism work as designed,” and that question isn’t useful yet if you don’t have a resilience mechanism to test, or can’t see clearly enough to tell if it worked.
Start with one dependency, one hypothesis, and a rollback plan. The point isn’t to prove your system is unbreakable. It’s to find out, on a Tuesday afternoon you chose, what actually happens, before a real incident picks the timing for you.
Frequently asked questions
- What is chaos engineering, in plain terms?
- It's the practice of intentionally introducing failure, a killed server process, added network latency, a dependency returning errors, into a system you're running, in order to observe how it actually behaves and find weaknesses before a real, unplanned outage finds them for you. The goal isn't to break things for its own sake; it's to replace assumptions about resilience with evidence.
- Isn't this just testing?
- It's closer to a live experiment than a test suite. A unit test verifies a function against known inputs in isolation. A chaos experiment verifies how a running, deployed system, with real network calls, real timeouts, and real retry logic, behaves when a specific failure hits it. Some failure modes, a downstream service timing out under load, a database failover taking longer than expected, only show up when the whole system is running together, not in an isolated test.
- Do I need Netflix's scale to justify doing this?
- No. The scale changes the tooling, not the underlying value. A team running a handful of services can learn a huge amount from a manual, scheduled exercise: pick one dependency, simulate it being slow or unavailable, and watch what actually happens to the rest of the system. You don't need a dedicated chaos engineering platform to get the core benefit, which is replacing an assumption with an observed fact.
- What has to be in place before running a chaos experiment?
- Observability, first and non-negotiably. If you can't already see latency, error rates, and traces for your system under normal conditions, a chaos experiment just produces confusion: something broke, but you can't tell what, why, or how badly. Get monitoring and alerting solid first. You also need a way to abort the experiment quickly if it goes worse than expected, and ideally a staging environment that resembles production closely enough for the results to transfer.
- What's the biggest mistake teams make when starting?
- Starting with too large a blast radius, running an ambitious, multi-failure scenario against production before running a small, single-variable experiment against staging. The value of chaos engineering comes from isolating one failure mode at a time and observing its effect clearly. A big, unfocused experiment that also happens to cause a real incident teaches you less than a small, controlled one, and it costs you credibility with the rest of the org for the next one you want to run.
Sources
Sponsored
More from this category
More from Cloud & Infrastructure
R.01 The AWS CloudFront Outage That Took Down Canvas, Blackboard, and Hugging Face at Once
R.02 Kubernetes 1.36 Haru: What's Actually Worth Upgrading For
R.03 AWS's Trillion-Dollar Billing Bug Is a Warning About Automated Cost Alerts
Sponsored
Discussion
Join the conversation.
Comments are powered by GitHub Discussions. Sign in with your GitHub account to leave a comment.
Sponsored