statsd-instrument 2.0.10 → 2.0.11

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: 46e2e5b04875e5bd0d24688df4592fd7302dd00e
4
- data.tar.gz: c489f07cdcf8e6bf9e41feb71f9e04fb47f24185
3
+ metadata.gz: 2b3d5d77001c8868328c05e1f62406ab13b92c03
4
+ data.tar.gz: 32b5ba8a24354acfb72f73ce2e514146e9e3773c
5
5
  SHA512:
6
- metadata.gz: e01b79500359d7279fe7b2922d7264c9ad6852f610dfee06c5a83794673cbe142f98b3201a543695f6b62e26c8d6aeceee1d0e7c491347d81120e19db5dcc578
7
- data.tar.gz: 0b4b9166b6229e01e601d67c9ef94227c6034b5d83ca4006ea0b5dfffa6788f10eccf1d28ae0f3d3fc5ceef97753117b71f48e8d57f9113c76c1bfda59d70024
6
+ metadata.gz: a94d925a45d26e5b5ebd366cc8aa2d2e61e06a577b79e5f4af908d1114598dad047cd24b0206d7864964be93f6a7e571f6f2d601ed68c26458433151cde8f540
7
+ data.tar.gz: d1bab44e9942aa4a7e1be4d1af6f88bcf33bf82106d7f8c3c5cfcb957579be583942693f30662f837a26e37f9a7adbadcebeea7a3c980ac06ae14e6931aa9bbc
data/README.md CHANGED
@@ -87,7 +87,7 @@ StatsD.increment('GoogleBase.insert', 1, sample_rate: 0.1)
87
87
 
88
88
  #### StatsD.gauge
89
89
 
90
- A gauge is a single numerical value value that tells you the state of the system at a point in time. A good example would be the number of messages in a queue.
90
+ A gauge is a single numerical value that tells you the state of the system at a point in time. A good example would be the number of messages in a queue.
91
91
 
92
92
  ``` ruby
93
93
  StatsD.gauge('GoogleBase.queued', 12, sample_rate: 1.0)
@@ -262,6 +262,10 @@ end
262
262
  ### RSpec
263
263
 
264
264
  ```ruby
265
+ RSpec.configure do |config|
266
+ config.include StatsD::Instrument::Matchers
267
+ end
268
+
265
269
  RSpec.describe 'Matchers' do
266
270
  context 'trigger_statsd_increment' do
267
271
  it 'will pass if there is exactly one matching StatsD call' do
@@ -269,9 +273,9 @@ RSpec.describe 'Matchers' do
269
273
  end
270
274
 
271
275
  it 'will pass if it matches the correct number of times' do
272
- expect {
276
+ expect {
273
277
  2.times do
274
- StatsD.increment('counter')
278
+ StatsD.increment('counter')
275
279
  end
276
280
  }.to trigger_statsd_increment('counter', times: 2)
277
281
  end
@@ -281,7 +285,6 @@ RSpec.describe 'Matchers' do
281
285
  end
282
286
  end
283
287
  end
284
-
285
288
  ```
286
289
 
287
290
  ## Notes
@@ -210,17 +210,39 @@ module StatsD
210
210
  raise ArgumentError, "already instrumented #{method} for #{self.name}" if method_defined? method_name_without_statsd
211
211
  raise ArgumentError, "could not find method #{method} for #{self.name}" unless method_defined?(method) || private_method_defined?(method)
212
212
 
213
+ method_scope = method_visibility(method)
214
+
213
215
  alias_method method_name_without_statsd, method
214
216
  yield method_name_without_statsd, method_name_with_statsd, metric_name
215
217
  alias_method method, method_name_with_statsd
218
+
219
+ private(method_name_without_statsd)
220
+ send(method_scope, method)
221
+ private(method_name_with_statsd)
216
222
  end
217
223
 
218
224
  def remove_from_method(method, name, action)
219
225
  method_name_without_statsd = :"#{method}_for_#{action}_on_#{self.name}_without_#{name}"
220
226
  method_name_with_statsd = :"#{method}_for_#{action}_on_#{self.name}_with_#{name}"
227
+
228
+ method_scope = method_visibility(method)
229
+
221
230
  send(:remove_method, method_name_with_statsd)
222
231
  alias_method method, method_name_without_statsd
223
232
  send(:remove_method, method_name_without_statsd)
233
+
234
+ send(method_scope, method)
235
+ end
236
+
237
+ def method_visibility(method)
238
+ case
239
+ when private_method_defined?(method)
240
+ :private
241
+ when protected_method_defined?(method)
242
+ :protected
243
+ else
244
+ :public
245
+ end
224
246
  end
225
247
  end
226
248
 
@@ -41,8 +41,8 @@ module StatsD::Instrument::Assertions
41
41
  assert options[:times] === metrics.length, "The amount of StatsD calls for metric #{metric_name} was unexpected. Expected #{options[:times].inspect}, found #{metrics.length}"
42
42
  metric = metrics.first
43
43
 
44
- assert_equal options[:sample_rate], metric.sample_rate, "Unexpected value submitted for StatsD metric #{metric_name}" if options[:sample_rate]
45
- assert_equal options[:value], metric.value, "Unexpected StatsD sample rate for metric #{metric_name}" if options[:value]
44
+ assert_equal options[:sample_rate], metric.sample_rate, "Unexpected StatsD sample rate for metric #{metric_name}" if options[:sample_rate]
45
+ assert_equal options[:value], metric.value, "Unexpected value submitted for StatsD metric #{metric_name}" if options[:value]
46
46
 
47
47
  if options[:tags]
48
48
  expected_tags = Set.new(StatsD::Instrument::Metric.normalize_tags(options[:tags]))
@@ -11,6 +11,7 @@ module StatsD::Instrument::Matchers
11
11
  }
12
12
 
13
13
  class Matcher
14
+ include RSpec::Matchers::Composable
14
15
  include StatsD::Instrument::Helpers
15
16
 
16
17
  def initialize(metric_type, metric_name, options = {})
@@ -50,11 +51,13 @@ module StatsD::Instrument::Matchers
50
51
  raise RSpec::Expectations::ExpectationNotMetError, "No StatsD calls for metric #{metric_name} were made." if metrics.empty?
51
52
  raise RSpec::Expectations::ExpectationNotMetError, "The numbers of StatsD calls for metric #{metric_name} was unexpected. Expected #{options[:times].inspect}, got #{metrics.length}" if options[:times] && options[:times] != metrics.length
52
53
 
53
- metric = metrics.first
54
+ [:sample_rate, :value, :tags].each do |expectation|
55
+ next unless options[expectation]
54
56
 
55
- raise RSpec::Expectations::ExpectationNotMetError, "Unexpected value submitted for StatsD metric #{metric_name}" if options[:sample_rate] && options[:sample_rate] != metric.sample_rate
56
- raise RSpec::Expectations::ExpectationNotMetError, "Unexpected StatsD sample rate for metric #{metric_name}" if options[:value] && options[:value] != metric.value
57
- raise RSpec::Expectations::ExpectationNotMetError, "Unexpected StatsD tags for metric #{metric_name}" if options[:tags] && options[:tags] != metric.tags
57
+ if metrics.all? { |m| m.public_send(expectation) != options[expectation] }
58
+ raise RSpec::Expectations::ExpectationNotMetError, "Unexpected StatsD #{expectation.to_s.gsub('_', ' ')} for metric #{metric_name}"
59
+ end
60
+ end
58
61
 
59
62
  true
60
63
  end
@@ -1,5 +1,5 @@
1
1
  module StatsD
2
2
  module Instrument
3
- VERSION = "2.0.10"
3
+ VERSION = "2.0.11"
4
4
  end
5
5
  end
@@ -10,6 +10,16 @@ class MatchersTest < Minitest::Test
10
10
  refute StatsD::Instrument::Matchers::Increment.new(:c, 'counter', {}).matches? lambda { StatsD.increment('not_counter') }
11
11
  end
12
12
 
13
+ def test_statsd_increment_compound
14
+ matcher_1 = StatsD::Instrument::Matchers::Increment.new(:c, 'counter', tags: ['a'])
15
+ matcher_2 = StatsD::Instrument::Matchers::Increment.new(:c, 'counter', tags: ['b'])
16
+
17
+ assert RSpec::Matchers::BuiltIn::Compound::And.new(matcher_1, matcher_2).matches? lambda {
18
+ StatsD.increment('counter', tags: ['a'])
19
+ StatsD.increment('counter', tags: ['b'])
20
+ }
21
+ end
22
+
13
23
  def test_statsd_increment_with_times_matched
14
24
  assert StatsD::Instrument::Matchers::Increment.new(:c, 'counter', times: 1).matches? lambda { StatsD.increment('counter') }
15
25
  end
@@ -45,6 +45,26 @@ end
45
45
  class GatewaySubClass < ActiveMerchant::Gateway
46
46
  end
47
47
 
48
+ class InstrumentedClass
49
+ extend StatsD::Instrument
50
+
51
+ def public_and_instrumented
52
+ end
53
+ statsd_count :public_and_instrumented, 'InstrumentedClass.public_and_instrumented'
54
+
55
+ protected
56
+
57
+ def protected_and_instrumented
58
+ end
59
+ statsd_count :protected_and_instrumented, 'InstrumentedClass.protected_and_instrumented'
60
+
61
+ private
62
+
63
+ def private_and_instrumented
64
+ end
65
+ statsd_count :private_and_instrumented, 'InstrumentedClass.private_and_instrumented'
66
+ end
67
+
48
68
  ActiveMerchant::Base.extend StatsD::Instrument
49
69
 
50
70
  class StatsDInstrumentationTest < Minitest::Test
@@ -116,7 +136,7 @@ class StatsDInstrumentationTest < Minitest::Test
116
136
  assert_statsd_increment('ActiveMerchant.Base.post_with_block.failure', times: 1) do
117
137
  assert_equal 'successful', ActiveMerchant::Base.new.post_with_block { 'successful' }
118
138
  assert_equal 'not so successful', ActiveMerchant::Base.new.post_with_block { 'not so successful' }
119
- end
139
+ end
120
140
 
121
141
  ActiveMerchant::Base.statsd_remove_count_success :post_with_block, 'ActiveMerchant.Base.post_with_block'
122
142
  end
@@ -219,4 +239,67 @@ class StatsDInstrumentationTest < Minitest::Test
219
239
 
220
240
  ActiveMerchant::Gateway.singleton_class.statsd_remove_count :sync, 'ActiveMerchant.Gateway.sync'
221
241
  end
242
+
243
+ def test_statsd_doesnt_change_method_scope_of_public_method
244
+ assert_scope InstrumentedClass, :public_and_instrumented, :public
245
+
246
+ assert_statsd_increment('InstrumentedClass.public_and_instrumented') do
247
+ InstrumentedClass.new.send(:public_and_instrumented)
248
+ end
249
+ end
250
+
251
+ def test_statsd_doesnt_change_method_scope_of_protected_method
252
+ assert_scope InstrumentedClass, :protected_and_instrumented, :protected
253
+
254
+ assert_statsd_increment('InstrumentedClass.protected_and_instrumented') do
255
+ InstrumentedClass.new.send(:protected_and_instrumented)
256
+ end
257
+ end
258
+
259
+ def test_statsd_doesnt_change_method_scope_of_private_method
260
+ assert_scope InstrumentedClass, :private_and_instrumented, :private
261
+
262
+ assert_statsd_increment('InstrumentedClass.private_and_instrumented') do
263
+ InstrumentedClass.new.send(:private_and_instrumented)
264
+ end
265
+ end
266
+
267
+ def test_statsd_doesnt_change_method_scope_on_removal_of_public_method
268
+ assert_scope InstrumentedClass, :public_and_instrumented, :public
269
+ InstrumentedClass.statsd_remove_count :public_and_instrumented, 'InstrumentedClass.public_and_instrumented'
270
+ assert_scope InstrumentedClass, :public_and_instrumented, :public
271
+
272
+ InstrumentedClass.statsd_count :public_and_instrumented, 'InstrumentedClass.public_and_instrumented'
273
+ end
274
+
275
+ def test_statsd_doesnt_change_method_scope_on_removal_of_protected_method
276
+ assert_scope InstrumentedClass, :protected_and_instrumented, :protected
277
+ InstrumentedClass.statsd_remove_count :protected_and_instrumented, 'InstrumentedClass.protected_and_instrumented'
278
+ assert_scope InstrumentedClass, :protected_and_instrumented, :protected
279
+
280
+ InstrumentedClass.statsd_count :protected_and_instrumented, 'InstrumentedClass.protected_and_instrumented'
281
+ end
282
+
283
+ def test_statsd_doesnt_change_method_scope_on_removal_of_private_method
284
+ assert_scope InstrumentedClass, :private_and_instrumented, :private
285
+ InstrumentedClass.statsd_remove_count :private_and_instrumented, 'InstrumentedClass.private_and_instrumented'
286
+ assert_scope InstrumentedClass, :private_and_instrumented, :private
287
+
288
+ InstrumentedClass.statsd_count :private_and_instrumented, 'InstrumentedClass.private_and_instrumented'
289
+ end
290
+
291
+ private
292
+
293
+ def assert_scope(klass, method, expected_scope)
294
+ method_scope = case
295
+ when klass.private_method_defined?(method)
296
+ :private
297
+ when klass.protected_method_defined?(method)
298
+ :protected
299
+ else
300
+ :public
301
+ end
302
+
303
+ assert_equal method_scope, expected_scope, "Expected method to be #{expected_scope}"
304
+ end
222
305
  end
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.0.10
4
+ version: 2.0.11
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: 2015-09-16 00:00:00.000000000 Z
13
+ date: 2016-02-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake