Faults are injected at different layers. At the network layer, tools manipulate the kernel using utilities like tc (traffic control) and iptables on Linux to add latency, drop a percentage of packets, or partition one host from another. At the process layer, an agent can send SIGKILL to a process, peg CPU to 100 percent, or fill up the disk. At the application layer, code or a service mesh intercepts calls and returns synthetic errors, like making 10 percent of calls to the payments service return HTTP 503.
A safe injection follows a tight loop. First you measure steady state, the normal value of a metric such as successful requests per second or p99 latency. Then you state a hypothesis: "if the recommendations service goes down, checkout latency stays under 400ms." You start small, often a single host or a tiny percentage of traffic, and you keep a kill switch ready to abort instantly.
Blast radius is the central safety control. You begin in staging, then move to production on a sliver of traffic during low-risk hours, and only widen the scope once each smaller experiment passes. Service meshes like Istio and Envoy make application-layer injection easy because they can inject HTTP delays and aborts through configuration without touching application code.