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