statsd-instrument 2.9.2 → 3.0.2

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +16 -23
  3. data/.rubocop.yml +3 -13
  4. data/CHANGELOG.md +33 -0
  5. data/Gemfile +8 -0
  6. data/README.md +3 -3
  7. data/Rakefile +1 -1
  8. data/benchmark/send-metrics-to-dev-null-log +5 -2
  9. data/benchmark/send-metrics-to-local-udp-receiver +8 -6
  10. data/bin/rake +29 -0
  11. data/bin/rubocop +29 -0
  12. data/lib/statsd/instrument.rb +80 -144
  13. data/lib/statsd/instrument/assertions.rb +200 -208
  14. data/lib/statsd/instrument/capture_sink.rb +23 -19
  15. data/lib/statsd/instrument/client.rb +414 -320
  16. data/lib/statsd/instrument/datagram.rb +69 -65
  17. data/lib/statsd/instrument/datagram_builder.rb +81 -77
  18. data/lib/statsd/instrument/dogstatsd_datagram.rb +76 -72
  19. data/lib/statsd/instrument/dogstatsd_datagram_builder.rb +68 -64
  20. data/lib/statsd/instrument/environment.rb +79 -98
  21. data/lib/statsd/instrument/expectation.rb +96 -96
  22. data/lib/statsd/instrument/helpers.rb +10 -35
  23. data/lib/statsd/instrument/log_sink.rb +20 -16
  24. data/lib/statsd/instrument/matchers.rb +86 -71
  25. data/lib/statsd/instrument/null_sink.rb +12 -8
  26. data/lib/statsd/instrument/railtie.rb +11 -11
  27. data/lib/statsd/instrument/statsd_datagram_builder.rb +12 -8
  28. data/lib/statsd/instrument/strict.rb +12 -123
  29. data/lib/statsd/instrument/udp_sink.rb +50 -46
  30. data/lib/statsd/instrument/version.rb +1 -1
  31. data/statsd-instrument.gemspec +2 -8
  32. data/test/assertions_test.rb +46 -12
  33. data/test/capture_sink_test.rb +8 -8
  34. data/test/client_test.rb +62 -51
  35. data/test/datagram_builder_test.rb +29 -29
  36. data/test/datagram_test.rb +1 -1
  37. data/test/dogstatsd_datagram_builder_test.rb +28 -28
  38. data/test/environment_test.rb +10 -46
  39. data/test/helpers/rubocop_helper.rb +11 -8
  40. data/test/helpers_test.rb +5 -5
  41. data/test/integration_test.rb +10 -25
  42. data/test/log_sink_test.rb +2 -2
  43. data/test/matchers_test.rb +36 -36
  44. data/test/null_sink_test.rb +2 -2
  45. data/test/rubocop/metric_return_value_test.rb +3 -3
  46. data/test/rubocop/metric_value_keyword_argument_test.rb +1 -1
  47. data/test/rubocop/positional_arguments_test.rb +10 -10
  48. data/test/statsd_instrumentation_test.rb +97 -122
  49. data/test/statsd_test.rb +50 -75
  50. data/test/test_helper.rb +7 -5
  51. data/test/udp_sink_test.rb +8 -8
  52. metadata +7 -125
  53. data/.rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml +0 -1027
  54. data/benchmark/datagram-client +0 -40
  55. data/lib/statsd/instrument/backend.rb +0 -18
  56. data/lib/statsd/instrument/backends/capture_backend.rb +0 -32
  57. data/lib/statsd/instrument/backends/logger_backend.rb +0 -20
  58. data/lib/statsd/instrument/backends/null_backend.rb +0 -9
  59. data/lib/statsd/instrument/backends/udp_backend.rb +0 -152
  60. data/lib/statsd/instrument/legacy_client.rb +0 -301
  61. data/lib/statsd/instrument/metric.rb +0 -155
  62. data/test/assertions_on_legacy_client_test.rb +0 -344
  63. data/test/capture_backend_test.rb +0 -26
  64. data/test/compatibility/dogstatsd_datagram_compatibility_test.rb +0 -161
  65. data/test/deprecations_test.rb +0 -139
  66. data/test/logger_backend_test.rb +0 -22
  67. data/test/metric_test.rb +0 -47
  68. data/test/udp_backend_test.rb +0 -228
@@ -1,62 +1,66 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # @note This class is part of the new Client implementation that is intended
4
- # to become the new default in the next major release of this library.
5
- class StatsD::Instrument::UDPSink
6
- def self.for_addr(addr)
7
- host, port_as_string = addr.split(':', 2)
8
- new(host, Integer(port_as_string))
9
- end
3
+ module StatsD
4
+ module Instrument
5
+ # @note This class is part of the new Client implementation that is intended
6
+ # to become the new default in the next major release of this library.
7
+ class UDPSink
8
+ def self.for_addr(addr)
9
+ host, port_as_string = addr.split(':', 2)
10
+ new(host, Integer(port_as_string))
11
+ end
10
12
 
11
- attr_reader :host, :port
13
+ attr_reader :host, :port
12
14
 
13
- def initialize(host, port)
14
- @host = host
15
- @port = port
16
- @mutex = Mutex.new
17
- @socket = nil
18
- end
15
+ def initialize(host, port)
16
+ @host = host
17
+ @port = port
18
+ @mutex = Mutex.new
19
+ @socket = nil
20
+ end
19
21
 
20
- def sample?(sample_rate)
21
- sample_rate == 1 || rand < sample_rate
22
- end
22
+ def sample?(sample_rate)
23
+ sample_rate == 1 || rand < sample_rate
24
+ end
23
25
 
24
- def <<(datagram)
25
- with_socket { |socket| socket.send(datagram, 0) > 0 }
26
- self
26
+ def <<(datagram)
27
+ with_socket { |socket| socket.send(datagram, 0) > 0 }
28
+ self
27
29
 
28
- rescue ThreadError
29
- # In cases where a TERM or KILL signal has been sent, and we send stats as
30
- # part of a signal handler, locks cannot be acquired, so we do our best
31
- # to try and send the datagram without a lock.
32
- socket.send(datagram, 0) > 0
30
+ rescue ThreadError
31
+ # In cases where a TERM or KILL signal has been sent, and we send stats as
32
+ # part of a signal handler, locks cannot be acquired, so we do our best
33
+ # to try and send the datagram without a lock.
34
+ socket.send(datagram, 0) > 0
33
35
 
34
- rescue SocketError, IOError, SystemCallError
35
- # TODO: log?
36
- invalidate_socket
37
- end
36
+ rescue SocketError, IOError, SystemCallError
37
+ # TODO: log?
38
+ invalidate_socket
39
+ end
38
40
 
39
- def addr
40
- "#{host}:#{port}"
41
- end
41
+ def addr
42
+ "#{host}:#{port}"
43
+ end
42
44
 
43
- private
45
+ private
44
46
 
45
- def with_socket
46
- @mutex.synchronize { yield(socket) }
47
- end
47
+ def with_socket
48
+ @mutex.synchronize { yield(socket) }
49
+ end
48
50
 
49
- def socket
50
- if @socket.nil?
51
- @socket = UDPSocket.new
52
- @socket.connect(@host, @port)
53
- end
54
- @socket
55
- end
51
+ def socket
52
+ if @socket.nil?
53
+ @socket = UDPSocket.new
54
+ @socket.connect(@host, @port)
55
+ end
56
+ @socket
57
+ end
56
58
 
57
- def invalidate_socket
58
- @mutex.synchronize do
59
- @socket = nil
59
+ def invalidate_socket
60
+ @mutex.synchronize do
61
+ @socket = nil
62
+ end
63
+ end
60
64
  end
61
65
  end
62
66
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module StatsD
4
4
  module Instrument
5
- VERSION = "2.9.2"
5
+ VERSION = "3.0.2"
6
6
  end
7
7
  end
@@ -16,15 +16,9 @@ Gem::Specification.new do |spec|
16
16
  spec.license = "MIT"
17
17
 
18
18
  spec.files = `git ls-files`.split($/)
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_development_dependency 'rake'
24
- spec.add_development_dependency 'minitest'
25
- spec.add_development_dependency 'rspec'
26
- spec.add_development_dependency 'mocha'
27
- spec.add_development_dependency 'yard'
28
- spec.add_development_dependency 'rubocop'
29
- spec.add_development_dependency 'benchmark-ips'
23
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
30
24
  end
@@ -31,7 +31,7 @@ class AssertionsTest < Minitest::Test
31
31
  StatsD.increment('counter')
32
32
  end
33
33
  end
34
- assert_equal assertion.message, "No StatsD calls for metric counter expected."
34
+ assert_equal(assertion.message, "No StatsD calls for metric counter expected.")
35
35
 
36
36
  @test_case.assert_no_statsd_calls('counter1', 'counter2') do
37
37
  # noop
@@ -49,21 +49,21 @@ class AssertionsTest < Minitest::Test
49
49
  StatsD.increment('counter3')
50
50
  end
51
51
  end
52
- assert_equal assertion.message, "No StatsD calls for metric counter1, counter2 expected."
52
+ assert_equal(assertion.message, "No StatsD calls for metric counter1, counter2 expected.")
53
53
 
54
54
  assertion = assert_raises(Minitest::Assertion) do
55
55
  @test_case.assert_no_statsd_calls('counter0', 'counter1', 'counter2') do
56
56
  StatsD.increment('counter1')
57
57
  end
58
58
  end
59
- assert_equal assertion.message, "No StatsD calls for metric counter1 expected."
59
+ assert_equal(assertion.message, "No StatsD calls for metric counter1 expected.")
60
60
 
61
61
  assertion = assert_raises(Minitest::Assertion) do
62
62
  @test_case.assert_no_statsd_calls do
63
63
  StatsD.increment('other')
64
64
  end
65
65
  end
66
- assert_equal assertion.message, "No StatsD calls for metric other expected."
66
+ assert_equal(assertion.message, "No StatsD calls for metric other expected.")
67
67
 
68
68
  assertion = assert_raises(Minitest::Assertion) do
69
69
  @test_case.assert_no_statsd_calls do
@@ -71,7 +71,7 @@ class AssertionsTest < Minitest::Test
71
71
  StatsD.increment('another')
72
72
  end
73
73
  end
74
- assert_equal assertion.message, "No StatsD calls for metric other, another expected."
74
+ assert_equal(assertion.message, "No StatsD calls for metric other, another expected.")
75
75
  end
76
76
 
77
77
  def test_assert_statsd
@@ -202,8 +202,8 @@ class AssertionsTest < Minitest::Test
202
202
  end
203
203
  end
204
204
 
205
- assert_includes assertion.message, "Captured metrics with the same key"
206
- assert_includes assertion.message, "MyJob"
205
+ assert_includes(assertion.message, "Captured metrics with the same key")
206
+ assert_includes(assertion.message, "MyJob")
207
207
  end
208
208
 
209
209
  def test_capture_and_assert
@@ -367,7 +367,7 @@ class AssertionsTest < Minitest::Test
367
367
  end
368
368
  end
369
369
  end
370
- assert_includes assertion.message, "No StatsD calls for metric counter of type c were made"
370
+ assert_includes(assertion.message, "No StatsD calls for metric counter of type c were made")
371
371
  end
372
372
 
373
373
  def test_assertion_block_with_unexpected_exceptions
@@ -377,7 +377,7 @@ class AssertionsTest < Minitest::Test
377
377
  raise "unexpected"
378
378
  end
379
379
  end
380
- assert_includes assertion.message, "An exception occurred in the block provided to the StatsD assertion"
380
+ assert_includes(assertion.message, "An exception occurred in the block provided to the StatsD assertion")
381
381
 
382
382
  assertion = assert_raises(Minitest::Assertion) do
383
383
  @test_case.assert_raises(RuntimeError) do
@@ -387,7 +387,7 @@ class AssertionsTest < Minitest::Test
387
387
  end
388
388
  end
389
389
  end
390
- assert_includes assertion.message, "An exception occurred in the block provided to the StatsD assertion"
390
+ assert_includes(assertion.message, "An exception occurred in the block provided to the StatsD assertion")
391
391
 
392
392
  assertion = assert_raises(Minitest::Assertion) do
393
393
  @test_case.assert_raises(RuntimeError) do
@@ -396,7 +396,7 @@ class AssertionsTest < Minitest::Test
396
396
  end
397
397
  end
398
398
  end
399
- assert_includes assertion.message, "An exception occurred in the block provided to the StatsD assertion"
399
+ assert_includes(assertion.message, "An exception occurred in the block provided to the StatsD assertion")
400
400
  end
401
401
 
402
402
  def test_assertion_block_with_other_assertion_failures
@@ -406,6 +406,40 @@ class AssertionsTest < Minitest::Test
406
406
  @test_case.flunk('other assertion failure')
407
407
  end
408
408
  end
409
- assert_equal "other assertion failure", assertion.message
409
+ assert_equal("other assertion failure", assertion.message)
410
+ end
411
+
412
+ def test_assert_when_using_no_prefix
413
+ env = StatsD::Instrument::Environment.new('STATSD_PREFIX' => nil)
414
+ StatsD.singleton_client = StatsD::Instrument::Client.from_env(env)
415
+
416
+ @test_case.assert_statsd_increment('incr', no_prefix: false) do
417
+ StatsD.increment('incr')
418
+ end
419
+
420
+ @test_case.assert_statsd_increment('incr', no_prefix: true) do
421
+ StatsD.increment('incr')
422
+ end
423
+
424
+ env = StatsD::Instrument::Environment.new('STATSD_PREFIX' => 'prefix')
425
+ StatsD.singleton_client = StatsD::Instrument::Client.from_env(env)
426
+
427
+ @test_case.assert_statsd_increment('incr', no_prefix: false) do
428
+ StatsD.increment('incr')
429
+ end
430
+
431
+ assert_raises(Minitest::Assertion) do
432
+ @test_case.assert_statsd_increment('incr', no_prefix: true) do
433
+ StatsD.increment('incr')
434
+ end
435
+ end
436
+
437
+ @test_case.assert_statsd_increment('prefix.incr', no_prefix: true) do
438
+ StatsD.increment('incr')
439
+ end
440
+
441
+ @test_case.assert_statsd_increment('incr', no_prefix: true) do
442
+ StatsD.increment('incr', no_prefix: true)
443
+ end
410
444
  end
411
445
  end
@@ -7,9 +7,9 @@ class CaptureSinkTest < Minitest::Test
7
7
  capture_sink = StatsD::Instrument::CaptureSink.new(parent: [])
8
8
  capture_sink << 'foo:1|c'
9
9
 
10
- assert_equal 1, capture_sink.datagrams.length
11
- assert_kind_of StatsD::Instrument::Datagram, capture_sink.datagrams.first
12
- assert_equal 'foo:1|c', capture_sink.datagrams.first.source
10
+ assert_equal(1, capture_sink.datagrams.length)
11
+ assert_kind_of(StatsD::Instrument::Datagram, capture_sink.datagrams.first)
12
+ assert_equal('foo:1|c', capture_sink.datagrams.first.source)
13
13
  end
14
14
 
15
15
  def test_capture_sink_sends_datagrams_to_parent
@@ -17,7 +17,7 @@ class CaptureSinkTest < Minitest::Test
17
17
  capture_sink = StatsD::Instrument::CaptureSink.new(parent: parent)
18
18
  capture_sink << 'foo:1|c' << 'bar:1|c'
19
19
 
20
- assert_equal ['foo:1|c', 'bar:1|c'], parent
20
+ assert_equal(['foo:1|c', 'bar:1|c'], parent)
21
21
  end
22
22
 
23
23
  def test_nesting_capture_sink_instances
@@ -28,15 +28,15 @@ class CaptureSinkTest < Minitest::Test
28
28
  outer_capture_sink << 'foo:1|c'
29
29
  inner_capture_sink << 'bar:1|c'
30
30
 
31
- assert_equal ['foo:1|c', 'bar:1|c'], outer_capture_sink.datagrams.map(&:source)
32
- assert_equal ['bar:1|c'], inner_capture_sink.datagrams.map(&:source)
31
+ assert_equal(['foo:1|c', 'bar:1|c'], outer_capture_sink.datagrams.map(&:source))
32
+ assert_equal(['bar:1|c'], inner_capture_sink.datagrams.map(&:source))
33
33
  end
34
34
 
35
35
  def test_using_a_different_datagram_class
36
36
  sink = StatsD::Instrument::CaptureSink.new(parent: [], datagram_class: String)
37
37
  sink << 'foo:1|c'
38
38
 
39
- assert sink.datagrams.all? { |datagram| datagram.is_a?(String) }
40
- assert_equal ['foo:1|c'], sink.datagrams
39
+ assert(sink.datagrams.all? { |datagram| datagram.is_a?(String) })
40
+ assert_equal(['foo:1|c'], sink.datagrams)
41
41
  end
42
42
  end
@@ -19,25 +19,25 @@ class ClientTest < Minitest::Test
19
19
  )
20
20
  client = StatsD::Instrument::Client.from_env(env)
21
21
 
22
- assert_equal 0.1, client.default_sample_rate
23
- assert_equal 'foo', client.prefix
24
- assert_equal ['shard:1', 'env:production'], client.default_tags
25
- assert_equal StatsD::Instrument::StatsDDatagramBuilder, client.datagram_builder_class
22
+ assert_equal(0.1, client.default_sample_rate)
23
+ assert_equal('foo', client.prefix)
24
+ assert_equal(['shard:1', 'env:production'], client.default_tags)
25
+ assert_equal(StatsD::Instrument::StatsDDatagramBuilder, client.datagram_builder_class)
26
26
 
27
- assert_kind_of StatsD::Instrument::UDPSink, client.sink
28
- assert_equal '1.2.3.4', client.sink.host
29
- assert_equal 8125, client.sink.port
27
+ assert_kind_of(StatsD::Instrument::UDPSink, client.sink)
28
+ assert_equal('1.2.3.4', client.sink.host)
29
+ assert_equal(8125, client.sink.port)
30
30
  end
31
31
 
32
32
  def test_client_from_env_has_sensible_defaults
33
33
  env = StatsD::Instrument::Environment.new({})
34
34
  client = StatsD::Instrument::Client.from_env(env)
35
35
 
36
- assert_equal 1.0, client.default_sample_rate
37
- assert_nil client.prefix
38
- assert_nil client.default_tags
39
- assert_equal StatsD::Instrument::DogStatsDDatagramBuilder, client.datagram_builder_class
40
- assert_kind_of StatsD::Instrument::LogSink, client.sink
36
+ assert_equal(1.0, client.default_sample_rate)
37
+ assert_nil(client.prefix)
38
+ assert_nil(client.default_tags)
39
+ assert_equal(StatsD::Instrument::DogStatsDDatagramBuilder, client.datagram_builder_class)
40
+ assert_kind_of(StatsD::Instrument::LogSink, client.sink)
41
41
  end
42
42
 
43
43
  def test_client_from_env_with_overrides
@@ -51,12 +51,12 @@ class ClientTest < Minitest::Test
51
51
  client = StatsD::Instrument::Client.from_env(env,
52
52
  prefix: 'bar', implementation: 'dogstatsd', sink: StatsD::Instrument::NullSink.new)
53
53
 
54
- assert_equal 0.1, client.default_sample_rate
55
- assert_equal 'bar', client.prefix
56
- assert_equal ['shard:1', 'env:production'], client.default_tags
57
- assert_equal StatsD::Instrument::DogStatsDDatagramBuilder, client.datagram_builder_class
54
+ assert_equal(0.1, client.default_sample_rate)
55
+ assert_equal('bar', client.prefix)
56
+ assert_equal(['shard:1', 'env:production'], client.default_tags)
57
+ assert_equal(StatsD::Instrument::DogStatsDDatagramBuilder, client.datagram_builder_class)
58
58
 
59
- assert_kind_of StatsD::Instrument::NullSink, client.sink
59
+ assert_kind_of(StatsD::Instrument::NullSink, client.sink)
60
60
  end
61
61
 
62
62
  def test_capture
@@ -71,27 +71,27 @@ class ClientTest < Minitest::Test
71
71
  end
72
72
  @client.increment('quc')
73
73
 
74
- assert_equal ['bar', 'baz'], outer_datagrams.map(&:name)
75
- assert_equal ['baz'], inner_datagrams.map(&:name)
74
+ assert_equal(['bar', 'baz'], outer_datagrams.map(&:name))
75
+ assert_equal(['baz'], inner_datagrams.map(&:name))
76
76
  end
77
77
 
78
78
  def test_metric_methods_return_truish_void
79
- assert @client.increment('foo')
80
- assert @client.measure('bar', 122.54)
81
- assert @client.set('baz', 123)
82
- assert @client.gauge('baz', 12.3)
79
+ assert(@client.increment('foo'))
80
+ assert(@client.measure('bar', 122.54))
81
+ assert(@client.set('baz', 123))
82
+ assert(@client.gauge('baz', 12.3))
83
83
  end
84
84
 
85
85
  def test_increment_with_default_value
86
86
  datagrams = @client.capture { @client.increment('foo') }
87
- assert_equal 1, datagrams.size
88
- assert_equal 'foo:1|c', datagrams.first.source
87
+ assert_equal(1, datagrams.size)
88
+ assert_equal('foo:1|c', datagrams.first.source)
89
89
  end
90
90
 
91
91
  def test_measure_with_value
92
92
  datagrams = @client.capture { @client.measure('foo', 122.54) }
93
- assert_equal 1, datagrams.size
94
- assert_equal 'foo:122.54|ms', datagrams.first.source
93
+ assert_equal(1, datagrams.size)
94
+ assert_equal('foo:122.54|ms', datagrams.first.source)
95
95
  end
96
96
 
97
97
  def test_measure_with_block
@@ -99,32 +99,32 @@ class ClientTest < Minitest::Test
99
99
  datagrams = @client.capture do
100
100
  @client.measure('foo') {}
101
101
  end
102
- assert_equal 1, datagrams.size
103
- assert_equal 'foo:100.0|ms', datagrams.first.source
102
+ assert_equal(1, datagrams.size)
103
+ assert_equal('foo:100.0|ms', datagrams.first.source)
104
104
  end
105
105
 
106
106
  def test_gauge
107
107
  datagrams = @client.capture { @client.gauge('foo', 123) }
108
- assert_equal 1, datagrams.size
109
- assert_equal 'foo:123|g', datagrams.first.source
108
+ assert_equal(1, datagrams.size)
109
+ assert_equal('foo:123|g', datagrams.first.source)
110
110
  end
111
111
 
112
112
  def test_set
113
113
  datagrams = @client.capture { @client.set('foo', 12345) }
114
- assert_equal 1, datagrams.size
115
- assert_equal 'foo:12345|s', datagrams.first.source
114
+ assert_equal(1, datagrams.size)
115
+ assert_equal('foo:12345|s', datagrams.first.source)
116
116
  end
117
117
 
118
118
  def test_histogram
119
119
  datagrams = @dogstatsd_client.capture { @dogstatsd_client.histogram('foo', 12.44) }
120
- assert_equal 1, datagrams.size
121
- assert_equal 'foo:12.44|h', datagrams.first.source
120
+ assert_equal(1, datagrams.size)
121
+ assert_equal('foo:12.44|h', datagrams.first.source)
122
122
  end
123
123
 
124
124
  def test_distribution_with_value
125
125
  datagrams = @dogstatsd_client.capture { @dogstatsd_client.distribution('foo', 12.44) }
126
- assert_equal 1, datagrams.size
127
- assert_equal 'foo:12.44|d', datagrams.first.source
126
+ assert_equal(1, datagrams.size)
127
+ assert_equal('foo:12.44|d', datagrams.first.source)
128
128
  end
129
129
 
130
130
  def test_distribution_with_block
@@ -132,8 +132,8 @@ class ClientTest < Minitest::Test
132
132
  datagrams = @dogstatsd_client.capture do
133
133
  @dogstatsd_client.distribution('foo') {}
134
134
  end
135
- assert_equal 1, datagrams.size
136
- assert_equal "foo:100.0|d", datagrams.first.source
135
+ assert_equal(1, datagrams.size)
136
+ assert_equal("foo:100.0|d", datagrams.first.source)
137
137
  end
138
138
 
139
139
  def test_latency_emits_ms_metric
@@ -141,8 +141,8 @@ class ClientTest < Minitest::Test
141
141
  datagrams = @client.capture do
142
142
  @client.latency('foo') {}
143
143
  end
144
- assert_equal 1, datagrams.size
145
- assert_equal "foo:100.0|ms", datagrams.first.source
144
+ assert_equal(1, datagrams.size)
145
+ assert_equal("foo:100.0|ms", datagrams.first.source)
146
146
  end
147
147
 
148
148
  def test_latency_on_dogstatsd_prefers_distribution_metric_type
@@ -150,8 +150,8 @@ class ClientTest < Minitest::Test
150
150
  datagrams = @dogstatsd_client.capture do
151
151
  @dogstatsd_client.latency('foo') {}
152
152
  end
153
- assert_equal 1, datagrams.size
154
- assert_equal "foo:100.0|d", datagrams.first.source
153
+ assert_equal(1, datagrams.size)
154
+ assert_equal("foo:100.0|d", datagrams.first.source)
155
155
  end
156
156
 
157
157
  def test_latency_calls_block_even_when_not_sending_a_sample
@@ -159,19 +159,19 @@ class ClientTest < Minitest::Test
159
159
  @client.capture do
160
160
  @client.latency('foo', sample_rate: 0) { called = true }
161
161
  end
162
- assert called, "The block should have been called"
162
+ assert(called, "The block should have been called")
163
163
  end
164
164
 
165
165
  def test_service_check
166
166
  datagrams = @dogstatsd_client.capture { @dogstatsd_client.service_check('service', :ok) }
167
- assert_equal 1, datagrams.size
168
- assert_equal "_sc|service|0", datagrams.first.source
167
+ assert_equal(1, datagrams.size)
168
+ assert_equal("_sc|service|0", datagrams.first.source)
169
169
  end
170
170
 
171
171
  def test_event
172
172
  datagrams = @dogstatsd_client.capture { @dogstatsd_client.event('service', "event\ndescription") }
173
- assert_equal 1, datagrams.size
174
- assert_equal "_e{7,18}:service|event\\ndescription", datagrams.first.source
173
+ assert_equal(1, datagrams.size)
174
+ assert_equal("_e{7,18}:service|event\\ndescription", datagrams.first.source)
175
175
  end
176
176
 
177
177
  def test_no_prefix
@@ -181,9 +181,20 @@ class ClientTest < Minitest::Test
181
181
  client.increment('bar', no_prefix: true)
182
182
  end
183
183
 
184
- assert_equal 2, datagrams.size
185
- assert_equal "foo.bar", datagrams[0].name
186
- assert_equal "bar", datagrams[1].name
184
+ assert_equal(2, datagrams.size)
185
+ assert_equal("foo.bar", datagrams[0].name)
186
+ assert_equal("bar", datagrams[1].name)
187
+ end
188
+
189
+ def test_default_tags_normalization
190
+ client = StatsD::Instrument::Client.new(default_tags: { first_tag: 'f|irst_value', second_tag: 'sec,ond_value' })
191
+ datagrams = client.capture do
192
+ client.increment('bar', tags: ['th|ird_#,tag'])
193
+ end
194
+
195
+ assert_includes(datagrams.first.tags, 'first_tag:first_value')
196
+ assert_includes(datagrams.first.tags, 'second_tag:second_value')
197
+ assert_includes(datagrams.first.tags, 'third_#tag')
187
198
  end
188
199
 
189
200
  def test_sampling