# ReqFuse <object data="assets/logo.png" type="image/jpeg"> <img src="assets/fuse.png" alt="ReqFuse fuses" /> </object> ReqFuse on Github https://github.com/carsdotcom/req_fuse ReqFuse on Hex https://hex.pm/packages/req_fuse ReqFuse on HexDocs https://hexdocs.pm/req_fuse [](https://github.com/carsdotcom/req_fuse/actions/workflows/elixir.yml) <!-- MDOC --> [Req](https://github.com/wojtekmach/req) plugin for [`:fuse`](https://github.com/jlouis/fuse) ReqFuse provides circuit-breaker (or load-shedding) functionality for HTTP requests that use the Req library. ## Usage After adding the dependencies, simply attach the ReqFuse step to your request ensuring you are passing in the required and any optional fuse configuration. ```elixir Mix.install([ {:req, "~> 0.3"}, {:req_fuse, "~> 0.2"} ]) req_fuse_opts = [fuse_name: My.Example.Fuse] req = [url: "https://httpstat.us/500", retry: :never] |> Req.new() |> ReqFuse.attach(req_fuse_opts) # Fire the request enough times to melt the fuse Enum.each(0..10, fn _ -> Req.request(req) end) => :ok Req.request(req) => 08:45:42.518 [warning] :fuse circuit breaker is open; fuse = Elixir.My.Example.Fuse => {:error, %RuntimeError{message: "circuit breaker is open"}} ``` ## Installation If [available in Hex](https://hex.pm/docs/publish), the package can be installed by adding `req_fuse` to your list of dependencies in `mix.exs`: ```elixir def deps do [ {:req_fuse, ">= 0.2.0"} ] end ``` <!-- MDOC --> ## Twiddling the Knobs Attach the circuit-breaker :fuse step and configure the available options ### Fuse Options - `:fuse_melt_func` - A 1-arity function to determine if response should melt the fuse defaults to `ReqFuse.Steps.Fuse.melt?/1` - `:fuse_mode` - how to query the fuse, which has two values: - `:sync` - queries are serialized through the `:fuse_server` process (the default) - `:async_dirty` - queries check the fuse state directly, but may not account for recent melts or resets - `:fuse_name` - **REQUIRED** the name of the fuse to install - `:fuse_opts` The fuse _strategy_ options (see [fuse docs](https://hexdocs.pm/fuse/fuse.html#types) for reference) (order matters) See `ReqFuse.Steps.Fuse.defaults/0` for more information. - `:fuse_verbose` - If false, suppress Log output See https://github.com/jlouis/fuse#tutorial for more information about the supported fuse strategies and their options. See also the additional discussion on options in `ReqFuse.Steps.Fuse` ## License See [LICENSE](https://github.com/carsdotcom/req_fuse/blob/main/LICENSE) ## Updates See [CHANGELOG.md](https://github.com/carsdotcom/req_fuse/blob/main/CHANGELOG.md) Updating the changelog. (Uses `auto-changelog`) https://github.com/cookpete/auto-changelog `auto-changelog --breaking-pattern "BREAKING CHANGE" --template keepachangelog --commit-limit false --unreleased` ### Tagging by version in mix.exs ``` git tag `grep -e '@version \"\d\.\d\.\d\".*' mix.exs | awk '{gsub(/"/, "", $2); print $2}'` ```