statsd-instrument 2.3.0.beta3 → 2.3.0.beta4
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/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
|