class FoucaultHttp::Circuit

Constants

MAX_RETRIES

Attributes

circuit[R]

Public Class Methods

monad_circuit_wrapper_fn() click to toggle source

Provides a wrapper fn that allows a monad result to be thrown as an exception so that Stoplight can execute retry behaviour.

# File lib/foucault_http/circuit.rb, line 21
def monad_circuit_wrapper_fn
  -> caller { result = caller.(); result.success? ? result : raise(FoucaultHttp::MonadException.new(result: result)) }
end
new(name:, max_retries: MAX_RETRIES) click to toggle source
# File lib/foucault_http/circuit.rb, line 26
def initialize(name:, max_retries: MAX_RETRIES)
  # redis = Redis.new
  # datastore = Stoplight::DataStore::Redis.new(redis)
  # Stoplight::Light.default_data_store = datastore
  @name = name
  @max_retries = max_retries
end

Public Instance Methods

call(circuit_fn: , caller: nil) click to toggle source
# File lib/foucault_http/circuit.rb, line 34
def call(circuit_fn: , caller: nil)
  info(msg: "CircuitBreaker: #{circuit_to_s}", service_name: @name)
  @circuit = if caller.nil?
                Stoplight(@name) { circuit_fn.() }.with_threshold(@max_retries).with_cool_off_time(10)
              else
                Stoplight(@name) { circuit_fn.(caller) }.with_threshold(@max_retries).with_cool_off_time(10)#.with_fallback {|e| binding.pry; e.result}
              end
  run(@circuit)
end
circuit_failure() click to toggle source
# File lib/foucault_http/circuit.rb, line 67
def circuit_failure
  NetResponseValue.new(
    status: NetResponseValue::CIRCUIT_RED,
    body: nil,
    code: 500
  )
end
circuit_to_s() click to toggle source
# File lib/foucault_http/circuit.rb, line 75
def circuit_to_s
  "Circuit: #{@name}"
end
colour() click to toggle source
# File lib/foucault_http/circuit.rb, line 63
def colour
  @circuit.color
end
failures() click to toggle source
# File lib/foucault_http/circuit.rb, line 59
def failures
  Stoplight::Light.default_data_store.get_failures(@circuit)
end
run(circuit) click to toggle source
# File lib/foucault_http/circuit.rb, line 44
def run(circuit)
  begin
    circuit.run
  rescue Stoplight::Error::RedLight => e
    info({msg: "CircuitBreaker: #{circuit_to_s}", service_name: @name, circuit_state: "red"})
    @last_error
  rescue FoucaultHttp::MonadException => e
    @last_error = e.result
    retry
  rescue StandardError => e
    @last_error = e
    retry
  end
end