Class: Twingly::Metrics::Meter

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

Constant Summary collapse

TICK_INTERVAL =
5.0

Instance Method Summary collapse

Constructor Details

#initialize(averager_klass = Twingly::Metrics::EWMA) ⇒ Meter

Returns a new instance of Meter.



12
13
14
15
16
17
18
19
20
# File 'lib/twingly/metrics/meter.rb', line 12

def initialize(averager_klass = Twingly::Metrics::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



22
23
24
25
26
27
28
29
# File 'lib/twingly/metrics/meter.rb', line 22

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



57
58
59
# File 'lib/twingly/metrics/meter.rb', line 57

def count
  @count.value
end

#fifteen_minute_rateObject



71
72
73
74
# File 'lib/twingly/metrics/meter.rb', line 71

def fifteen_minute_rate
  tick_if_nessesary
  @m15_rate.rate
end

#five_minute_rateObject



66
67
68
69
# File 'lib/twingly/metrics/meter.rb', line 66

def five_minute_rate
  tick_if_nessesary
  @m5_rate.rate
end

#mark(val = 1) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/twingly/metrics/meter.rb', line 49

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



76
77
78
79
80
81
# File 'lib/twingly/metrics/meter.rb', line 76

def mean_rate
  return 0.0 if count.zero?

  elapsed = Time.now.to_f - @start_time
  count / elapsed
end

#one_minute_rateObject



61
62
63
64
# File 'lib/twingly/metrics/meter.rb', line 61

def one_minute_rate
  tick_if_nessesary
  @m1_rate.rate
end

#stopObject



83
# File 'lib/twingly/metrics/meter.rb', line 83

def stop; end

#tickObject



31
32
33
34
35
# File 'lib/twingly/metrics/meter.rb', line 31

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

#tick_if_nessesaryObject



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/twingly/metrics/meter.rb', line 37

def tick_if_nessesary
  old_tick = @last_tick.value
  new_tick = Time.new.to_f
  age = new_tick - old_tick
  return unless 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