Sha256: a12245813f2a061ebd51ab2ebc9e82b2f100d5c95fff5921380d8cbf31bdae9a
Contents?: true
Size: 1.7 KB
Versions: 3
Compression:
Stored size: 1.7 KB
Contents
require_relative 'alarm' module Ring class SQA class Analyzer INTERVAL = 60 # how often to run analyze loop INFLIGHT_WAIT = 1 # how long to wait for inflight records def run sleep INTERVAL loop do start = Time.now @db.purge @db_id_seen, records = @db.nodes_down(@db_id_seen+1) sleep INFLIGHT_WAIT records = records.all @buffer.push records.map { |record| record.peer } @buffer.exceed_median? ? @alarm.set(@buffer) : @alarm.clear delay = INTERVAL-(Time.now-start) if delay > 0 sleep delay else Log.error "Analyzer loop took longer than #{INTERVAL}, wanted to sleep for #{delay}s" end end end private def initialize database, nodes @db = database @nodes = nodes @alarm = Alarm.new @db @buffer = AnalyzeBuffer.new @db_id_seen = 0 end end class AnalyzeBuffer attr_reader :array def initialize max_size=30 @max_size = max_size init_nodes = Array.new 99, '' @array = Array.new max_size, init_nodes end def push e @array.shift @array.push e end def median of_first=27 of_first = of_first-1 middle = of_first/2 node_count[0..of_first].sort[middle] end def exceed_median? last=3, tolerance=CFG.analyzer.tolerance first = @max_size-last violate = (median+1)*tolerance node_count[first..-1].all? { |e| e > violate } end def node_count @array.map { |nodes| nodes.size } end def exceeding_nodes exceed = @array[27] & @array[28] & @array[29] exceed - @array[0..26].flatten.uniq end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
ring-sqa-0.0.18 | lib/ring/sqa/analyzer.rb |
ring-sqa-0.0.16 | lib/ring/sqa/analyzer.rb |
ring-sqa-0.0.15 | lib/ring/sqa/analyzer.rb |