Class: God::Conditions::Flapping

Inherits:
TriggerCondition show all
Defined in:
lib/god/conditions/flapping.rb

Overview

Condition Symbol :flapping Type: Trigger

Trigger when a Task transitions to or from a state or states a given number of times within a given period.

Paramaters Required times is the number of times that the Task must transition before triggering. within is the number of seconds within which the Task must transition the specified number of times before triggering. You may use the sugar methods #seconds, #minutes, #hours, #days to clarify your code (see examples). --one or both of-- from_state is the state (as a Symbol) from which the transition must occur. +to_state is the state (as a Symbol) to which the transition must occur.

Optional:
+retry_in+ is the number of seconds after which to re-monitor the Task after
           it has been disabled by the condition.
+retry_times+ is the number of times after which to permanently unmonitor
              the Task.
+retry_within+ is the number of seconds within which 

Examples

Trigger if

Instance Attribute Summary collapse

Attributes inherited from God::Condition

#info, #notify, #phase, #transition

Attributes inherited from Behavior

#watch

Instance Method Summary collapse

Methods inherited from TriggerCondition

#deregister, #register, #trigger

Methods inherited from God::Condition

#friendly_name, generate, valid?

Methods inherited from Behavior

#after_restart, #after_start, #after_stop, #before_restart, #before_start, #before_stop, #friendly_name, generate

Methods included from God::Configurable

#base_name, #complain, complain, #friendly_name, #reset

Constructor Details

#initializeFlapping



41
42
43
# File 'lib/god/conditions/flapping.rb', line 41

def initialize
  self.info = "process is flapping"
end

Instance Attribute Details

#from_stateObject

Returns the value of attribute from_state.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def from_state
  @from_state
end

#retry_inObject

Returns the value of attribute retry_in.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def retry_in
  @retry_in
end

#retry_timesObject

Returns the value of attribute retry_times.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def retry_times
  @retry_times
end

#retry_withinObject

Returns the value of attribute retry_within.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def retry_within
  @retry_within
end

#timesObject

Returns the value of attribute times.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def times
  @times
end

#to_stateObject

Returns the value of attribute to_state.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def to_state
  @to_state
end

#withinObject

Returns the value of attribute within.



33
34
35
# File 'lib/god/conditions/flapping.rb', line 33

def within
  @within
end

Instance Method Details

#prepareObject



45
46
47
48
# File 'lib/god/conditions/flapping.rb', line 45

def prepare
  @timeline = Timeline.new(self.times)
  @retry_timeline = Timeline.new(self.retry_times)
end

#process(event, payload) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/god/conditions/flapping.rb', line 58

def process(event, payload)
  begin
    if event == :state_change
      event_from_state, event_to_state = *payload
      
      from_state_match = !self.from_state || self.from_state && Array(self.from_state).include?(event_from_state)
      to_state_match = !self.to_state || self.to_state && Array(self.to_state).include?(event_to_state)
      
      if from_state_match && to_state_match
        @timeline << Time.now
        
        concensus = (@timeline.size == self.times)
        duration = (@timeline.last - @timeline.first) < self.within
        
        if concensus && duration
          @timeline.clear
          trigger
          retry_mechanism
        end
      end
    end
  rescue => e
    puts e.message
    puts e.backtrace.join("\n")
  end
end

#valid?Boolean



50
51
52
53
54
55
56
# File 'lib/god/conditions/flapping.rb', line 50

def valid?
  valid = true
  valid &= complain("Attribute 'times' must be specified", self) if self.times.nil?
  valid &= complain("Attribute 'within' must be specified", self) if self.within.nil?
  valid &= complain("Attributes 'from_state', 'to_state', or both must be specified", self) if self.from_state.nil? && self.to_state.nil?
  valid
end