# ReqFuse

<object data="assets/logo.png" type="image/jpeg">
  <img src="assets/fuse.png" alt="ReqFuse fuses" />

ReqFuse on Github

ReqFuse on Hex

ReqFuse on HexDocs


<!-- MDOC -->

[Req]( plugin for [`: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.

  {:req, "~> 0.3"},
  {:req_fuse, "~> 0.2"}

req_fuse_opts = [fuse_name: My.Example.Fuse]
req = [url: "", retry: :never]
|> ReqFuse.attach(req_fuse_opts)

# Fire the request enough times to melt the fuse
Enum.each(0..10, fn _ -> Req.request(req) end)
  => :ok
  => 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](, the package can be installed
by adding `req_fuse` to your list of dependencies in `mix.exs`:

def deps do
    {:req_fuse, ">= 0.2.0"}

<!-- 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]( for reference) (order matters)
    See `ReqFuse.Steps.Fuse.defaults/0` for more information.
  - `:fuse_verbose` - If false, suppress Log output

See 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](

## Updates

  See [](

  Updating the changelog. (Uses `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}'`