Class: Metriks::Meter

Inherits:
Object
  • Object
show all
Defined in:
lib/metriks/meter.rb

Constant Summary collapse

TICK_INTERVAL =
5.0

Instance Method Summary collapse

Constructor Details

#initialize(averager_klass = Metriks::EWMA) ⇒ Meter

Returns a new instance of Meter.



9
10
11
12
13
14
15
16
17
# File 'lib/metriks/meter.rb', line 9

def initialize(averager_klass = Metriks::EWMA)
  @count = Atomic.new(0)
  @start_time = Time.now.to_f
  @last_tick = Atomic.new(@start_time)

  @m1_rate  = averager_klass.new_m1
  @m5_rate  = averager_klass.new_m5
  @m15_rate = averager_klass.new_m15
end

Instance Method Details

#clearObject



19
20
21
22
23
24
25
26
# File 'lib/metriks/meter.rb', line 19

def clear
  @count.value = 0
  @start_time = Time.now.to_f
  @last_tick.value = @start_time
  @m1_rate.clear
  @m5_rate.clear
  @m15_rate.clear
end

#countObject



54
55
56
# File 'lib/metriks/meter.rb', line 54

def count
  @count.value
end

#fifteen_minute_rateObject



68
69
70
71
# File 'lib/metriks/meter.rb', line 68

def fifteen_minute_rate
  tick_if_nessesary
  @m15_rate.rate
end

#five_minute_rateObject



63
64
65
66
# File 'lib/metriks/meter.rb', line 63

def five_minute_rate
  tick_if_nessesary
  @m5_rate.rate
end

#mark(val = 1) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/metriks/meter.rb', line 46

def mark(val = 1)
  tick_if_nessesary
  @count.update { |v| v + val }
  @m1_rate.update(val)
  @m5_rate.update(val)
  @m15_rate.update(val)
end

#mean_rateObject



73
74
75
76
77
78
79
80
# File 'lib/metriks/meter.rb', line 73

def mean_rate
  if count == 0
    return 0.0
  else
    elapsed = Time.now.to_f - @start_time
    count / elapsed
  end
end

#one_minute_rateObject



58
59
60
61
# File 'lib/metriks/meter.rb', line 58

def one_minute_rate
  tick_if_nessesary
  @m1_rate.rate
end

#stopObject



82
83
# File 'lib/metriks/meter.rb', line 82

def stop
end

#tickObject



28
29
30
31
32
# File 'lib/metriks/meter.rb', line 28

def tick
  @m1_rate.tick
  @m5_rate.tick
  @m15_rate.tick
end

#tick_if_nessesaryObject



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/metriks/meter.rb', line 34

def tick_if_nessesary
  old_tick = @last_tick.value
  new_tick = Time.new.to_f
  age = new_tick - old_tick
  if age > TICK_INTERVAL && @last_tick.compare_and_swap(old_tick, new_tick)
    required_ticks = age / TICK_INTERVAL
    required_ticks.to_i.times do
      tick
    end
  end
end