Class: Sc4ry::Circuits

Inherits:
Object
  • Object
show all
Defined in:
lib/sc4ry/circuits.rb

Constant Summary collapse

@@circuits_store =
Sc4ry::Store.instance
@@config =
{ :max_failure_count => 5,
:timeout_value => 20,
:timeout => false,
:max_timeout_count => 5,
:max_time => 10,
:max_overtime_count => 3,
:check_delay => 30,
:notifiers => [],
:exceptions => [StandardError, RuntimeError]
}

Class Method Summary collapse

Class Method Details

.default_configObject



17
18
19
# File 'lib/sc4ry/circuits.rb', line 17

def Circuits.default_config
  return @@config
end

.get(options) ⇒ Object



34
35
36
# File 'lib/sc4ry/circuits.rb', line 34

def Circuits.get(options)
  @@circuits_store.get key: options[:circuit]
end

.listObject



29
30
31
# File 'lib/sc4ry/circuits.rb', line 29

def Circuits.list
  return @@circuits_store.list
end

.register(options = {}) ⇒ Object



21
22
23
24
25
26
27
# File 'lib/sc4ry/circuits.rb', line 21

def Circuits.register(options = {})
  raise ":circuit is mandatory" unless options[:circuit]
  name = options[:circuit]
  override = (options[:config].class == Hash)? options[:config] : {}
  config = @@config.merge override
  @@circuits_store.put key: name, value: config 
end

.run(options = {}, &block) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/sc4ry/circuits.rb', line 38

def Circuits.run(options = {}, &block)
  circuits_list = Circuits.list
  raise "No circuit block given" unless block_given?
  raise "No circuits defined" if circuits_list.empty? 
  circuit_name = (options[:circuit])? options[:circuit] : circuits_list.first
  raise "Circuit #{circuit_name} not found" unless circuits_list.include? circuit_name
  circuit = Circuits.get circuit: circuit_name
  skip = false
  if circuit.include? :status then
    if circuit[:status][:general] == :open then 
      @now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
      skip = true if ((@now - circuit[:values].last[:end_time]) <  circuit[:check_delay])
    end
  end
  unless skip 
    controller = Sc4ry::RunController.new(circuit)
    Circuits.control circuit: circuit_name, values: controller.run(block: block)
  end
  Sc4ry::Helpers.log level: :info, message: "Circuit #{circuit_name} : status #{circuit[:status]}"

end