statsd-instrument 3.7.0 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/pull_request_template.md +14 -0
- data/.github/workflows/benchmark.yml +2 -3
- data/.github/workflows/lint.yml +1 -2
- data/.github/workflows/tests.yml +2 -2
- data/.rubocop.yml +0 -1
- data/.ruby-version +1 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +7 -0
- data/README.md +56 -0
- data/Rakefile +11 -0
- data/benchmark/local-udp-throughput +178 -13
- data/benchmark/send-metrics-to-local-udp-receiver +6 -4
- data/lib/statsd/instrument/aggregator.rb +259 -0
- data/lib/statsd/instrument/{batched_udp_sink.rb → batched_sink.rb} +112 -19
- data/lib/statsd/instrument/client.rb +65 -7
- data/lib/statsd/instrument/datagram.rb +6 -2
- data/lib/statsd/instrument/datagram_builder.rb +21 -0
- data/lib/statsd/instrument/environment.rb +42 -6
- data/lib/statsd/instrument/{udp_sink.rb → sink.rb} +34 -25
- data/lib/statsd/instrument/udp_connection.rb +39 -0
- data/lib/statsd/instrument/uds_connection.rb +52 -0
- data/lib/statsd/instrument/version.rb +1 -1
- data/lib/statsd/instrument.rb +9 -3
- data/statsd-instrument.gemspec +2 -0
- data/test/aggregator_test.rb +142 -0
- data/test/client_test.rb +36 -1
- data/test/datagram_builder_test.rb +5 -0
- data/test/dispatcher_stats_test.rb +69 -0
- data/test/environment_test.rb +4 -4
- data/test/integration_test.rb +51 -0
- data/test/test_helper.rb +6 -1
- data/test/udp_sink_test.rb +28 -6
- data/test/uds_sink_test.rb +187 -0
- metadata +20 -9
data/test/integration_test.rb
CHANGED
@@ -26,4 +26,55 @@ class IntegrationTest < Minitest::Test
|
|
26
26
|
StatsD.increment("counter")
|
27
27
|
assert_equal("counter:1|c", @server.recvfrom(100).first)
|
28
28
|
end
|
29
|
+
|
30
|
+
def test_live_local_udp_socket_with_aggregation_flush
|
31
|
+
client = StatsD::Instrument::Environment.new(
|
32
|
+
"STATSD_ADDR" => "#{@server.addr[2]}:#{@server.addr[1]}",
|
33
|
+
"STATSD_IMPLEMENTATION" => "dogstatsd",
|
34
|
+
"STATSD_ENV" => "production",
|
35
|
+
"STATSD_ENABLE_AGGREGATION" => "true",
|
36
|
+
"STATSD_AGGREGATION_INTERVAL" => "5.0",
|
37
|
+
).client
|
38
|
+
|
39
|
+
10.times do |i|
|
40
|
+
client.increment("counter", 2)
|
41
|
+
client.distribution("test_distribution", 3 * i)
|
42
|
+
client.gauge("test_gauge", 3 * i)
|
43
|
+
end
|
44
|
+
|
45
|
+
client.force_flush
|
46
|
+
|
47
|
+
packets = []
|
48
|
+
while IO.select([@server], nil, nil, 0.1)
|
49
|
+
packets << @server.recvfrom(200).first
|
50
|
+
end
|
51
|
+
packets = packets.map { |packet| packet.split("\n") }.flatten
|
52
|
+
|
53
|
+
assert_equal("counter:20|c", packets.find { |packet| packet.start_with?("counter:") })
|
54
|
+
assert_equal(
|
55
|
+
"test_distribution:0:3:6:9:12:15:18:21:24:27|d",
|
56
|
+
packets.find { |packet| packet.start_with?("test_distribution:") },
|
57
|
+
)
|
58
|
+
assert_equal("test_gauge:27|g", packets.find { |packet| packet.start_with?("test_gauge:") })
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_live_local_udp_socket_with_aggregation_periodic_flush
|
62
|
+
client = StatsD::Instrument::Environment.new(
|
63
|
+
"STATSD_ADDR" => "#{@server.addr[2]}:#{@server.addr[1]}",
|
64
|
+
"STATSD_IMPLEMENTATION" => "dogstatsd",
|
65
|
+
"STATSD_ENV" => "production",
|
66
|
+
"STATSD_ENABLE_AGGREGATION" => "true",
|
67
|
+
"STATSD_AGGREGATION_INTERVAL" => "0.1",
|
68
|
+
).client
|
69
|
+
|
70
|
+
10.times do
|
71
|
+
client.increment("counter", 2)
|
72
|
+
end
|
73
|
+
|
74
|
+
before_flush = Time.now
|
75
|
+
sleep(0.2)
|
76
|
+
|
77
|
+
assert_equal("counter:20|c", @server.recvfrom(100).first)
|
78
|
+
assert_operator(Time.now - before_flush, :<, 0.3, "Flush and ingest should have happened within 0.4s")
|
79
|
+
end
|
29
80
|
end
|
data/test/test_helper.rb
CHANGED
@@ -6,8 +6,13 @@ end
|
|
6
6
|
|
7
7
|
ENV["ENV"] = "test"
|
8
8
|
|
9
|
+
unless ENV.key?("CI")
|
10
|
+
require "minitest/pride"
|
11
|
+
end
|
9
12
|
require "minitest/autorun"
|
10
|
-
|
13
|
+
unless ENV.key?("CI")
|
14
|
+
require "minitest/pride"
|
15
|
+
end
|
11
16
|
require "mocha/minitest"
|
12
17
|
require "statsd-instrument"
|
13
18
|
|
data/test/udp_sink_test.rb
CHANGED
@@ -107,7 +107,8 @@ module UDPSinkTests
|
|
107
107
|
private
|
108
108
|
|
109
109
|
def build_sink(host = @host, port = @port)
|
110
|
-
|
110
|
+
connection = StatsD::Instrument::UdpConnection.new(host, port)
|
111
|
+
StatsD::Instrument::Sink.new(connection)
|
111
112
|
end
|
112
113
|
|
113
114
|
def read_datagrams(count, timeout: ENV["CI"] ? 5 : 1)
|
@@ -132,7 +133,7 @@ class UDPSinkTest < Minitest::Test
|
|
132
133
|
@receiver.bind("localhost", 0)
|
133
134
|
@host = @receiver.addr[2]
|
134
135
|
@port = @receiver.addr[1]
|
135
|
-
@sink_class = StatsD::Instrument::
|
136
|
+
@sink_class = StatsD::Instrument::Sink
|
136
137
|
end
|
137
138
|
|
138
139
|
def teardown
|
@@ -167,7 +168,7 @@ class UDPSinkTest < Minitest::Test
|
|
167
168
|
ensure
|
168
169
|
StatsD.logger = previous_logger
|
169
170
|
# Make sure our fake socket is closed so that it doesn't interfere with other tests
|
170
|
-
udp_sink&.send(:
|
171
|
+
udp_sink&.send(:invalidate_connection)
|
171
172
|
end
|
172
173
|
end
|
173
174
|
end
|
@@ -180,7 +181,7 @@ class BatchedUDPSinkTest < Minitest::Test
|
|
180
181
|
@receiver.bind("localhost", 0)
|
181
182
|
@host = @receiver.addr[2]
|
182
183
|
@port = @receiver.addr[1]
|
183
|
-
@sink_class = StatsD::Instrument::
|
184
|
+
@sink_class = StatsD::Instrument::BatchedSink
|
184
185
|
@sinks = []
|
185
186
|
end
|
186
187
|
|
@@ -202,10 +203,31 @@ class BatchedUDPSinkTest < Minitest::Test
|
|
202
203
|
assert(buffer.empty?)
|
203
204
|
end
|
204
205
|
|
206
|
+
def test_statistics
|
207
|
+
datagrams = StatsD.singleton_client.capture do
|
208
|
+
buffer_size = 2
|
209
|
+
sink = build_sink(@host, @port, buffer_capacity: buffer_size, statistics_interval: 0.1)
|
210
|
+
2.times { |i| sink << "foo:#{i}|c" }
|
211
|
+
sink.flush(blocking: false)
|
212
|
+
sink.instance_variable_get(:@dispatcher).instance_variable_get(:@statistics).maybe_flush!(force: true)
|
213
|
+
end
|
214
|
+
|
215
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_udp_sink.avg_batch_length") })
|
216
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_udp_sink.avg_batched_packet_size") })
|
217
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_udp_sink.avg_buffer_length") })
|
218
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_udp_sink.batched_sends") })
|
219
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_udp_sink.synchronous_sends") })
|
220
|
+
end
|
221
|
+
|
205
222
|
private
|
206
223
|
|
207
|
-
def build_sink(host = @host, port = @port, buffer_capacity: 50)
|
208
|
-
sink =
|
224
|
+
def build_sink(host = @host, port = @port, buffer_capacity: 50, statistics_interval: 0)
|
225
|
+
sink = StatsD::Instrument::Sink.for_addr("#{host}:#{port}")
|
226
|
+
sink = @sink_class.new(
|
227
|
+
sink,
|
228
|
+
buffer_capacity: buffer_capacity,
|
229
|
+
statistics_interval: statistics_interval,
|
230
|
+
)
|
209
231
|
@sinks << sink
|
210
232
|
sink
|
211
233
|
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
module UdsTestHelper
|
6
|
+
MAX_READ_BYTES = 64 * 1024
|
7
|
+
private_constant :MAX_READ_BYTES
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def create_socket_file
|
12
|
+
tmpdir = Dir.mktmpdir
|
13
|
+
socket_path = File.join(tmpdir, "sockets", "statsd.sock")
|
14
|
+
FileUtils.mkdir_p(File.dirname(socket_path))
|
15
|
+
|
16
|
+
socket_path
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_receiver(socket_path)
|
20
|
+
FileUtils.rm_f(socket_path)
|
21
|
+
receiver = Socket.new(Socket::AF_UNIX, Socket::SOCK_DGRAM)
|
22
|
+
receiver.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
|
23
|
+
receiver.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVBUF, (2 * MAX_READ_BYTES).to_i)
|
24
|
+
receiver.bind(Socket.pack_sockaddr_un(socket_path))
|
25
|
+
|
26
|
+
receiver
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_sink(socket_path)
|
30
|
+
connection = StatsD::Instrument::UdsConnection.new(socket_path)
|
31
|
+
@sink_class.new(connection)
|
32
|
+
end
|
33
|
+
|
34
|
+
def sink
|
35
|
+
@sink ||= build_sink(@socket_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def skip_on_jruby(message = "JRuby does not support UNIX domain sockets")
|
39
|
+
skip(message) if RUBY_PLATFORM == "java"
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_datagrams(count, timeout: ENV["CI"] ? 5 : 1)
|
43
|
+
datagrams = []
|
44
|
+
count.times do
|
45
|
+
if @receiver.wait_readable(timeout)
|
46
|
+
|
47
|
+
datagrams += @receiver.recvfrom(MAX_READ_BYTES).first.lines(chomp: true)
|
48
|
+
break if datagrams.size >= count
|
49
|
+
else
|
50
|
+
break
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
datagrams
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class UdsSinkTest < Minitest::Test
|
59
|
+
include UdsTestHelper
|
60
|
+
|
61
|
+
def setup
|
62
|
+
@sink_class = StatsD::Instrument::Sink
|
63
|
+
@socket_path = create_socket_file
|
64
|
+
skip_on_jruby
|
65
|
+
|
66
|
+
@receiver = create_receiver(@socket_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
def teardown
|
70
|
+
return if RUBY_PLATFORM == "java"
|
71
|
+
|
72
|
+
@receiver.close
|
73
|
+
FileUtils.rm_f(@socket_path)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_send_metric_with_tags
|
77
|
+
metric = "test.metric"
|
78
|
+
value = 42
|
79
|
+
tags = { region: "us-west", environment: "production" }
|
80
|
+
sink << "#{metric}:#{value}|c|##{"region:#{tags[:region]},environment:#{tags[:environment]}"}"
|
81
|
+
# Assert that the metric with tags was sent successfully
|
82
|
+
|
83
|
+
datagrams = read_datagrams(1)
|
84
|
+
assert_equal("test.metric:42|c|#region:us-west,environment:production".b, datagrams.first)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_send_metric_with_sample_rate
|
88
|
+
metric = "test.metric"
|
89
|
+
value = 42
|
90
|
+
sample_rate = 0.5
|
91
|
+
sink << "#{metric}:#{value}|c|@#{sample_rate}"
|
92
|
+
datagrams = read_datagrams(1)
|
93
|
+
assert_equal("test.metric:42|c|@0.5".b, datagrams.first)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_flush_with_empty_batch
|
97
|
+
sink.flush
|
98
|
+
datagrams = read_datagrams(1, timeout: 0.1)
|
99
|
+
assert_empty(datagrams)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class BatchedUdsSinkTest < Minitest::Test
|
104
|
+
include UdsTestHelper
|
105
|
+
|
106
|
+
def setup
|
107
|
+
@socket_path = create_socket_file
|
108
|
+
@sink_class = StatsD::Instrument::BatchedSink
|
109
|
+
@sinks = []
|
110
|
+
|
111
|
+
skip_on_jruby
|
112
|
+
|
113
|
+
@receiver = create_receiver(@socket_path)
|
114
|
+
end
|
115
|
+
|
116
|
+
def teardown
|
117
|
+
return if RUBY_PLATFORM == "java"
|
118
|
+
|
119
|
+
@receiver.close
|
120
|
+
FileUtils.remove_entry(@socket_path)
|
121
|
+
@sinks.each(&:shutdown)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_send_metric_with_tags
|
125
|
+
metric = "test.metric"
|
126
|
+
value = 42
|
127
|
+
tags = { region: "us-west", environment: "production" }
|
128
|
+
sink << "#{metric}:#{value}|c|##{"region:#{tags[:region]},environment:#{tags[:environment]}"}"
|
129
|
+
datagrams = read_datagrams(1)
|
130
|
+
assert_equal("test.metric:42|c|#region:us-west,environment:production".b, datagrams.first)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_send_metric_with_sample_rate
|
134
|
+
metric = "test.metric"
|
135
|
+
value = 42
|
136
|
+
sample_rate = 0.5
|
137
|
+
sink << "#{metric}:#{value}|c|@#{sample_rate}"
|
138
|
+
datagrams = read_datagrams(1)
|
139
|
+
assert_equal("test.metric:42|c|@0.5".b, datagrams.first)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_flush_with_empty_batch
|
143
|
+
sink.flush(blocking: false)
|
144
|
+
datagrams = read_datagrams(1, timeout: 0.1)
|
145
|
+
assert_empty(datagrams)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_flush
|
149
|
+
buffer_size = 50
|
150
|
+
sink = build_sink(@socket_path, buffer_capacity: buffer_size)
|
151
|
+
dispatcher = sink.instance_variable_get(:@dispatcher)
|
152
|
+
buffer = dispatcher.instance_variable_get(:@buffer)
|
153
|
+
(buffer_size * 2).times { |i| sink << "foo:#{i}|c" }
|
154
|
+
assert(!buffer.empty?)
|
155
|
+
sink.flush(blocking: false)
|
156
|
+
assert(buffer.empty?)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_statistics
|
160
|
+
datagrams = StatsD.singleton_client.capture do
|
161
|
+
buffer_size = 2
|
162
|
+
sink = build_sink(@socket_path, buffer_capacity: buffer_size, statistics_interval: 0.1)
|
163
|
+
2.times { |i| sink << "foo:#{i}|c" }
|
164
|
+
sink.flush(blocking: false)
|
165
|
+
sink.instance_variable_get(:@dispatcher).instance_variable_get(:@statistics).maybe_flush!(force: true)
|
166
|
+
end
|
167
|
+
|
168
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_uds_sink.avg_batch_length") })
|
169
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_uds_sink.avg_batched_packet_size") })
|
170
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_uds_sink.avg_buffer_length") })
|
171
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_uds_sink.batched_sends") })
|
172
|
+
assert(datagrams.any? { |d| d.name.start_with?("statsd_instrument.batched_uds_sink.synchronous_sends") })
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
def build_sink(socket_path, buffer_capacity: 50, statistics_interval: 0)
|
178
|
+
sink = StatsD::Instrument::Sink.for_addr(socket_path)
|
179
|
+
sink = @sink_class.new(
|
180
|
+
sink,
|
181
|
+
buffer_capacity: buffer_capacity,
|
182
|
+
statistics_interval: statistics_interval,
|
183
|
+
)
|
184
|
+
@sinks << sink
|
185
|
+
sink
|
186
|
+
end
|
187
|
+
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsd-instrument
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Storimer
|
8
8
|
- Tobias Lutke
|
9
9
|
- Willem van Bergen
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-08-19 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: A StatsD client for Ruby apps. Provides metaprogramming methods to inject
|
16
16
|
StatsD instrumentation into your code.
|
@@ -21,12 +21,14 @@ extensions: []
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- ".github/CODEOWNERS"
|
24
|
+
- ".github/pull_request_template.md"
|
24
25
|
- ".github/workflows/benchmark.yml"
|
25
26
|
- ".github/workflows/cla.yml"
|
26
27
|
- ".github/workflows/lint.yml"
|
27
28
|
- ".github/workflows/tests.yml"
|
28
29
|
- ".gitignore"
|
29
30
|
- ".rubocop.yml"
|
31
|
+
- ".ruby-version"
|
30
32
|
- ".yardopts"
|
31
33
|
- CHANGELOG.md
|
32
34
|
- CONTRIBUTING.md
|
@@ -42,8 +44,9 @@ files:
|
|
42
44
|
- bin/rubocop
|
43
45
|
- lib/statsd-instrument.rb
|
44
46
|
- lib/statsd/instrument.rb
|
47
|
+
- lib/statsd/instrument/aggregator.rb
|
45
48
|
- lib/statsd/instrument/assertions.rb
|
46
|
-
- lib/statsd/instrument/
|
49
|
+
- lib/statsd/instrument/batched_sink.rb
|
47
50
|
- lib/statsd/instrument/capture_sink.rb
|
48
51
|
- lib/statsd/instrument/client.rb
|
49
52
|
- lib/statsd/instrument/datagram.rb
|
@@ -66,12 +69,15 @@ files:
|
|
66
69
|
- lib/statsd/instrument/rubocop/positional_arguments.rb
|
67
70
|
- lib/statsd/instrument/rubocop/singleton_configuration.rb
|
68
71
|
- lib/statsd/instrument/rubocop/splat_arguments.rb
|
72
|
+
- lib/statsd/instrument/sink.rb
|
69
73
|
- lib/statsd/instrument/statsd_datagram_builder.rb
|
70
74
|
- lib/statsd/instrument/strict.rb
|
71
|
-
- lib/statsd/instrument/
|
75
|
+
- lib/statsd/instrument/udp_connection.rb
|
76
|
+
- lib/statsd/instrument/uds_connection.rb
|
72
77
|
- lib/statsd/instrument/version.rb
|
73
78
|
- shipit.rubygems.yml
|
74
79
|
- statsd-instrument.gemspec
|
80
|
+
- test/aggregator_test.rb
|
75
81
|
- test/assertions_test.rb
|
76
82
|
- test/benchmark/clock_gettime.rb
|
77
83
|
- test/benchmark/metrics.rb
|
@@ -81,6 +87,7 @@ files:
|
|
81
87
|
- test/client_test.rb
|
82
88
|
- test/datagram_builder_test.rb
|
83
89
|
- test/datagram_test.rb
|
90
|
+
- test/dispatcher_stats_test.rb
|
84
91
|
- test/dogstatsd_datagram_builder_test.rb
|
85
92
|
- test/environment_test.rb
|
86
93
|
- test/helpers/rubocop_helper.rb
|
@@ -102,12 +109,13 @@ files:
|
|
102
109
|
- test/statsd_test.rb
|
103
110
|
- test/test_helper.rb
|
104
111
|
- test/udp_sink_test.rb
|
112
|
+
- test/uds_sink_test.rb
|
105
113
|
homepage: https://github.com/Shopify/statsd-instrument
|
106
114
|
licenses:
|
107
115
|
- MIT
|
108
116
|
metadata:
|
109
117
|
allowed_push_host: https://rubygems.org
|
110
|
-
post_install_message:
|
118
|
+
post_install_message:
|
111
119
|
rdoc_options: []
|
112
120
|
require_paths:
|
113
121
|
- lib
|
@@ -115,18 +123,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
123
|
requirements:
|
116
124
|
- - ">="
|
117
125
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
126
|
+
version: 2.6.0
|
119
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
128
|
requirements:
|
121
129
|
- - ">="
|
122
130
|
- !ruby/object:Gem::Version
|
123
131
|
version: '0'
|
124
132
|
requirements: []
|
125
|
-
rubygems_version: 3.5.
|
126
|
-
signing_key:
|
133
|
+
rubygems_version: 3.5.17
|
134
|
+
signing_key:
|
127
135
|
specification_version: 4
|
128
136
|
summary: A StatsD client for Ruby apps
|
129
137
|
test_files:
|
138
|
+
- test/aggregator_test.rb
|
130
139
|
- test/assertions_test.rb
|
131
140
|
- test/benchmark/clock_gettime.rb
|
132
141
|
- test/benchmark/metrics.rb
|
@@ -136,6 +145,7 @@ test_files:
|
|
136
145
|
- test/client_test.rb
|
137
146
|
- test/datagram_builder_test.rb
|
138
147
|
- test/datagram_test.rb
|
148
|
+
- test/dispatcher_stats_test.rb
|
139
149
|
- test/dogstatsd_datagram_builder_test.rb
|
140
150
|
- test/environment_test.rb
|
141
151
|
- test/helpers/rubocop_helper.rb
|
@@ -157,3 +167,4 @@ test_files:
|
|
157
167
|
- test/statsd_test.rb
|
158
168
|
- test/test_helper.rb
|
159
169
|
- test/udp_sink_test.rb
|
170
|
+
- test/uds_sink_test.rb
|