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 => [],
:forward_unknown_exceptions => true,
:raise_on_opening => false,
:exceptions => [StandardError, RuntimeError]
}

Class Method Summary collapse

Class Method Details

.default_configObject



19
20
21
# File 'lib/sc4ry/circuits.rb', line 19

def Circuits.default_config
  return @@config
end

.default_config=(config) ⇒ Object



23
24
25
# File 'lib/sc4ry/circuits.rb', line 23

def Circuits.default_config=(config)
  @@config = config
end

.get(options) ⇒ Object



40
41
42
# File 'lib/sc4ry/circuits.rb', line 40

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

.listObject



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

def Circuits.list
  return @@circuits_store.list
end

.register(options = {}) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/sc4ry/circuits.rb', line 27

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



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/sc4ry/circuits.rb', line 44

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