Chaos Spawn

Build Status

What and why

Inspired by netfix's chaos monkey. This library is intended to be a low level process based equivalent. It works by replacing the Kernel.spawn functions with overidden ones that return processes that die at random. This should force an app's supervision tree to actually work.

Currently super alpha. Probably not a good idea to use yet.

Usage

Add Chaos Spawn as an application in your mix.exs:

def application do
[applications: [:logger, :chaos_spawn]]
end

Usage - in manual spawns

Use ChaosSpawn.Chaotic.Spawn in any module you wish to have unreliable spawn calls. This will automatically replace the spawn calls with the versions from the ChaosSpawn module.

defmodule ChaosSpawn.Example.Spawn do
# Using the following will automatically replace all the spawn
# functions with the chaotic ones.
use ChaosSpawn.Chaotic.Spawn
def test do
spawn fn ->
IO.puts "waiting for message"
receive do
_ -> IO.puts "message recieved!"
end
end
end
end

Usage - in Gen servers

Instead of useing GenServer use the chaotic version and then modify the start_link as below:

defmodule ChaosSpawn.Example.GenServer do
use ChaosSpawn.Chaotic.GenServer
def start_link(opts \\ []) do
# This function is imported when using ChaosSpawn.Chaotic.GenServer
start_chaotic_link(__MODULE__, :ok, opts)
# or to switch to the non chaotic version this is imported from GenServer:
# start_link(__MODULE__, :ok, opts)
end
end

Usage - in Gen events

Replace GenEvent.start_link with ChaosSpawn.Chaotic.GenEvent.start_link.

{:ok, pid} = ChaosSpawn.Chaotic.GenEvent.start_link([])
GenEvent.add_handler(pid, SomeHandler, [])

Config

Two keys are provided. The first kill_tick is the delay in milliseconds that between chaos spawn checking for processes to kill. kill_probability is a float between 0 and 1 that determines the probability of a process being killed each tick.

config :chaos_spawn, :kill_tick, 1000
config :chaos_spawn, :kill_probability, 0.1

Contributing

Contributions to this repo are more than welcome. Guidlines for succesfull PRs: