Class: Metrics::Instruments::Timer

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

Constant Summary collapse

DEFAULT_PERCENTILES =
[0.25, 0.50, 0.75, 0.95, 0.97, 0.98, 0.99]

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.



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

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



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/ruby-metrics/instruments/timer.rb', line 98

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,
      :unit => @duration_unit
    }
  }
end

#clearObject



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

def clear
  @meter.clear
  @histogram.clear
end

#countObject



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

def count
  @histogram.count
end

#fifteen_minute_rateObject



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

def fifteen_minute_rate
  @meter.fifteen_minute_rate(@rate_unit)
end

#five_minute_rateObject



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

def five_minute_rate
  @meter.five_minute_rate(@rate_unit)
end

#maxObject



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

def max
  scale_duration_to_ns @histogram.max, @duration_unit
end

#meanObject



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

def mean
  scale_duration_to_ns @histogram.mean, @duration_unit
end

#mean_rateObject



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

def mean_rate
  @meter.mean_rate(@rate_unit)
end

#minObject



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

def min
  scale_duration_to_ns @histogram.min, @duration_unit
end

#one_minute_rateObject



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

def one_minute_rate
  @meter.one_minute_rate(@rate_unit)
end

#quantiles(percentiles = DEFAULT_PERCENTILES) ⇒ Object



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

def quantiles(percentiles = DEFAULT_PERCENTILES)
  @histogram.quantiles(percentiles).inject({}) do |result, (k, v)|
    result[k] = scale_duration_to_ns v, @duration_unit
    result
  end
end

#std_devObject



74
75
76
# File 'lib/ruby-metrics/instruments/timer.rb', line 74

def std_dev
  scale_duration_to_ns @histogram.std_dev, @duration_unit
end

#timeObject



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

def time
  start_time = Time.now.to_f
  result = yield
  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



117
118
119
# File 'lib/ruby-metrics/instruments/timer.rb', line 117

def to_json(*_)
  as_json.to_json
end

#update(duration, unit) ⇒ Object



29
30
31
# File 'lib/ruby-metrics/instruments/timer.rb', line 29

def update(duration, unit)
  update_timer(convert_to_ns(duration, unit))
end

#update_timer(duration) ⇒ Object



91
92
93
94
95
96
# File 'lib/ruby-metrics/instruments/timer.rb', line 91

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

#valuesObject



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

def values
  @histogram.values.map do |value|
    scale_duration_to_ns value, @duration_unit
  end
end