multimeter 1.1.8-java → 2.0.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/multimeter.rb +83 -520
- data/lib/multimeter/version.rb +1 -1
- data/lib/multimeter_metrics.jar +0 -0
- metadata +12 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6705c90a356382fa03d5b9a49d564a0229f62f07
|
4
|
+
data.tar.gz: e8ad55447af09f9347653b75b9d205ce6c2473b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2af9a88eebd3bd5736d4223e8f7513c263896b6e0d3e7eece848aab69e53bef83cb6c1ec0453ab604c8c5bdfb3127d0306171dda0e8c12f09e142e6eefeeef3a
|
7
|
+
data.tar.gz: 35e00dcba6a7eb0c6294f568bca506e5af7258e16610671418f6cd3fd394e1e3029ee3f2e7fa007ed49b365c6d1d4530d2b1b9711ddab80346727cf99a7398cb
|
data/lib/multimeter.rb
CHANGED
@@ -1,340 +1,119 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'metrics-core-jars'
|
4
|
+
require 'multimeter_metrics'
|
4
5
|
require 'json'
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
module Metrics
|
9
|
-
java_import 'com.yammer.metrics.core.MetricsRegistry'
|
10
|
-
java_import 'com.yammer.metrics.core.MetricName'
|
11
|
-
java_import 'com.yammer.metrics.core.Meter'
|
12
|
-
java_import 'com.yammer.metrics.core.Counter'
|
13
|
-
java_import 'com.yammer.metrics.core.Histogram'
|
14
|
-
java_import 'com.yammer.metrics.core.Gauge'
|
15
|
-
java_import 'com.yammer.metrics.core.Timer'
|
16
|
-
java_import 'com.yammer.metrics.stats.Snapshot'
|
17
|
-
java_import 'com.yammer.metrics.reporting.JmxReporter'
|
18
|
-
|
19
|
-
class Meter
|
20
|
-
def type
|
21
|
-
:meter
|
22
|
-
end
|
23
|
-
|
24
|
-
def to_h
|
25
|
-
{
|
26
|
-
:type => :meter,
|
27
|
-
:event_type => event_type,
|
28
|
-
:count => count,
|
29
|
-
:mean_rate => mean_rate,
|
30
|
-
:one_minute_rate => one_minute_rate,
|
31
|
-
:five_minute_rate => five_minute_rate,
|
32
|
-
:fifteen_minute_rate => fifteen_minute_rate
|
33
|
-
}
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class Counter
|
38
|
-
def type
|
39
|
-
:counter
|
40
|
-
end
|
41
|
-
|
42
|
-
def to_h
|
43
|
-
{
|
44
|
-
:type => :counter,
|
45
|
-
:count => count
|
46
|
-
}
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
class Histogram
|
51
|
-
def type
|
52
|
-
:histogram
|
53
|
-
end
|
54
|
-
|
55
|
-
def to_h
|
56
|
-
{
|
57
|
-
:type => :histogram,
|
58
|
-
:count => count,
|
59
|
-
:max => max,
|
60
|
-
:min => min,
|
61
|
-
:mean => mean,
|
62
|
-
:std_dev => std_dev,
|
63
|
-
:sum => sum
|
64
|
-
}.merge(snapshot.to_h)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class Gauge
|
69
|
-
def type
|
70
|
-
:gauge
|
71
|
-
end
|
72
|
-
|
73
|
-
def to_h
|
74
|
-
{
|
75
|
-
:type => :gauge,
|
76
|
-
:value => value
|
77
|
-
}
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class Timer
|
82
|
-
def type
|
83
|
-
:timer
|
84
|
-
end
|
85
|
-
|
86
|
-
def to_h
|
87
|
-
{
|
88
|
-
:type => :timer,
|
89
|
-
:event_type => event_type,
|
90
|
-
:count => count,
|
91
|
-
:mean_rate => mean_rate,
|
92
|
-
:one_minute_rate => one_minute_rate,
|
93
|
-
:five_minute_rate => five_minute_rate,
|
94
|
-
:fifteen_minute_rate => fifteen_minute_rate,
|
95
|
-
:max => max,
|
96
|
-
:min => min,
|
97
|
-
:mean => mean,
|
98
|
-
:std_dev => std_dev,
|
99
|
-
:sum => sum
|
100
|
-
}.merge(snapshot.to_h)
|
101
|
-
end
|
102
|
-
|
103
|
-
def measure
|
104
|
-
ctx = self.time
|
105
|
-
begin
|
106
|
-
yield
|
107
|
-
ensure
|
108
|
-
ctx.stop
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
class Snapshot
|
114
|
-
def to_h
|
115
|
-
{
|
116
|
-
:median => median,
|
117
|
-
:percentiles => {
|
118
|
-
'75' => get75thPercentile,
|
119
|
-
'95' => get95thPercentile,
|
120
|
-
'98' => get98thPercentile,
|
121
|
-
'99' => get99thPercentile,
|
122
|
-
'99.9' => get999thPercentile
|
123
|
-
}
|
124
|
-
}
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
module JavaConcurrency
|
131
|
-
java_import 'java.util.concurrent.TimeUnit'
|
132
|
-
java_import 'java.util.concurrent.ConcurrentHashMap'
|
133
|
-
java_import 'java.util.concurrent.atomic.AtomicReference'
|
134
|
-
java_import 'java.lang.Thread'
|
7
|
+
module Metrics
|
8
|
+
include_package 'com.codahale.metrics'
|
135
9
|
end
|
136
10
|
|
137
11
|
module Multimeter
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
def self.metrics(group, scope, &block)
|
147
|
-
Class.new do
|
148
|
-
include(Metrics)
|
149
|
-
group(group)
|
150
|
-
scope(scope)
|
151
|
-
instance_eval(&block)
|
152
|
-
end.new
|
12
|
+
class MetricRegistry
|
13
|
+
def to_h
|
14
|
+
h = {}
|
15
|
+
metrics.each do |metric_name, metric|
|
16
|
+
h[metric_name] = metric.to_h
|
17
|
+
end
|
18
|
+
h
|
19
|
+
end
|
153
20
|
end
|
154
21
|
|
155
|
-
|
156
|
-
def
|
157
|
-
|
22
|
+
class Meter
|
23
|
+
def to_h
|
24
|
+
{
|
25
|
+
:type => :meter,
|
26
|
+
:count => count,
|
27
|
+
:mean_rate => mean_rate,
|
28
|
+
:one_minute_rate => one_minute_rate,
|
29
|
+
:five_minute_rate => five_minute_rate,
|
30
|
+
:fifteen_minute_rate => fifteen_minute_rate
|
31
|
+
}
|
158
32
|
end
|
33
|
+
end
|
159
34
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
self.class.instance_metrics.each do |type, name, options|
|
167
|
-
multimeter_registry.send(type, name, options)
|
168
|
-
end
|
35
|
+
class Counter
|
36
|
+
def to_h
|
37
|
+
{
|
38
|
+
:type => :counter,
|
39
|
+
:count => count
|
40
|
+
}
|
169
41
|
end
|
42
|
+
end
|
170
43
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
group = self.class.send(:group) || package
|
178
|
-
scope = self.class.send(:scope) || class_name
|
179
|
-
if (iid_proc = self.class.send(:instance_id))
|
180
|
-
instance_id = instance_exec(&iid_proc)
|
181
|
-
else
|
182
|
-
instance_id = self.object_id
|
183
|
-
end
|
184
|
-
if registry_mode == :linked_instance
|
185
|
-
::Multimeter.global_registry.sub_registry(scope, instance_id)
|
186
|
-
else
|
187
|
-
::Multimeter.registry(group, scope, instance_id)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
when :global
|
191
|
-
::Multimeter.global_registry
|
192
|
-
else
|
193
|
-
self.class.multimeter_registry
|
194
|
-
end
|
44
|
+
class Histogram
|
45
|
+
def to_h
|
46
|
+
{
|
47
|
+
:type => :histogram,
|
48
|
+
:count => count,
|
49
|
+
}.merge(snapshot.to_h)
|
195
50
|
end
|
51
|
+
end
|
196
52
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
::Multimeter.global_registry
|
208
|
-
else
|
209
|
-
::Multimeter.registry(g, s)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def instance_gauges
|
215
|
-
@instance_gauges || []
|
216
|
-
end
|
217
|
-
|
218
|
-
def instance_metrics
|
219
|
-
@instance_metrics || []
|
220
|
-
end
|
221
|
-
|
222
|
-
private
|
223
|
-
|
224
|
-
def group(g=nil)
|
225
|
-
@multimeter_registry_group = g.to_s if g
|
226
|
-
@multimeter_registry_group
|
227
|
-
end
|
228
|
-
|
229
|
-
def scope(t=nil)
|
230
|
-
@multimeter_registry_scope = t.to_s if t
|
231
|
-
@multimeter_registry_scope
|
232
|
-
end
|
233
|
-
|
234
|
-
def instance_id(pr=nil, &block_pr)
|
235
|
-
pr ||= block_pr
|
236
|
-
@multimeter_registry_iid = pr if pr
|
237
|
-
@multimeter_registry_iid
|
238
|
-
end
|
239
|
-
|
240
|
-
def registry_mode(m=nil)
|
241
|
-
@multimeter_registry_mode = m if m
|
242
|
-
@multimeter_registry_mode
|
243
|
-
end
|
244
|
-
|
245
|
-
def add_instance_gauge(name, block)
|
246
|
-
@instance_gauges ||= []
|
247
|
-
@instance_gauges << [name, block]
|
248
|
-
end
|
249
|
-
|
250
|
-
def add_instance_metric(type, name, options)
|
251
|
-
@instance_metrics ||= []
|
252
|
-
@instance_metrics << [type, name, options]
|
253
|
-
end
|
254
|
-
|
255
|
-
%w[counter meter histogram timer].each do |t|
|
256
|
-
type = t.to_sym
|
257
|
-
define_method(type) do |name, options={}|
|
258
|
-
case registry_mode
|
259
|
-
when :instance, :linked_instance
|
260
|
-
add_instance_metric(type, name, options)
|
261
|
-
else
|
262
|
-
multimeter_registry.send(type, name, options)
|
263
|
-
end
|
264
|
-
define_method(name) do
|
265
|
-
multimeter_registry.get(name)
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
def gauge(name, &block)
|
271
|
-
case registry_mode
|
272
|
-
when :instance, :linked_instance
|
273
|
-
add_instance_gauge(name, block)
|
274
|
-
else
|
275
|
-
multimeter_registry.gauge(name, &block)
|
276
|
-
end
|
277
|
-
define_method(name) do
|
278
|
-
multimeter_registry.gauge(name)
|
279
|
-
end
|
280
|
-
end
|
53
|
+
class Timer
|
54
|
+
def to_h
|
55
|
+
{
|
56
|
+
:type => :timer,
|
57
|
+
:count => count,
|
58
|
+
:mean_rate => mean_rate,
|
59
|
+
:one_minute_rate => one_minute_rate,
|
60
|
+
:five_minute_rate => five_minute_rate,
|
61
|
+
:fifteen_minute_rate => fifteen_minute_rate,
|
62
|
+
}.merge(snapshot.to_h(NANO_TO_MILLI_SCALE))
|
281
63
|
end
|
282
64
|
end
|
283
65
|
|
284
|
-
|
285
|
-
def
|
286
|
-
|
287
|
-
|
66
|
+
class Snapshot
|
67
|
+
def to_h(scale=1)
|
68
|
+
{
|
69
|
+
:max => max * scale,
|
70
|
+
:min => min * scale,
|
71
|
+
:mean => mean * scale,
|
72
|
+
:std_dev => std_dev * scale,
|
73
|
+
:median => median * scale,
|
74
|
+
:percentiles => {
|
75
|
+
'75' => p75 * scale,
|
76
|
+
'95' => p95 * scale,
|
77
|
+
'98' => p98 * scale,
|
78
|
+
'99' => p99 * scale,
|
79
|
+
'99.9' => p999 * scale,
|
80
|
+
}
|
81
|
+
}
|
288
82
|
end
|
289
83
|
end
|
290
84
|
|
291
|
-
|
292
|
-
def
|
293
|
-
|
294
|
-
|
85
|
+
class Gauge
|
86
|
+
def to_h
|
87
|
+
{
|
88
|
+
:type => :gauge,
|
89
|
+
:value => value,
|
90
|
+
}
|
295
91
|
end
|
296
92
|
end
|
297
93
|
|
298
|
-
|
299
|
-
|
300
|
-
m.send(:include, Metrics)
|
301
|
-
m.send(:registry_mode, :linked)
|
302
|
-
end
|
94
|
+
def self.create_registry
|
95
|
+
MetricRegistry.new
|
303
96
|
end
|
304
97
|
|
305
|
-
|
306
|
-
|
307
|
-
m.send(:include, Metrics)
|
308
|
-
m.send(:registry_mode, :linked_instance)
|
309
|
-
end
|
98
|
+
def self.jmx(registry, options = {})
|
99
|
+
Metrics::JmxReporter.forRegistry(registry.to_java).inDomain(options[:domain] || 'multimeter').build.tap(&:start)
|
310
100
|
end
|
311
101
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
@jmx_reporter = ::Yammer::Metrics::JmxReporter.new(@registry)
|
316
|
-
@jmx_reporter.start
|
317
|
-
if options[:recursive]
|
318
|
-
sub_registries.each do |registry|
|
319
|
-
registry.jmx!
|
320
|
-
end
|
321
|
-
end
|
102
|
+
def self.http(registry, rack_handler, options={})
|
103
|
+
server_thread = Java::JavaLang::Thread.new do
|
104
|
+
rack_handler.run(Http.create_app(registry), options)
|
322
105
|
end
|
106
|
+
server_thread.daemon = true
|
107
|
+
server_thread.name = 'multimeter-http-server'
|
108
|
+
server_thread.start
|
109
|
+
server_thread
|
323
110
|
end
|
324
111
|
|
325
|
-
|
326
|
-
def http!(rack_handler, options={})
|
327
|
-
return if @server_thread
|
328
|
-
@server_thread = JavaConcurrency::Thread.new do
|
329
|
-
rack_handler.run(create_app(self), options)
|
330
|
-
end
|
331
|
-
@server_thread.daemon = true
|
332
|
-
@server_thread.name = 'multimeter-http-server'
|
333
|
-
@server_thread.start
|
334
|
-
end
|
112
|
+
private
|
335
113
|
|
336
|
-
|
114
|
+
NANO_TO_MILLI_SCALE = 1.0/1_000_000
|
337
115
|
|
116
|
+
module Http
|
338
117
|
class BadRequest < StandardError; end
|
339
118
|
|
340
119
|
COMMON_HEADERS = {'Connection' => 'close'}.freeze
|
@@ -342,7 +121,7 @@ module Multimeter
|
|
342
121
|
JSONP_HEADERS = COMMON_HEADERS.merge('Content-Type' => 'application/javascript').freeze
|
343
122
|
ERROR_HEADERS = COMMON_HEADERS.merge('Content-Type' => 'text/plain').freeze
|
344
123
|
|
345
|
-
def create_app(registry)
|
124
|
+
def self.create_app(registry)
|
346
125
|
proc do |env|
|
347
126
|
begin
|
348
127
|
body = registry.to_h.to_json
|
@@ -366,220 +145,4 @@ module Multimeter
|
|
366
145
|
end
|
367
146
|
end
|
368
147
|
end
|
369
|
-
|
370
|
-
class Registry
|
371
|
-
include Enumerable
|
372
|
-
include Jmx
|
373
|
-
include Http
|
374
|
-
|
375
|
-
attr_reader :group, :scope, :instance_id
|
376
|
-
|
377
|
-
def initialize(*args)
|
378
|
-
@group, @scope, @instance_id = args
|
379
|
-
@registry = ::Yammer::Metrics::MetricsRegistry.new
|
380
|
-
@sub_registries = JavaConcurrency::ConcurrentHashMap.new
|
381
|
-
end
|
382
|
-
|
383
|
-
def instance_registry?
|
384
|
-
!!@instance_id
|
385
|
-
end
|
386
|
-
|
387
|
-
def sub_registry(scope, instance_id=nil)
|
388
|
-
full_id = scope.dup
|
389
|
-
full_id << "/#{instance_id}" if instance_id
|
390
|
-
r = @sub_registries.get(full_id)
|
391
|
-
unless r
|
392
|
-
r = self.class.new(@group, scope, instance_id)
|
393
|
-
@sub_registries.put_if_absent(full_id, r)
|
394
|
-
r = @sub_registries.get(full_id)
|
395
|
-
end
|
396
|
-
r
|
397
|
-
end
|
398
|
-
|
399
|
-
def sub_registries
|
400
|
-
@sub_registries.values.to_a
|
401
|
-
end
|
402
|
-
|
403
|
-
def each_metric
|
404
|
-
return self unless block_given?
|
405
|
-
@registry.all_metrics.each do |metric_name, metric|
|
406
|
-
yield metric_name.name, metric
|
407
|
-
end
|
408
|
-
end
|
409
|
-
alias_method :each, :each_metric
|
410
|
-
|
411
|
-
def get(name)
|
412
|
-
@registry.all_metrics[create_name(name)]
|
413
|
-
end
|
414
|
-
|
415
|
-
def find_metric(name)
|
416
|
-
m = get(name)
|
417
|
-
unless m
|
418
|
-
sub_registries.each do |registry|
|
419
|
-
m = registry.find_metric(name)
|
420
|
-
break if m
|
421
|
-
end
|
422
|
-
end
|
423
|
-
m
|
424
|
-
end
|
425
|
-
|
426
|
-
def gauge(name, options={}, &block)
|
427
|
-
existing_gauge = get(name)
|
428
|
-
if block_given? && existing_gauge.respond_to?(:same?) && existing_gauge.same?(block)
|
429
|
-
return
|
430
|
-
elsif existing_gauge && block_given?
|
431
|
-
raise ArgumentError, %(Cannot redeclare gauge #{name})
|
432
|
-
else
|
433
|
-
@registry.new_gauge(create_name(name), ProcGauge.new(block))
|
434
|
-
end
|
435
|
-
end
|
436
|
-
|
437
|
-
def counter(name, options={})
|
438
|
-
error_translation do
|
439
|
-
@registry.new_counter(create_name(name))
|
440
|
-
end
|
441
|
-
end
|
442
|
-
|
443
|
-
def meter(name, options={})
|
444
|
-
error_translation do
|
445
|
-
event_type = (options[:event_type] || '').to_s
|
446
|
-
time_unit = TIME_UNITS[options[:time_unit] || :seconds]
|
447
|
-
@registry.new_meter(create_name(name), event_type, time_unit)
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
def histogram(name, options={})
|
452
|
-
error_translation do
|
453
|
-
@registry.new_histogram(create_name(name), !!options[:biased])
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
|
-
def timer(name, options={})
|
458
|
-
error_translation do
|
459
|
-
duration_unit = TIME_UNITS[options[:duration_unit] || :milliseconds]
|
460
|
-
rate_unit = TIME_UNITS[options[:rate_unit] || :seconds]
|
461
|
-
@registry.new_timer(create_name(name), duration_unit, rate_unit)
|
462
|
-
end
|
463
|
-
end
|
464
|
-
|
465
|
-
def to_h
|
466
|
-
h = {@scope => {}}
|
467
|
-
each_metric do |metric_name, metric|
|
468
|
-
h[@scope][metric_name.to_sym] = metric.to_h
|
469
|
-
end
|
470
|
-
registries_by_scope = sub_registries.group_by { |r| r.scope }
|
471
|
-
registries_by_scope.each do |scope, registries|
|
472
|
-
if registries.size == 1
|
473
|
-
h.merge!(registries.first.to_h)
|
474
|
-
else
|
475
|
-
h[scope] = {}
|
476
|
-
registries_by_metric = Hash.new { |h, k| h[k] = [] }
|
477
|
-
registries.each do |registry|
|
478
|
-
registry.each_metric do |metric_name, _|
|
479
|
-
registries_by_metric[metric_name] << registry
|
480
|
-
end
|
481
|
-
end
|
482
|
-
registries_by_metric.each do |metric_name, registries|
|
483
|
-
if registries.size == 1
|
484
|
-
h[scope][metric_name.to_sym] = registries.first.get(metric_name).to_h
|
485
|
-
else
|
486
|
-
metrics_by_instance_id = Hash[registries.map { |r| [r.instance_id, r.get(metric_name)] }]
|
487
|
-
h[scope][metric_name.to_sym] = Aggregate.new(metrics_by_instance_id).to_h
|
488
|
-
end
|
489
|
-
end
|
490
|
-
end
|
491
|
-
h
|
492
|
-
end
|
493
|
-
h.delete_if { |k, v| v.empty? }
|
494
|
-
h
|
495
|
-
end
|
496
|
-
|
497
|
-
private
|
498
|
-
|
499
|
-
TIME_UNITS = {
|
500
|
-
:seconds => JavaConcurrency::TimeUnit::SECONDS,
|
501
|
-
:milliseconds => JavaConcurrency::TimeUnit::MILLISECONDS
|
502
|
-
}.freeze
|
503
|
-
|
504
|
-
def create_name(name)
|
505
|
-
::Yammer::Metrics::MetricName.new(@group, @scope, name.to_s)
|
506
|
-
end
|
507
|
-
|
508
|
-
def error_translation
|
509
|
-
begin
|
510
|
-
yield
|
511
|
-
rescue java.lang.ClassCastException => cce
|
512
|
-
raise ArgumentError, %(Cannot redeclare a metric as another type)
|
513
|
-
end
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
class Aggregate
|
518
|
-
def initialize(metrics)
|
519
|
-
@metrics = metrics
|
520
|
-
@type = check_type!
|
521
|
-
end
|
522
|
-
|
523
|
-
def to_h
|
524
|
-
{
|
525
|
-
:type => :aggregate,
|
526
|
-
:total => compute_total,
|
527
|
-
:parts => Hash[@metrics.map { |k, v| [k.to_s, v.to_h] }]
|
528
|
-
}
|
529
|
-
end
|
530
|
-
|
531
|
-
private
|
532
|
-
|
533
|
-
def check_type!
|
534
|
-
types = @metrics.values.map(&:type).uniq
|
535
|
-
unless types.size == 1
|
536
|
-
raise ArgumentError, %[All metrics of an aggregate must be of the same type (they were: #{types.join(', ')})]
|
537
|
-
end
|
538
|
-
types.first
|
539
|
-
end
|
540
|
-
|
541
|
-
def compute_total
|
542
|
-
h = {}
|
543
|
-
metric_hs = @metrics.values.map(&:to_h)
|
544
|
-
metric_hs.first.keys.each do |property|
|
545
|
-
values = metric_hs.map { |h| h[property] }
|
546
|
-
aggregate_value = begin
|
547
|
-
case property
|
548
|
-
when :type, :event_type then values.first
|
549
|
-
when :percentiles then nil
|
550
|
-
else
|
551
|
-
if values.all? { |v| v.nil? || v.is_a?(Numeric) }
|
552
|
-
min, max = values.compact.minmax
|
553
|
-
sum = values.compact.reduce(:+)
|
554
|
-
{
|
555
|
-
:max => max,
|
556
|
-
:min => min,
|
557
|
-
:sum => sum,
|
558
|
-
:avg => sum ? sum.fdiv(values.size) : nil,
|
559
|
-
}
|
560
|
-
end
|
561
|
-
end
|
562
|
-
end
|
563
|
-
h[property] = aggregate_value if aggregate_value
|
564
|
-
end
|
565
|
-
h
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
class ProcGauge < ::Yammer::Metrics::Gauge
|
570
|
-
def initialize(proc)
|
571
|
-
super()
|
572
|
-
@proc = proc
|
573
|
-
end
|
574
|
-
|
575
|
-
def value
|
576
|
-
@proc.call
|
577
|
-
end
|
578
|
-
|
579
|
-
def same?(other_proc)
|
580
|
-
other_proc.source_location == @proc.source_location
|
581
|
-
end
|
582
|
-
end
|
583
|
-
|
584
|
-
GLOBAL_REGISTRY = registry('multimeter', 'global')
|
585
148
|
end
|
data/lib/multimeter/version.rb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multimeter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
16
|
- - ~>
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version:
|
18
|
+
version: '3.1'
|
19
19
|
- - <
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 4.0.0
|
22
22
|
name: metrics-core-jars
|
23
23
|
prerelease: false
|
24
24
|
type: :runtime
|
@@ -26,11 +26,11 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: '3.1'
|
30
30
|
- - <
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
description: Multimeter provides a
|
32
|
+
version: 4.0.0
|
33
|
+
description: Multimeter provides a thin wrapper around Dropwizard's (a.k.a. Coda Hale's) Metrics library under the hood.
|
34
34
|
email:
|
35
35
|
- theo@iconara.net
|
36
36
|
executables: []
|
@@ -39,8 +39,10 @@ extra_rdoc_files: []
|
|
39
39
|
files:
|
40
40
|
- lib/multimeter.rb
|
41
41
|
- lib/multimeter/version.rb
|
42
|
+
- lib/multimeter_metrics.jar
|
42
43
|
homepage: http://github.com/iconara/multimeter
|
43
|
-
licenses:
|
44
|
+
licenses:
|
45
|
+
- Apache-2.0
|
44
46
|
metadata: {}
|
45
47
|
post_install_message:
|
46
48
|
rdoc_options: []
|
@@ -58,8 +60,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
60
|
version: '0'
|
59
61
|
requirements: []
|
60
62
|
rubyforge_project: multimeter
|
61
|
-
rubygems_version: 2.
|
63
|
+
rubygems_version: 2.6.6
|
62
64
|
signing_key:
|
63
65
|
specification_version: 4
|
64
|
-
summary: JRuby application metric instrumentation using
|
66
|
+
summary: JRuby application metric instrumentation using Dropwizard's Metrics
|
65
67
|
test_files: []
|