statsd-instrument 2.6.0 → 2.7.0
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/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
|