Class: Metrics::Instruments::Timer

Inherits:
Instrument show all
Includes:
TimeConversion
Defined in:
lib/ruby-metrics/instruments/timer.rb

Constant Summary

Constants included from TimeConversion

TimeConversion::UNITS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TimeConversion

#convert_to_ns, #scale_time_units

Methods inherited from Instrument

#tag, #tags

Constructor Details

#initialize(options = {}) ⇒ Timer

Returns a new instance of Timer.



11
12
13
14
15
16
17
18
19
20
# File 'lib/ruby-metrics/instruments/timer.rb', line 11

def initialize(options = {})
  @meter          = Meter.new
  @histogram      = ExponentialHistogram.new

  @duration_unit  = options[:duration_unit] || :seconds
  @rate_unit      = options[:rate_unit] || :seconds
  @units          = options[:units]
  
  clear
end

Instance Attribute Details

#duration_unitObject (readonly)

Returns the value of attribute duration_unit.



9
10
11
# File 'lib/ruby-metrics/instruments/timer.rb', line 9

def duration_unit
  @duration_unit
end

#rate_unitObject (readonly)

Returns the value of attribute rate_unit.



9
10
11
# File 'lib/ruby-metrics/instruments/timer.rb', line 9

def rate_unit
  @rate_unit
end

#unitsObject (readonly)

Returns the value of attribute units.



9
10
11
# File 'lib/ruby-metrics/instruments/timer.rb', line 9

def units
  @units
end

Instance Method Details

#as_json(*_) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/ruby-metrics/instruments/timer.rb', line 103

def as_json(*_)
  {
    :count => count,
    :rates => {
      :one_minute_rate => one_minute_rate,
      :five_minute_rate => five_minute_rate,
      :fifteen_minute_rate => fifteen_minute_rate,
      :unit => @rate_unit
    },
    :durations => {
      :min => min,
      :max => max,
      :mean => mean,
      :percentiles => quantiles([0.25, 0.50, 0.75, 0.95, 0.97, 0.98, 0.99]),
      :unit => @duration_unit
    }
  }
end

#clearObject



22
23
24
# File 'lib/ruby-metrics/instruments/timer.rb', line 22

def clear
  @histogram.clear
end

#countObject



40
41
42
# File 'lib/ruby-metrics/instruments/timer.rb', line 40

def count
  @histogram.count
end

#fifteen_minute_rateObject



44
45
46
# File 'lib/ruby-metrics/instruments/timer.rb', line 44

def fifteen_minute_rate
  @meter.fifteen_minute_rate(@rate_unit)
end

#five_minute_rateObject



48
49
50
# File 'lib/ruby-metrics/instruments/timer.rb', line 48

def five_minute_rate
  @meter.five_minute_rate(@rate_unit)
end

#maxObject



60
61
62
# File 'lib/ruby-metrics/instruments/timer.rb', line 60

def max
  scale_duration_to_ns @histogram.max, @duration_unit
end

#meanObject



68
69
70
# File 'lib/ruby-metrics/instruments/timer.rb', line 68

def mean
  scale_duration_to_ns @histogram.mean, @duration_unit
end

#mean_rateObject



56
57
58
# File 'lib/ruby-metrics/instruments/timer.rb', line 56

def mean_rate
  @meter.mean_rate(@rate_unit)
end

#minObject



64
65
66
# File 'lib/ruby-metrics/instruments/timer.rb', line 64

def min
  scale_duration_to_ns @histogram.min, @duration_unit
end

#one_minute_rateObject



52
53
54
# File 'lib/ruby-metrics/instruments/timer.rb', line 52

def one_minute_rate
  @meter.one_minute_rate(@rate_unit)
end

#quantiles(percentiles = [0.99,0.97,0.95,0.75,0.5,0.25]) ⇒ Object



76
77
78
79
80
81
82
83
84
# File 'lib/ruby-metrics/instruments/timer.rb', line 76

def quantiles(percentiles = [0.99,0.97,0.95,0.75,0.5,0.25])
  result = {}

  @histogram.quantiles(percentiles).each do |k,v|
    result[k] = scale_duration_to_ns v, @duration_unit
  end

  result
end

#std_devObject



72
73
74
# File 'lib/ruby-metrics/instruments/timer.rb', line 72

def std_dev
  scale_duration_to_ns @histogram.std_dev, @duration_unit
end

#time(&block) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/ruby-metrics/instruments/timer.rb', line 31

def time(&block)
  start_time = Time.now.to_f
  result = block.call
  time_diff = Time.now.to_f - start_time
  time_in_ns = convert_to_ns time_diff, :seconds
  update_timer(time_in_ns)
  result
end

#to_json(*_) ⇒ Object



122
123
124
# File 'lib/ruby-metrics/instruments/timer.rb', line 122

def to_json(*_)
  as_json.to_json
end

#update(duration, unit) ⇒ Object



26
27
28
29
# File 'lib/ruby-metrics/instruments/timer.rb', line 26

def update(duration, unit)
  mult = convert_to_ns(1, unit)
  self.update_timer(duration * mult)
end

#update_timer(duration) ⇒ Object



96
97
98
99
100
101
# File 'lib/ruby-metrics/instruments/timer.rb', line 96

def update_timer(duration)
  if duration >= 0
    @histogram.update(duration)
    @meter.mark
  end
end

#valuesObject



86
87
88
89
90
91
92
93
94
# File 'lib/ruby-metrics/instruments/timer.rb', line 86

def values
  result = []

  @histogram.values.each do |value|
    result << (scale_duration_to_ns value, @duration_unit)
  end

  result
end