class Bluepill::Triggers::Flapping

Constants

PARAMS
TRIGGER_STATES

Attributes

timeline[R]

Public Class Methods

new(process, options = {}) click to toggle source
Calls superclass method Bluepill::Trigger::new
# File lib/bluepill/triggers/flapping.rb, line 11
def initialize(process, options = {})
  options.reverse_merge!(times: 5, within: 1, retry_in: 5)

  options.each_pair do |name, val|
    instance_variable_set("@#{name}", val) if PARAMS.include?(name)
  end

  @timeline = Util::RotationalArray.new(@times)
  super
end

Public Instance Methods

check_flapping() click to toggle source
# File lib/bluepill/triggers/flapping.rb, line 33
def check_flapping
  # The process has not flapped if we haven't encountered enough incidents
  return unless @timeline.compact.length == times

  # Check if the incident happend within the timeframe
  return unless @timeline.last - @timeline.first <= within

  logger.info "Flapping detected: retrying in #{retry_in} seconds"

  schedule_event(:start, retry_in) unless retry_in.zero? # retry_in zero means "do not retry, ever"
  schedule_event(:unmonitor, 0)

  @timeline.clear

  # This will prevent a transition from happening in the process state_machine
  throw :halt
end
notify(transition) click to toggle source
# File lib/bluepill/triggers/flapping.rb, line 22
def notify(transition)
  return unless TRIGGER_STATES.include?(transition.to_name)
  timeline << Time.now.to_i
  check_flapping
end
reset!() click to toggle source
Calls superclass method Bluepill::Trigger#reset!
# File lib/bluepill/triggers/flapping.rb, line 28
def reset!
  @timeline.clear
  super
end