1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
require 'atomic'
module Metriks
class SimpleMovingAverage
INTERVAL = 5.0
SECONDS_PER_MINUTE = 60.0
ONE_MINUTE = 1
FIVE_MINUTES = 5
FIFTEEN_MINUTES = 15
def self.new_m1
new(ONE_MINUTE * SECONDS_PER_MINUTE, INTERVAL)
end
def self.new_m5
new(FIVE_MINUTES * SECONDS_PER_MINUTE, INTERVAL)
end
def self.new_m15
new(FIFTEEN_MINUTES * SECONDS_PER_MINUTE, INTERVAL)
end
def initialize(duration, interval)
@interval = interval
@duration = duration
@values = Array.new((duration / interval).to_i) { Atomic.new(nil) }
@index = Atomic.new(0)
end
def clear
@values.each do |value|
value.value = nil
end
@index.value = 0
end
def update(value)
@values[@index.value].update { |v| v ? v + value : value }
end
def tick
@index.update { |v| v < @values.length - 1 ? v + 1 : 0 }
end
def rate
num, count = 0.0, 0.0
@values.each do |value|
if v = value.value
num += v
count += 1
end
end
num / count / @interval.to_f
end
end
end
|