statsd-instrument 2.3.0.beta3 → 2.3.0.beta4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/statsd/instrument.rb +68 -58
- data/lib/statsd/instrument/version.rb +1 -1
- data/test/statsd_instrumentation_test.rb +58 -0
- data/test/statsd_test.rb +25 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e554f96249614fda4598c73f8a374eb17d53aac
|
4
|
+
data.tar.gz: 0d2b774c6545501caf5a4e8a2c254a68fea40239
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35310f0da894755a60b5517d8d555169805eb2e27c789c79d8a36fe8f87a0e7e14183814f6c81d4734338f4384ed329c6a9041df21f573b95e9c1d1e60ec9f55
|
7
|
+
data.tar.gz: 4c146f7e47bd0b181c3844e126fa8b0760ad6f6dd91f979cf83be422ac58e89bc9cb9e43744aa5a6096e592d5a5b43ed56688bbbf921bd5b80fba06f2dc9029a
|
data/lib/statsd/instrument.rb
CHANGED
@@ -72,7 +72,7 @@ module StatsD
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
# Adds execution duration instrumentation to a method.
|
75
|
+
# Adds execution duration instrumentation to a method as a timing.
|
76
76
|
#
|
77
77
|
# @param method [Symbol] The name of the method to instrument.
|
78
78
|
# @param name [String, #call] The name of the metric to use. You can also pass in a
|
@@ -87,6 +87,22 @@ module StatsD
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
# Adds execution duration instrumentation to a method as a distribution.
|
91
|
+
#
|
92
|
+
# @param method [Symbol] The name of the method to instrument.
|
93
|
+
# @param name [String, #call] The name of the metric to use. You can also pass in a
|
94
|
+
# callable to dynamically generate a metric name
|
95
|
+
# @param metric_options (see StatsD#measure)
|
96
|
+
# @return [void]
|
97
|
+
# @note Supported by the datadog implementation only (in beta)
|
98
|
+
def statsd_distribution(method, name, *metric_options)
|
99
|
+
add_to_method(method, name, :distribution) do
|
100
|
+
define_method(method) do |*args, &block|
|
101
|
+
StatsD.distribution(StatsD::Instrument.generate_metric_name(name, self, *args), *metric_options) { super(*args, &block) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
90
106
|
# Adds success and failure counter instrumentation to a method.
|
91
107
|
#
|
92
108
|
# A method call will be considered successful if it does not raise an exception, and the result is true-y.
|
@@ -206,6 +222,15 @@ module StatsD
|
|
206
222
|
remove_from_method(method, name, :measure)
|
207
223
|
end
|
208
224
|
|
225
|
+
# Removes StatsD distribution instrumentation from a method
|
226
|
+
# @param method (see #statsd_remove_count)
|
227
|
+
# @param name (see #statsd_remove_count)
|
228
|
+
# @return [void]
|
229
|
+
# @see #statsd_measure
|
230
|
+
def statsd_remove_distribution(method, name)
|
231
|
+
remove_from_method(method, name, :distribution)
|
232
|
+
end
|
233
|
+
|
209
234
|
private
|
210
235
|
|
211
236
|
def statsd_instrumentation_for(method, name, action)
|
@@ -282,17 +307,13 @@ module StatsD
|
|
282
307
|
# HTTP.get(url)
|
283
308
|
# end
|
284
309
|
def measure(key, value = nil, *metric_options, &block)
|
285
|
-
|
286
|
-
metric_options = [value]
|
287
|
-
value = value.fetch(:value, nil)
|
288
|
-
end
|
310
|
+
value, metric_options = parse_options(value, metric_options)
|
289
311
|
type = (!metric_options.empty? && metric_options.first[:as_dist] ? :d : :ms)
|
290
312
|
|
291
313
|
result = nil
|
292
314
|
value = 1000 * StatsD::Instrument.duration { result = block.call } if block_given?
|
293
|
-
metric = collect_metric(
|
294
|
-
result
|
295
|
-
result
|
315
|
+
metric = collect_metric(type, key, value, metric_options)
|
316
|
+
(result || metric)
|
296
317
|
end
|
297
318
|
|
298
319
|
# Emits a counter metric.
|
@@ -307,12 +328,7 @@ module StatsD
|
|
307
328
|
# @param metric_options [Hash] (default: {}) Metric options
|
308
329
|
# @return (see #collect_metric)
|
309
330
|
def increment(key, value = 1, *metric_options)
|
310
|
-
|
311
|
-
metric_options = [value]
|
312
|
-
value = value.fetch(:value, 1)
|
313
|
-
end
|
314
|
-
|
315
|
-
collect_metric(hash_argument(metric_options).merge(type: :c, name: key, value: value))
|
331
|
+
collect_metric(:c, key, value, metric_options)
|
316
332
|
end
|
317
333
|
|
318
334
|
# Emits a gauge metric.
|
@@ -321,12 +337,7 @@ module StatsD
|
|
321
337
|
# @param metric_options [Hash] (default: {}) Metric options
|
322
338
|
# @return (see #collect_metric)
|
323
339
|
def gauge(key, value, *metric_options)
|
324
|
-
|
325
|
-
metric_options = [value]
|
326
|
-
value = value.fetch(:value, nil)
|
327
|
-
end
|
328
|
-
|
329
|
-
collect_metric(hash_argument(metric_options).merge(type: :g, name: key, value: value))
|
340
|
+
collect_metric(:g, key, value, metric_options)
|
330
341
|
end
|
331
342
|
|
332
343
|
# Emits a histogram metric.
|
@@ -336,12 +347,7 @@ module StatsD
|
|
336
347
|
# @return (see #collect_metric)
|
337
348
|
# @note Supported by the datadog implementation only.
|
338
349
|
def histogram(key, value, *metric_options)
|
339
|
-
|
340
|
-
metric_options = [value]
|
341
|
-
value = value.fetch(:value, nil)
|
342
|
-
end
|
343
|
-
|
344
|
-
collect_metric(hash_argument(metric_options).merge(type: :h, name: key, value: value))
|
350
|
+
collect_metric(:h, key, value, metric_options)
|
345
351
|
end
|
346
352
|
|
347
353
|
# Emits a distribution metric.
|
@@ -350,13 +356,26 @@ module StatsD
|
|
350
356
|
# @param metric_options [Hash] (default: {}) Metric options
|
351
357
|
# @return (see #collect_metric)
|
352
358
|
# @note Supported by the datadog implementation only (in beta)
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
359
|
+
#
|
360
|
+
# @overload distribution(key, metric_options = {}, &block)
|
361
|
+
# Emits a distribution metric, after measuring the execution duration of the
|
362
|
+
# block passed to this method.
|
363
|
+
# @param key [String] The name of the metric.
|
364
|
+
# @param metric_options [Hash] Options for the metric
|
365
|
+
# @yield The method will yield the block that was passed to this method to measure its duration.
|
366
|
+
# @return The value that was returns by the block passed to this method.
|
367
|
+
# @note Supported by the datadog implementation only.
|
368
|
+
#
|
369
|
+
# @example
|
370
|
+
# http_response = StatsD.distribution('HTTP.call.duration') do
|
371
|
+
# HTTP.get(url)
|
372
|
+
# end
|
373
|
+
def distribution(key, value=nil, *metric_options, &block)
|
374
|
+
value, metric_options = parse_options(value, metric_options)
|
375
|
+
result = nil
|
376
|
+
value = 1000 * StatsD::Instrument.duration { result = block.call } if block_given?
|
377
|
+
metric = collect_metric(:d, key, value, metric_options)
|
378
|
+
(result || metric)
|
360
379
|
end
|
361
380
|
|
362
381
|
# Emits a key/value metric.
|
@@ -366,12 +385,7 @@ module StatsD
|
|
366
385
|
# @return (see #collect_metric)
|
367
386
|
# @note Supported by the statsite implementation only.
|
368
387
|
def key_value(key, value, *metric_options)
|
369
|
-
|
370
|
-
metric_options = [value]
|
371
|
-
value = value.fetch(:value, nil)
|
372
|
-
end
|
373
|
-
|
374
|
-
collect_metric(hash_argument(metric_options).merge(type: :kv, name: key, value: value))
|
388
|
+
collect_metric(:kv, key, value, metric_options)
|
375
389
|
end
|
376
390
|
|
377
391
|
# Emits a set metric.
|
@@ -381,12 +395,7 @@ module StatsD
|
|
381
395
|
# @return (see #collect_metric)
|
382
396
|
# @note Supported by the datadog implementation only.
|
383
397
|
def set(key, value, *metric_options)
|
384
|
-
|
385
|
-
metric_options = [value]
|
386
|
-
value = value.fetch(:value, nil)
|
387
|
-
end
|
388
|
-
|
389
|
-
collect_metric(hash_argument(metric_options).merge(type: :s, name: key, value: value))
|
398
|
+
collect_metric(:s, key, value, metric_options)
|
390
399
|
end
|
391
400
|
|
392
401
|
# Emits an event metric.
|
@@ -396,12 +405,7 @@ module StatsD
|
|
396
405
|
# @return (see #collect_metric)
|
397
406
|
# @note Supported by the datadog implementation only.
|
398
407
|
def event(title, text, *metric_options)
|
399
|
-
|
400
|
-
metric_options = [text]
|
401
|
-
text = text.fetch(:text, nil)
|
402
|
-
end
|
403
|
-
|
404
|
-
collect_metric(hash_argument(metric_options).merge(type: :_e, name: title, value: text))
|
408
|
+
collect_metric(:_e, title, text, metric_options)
|
405
409
|
end
|
406
410
|
|
407
411
|
# Emits a service check metric.
|
@@ -411,12 +415,7 @@ module StatsD
|
|
411
415
|
# @return (see #collect_metric)
|
412
416
|
# @note Supported by the datadog implementation only.
|
413
417
|
def service_check(name, status, *metric_options)
|
414
|
-
|
415
|
-
metric_options = [status]
|
416
|
-
status = status.fetch(:status, nil)
|
417
|
-
end
|
418
|
-
|
419
|
-
collect_metric(hash_argument(metric_options).merge(type: :_sc, name: name, value: status))
|
418
|
+
collect_metric(:_sc, name, status, metric_options)
|
420
419
|
end
|
421
420
|
|
422
421
|
private
|
@@ -437,10 +436,21 @@ module StatsD
|
|
437
436
|
return hash
|
438
437
|
end
|
439
438
|
|
439
|
+
def parse_options(value, metric_options)
|
440
|
+
if value.is_a?(Hash) && metric_options.empty?
|
441
|
+
metric_options = [value]
|
442
|
+
value = value.fetch(:value, nil)
|
443
|
+
end
|
444
|
+
[value, metric_options]
|
445
|
+
end
|
446
|
+
|
440
447
|
# Instantiates a metric, and sends it to the backend for further processing.
|
441
448
|
# @param options (see StatsD::Instrument::Metric#initialize)
|
442
449
|
# @return [StatsD::Instrument::Metric] The meric that was sent to the backend.
|
443
|
-
def collect_metric(
|
450
|
+
def collect_metric(type, name, value, metric_options)
|
451
|
+
value, metric_options = parse_options(value, metric_options)
|
452
|
+
|
453
|
+
options = hash_argument(metric_options).merge(type: type, name: name, value: value)
|
444
454
|
backend.collect_metric(metric = StatsD::Instrument::Metric.new(options))
|
445
455
|
metric
|
446
456
|
end
|
@@ -265,6 +265,64 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
265
265
|
ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
|
266
266
|
end
|
267
267
|
|
268
|
+
|
269
|
+
def test_statsd_distribution
|
270
|
+
ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', sample_rate: 0.3
|
271
|
+
|
272
|
+
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post', sample_rate: 0.3) do
|
273
|
+
ActiveMerchant::UniqueGateway.new.purchase(true)
|
274
|
+
end
|
275
|
+
ensure
|
276
|
+
ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_statsd_distribution_uses_normalized_metric_name
|
280
|
+
ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant::Gateway.ssl_post'
|
281
|
+
|
282
|
+
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post') do
|
283
|
+
ActiveMerchant::UniqueGateway.new.purchase(true)
|
284
|
+
end
|
285
|
+
ensure
|
286
|
+
ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant::Gateway.ssl_post'
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_statsd_distribution_yells_without_block
|
290
|
+
err = assert_raises(ArgumentError) do
|
291
|
+
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post')
|
292
|
+
end
|
293
|
+
assert_equal "block must be given", err.to_s
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_statsd_distribution_with_method_receiving_block
|
297
|
+
ActiveMerchant::Base.statsd_distribution :post_with_block, 'ActiveMerchant.Base.post_with_block'
|
298
|
+
|
299
|
+
assert_statsd_distribution('ActiveMerchant.Base.post_with_block') do
|
300
|
+
assert_equal 'block called', ActiveMerchant::Base.new.post_with_block { 'block called' }
|
301
|
+
end
|
302
|
+
ensure
|
303
|
+
ActiveMerchant::Base.statsd_remove_distribution :post_with_block, 'ActiveMerchant.Base.post_with_block'
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_statsd_distribution_with_value
|
307
|
+
ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', 1
|
308
|
+
|
309
|
+
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post') do
|
310
|
+
ActiveMerchant::UniqueGateway.new.purchase(true)
|
311
|
+
end
|
312
|
+
ensure
|
313
|
+
ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_statsd_distribution_with_value_and_options
|
317
|
+
ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', 1, sample_rate: 0.45
|
318
|
+
|
319
|
+
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post', sample_rate: 0.45) do
|
320
|
+
ActiveMerchant::UniqueGateway.new.purchase(true)
|
321
|
+
end
|
322
|
+
ensure
|
323
|
+
ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
|
324
|
+
end
|
325
|
+
|
268
326
|
def test_instrumenting_class_method
|
269
327
|
ActiveMerchant::Gateway.singleton_class.extend StatsD::Instrument
|
270
328
|
ActiveMerchant::Gateway.singleton_class.statsd_count :sync, 'ActiveMerchant.Gateway.sync'
|
data/test/statsd_test.rb
CHANGED
@@ -143,6 +143,31 @@ class StatsDTest < Minitest::Test
|
|
143
143
|
assert_equal 42, metric.value
|
144
144
|
end
|
145
145
|
|
146
|
+
def test_statsd_distribution_with_benchmarked_block_duration
|
147
|
+
StatsD::Instrument.stubs(:duration).returns(1.12)
|
148
|
+
metric = capture_statsd_call do
|
149
|
+
StatsD.distribution('values.foobar') { 'foo' }
|
150
|
+
end
|
151
|
+
assert_equal :d, metric.type
|
152
|
+
assert_equal 1120.0, metric.value
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_statsd_distribution_with_block_and_options
|
156
|
+
StatsD::Instrument.stubs(:duration).returns(1.12)
|
157
|
+
metric = capture_statsd_call do
|
158
|
+
StatsD.distribution('values.foobar', :tags => ['test'], :sample_rate => 0.9) { 'foo' }
|
159
|
+
end
|
160
|
+
assert_equal 1120.0, metric.value
|
161
|
+
assert_equal 'values.foobar', metric.name
|
162
|
+
assert_equal 0.9, metric.sample_rate
|
163
|
+
assert_equal ['test'], metric.tags
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_statsd_distribution_returns_return_value_of_block
|
167
|
+
return_value = StatsD.distribution('values.foobar') { 'sarah' }
|
168
|
+
assert_equal 'sarah', return_value
|
169
|
+
end
|
170
|
+
|
146
171
|
def test_statsd_key_value
|
147
172
|
result = nil
|
148
173
|
metric = capture_statsd_call { result = StatsD.key_value('values.foobar', 42) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsd-instrument
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.0.
|
4
|
+
version: 2.3.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Storimer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2018-07-
|
13
|
+
date: 2018-07-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|