hitimes 1.3.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -12
- data/HISTORY.md +26 -2
- data/Manifest.txt +5 -31
- data/README.md +44 -59
- data/hitimes.gemspec +26 -0
- data/lib/hitimes/initialize.rb +104 -0
- data/lib/hitimes/instant.rb +41 -0
- data/lib/hitimes/interval.rb +171 -0
- data/lib/hitimes/metric.rb +18 -22
- data/lib/hitimes/mutexed_stats.rb +3 -20
- data/lib/hitimes/paths.rb +16 -14
- data/lib/hitimes/stats.rb +119 -22
- data/lib/hitimes/timed_metric.rb +43 -42
- data/lib/hitimes/timed_value_metric.rb +43 -43
- data/lib/hitimes/value_metric.rb +16 -15
- data/lib/hitimes/version.rb +3 -1
- data/lib/hitimes.rb +14 -41
- metadata +24 -157
- data/Rakefile +0 -28
- data/examples/benchmarks.rb +0 -113
- data/examples/stats.rb +0 -31
- data/ext/hitimes/c/extconf.rb +0 -24
- data/ext/hitimes/c/hitimes.c +0 -37
- data/ext/hitimes/c/hitimes_instant_clock_gettime.c +0 -28
- data/ext/hitimes/c/hitimes_instant_osx.c +0 -48
- data/ext/hitimes/c/hitimes_instant_windows.c +0 -27
- data/ext/hitimes/c/hitimes_interval.c +0 -370
- data/ext/hitimes/c/hitimes_interval.h +0 -73
- data/ext/hitimes/c/hitimes_stats.c +0 -269
- data/ext/hitimes/c/hitimes_stats.h +0 -30
- data/ext/hitimes/java/src/hitimes/Hitimes.java +0 -63
- data/ext/hitimes/java/src/hitimes/HitimesInterval.java +0 -176
- data/ext/hitimes/java/src/hitimes/HitimesService.java +0 -16
- data/ext/hitimes/java/src/hitimes/HitimesStats.java +0 -112
- data/spec/hitimes_spec.rb +0 -24
- data/spec/interval_spec.rb +0 -136
- data/spec/metric_spec.rb +0 -28
- data/spec/mutex_stats_spec.rb +0 -36
- data/spec/paths_spec.rb +0 -11
- data/spec/spec_helper.rb +0 -11
- data/spec/stats_spec.rb +0 -98
- data/spec/timed_metric_spec.rb +0 -155
- data/spec/timed_value_metric_spec.rb +0 -171
- data/spec/value_metric_spec.rb +0 -108
- data/spec/version_spec.rb +0 -7
- data/tasks/default.rake +0 -242
- data/tasks/extension.rake +0 -38
- data/tasks/this.rb +0 -208
- /data/{LICENSE → LICENSE.txt} +0 -0
data/lib/hitimes/metric.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
#--
|
3
4
|
# Copyright (c) 2008, 2009 Jeremy Hinegardner
|
@@ -13,15 +14,14 @@ module Hitimes
|
|
13
14
|
# * The name of the metric
|
14
15
|
# * The time of day the first measurement is taken
|
15
16
|
# * The time of day the last measurement is taken
|
16
|
-
# * additional data
|
17
|
+
# * additional data
|
17
18
|
#
|
18
19
|
# Each derived class is assumed to set the sampling_start_time and
|
19
20
|
# sampling_stop_time appropriately.
|
20
|
-
#
|
21
|
+
#
|
21
22
|
# Metric itself should generally not be used. Only use the derived classes.
|
22
23
|
#
|
23
24
|
class Metric
|
24
|
-
|
25
25
|
# the number of seconds as a float since the sampling_start_time
|
26
26
|
attr_reader :sampling_delta
|
27
27
|
|
@@ -41,7 +41,7 @@ module Hitimes
|
|
41
41
|
# +additional_data+ may be anything that follows the +to_hash+ protocol.
|
42
42
|
# +name+ may be anything that follows the +to_s+ protocol.
|
43
43
|
#
|
44
|
-
def initialize(
|
44
|
+
def initialize(name, additional_data = {})
|
45
45
|
@sampling_start_time = nil
|
46
46
|
@sampling_start_interval = nil
|
47
47
|
@sampling_delta = 0
|
@@ -51,7 +51,7 @@ module Hitimes
|
|
51
51
|
end
|
52
52
|
|
53
53
|
#
|
54
|
-
# :call-seq:
|
54
|
+
# :call-seq:
|
55
55
|
# metric.sampling_start_time -> Float or nil
|
56
56
|
#
|
57
57
|
# The time at which the first sample was taken.
|
@@ -60,11 +60,9 @@ module Hitimes
|
|
60
60
|
# If the metric has not started measuring then the start time is nil.
|
61
61
|
#
|
62
62
|
def sampling_start_time
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
nil
|
67
|
-
end
|
63
|
+
return unless @sampling_start_interval
|
64
|
+
|
65
|
+
@sampling_start_time ||= utc_microseconds
|
68
66
|
end
|
69
67
|
|
70
68
|
#
|
@@ -73,8 +71,8 @@ module Hitimes
|
|
73
71
|
#
|
74
72
|
# The time at which the last sample was taken
|
75
73
|
# This is the number of microseconds since UNIX epoch UTC as a Float
|
76
|
-
#
|
77
|
-
# If the metric has not completely measured at least one thing then
|
74
|
+
#
|
75
|
+
# If the metric has not completely measured at least one thing then
|
78
76
|
# stop time is nil.
|
79
77
|
#
|
80
78
|
# Because accessing the actual 'time of day' is an expesive operation, we
|
@@ -84,11 +82,9 @@ module Hitimes
|
|
84
82
|
# When sampling_stop_time is called, the actual time of day is caculated.
|
85
83
|
#
|
86
84
|
def sampling_stop_time
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
nil
|
91
|
-
end
|
85
|
+
return unless @sampling_delta.positive?
|
86
|
+
|
87
|
+
(sampling_start_time + (@sampling_delta * 1_000_000))
|
92
88
|
end
|
93
89
|
|
94
90
|
#
|
@@ -96,13 +92,13 @@ module Hitimes
|
|
96
92
|
# metric.to_hash -> Hash
|
97
93
|
# metric.to_hash
|
98
94
|
#
|
99
|
-
# Convert the metric to a Hash.
|
95
|
+
# Convert the metric to a Hash.
|
100
96
|
#
|
101
97
|
def to_hash
|
102
|
-
{
|
103
|
-
|
104
|
-
|
105
|
-
|
98
|
+
{ "sampling_start_time" => sampling_start_time,
|
99
|
+
"sampling_stop_time" => sampling_stop_time,
|
100
|
+
"additional_data" => additional_data,
|
101
|
+
"name" => name, }
|
106
102
|
end
|
107
103
|
|
108
104
|
#
|
@@ -1,32 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Copyright (c) 2008, 2009 Jeremy Hinegardner
|
3
5
|
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
6
|
#++
|
5
7
|
|
6
|
-
require 'thread'
|
7
|
-
|
8
8
|
module Hitimes
|
9
9
|
#
|
10
10
|
# MutexedStats is the start of a threadsafe Stats class. Currently, on MRI
|
11
11
|
# Ruby the Stats object is already threadsafe, so there is no need to use
|
12
12
|
# MutexedStats.
|
13
13
|
#
|
14
|
-
|
15
|
-
def initialize
|
16
|
-
@mutex = Mutex.new
|
17
|
-
end
|
18
|
-
|
19
|
-
# call-seq:
|
20
|
-
# mutex_stat.update( val ) -> nil
|
21
|
-
#
|
22
|
-
# Update the running stats with the new value in a threadsafe manner.
|
23
|
-
#
|
24
|
-
def update( value )
|
25
|
-
@mutex.synchronize do
|
26
|
-
super( value )
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
14
|
+
MutexedStats = Stats
|
30
15
|
end
|
31
|
-
|
32
|
-
|
data/lib/hitimes/paths.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Copyright (c) 2008 Jeremy Hinegardner
|
3
5
|
# All rights reserved. See LICENSE and/or COPYING for details.
|
@@ -8,34 +10,34 @@ module Hitimes
|
|
8
10
|
# Access to various paths inside the project programatically
|
9
11
|
#
|
10
12
|
module Paths
|
11
|
-
#
|
13
|
+
#
|
12
14
|
# :call-seq:
|
13
15
|
# Hitimes::Paths.root_dir -> String
|
14
16
|
#
|
15
17
|
# Returns The full expanded path of the parent directory of +lib+
|
16
|
-
# going up the path from the current file. A trailing File::SEPARATOR
|
18
|
+
# going up the path from the current file. A trailing File::SEPARATOR
|
17
19
|
# is guaranteed.
|
18
|
-
#
|
20
|
+
#
|
19
21
|
def self.root_dir
|
20
|
-
@root_dir ||=
|
22
|
+
@root_dir ||= begin
|
21
23
|
path_parts = ::File.expand_path(__FILE__).split(::File::SEPARATOR)
|
22
24
|
lib_index = path_parts.rindex("lib")
|
23
25
|
@root_dir = path_parts[0...lib_index].join(::File::SEPARATOR) + ::File::SEPARATOR
|
24
|
-
|
25
|
-
end
|
26
|
+
end
|
27
|
+
end
|
26
28
|
|
27
|
-
#
|
29
|
+
#
|
28
30
|
# :call-seq:
|
29
31
|
# Hitimes::Paths.lib_path( *args ) -> String
|
30
32
|
#
|
31
33
|
# Returns The full expanded path of the +lib+ directory below
|
32
|
-
# _root_dir_. All parameters passed in are joined onto the
|
33
|
-
# result. A trailing File::SEPARATOR is guaranteed if
|
34
|
+
# _root_dir_. All parameters passed in are joined onto the
|
35
|
+
# result. A trailing File::SEPARATOR is guaranteed if
|
34
36
|
# _args_ are *not* present.
|
35
|
-
#
|
37
|
+
#
|
36
38
|
def self.lib_path(*args)
|
37
|
-
|
38
|
-
end
|
39
|
+
sub_path("lib", *args)
|
40
|
+
end
|
39
41
|
|
40
42
|
#
|
41
43
|
# :call-seq:
|
@@ -45,9 +47,9 @@ module Hitimes
|
|
45
47
|
# _arg_ parameters passed in are joined onto the result. A trailing
|
46
48
|
# File::SEPARATOR is guaranteed if _args_ are *not* present.
|
47
49
|
#
|
48
|
-
def self.sub_path(sub
|
50
|
+
def self.sub_path(sub, *args)
|
49
51
|
sp = ::File.join(root_dir, sub) + File::SEPARATOR
|
50
|
-
|
52
|
+
::File.join(sp, *args) if args
|
51
53
|
end
|
52
54
|
end
|
53
55
|
end
|
data/lib/hitimes/stats.rb
CHANGED
@@ -1,34 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Copyright (c) 2008, 2009 Jeremy Hinegardner
|
3
5
|
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
6
|
#++
|
5
7
|
|
6
|
-
require
|
8
|
+
require "stringio"
|
7
9
|
module Hitimes
|
10
|
+
#
|
11
|
+
# The Stats class encapulsates capturing and reporting statistics. It is
|
12
|
+
# modeled after the RFuzz::Sampler class, but implemented in C. For general use
|
13
|
+
# you allocate a new Stats object, and then update it with new values. The
|
14
|
+
# Stats object will keep track of the _min_, _max_, _count_, _sum_ and _sumsq_
|
15
|
+
# and when you want you may also retrieve the _mean_, _stddev_ and _rate_.
|
16
|
+
#
|
17
|
+
# this contrived example shows getting a list of all the files in a directory
|
18
|
+
# and running stats on file sizes.
|
19
|
+
#
|
20
|
+
# s = Hitimes::Stats.new
|
21
|
+
# dir = ARGV.shift || Dir.pwd
|
22
|
+
# Dir.entries( dir ).each do |entry|
|
23
|
+
# fs = File.stat( entry )
|
24
|
+
# if fs.file? then
|
25
|
+
# s.update( fs.size )
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# %w[ count min max mean sum stddev rate ].each do |m|
|
30
|
+
# puts "#{m.rjust(6)} : #{s.send( m ) }"
|
31
|
+
# end
|
32
|
+
#
|
8
33
|
class Stats
|
9
34
|
# A list of the available stats
|
10
|
-
STATS = %w[
|
35
|
+
STATS = %w[count max mean min rate stddev sum sumsq].freeze
|
36
|
+
|
37
|
+
attr_reader :min, :max, :count, :sum, :sumsq
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
@mutex = Mutex.new
|
41
|
+
@min = Float::INFINITY
|
42
|
+
@max = -Float::INFINITY
|
43
|
+
@count = 0
|
44
|
+
@sum = 0.0
|
45
|
+
@sumsq = 0.0
|
46
|
+
end
|
11
47
|
|
12
|
-
#
|
48
|
+
# call-seq:
|
49
|
+
# stat.update( val ) -> val
|
50
|
+
#
|
51
|
+
# Update the running stats with the new value.
|
52
|
+
# Return the input value.
|
53
|
+
def update(value)
|
54
|
+
@mutex.synchronize do
|
55
|
+
@min = (value < @min) ? value : @min
|
56
|
+
@max = (value > @max) ? value : @max
|
57
|
+
|
58
|
+
@count += 1
|
59
|
+
@sum += value
|
60
|
+
@sumsq += (value * value)
|
61
|
+
end
|
62
|
+
|
63
|
+
value
|
64
|
+
end
|
65
|
+
|
66
|
+
# call-seq:
|
67
|
+
# stat.mean -> Float
|
68
|
+
#
|
69
|
+
# Return the arithmetic mean of the values put into the Stats object. If no
|
70
|
+
# values have passed through the stats object then 0.0 is returned;
|
71
|
+
def mean
|
72
|
+
return 0.0 if @count.zero?
|
73
|
+
|
74
|
+
@sum / @count
|
75
|
+
end
|
76
|
+
|
77
|
+
# call-seq:
|
78
|
+
# stat.rate -> Float
|
79
|
+
#
|
80
|
+
# Return the +count+ divided by +sum+.
|
81
|
+
#
|
82
|
+
# In many cases when Stats#update( _value_ ) is called, the _value_ is a unit
|
83
|
+
# of time, typically seconds or microseconds. #rate is a convenience for those
|
84
|
+
# times. In this case, where _value_ is a unit if time, then count divided by
|
85
|
+
# sum is a useful value, i.e. +something per unit of time+.
|
86
|
+
#
|
87
|
+
# In the case where _value_ is a non-time related value, then the value
|
88
|
+
# returned by _rate_ is not really useful.
|
89
|
+
#
|
90
|
+
def rate
|
91
|
+
return 0.0 if @sum.zero?
|
92
|
+
|
93
|
+
@count / @sum
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# call-seq:
|
98
|
+
# stat.stddev -> Float
|
99
|
+
#
|
100
|
+
# Return the standard deviation of all the values that have passed through the
|
101
|
+
# Stats object. The standard deviation has no meaning unless the count is > 1,
|
102
|
+
# therefore if the current _stat.count_ is < 1 then 0.0 will be returned;
|
103
|
+
#
|
104
|
+
def stddev
|
105
|
+
return 0.0 unless @count > 1
|
106
|
+
|
107
|
+
Math.sqrt((@sumsq - ((@sum * @sum) / @count)) / (@count - 1))
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
13
111
|
# call-seq:
|
14
112
|
# stat.to_hash -> Hash
|
15
113
|
# stat.to_hash( %w[ count max mean ]) -> Hash
|
16
114
|
#
|
17
115
|
# return a hash of the stats. By default this returns a hash of all stats
|
18
116
|
# but passing in an array of items will limit the stats returned to only
|
19
|
-
# those in the Array.
|
117
|
+
# those in the Array.
|
20
118
|
#
|
21
119
|
# If passed in an empty array or nil to to_hash then STATS is assumed to be
|
22
120
|
# the list of stats to return in the hash.
|
23
121
|
#
|
24
|
-
def to_hash(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
122
|
+
def to_hash(*args)
|
123
|
+
result = {}
|
124
|
+
fields = [args].flatten
|
125
|
+
fields = STATS if fields.empty?
|
126
|
+
fields.each do |meth|
|
127
|
+
result[meth] = send(meth)
|
30
128
|
end
|
31
|
-
|
129
|
+
result
|
32
130
|
end
|
33
131
|
|
34
132
|
#
|
@@ -40,19 +138,18 @@ module Hitimes
|
|
40
138
|
# of all the stats. If an array of items is passed in, those that match the
|
41
139
|
# known stats will be all that is included in the json output.
|
42
140
|
#
|
43
|
-
def to_json(
|
44
|
-
|
45
|
-
|
46
|
-
|
141
|
+
def to_json(*args)
|
142
|
+
stats = to_hash(*args)
|
143
|
+
slugs = []
|
144
|
+
out = StringIO.new
|
47
145
|
|
48
|
-
|
49
|
-
|
50
|
-
|
146
|
+
out.print "{ "
|
147
|
+
stats.each_pair do |key, val|
|
148
|
+
slugs << "\"#{key}\": #{val}"
|
51
149
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
150
|
+
out.print slugs.join(", ")
|
151
|
+
out.print "}"
|
152
|
+
out.string
|
55
153
|
end
|
56
|
-
|
57
154
|
end
|
58
155
|
end
|
data/lib/hitimes/timed_metric.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Copyright (c) 2008, 2009 Jeremy Hinegardner
|
3
5
|
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
6
|
#++
|
5
7
|
|
6
|
-
require
|
8
|
+
require "forwardable"
|
7
9
|
module Hitimes
|
8
10
|
#
|
9
11
|
# A TimedMetric holds the metrics on how long it takes to do something. For
|
@@ -11,11 +13,11 @@ module Hitimes
|
|
11
13
|
#
|
12
14
|
# tm = TimedMetric.new( 'my-method' )
|
13
15
|
#
|
14
|
-
# 200.times do
|
15
|
-
# my_method_result = tm.measure do
|
16
|
+
# 200.times do
|
17
|
+
# my_method_result = tm.measure do
|
16
18
|
# my_method( ... )
|
17
19
|
# end
|
18
|
-
# end
|
20
|
+
# end
|
19
21
|
#
|
20
22
|
# puts "#{ tm.name } operated at a rate of #{ tm.rate } calls per second"
|
21
23
|
#
|
@@ -23,9 +25,9 @@ module Hitimes
|
|
23
25
|
# Metric API also.
|
24
26
|
#
|
25
27
|
# A TimedMetric measures the execution time of an option with the Interval
|
26
|
-
# class.
|
27
|
-
#
|
28
|
-
# A TimedMetric contains a Stats object, therefore TimedMetric has +count+, +max+,
|
28
|
+
# class.
|
29
|
+
#
|
30
|
+
# A TimedMetric contains a Stats object, therefore TimedMetric has +count+, +max+,
|
29
31
|
# +mean+, +min+, +rate+, +stddev+, +sum+, +sumsq+ methods that delegate to that Stats
|
30
32
|
# object for convenience.
|
31
33
|
#
|
@@ -41,10 +43,10 @@ module Hitimes
|
|
41
43
|
#
|
42
44
|
# Return a TimedMetric that has been started
|
43
45
|
#
|
44
|
-
def now(
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
def now(name, additional_data = {})
|
47
|
+
tm = TimedMetric.new(name, additional_data)
|
48
|
+
tm.start
|
49
|
+
tm
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
@@ -56,8 +58,8 @@ module Hitimes
|
|
56
58
|
# Create a new TimedMetric giving it a name and additional data.
|
57
59
|
# +additional_data+ may be anything that follows the +to_hash+ protocol
|
58
60
|
#
|
59
|
-
def initialize(
|
60
|
-
super(
|
61
|
+
def initialize(name, additional_data = {})
|
62
|
+
super(name, additional_data)
|
61
63
|
@stats = Stats.new
|
62
64
|
@current_interval = Interval.new
|
63
65
|
end
|
@@ -66,23 +68,23 @@ module Hitimes
|
|
66
68
|
# :call-seq:
|
67
69
|
# timed_metric.running? -> true or false
|
68
70
|
#
|
69
|
-
# return whether or not the timer is currently running.
|
71
|
+
# return whether or not the timer is currently running.
|
70
72
|
#
|
71
73
|
def running?
|
72
74
|
@current_interval.running?
|
73
75
|
end
|
74
76
|
|
75
|
-
#
|
77
|
+
#
|
76
78
|
# :call-seq:
|
77
79
|
# timed_metric.start -> nil
|
78
80
|
#
|
79
81
|
# Start the current metric, if the current metric is already started, then
|
80
|
-
# this is a noop.
|
82
|
+
# this is a noop.
|
81
83
|
#
|
82
84
|
def start
|
83
|
-
|
84
|
-
@current_interval.start
|
85
|
-
@sampling_start_time ||=
|
85
|
+
unless @current_interval.running?
|
86
|
+
@current_interval.start
|
87
|
+
@sampling_start_time ||= utc_microseconds
|
86
88
|
@sampling_start_interval ||= Interval.now
|
87
89
|
end
|
88
90
|
nil
|
@@ -96,19 +98,19 @@ module Hitimes
|
|
96
98
|
# interval. If the timer was stopped then the duration of the last Interval
|
97
99
|
# is returned. If the timer was already stopped then false is returned and
|
98
100
|
# no stats are updated.
|
99
|
-
#
|
101
|
+
#
|
100
102
|
def stop
|
101
|
-
if @current_interval.running?
|
102
|
-
|
103
|
-
@stats.update(
|
103
|
+
if @current_interval.running?
|
104
|
+
duration = @current_interval.stop
|
105
|
+
@stats.update(duration)
|
104
106
|
@current_interval = Interval.new
|
105
107
|
|
106
108
|
# update the length of time we have been sampling
|
107
109
|
@sampling_delta = @sampling_start_interval.duration_so_far
|
108
110
|
|
109
|
-
return
|
111
|
+
return duration
|
110
112
|
end
|
111
|
-
|
113
|
+
false
|
112
114
|
end
|
113
115
|
|
114
116
|
#
|
@@ -118,7 +120,7 @@ module Hitimes
|
|
118
120
|
# Measure the execution of a block and add those stats to the running stats.
|
119
121
|
# The return value is the return value of the block
|
120
122
|
#
|
121
|
-
def measure
|
123
|
+
def measure
|
122
124
|
return_value = nil
|
123
125
|
begin
|
124
126
|
start
|
@@ -126,7 +128,7 @@ module Hitimes
|
|
126
128
|
ensure
|
127
129
|
stop
|
128
130
|
end
|
129
|
-
|
131
|
+
return_value
|
130
132
|
end
|
131
133
|
|
132
134
|
#
|
@@ -142,35 +144,34 @@ module Hitimes
|
|
142
144
|
# interval, i.e. the split-time. If the timer is not running, nothing
|
143
145
|
# happens and false is returned.
|
144
146
|
#
|
145
|
-
def split
|
146
|
-
if @current_interval.running?
|
147
|
+
def split
|
148
|
+
if @current_interval.running?
|
147
149
|
next_interval = @current_interval.split
|
148
|
-
|
149
|
-
@stats.update(
|
150
|
-
@current_interval = next_interval
|
151
|
-
return
|
152
|
-
end
|
153
|
-
|
150
|
+
duration = @current_interval.duration
|
151
|
+
@stats.update(duration)
|
152
|
+
@current_interval = next_interval
|
153
|
+
return duration
|
154
|
+
end
|
155
|
+
false
|
154
156
|
end
|
155
157
|
|
156
158
|
#
|
157
159
|
# :call-seq:
|
158
160
|
# metric.to_hash -> Hash
|
159
|
-
#
|
161
|
+
#
|
160
162
|
# Convert the metric to a hash
|
161
163
|
#
|
162
164
|
def to_hash
|
163
|
-
|
164
|
-
Stats::STATS.each do |
|
165
|
-
|
165
|
+
result = super
|
166
|
+
Stats::STATS.each do |stat|
|
167
|
+
result[stat] = send(stat)
|
166
168
|
end
|
167
|
-
|
169
|
+
result
|
168
170
|
end
|
169
171
|
|
170
|
-
|
171
172
|
# forward appropriate calls directly to the stats object
|
172
173
|
extend Forwardable
|
173
174
|
def_delegators :@stats, :count, :max, :mean, :min, :rate, :stddev, :sum, :sumsq
|
174
|
-
alias
|
175
|
+
alias duration sum
|
175
176
|
end
|
176
177
|
end
|