Class: Metrics::Instruments::Timer

Inherits:
Object
  • Object
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

Constructor Details

#initialize(options = {}) ⇒ Timer

Returns a new instance of Timer.



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

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.



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

def duration_unit
  @duration_unit
end

#rate_unitObject (readonly)

Returns the value of attribute rate_unit.



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

def rate_unit
  @rate_unit
end

#unitsObject (readonly)

Returns the value of attribute units.



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

def units
  @units
end

Instance Method Details

#as_json(*_) ⇒ Object



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

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



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

def clear
  @histogram.clear
end

#countObject



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

def count
  @histogram.count
end

#fifteen_minute_rateObject



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

def fifteen_minute_rate
  @meter.fifteen_minute_rate(@rate_unit)
end

#five_minute_rateObject



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

def five_minute_rate
  @meter.five_minute_rate(@rate_unit)
end

#maxObject



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

def max
  scale_duration_to_ns @histogram.max, @duration_unit
end

#meanObject



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

def mean
  scale_duration_to_ns @histogram.mean, @duration_unit
end

#mean_rateObject



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

def mean_rate
  @meter.mean_rate(@rate_unit)
end

#minObject



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

def min
  scale_duration_to_ns @histogram.min, @duration_unit
end

#one_minute_rateObject



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

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



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

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



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

def std_dev
  scale_duration_to_ns @histogram.std_dev, @duration_unit
end

#time(&block) ⇒ Object



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

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



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

def to_json(*_)
  as_json.to_json
end

#update(duration, unit) ⇒ Object



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

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

#update_timer(duration) ⇒ Object



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

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

#valuesObject



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

def values
  result = []

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

  result
end