deliveroo/routemaster-drain

View on GitHub
lib/routemaster/api_client_circuit.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'circuitbox'
require 'routemaster/errors'
module Routemaster
  class APIClientCircuit
    def initialize(url)
      url = URI.parse(url) unless url.is_a? URI
      @circuit_name = url.host.downcase
    end

    def call(&block)
      if enabled?
        begin
          return circuit.run!(&block)
        rescue Circuitbox::ServiceFailureError => e
          raise e.original
        end
      else
        return block.call
      end
    end

    private

    def enabled?
      ENV.fetch('ROUTEMASTER_ENABLE_API_CLIENT_CIRCUIT', 'NO') =~ /\A(YES|TRUE|ON|1)\Z/i
    end

    def circuit
      Circuitbox.circuit(@circuit_name, {
        sleep_window: configuration_setting(@circuit_name, 'ROUTEMASTER_CIRCUIT_BREAKER_SLEEP_WINDOW', 60).to_i,
        time_window: configuration_setting(@circuit_name, 'ROUTEMASTER_CIRCUIT_BREAKER_TIME_WINDOW', 120).to_i,
        volume_threshold: configuration_setting(@circuit_name, 'ROUTEMASTER_CIRCUIT_BREAKER_VOLUME_THRESHOLD', 50).to_i,
        error_threshold:  configuration_setting(@circuit_name, 'ROUTEMASTER_CIRCUIT_BREAKER_ERROR_THRESHOLD', 50).to_i,
        cache: Moneta::Adapters::Redis.new(backend: Config.cache_redis),
        exceptions: [Routemaster::Errors::FatalResource, Faraday::TimeoutError]
      })
    end

    def configuration_setting(circuit_name, setting_name, default)
      ENV.fetch("#{circuit_name}.#{setting_name}", ENV.fetch(setting_name, default))
    end
  end
end