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
ReqFuse provides circuit-breaker (or load-shedding) functionality for HTTP requests that use the Req library.
After adding the dependencies, simply attach the ReqFuse step to your request ensuring you are passing in the required and any optional fuse configuration.
Mix.install([
{:req, "~> 0.3"},
{:req_fuse, "~> 0.3"}
])
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"}}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.3.0"}
]
endAttach the circuit-breaker :fuse step and configure the available options
:fuse_melt_func- A 1-arity function to determine if response should melt the fuse defaults toReqFuse.Steps.Fuse.melt?/1:fuse_mode- how to query the fuse, which has two values::sync- queries are serialized through the:fuse_serverprocess (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_optsThe fuse strategy options (see fuse docs for reference) (order matters) SeeReqFuse.Steps.Fuse.defaults/0for 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
ReqFuse emits telemetry events for observability:
[:req_fuse, :blown]- Emitted when a request is blocked because the fuse is blown (circuit breaker is open).
:fuse_name- The name of the fuse that is blown.
:telemetry.attach(
"req-fuse-handler",
[:req_fuse, :blown],
fn _event, _measurements, metadata, _config ->
Logger.warning("Circuit breaker open for #{inspect(metadata.fuse_name)}")
end,
nil
)See LICENSE
See 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
git tag `grep -e '@version \"\d\.\d\.\d\".*' mix.exs | awk '{gsub(/"/, "", $2); print $2}'`
