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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bb6a3c1ab6dc3342aa4579ffaf36c536fa3676df
4
- data.tar.gz: 0e33034c21fe3225318c8ef8d681c987339b224f
3
+ metadata.gz: 6705c90a356382fa03d5b9a49d564a0229f62f07
4
+ data.tar.gz: e8ad55447af09f9347653b75b9d205ce6c2473b1
5
5
  SHA512:
6
- metadata.gz: 6fecf5491add5f28fcd3c49de25ed830ee7e41726b595ca6773151953b3b60e06d948d253677de00d06874f6ef4ba9ad511b14e076a939b99e9679eef30a8460
7
- data.tar.gz: 82e5c0eb873d918eda97972ed5801cb3f78198eb19629d7851b9a0385a9be918efe0fb8ef9020072b44c6081baa6ae2ad6792f1004420b48f3385b8322f4f1c8
6
+ metadata.gz: 2af9a88eebd3bd5736d4223e8f7513c263896b6e0d3e7eece848aab69e53bef83cb6c1ec0453ab604c8c5bdfb3127d0306171dda0e8c12f09e142e6eefeeef3a
7
+ data.tar.gz: 35e00dcba6a7eb0c6294f568bca506e5af7258e16610671418f6cd3fd394e1e3029ee3f2e7fa007ed49b365c6d1d4530d2b1b9711ddab80346727cf99a7398cb
@@ -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
- module Yammer
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
- def self.global_registry
139
- GLOBAL_REGISTRY
140
- end
141
-
142
- def self.registry(group, scope, instance_id=nil)
143
- Registry.new(group, scope, instance_id)
144
- end
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
- module Metrics
156
- def self.included(m)
157
- m.extend(Dsl)
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
- def initialize(*args)
161
- super
162
- self.class.instance_gauges.each do |name, block|
163
- instance_block = proc { instance_exec(&block) }
164
- multimeter_registry.gauge(name, &instance_block)
165
- end
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
- def multimeter_registry
172
- registry_mode = self.class.send(:registry_mode)
173
- case registry_mode
174
- when :instance, :linked_instance
175
- @multimeter_registry ||= begin
176
- package, _, class_name = self.class.name.rpartition('::')
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
- module Dsl
198
- def multimeter_registry
199
- @multimeter_registry ||= begin
200
- package, _, class_name = self.name.rpartition('::')
201
- g = group || package
202
- s = scope || class_name
203
- case registry_mode
204
- when :linked
205
- ::Multimeter.global_registry.sub_registry(s)
206
- when :global
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
- module InstanceMetrics
285
- def self.included(m)
286
- m.send(:include, Metrics)
287
- m.send(:registry_mode, :instance)
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
- module GlobalMetrics
292
- def self.included(m)
293
- m.send(:include, Metrics)
294
- m.send(:registry_mode, :global)
85
+ class Gauge
86
+ def to_h
87
+ {
88
+ :type => :gauge,
89
+ :value => value,
90
+ }
295
91
  end
296
92
  end
297
93
 
298
- module LinkedMetrics
299
- def self.included(m)
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
- module LinkedInstanceMetrics
306
- def self.included(m)
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
- module Jmx
313
- def jmx!(options={})
314
- return if @jmx_reporter
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
- module Http
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
- private
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
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Multimeter
4
- VERSION = '1.1.8'
4
+ VERSION = '2.0.0'.freeze
5
5
  end
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: 1.1.8
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: 2015-02-05 00:00:00.000000000 Z
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: 2.1.2
18
+ version: '3.1'
19
19
  - - <
20
20
  - !ruby/object:Gem::Version
21
- version: 3.0.0
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: 2.1.2
29
+ version: '3.1'
30
30
  - - <
31
31
  - !ruby/object:Gem::Version
32
- version: 3.0.0
33
- description: Multimeter provides a JRuby DSL for instrumenting your application. It uses Yammer's Metrics library under the hood.
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.2.2
63
+ rubygems_version: 2.6.6
62
64
  signing_key:
63
65
  specification_version: 4
64
- summary: JRuby application metric instrumentation using Yammer's Metrics
66
+ summary: JRuby application metric instrumentation using Dropwizard's Metrics
65
67
  test_files: []