multimeter 1.1.8-java → 2.0.0-java

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 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: []