class Leafy::Core::Meter

Constants

TICK_INTERVAL

Public Class Methods

new(clock = Clock.default_clock) click to toggle source

Creates a new {@link Meter}. @param clock the clock to use for the meter ticks

# File lib/leafy/core/meter.rb, line 18
def initialize(clock = Clock.default_clock)
  @clock = clock;
  @startTime = clock.tick
  @lastTick = Concurrent::AtomicFixnum.new(@startTime)#AtomicLong.new(startTime)
  @count = Adder.new

  @m1Rate = EWMA.oneMinuteEWMA
  @m5Rate = EWMA.fiveMinuteEWMA
  @m15Rate = EWMA.fifteenMinuteEWMA
end

Public Instance Methods

count() click to toggle source
# File lib/leafy/core/meter.rb, line 40
def count
  @count.sum
end
fifteen_minute_rate() click to toggle source
# File lib/leafy/core/meter.rb, line 45
def fifteen_minute_rate
  tickIfNecessary
  @m15Rate.rate
end
five_minute_rate() click to toggle source
# File lib/leafy/core/meter.rb, line 51
def five_minute_rate
  tickIfNecessary
  @m5Rate.rate
end
mark(n = 1) click to toggle source

Mark the occurrence of an event.

# File lib/leafy/core/meter.rb, line 30
def mark(n = 1)
  tickIfNecessary
  @count.add(n)
  @m1Rate.update(n)
  @m5Rate.update(n)
  @m15Rate.update(n)
  n
end
mean_rate() click to toggle source
# File lib/leafy/core/meter.rb, line 63
def mean_rate
  if count == 0
    0.0
  else
    elapsed = @clock.tick - @startTime
    count * 1000000000.0 / elapsed
  end
end
one_minute_rate() click to toggle source
# File lib/leafy/core/meter.rb, line 57
def one_minute_rate
  tickIfNecessary
  @m1Rate.rate
end

Private Instance Methods

tickIfNecessary() click to toggle source
# File lib/leafy/core/meter.rb, line 74
def tickIfNecessary
  oldTick = @lastTick.value #.get
  newTick = @clock.tick
  age = newTick - oldTick
  if age > TICK_INTERVAL
    newIntervalStartTick = newTick - age % TICK_INTERVAL
    if (@lastTick.compare_and_set(oldTick, newIntervalStartTick))
      requiredTicks = age / TICK_INTERVAL
      requiredTicks.to_i.times do
        @m1Rate.tick
        @m5Rate.tick
        @m15Rate.tick
      end
    end
  end
end