statsd-instrument 2.6.0 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +79 -9
- data/benchmark/datagram-client +0 -1
- data/benchmark/send-metrics-to-dev-null-log +0 -1
- data/lib/statsd/instrument.rb +66 -292
- data/lib/statsd/instrument/assertions.rb +83 -93
- data/lib/statsd/instrument/client.rb +2 -2
- data/lib/statsd/instrument/datagram.rb +12 -3
- data/lib/statsd/instrument/environment.rb +9 -3
- data/lib/statsd/instrument/expectation.rb +93 -0
- data/lib/statsd/instrument/helpers.rb +29 -11
- data/lib/statsd/instrument/legacy_client.rb +301 -0
- data/lib/statsd/instrument/metric.rb +8 -8
- data/lib/statsd/instrument/rubocop.rb +18 -0
- data/lib/statsd/instrument/rubocop/singleton_configuration.rb +53 -0
- data/lib/statsd/instrument/version.rb +1 -1
- data/test/assertions_on_legacy_client_test.rb +376 -0
- data/test/assertions_test.rb +105 -39
- data/test/capture_sink_test.rb +0 -2
- data/test/client_test.rb +0 -2
- data/test/compatibility/dogstatsd_datagram_compatibility_test.rb +0 -1
- data/test/datagram_builder_test.rb +1 -3
- data/test/datagram_test.rb +14 -0
- data/test/dogstatsd_datagram_builder_test.rb +0 -2
- data/test/environment_test.rb +1 -1
- data/test/helpers_test.rb +17 -0
- data/test/log_sink_test.rb +0 -2
- data/test/logger_backend_test.rb +2 -2
- data/test/metric_test.rb +2 -2
- data/test/null_sink_test.rb +0 -2
- data/test/rubocop/singleton_configuration_test.rb +43 -0
- data/test/statsd_datagram_builder_test.rb +0 -2
- data/test/statsd_instrumentation_test.rb +4 -6
- data/test/statsd_test.rb +1 -1
- data/test/test_helper.rb +0 -2
- data/test/udp_backend_test.rb +1 -1
- data/test/udp_sink_test.rb +0 -2
- metadata +11 -3
- data/lib/statsd/instrument/metric_expectation.rb +0 -82
data/test/assertions_test.rb
CHANGED
@@ -4,11 +4,19 @@ require 'test_helper'
|
|
4
4
|
|
5
5
|
class AssertionsTest < Minitest::Test
|
6
6
|
def setup
|
7
|
+
@old_client = StatsD.singleton_client
|
8
|
+
env = StatsD::Instrument::Environment.new('STATSD_IMPLEMENTATION' => 'datadog')
|
9
|
+
StatsD.singleton_client = env.default_client
|
10
|
+
|
7
11
|
test_class = Class.new(Minitest::Test)
|
8
12
|
test_class.send(:include, StatsD::Instrument::Assertions)
|
9
13
|
@test_case = test_class.new('fake')
|
10
14
|
end
|
11
15
|
|
16
|
+
def teardown
|
17
|
+
StatsD.singleton_client = @old_client
|
18
|
+
end
|
19
|
+
|
12
20
|
def test_assert_no_statsd_calls
|
13
21
|
@test_case.assert_no_statsd_calls('counter') do
|
14
22
|
# noop
|
@@ -41,7 +49,7 @@ class AssertionsTest < Minitest::Test
|
|
41
49
|
assert_equal assertion.message, "No StatsD calls for metric other, another expected."
|
42
50
|
end
|
43
51
|
|
44
|
-
def
|
52
|
+
def test_assert_statsd
|
45
53
|
@test_case.assert_statsd_increment('counter') do
|
46
54
|
StatsD.increment('counter')
|
47
55
|
end
|
@@ -130,6 +138,46 @@ class AssertionsTest < Minitest::Test
|
|
130
138
|
end
|
131
139
|
end
|
132
140
|
|
141
|
+
def test_assert_statsd_gauge_call_with_numeric_value
|
142
|
+
@test_case.assert_statsd_gauge('gauge', value: 42) do
|
143
|
+
StatsD.gauge('gauge', 42)
|
144
|
+
end
|
145
|
+
|
146
|
+
@test_case.assert_statsd_gauge('gauge', value: '42') do
|
147
|
+
StatsD.gauge('gauge', 42)
|
148
|
+
end
|
149
|
+
|
150
|
+
assert_raises(Minitest::Assertion) do
|
151
|
+
@test_case.assert_statsd_gauge('gauge', value: 42) do
|
152
|
+
StatsD.gauge('gauge', 45)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_assert_statsd_set_call_with_string_value
|
158
|
+
@test_case.assert_statsd_set('set', value: 12345) do
|
159
|
+
StatsD.set('set', '12345')
|
160
|
+
end
|
161
|
+
|
162
|
+
@test_case.assert_statsd_set('set', value: '12345') do
|
163
|
+
StatsD.set('set', '12345')
|
164
|
+
end
|
165
|
+
|
166
|
+
@test_case.assert_statsd_set('set', value: 12345) do
|
167
|
+
StatsD.set('set', 12345)
|
168
|
+
end
|
169
|
+
|
170
|
+
@test_case.assert_statsd_set('set', value: '12345') do
|
171
|
+
StatsD.set('set', 12345)
|
172
|
+
end
|
173
|
+
|
174
|
+
assert_raises(Minitest::Assertion) do
|
175
|
+
@test_case.assert_statsd_set('set', value: '42') do
|
176
|
+
StatsD.set('set', 45)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
133
181
|
def test_tags_will_match_subsets
|
134
182
|
@test_case.assert_statsd_increment('counter', sample_rate: 0.5, tags: { a: 1 }) do
|
135
183
|
StatsD.increment('counter', sample_rate: 0.5, tags: { a: 1, b: 2 })
|
@@ -153,60 +201,89 @@ class AssertionsTest < Minitest::Test
|
|
153
201
|
assert_includes assertion.message, "MyJob"
|
154
202
|
end
|
155
203
|
|
156
|
-
def
|
157
|
-
|
158
|
-
|
159
|
-
|
204
|
+
def test_capture_and_assert
|
205
|
+
datagrams = @test_case.capture_statsd_datagrams do
|
206
|
+
StatsD.increment('counter', tags: { foo: 1 })
|
207
|
+
StatsD.increment('counter', tags: { foo: 2 })
|
208
|
+
end
|
209
|
+
|
210
|
+
@test_case.assert_statsd_increment('counter', tags: ['foo:1'], datagrams: datagrams)
|
211
|
+
@test_case.assert_statsd_increment('counter', tags: ['foo:2'], datagrams: datagrams)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_capture_from_different_client
|
215
|
+
client = StatsD::Instrument::Client.new
|
216
|
+
@test_case.assert_statsd_increment('foo', client: client) do
|
217
|
+
client.increment('foo')
|
218
|
+
end
|
219
|
+
|
220
|
+
assert_raises(Minitest::Assertion) do
|
221
|
+
@test_case.assert_statsd_increment('foo', client: client) do
|
222
|
+
StatsD.increment('foo')
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
assert_raises(Minitest::Assertion) do
|
227
|
+
@test_case.assert_statsd_increment('foo') do
|
228
|
+
client.increment('foo')
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_multiple_expectations_are_not_order_dependent
|
234
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:1'])
|
235
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
236
|
+
@test_case.assert_statsd_expectations([foo_1_metric, foo_2_metric]) do
|
160
237
|
StatsD.increment('counter', tags: { foo: 1 })
|
161
238
|
StatsD.increment('counter', tags: { foo: 2 })
|
162
239
|
end
|
163
240
|
|
164
|
-
foo_1_metric = StatsD::Instrument::
|
165
|
-
foo_2_metric = StatsD::Instrument::
|
166
|
-
@test_case.
|
241
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:1'])
|
242
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
243
|
+
@test_case.assert_statsd_expectations([foo_2_metric, foo_1_metric]) do
|
167
244
|
StatsD.increment('counter', tags: { foo: 1 })
|
168
245
|
StatsD.increment('counter', tags: { foo: 2 })
|
169
246
|
end
|
170
247
|
|
171
|
-
foo_1_metric = StatsD::Instrument::
|
172
|
-
foo_2_metric = StatsD::Instrument::
|
173
|
-
@test_case.
|
248
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
249
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
250
|
+
@test_case.assert_statsd_expectations([foo_1_metric, foo_2_metric]) do
|
174
251
|
StatsD.increment('counter', tags: { foo: 1 })
|
175
252
|
StatsD.increment('counter', tags: { foo: 1 })
|
176
253
|
StatsD.increment('counter', tags: { foo: 2 })
|
177
254
|
end
|
178
255
|
|
179
|
-
foo_1_metric = StatsD::Instrument::
|
180
|
-
foo_2_metric = StatsD::Instrument::
|
181
|
-
@test_case.
|
256
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
257
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
258
|
+
@test_case.assert_statsd_expectations([foo_2_metric, foo_1_metric]) do
|
182
259
|
StatsD.increment('counter', tags: { foo: 1 })
|
183
260
|
StatsD.increment('counter', tags: { foo: 1 })
|
184
261
|
StatsD.increment('counter', tags: { foo: 2 })
|
185
262
|
end
|
186
263
|
|
187
|
-
foo_1_metric = StatsD::Instrument::
|
188
|
-
foo_2_metric = StatsD::Instrument::
|
189
|
-
@test_case.
|
264
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
265
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
266
|
+
@test_case.assert_statsd_expectations([foo_2_metric, foo_1_metric]) do
|
190
267
|
StatsD.increment('counter', tags: { foo: 1 })
|
191
268
|
StatsD.increment('counter', tags: { foo: 2 })
|
192
269
|
StatsD.increment('counter', tags: { foo: 1 })
|
193
270
|
end
|
194
271
|
end
|
195
272
|
|
196
|
-
def
|
273
|
+
def test_assert_multiple_statsd_expectations
|
197
274
|
assert_raises(Minitest::Assertion) do
|
198
|
-
foo_1_metric = StatsD::Instrument::
|
199
|
-
foo_2_metric = StatsD::Instrument::
|
200
|
-
@test_case.
|
275
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
276
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
277
|
+
@test_case.assert_statsd_expectations([foo_1_metric, foo_2_metric]) do
|
201
278
|
StatsD.increment('counter', tags: { foo: 1 })
|
202
279
|
StatsD.increment('counter', tags: { foo: 2 })
|
203
280
|
end
|
204
281
|
end
|
205
282
|
|
206
283
|
assert_raises(Minitest::Assertion) do
|
207
|
-
foo_1_metric = StatsD::Instrument::
|
208
|
-
foo_2_metric = StatsD::Instrument::
|
209
|
-
@test_case.
|
284
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
285
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
286
|
+
@test_case.assert_statsd_expectations([foo_1_metric, foo_2_metric]) do
|
210
287
|
StatsD.increment('counter', tags: { foo: 1 })
|
211
288
|
StatsD.increment('counter', tags: { foo: 1 })
|
212
289
|
StatsD.increment('counter', tags: { foo: 2 })
|
@@ -214,16 +291,16 @@ class AssertionsTest < Minitest::Test
|
|
214
291
|
end
|
215
292
|
end
|
216
293
|
|
217
|
-
foo_1_metric = StatsD::Instrument::
|
218
|
-
foo_2_metric = StatsD::Instrument::
|
219
|
-
@test_case.
|
294
|
+
foo_1_metric = StatsD::Instrument::Expectation.increment('counter', times: 2, tags: ['foo:1'])
|
295
|
+
foo_2_metric = StatsD::Instrument::Expectation.increment('counter', tags: ['foo:2'])
|
296
|
+
@test_case.assert_statsd_expectations([foo_1_metric, foo_2_metric]) do
|
220
297
|
StatsD.increment('counter', tags: { foo: 1 })
|
221
298
|
StatsD.increment('counter', tags: { foo: 1 })
|
222
299
|
StatsD.increment('counter', tags: { foo: 2 })
|
223
300
|
end
|
224
301
|
end
|
225
302
|
|
226
|
-
def
|
303
|
+
def test_assert_statsd_increment_with_tags
|
227
304
|
@test_case.assert_statsd_increment('counter', tags: ['a:b', 'c:d']) do
|
228
305
|
StatsD.increment('counter', tags: { a: 'b', c: 'd' })
|
229
306
|
end
|
@@ -233,17 +310,6 @@ class AssertionsTest < Minitest::Test
|
|
233
310
|
end
|
234
311
|
end
|
235
312
|
|
236
|
-
def test_assert_statsd_call_with_wrong_sample_rate_type
|
237
|
-
skip("In Strict mode, the StatsD.increment call will raise") if StatsD::Instrument.strict_mode_enabled?
|
238
|
-
|
239
|
-
assertion = assert_raises(Minitest::Assertion) do
|
240
|
-
@test_case.assert_statsd_increment('counter', tags: ['a', 'b']) do
|
241
|
-
StatsD.increment('counter', sample_rate: 'abc', tags: ['a', 'b'])
|
242
|
-
end
|
243
|
-
end
|
244
|
-
assert_equal "Unexpected sample rate type for metric counter, must be numeric", assertion.message
|
245
|
-
end
|
246
|
-
|
247
313
|
def test_nested_assertions
|
248
314
|
@test_case.assert_statsd_increment('counter1') do
|
249
315
|
@test_case.assert_statsd_increment('counter2') do
|
data/test/capture_sink_test.rb
CHANGED
data/test/client_test.rb
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'test_helper'
|
4
4
|
|
5
|
-
require 'statsd/instrument/client'
|
6
|
-
|
7
5
|
class DatagramBuilderTest < Minitest::Test
|
8
6
|
def setup
|
9
7
|
@datagram_builder = StatsD::Instrument::DatagramBuilder.new
|
@@ -17,7 +15,7 @@ class DatagramBuilderTest < Minitest::Test
|
|
17
15
|
end
|
18
16
|
|
19
17
|
def test_normalize_unsupported_tag_names
|
20
|
-
assert_equal ['
|
18
|
+
assert_equal ['ign#ored'], @datagram_builder.send(:normalize_tags, ['ign#o|re,d'])
|
21
19
|
# Note: how this is interpreted by the backend is undefined.
|
22
20
|
# We rely on the user to not do stuff like this if they don't want to be surprised.
|
23
21
|
# We do not want to take the performance hit of normaling this.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class DatagramTest < Minitest::Test
|
6
|
+
def test_parsing_datagrams
|
7
|
+
datagram = 'Kernel.Orders.order_creation_path:1|c|' \
|
8
|
+
'#order_source:web,code_source:NilController#NilAction,order_builder:false,' \
|
9
|
+
'multi_currency:false,fulfillment_orders_beta_enabled:false'
|
10
|
+
|
11
|
+
parsed = StatsD::Instrument::Datagram.new(datagram)
|
12
|
+
assert_includes parsed.tags, 'code_source:NilController#NilAction'
|
13
|
+
end
|
14
|
+
end
|
data/test/environment_test.rb
CHANGED
@@ -103,7 +103,7 @@ class EnvironmentTest < Minitest::Test
|
|
103
103
|
def test_default_client_has_sensible_defaults
|
104
104
|
env = StatsD::Instrument::Environment.new('STATSD_ENV' => 'production')
|
105
105
|
|
106
|
-
assert_equal StatsD::Instrument::
|
106
|
+
assert_equal StatsD::Instrument::DogStatsDDatagramBuilder, env.default_client.datagram_builder_class
|
107
107
|
assert_equal 'localhost', env.default_client.sink.host
|
108
108
|
assert_equal 8125, env.default_client.sink.port
|
109
109
|
assert_equal 1.0, env.default_client.default_sample_rate
|
data/test/helpers_test.rb
CHANGED
@@ -22,4 +22,21 @@ class HelpersTest < Minitest::Test
|
|
22
22
|
assert_equal 'gauge', metrics[1].name
|
23
23
|
assert_equal 12, metrics[1].value
|
24
24
|
end
|
25
|
+
|
26
|
+
def test_capture_metrics_with_new_client
|
27
|
+
@old_client = StatsD.singleton_client
|
28
|
+
StatsD.singleton_client = StatsD.client
|
29
|
+
|
30
|
+
StatsD.increment('counter')
|
31
|
+
metrics = @test_case.capture_statsd_datagrams do
|
32
|
+
StatsD.increment('counter')
|
33
|
+
StatsD.gauge('gauge', 12)
|
34
|
+
end
|
35
|
+
StatsD.gauge('gauge', 15)
|
36
|
+
|
37
|
+
assert_equal 2, metrics.length
|
38
|
+
|
39
|
+
ensure
|
40
|
+
StatsD.singleton_client = @old_client
|
41
|
+
end
|
25
42
|
end
|
data/test/log_sink_test.rb
CHANGED
data/test/logger_backend_test.rb
CHANGED
@@ -15,8 +15,8 @@ class LoggerBackendTest < Minitest::Test
|
|
15
15
|
@backend.collect_metric(@metric1)
|
16
16
|
@backend.collect_metric(@metric2)
|
17
17
|
assert_equal <<~LOG, @io.string
|
18
|
-
[StatsD]
|
19
|
-
[StatsD]
|
18
|
+
[StatsD] mock.counter:1|c|#a:b,c:d
|
19
|
+
[StatsD] mock.measure:123|ms|@0.3
|
20
20
|
LOG
|
21
21
|
end
|
22
22
|
end
|
data/test/metric_test.rb
CHANGED
@@ -36,11 +36,11 @@ class MetricTest < Minitest::Test
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_default_tags
|
39
|
-
StatsD.stubs(:default_tags).returns(['default_tag:default_value'])
|
39
|
+
StatsD.legacy_singleton_client.stubs(:default_tags).returns(['default_tag:default_value'])
|
40
40
|
m = StatsD::Instrument::Metric.new(type: :c, name: 'counter', tags: { tag: 'value' })
|
41
41
|
assert_equal ['tag:value', 'default_tag:default_value'], m.tags
|
42
42
|
|
43
|
-
StatsD.stubs(:default_tags).returns(['tag:value'])
|
43
|
+
StatsD.legacy_singleton_client.stubs(:default_tags).returns(['tag:value'])
|
44
44
|
m = StatsD::Instrument::Metric.new(type: :c, name: 'counter', tags: { tag: 'value' })
|
45
45
|
assert_equal ['tag:value', 'tag:value'], m.tags # we don't care about duplicates
|
46
46
|
end
|
data/test/null_sink_test.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'statsd/instrument/rubocop'
|
5
|
+
|
6
|
+
module Rubocop
|
7
|
+
class SingletonConfigurationTest < Minitest::Test
|
8
|
+
include RubocopHelper
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@cop = RuboCop::Cop::StatsD::SingletonConfiguration.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_offense_statsd_backend
|
15
|
+
assert_offense('StatsD.backend = "foo"')
|
16
|
+
assert_offense('old_backend = StatsD.backend')
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_offense_statsd_prefix
|
20
|
+
assert_offense('StatsD.prefix = "foo"')
|
21
|
+
assert_offense('"#{StatsD.prefix}.foo"')
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_offense_statsd_default_tags
|
25
|
+
assert_offense('StatsD.default_tags = ["foo"]')
|
26
|
+
assert_offense('StatsD.default_tags.empty?')
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_offense_statsd_default_sample_rate
|
30
|
+
assert_offense('StatsD.default_sample_rate = 1.0')
|
31
|
+
assert_offense('should_sample = StatsD.default_sample_rate > rand')
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_no_offense_for_other_methods
|
35
|
+
assert_no_offenses('StatsD.singleton_client = my_client')
|
36
|
+
assert_no_offenses('StatsD.logger.info("foo")')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_no_offense_for_constant_reference
|
40
|
+
assert_no_offenses('legacy_client = StatsD')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -221,11 +221,10 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
221
221
|
ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant::Gateway.ssl_post'
|
222
222
|
end
|
223
223
|
|
224
|
-
def
|
225
|
-
|
224
|
+
def test_statsd_measure_raises_without_a_provided_block
|
225
|
+
assert_raises(LocalJumpError) do
|
226
226
|
assert_statsd_measure('ActiveMerchant.Gateway.ssl_post')
|
227
227
|
end
|
228
|
-
assert_equal "block must be given", err.to_s
|
229
228
|
end
|
230
229
|
|
231
230
|
def test_statsd_measure_with_method_receiving_block
|
@@ -268,11 +267,10 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
268
267
|
ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant::Gateway.ssl_post'
|
269
268
|
end
|
270
269
|
|
271
|
-
def
|
272
|
-
|
270
|
+
def test_statsd_distribution_raises_without_a_provided_block
|
271
|
+
assert_raises(LocalJumpError) do
|
273
272
|
assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post')
|
274
273
|
end
|
275
|
-
assert_equal "block must be given", err.to_s
|
276
274
|
end
|
277
275
|
|
278
276
|
def test_statsd_distribution_with_method_receiving_block
|