statsd-instrument 2.8.0 → 2.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/workflows/ci.yml +16 -7
- data/.rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml +6 -6
- data/CHANGELOG.md +28 -6
- data/CONTRIBUTING.md +3 -3
- data/README.md +11 -11
- data/lib/statsd/instrument.rb +33 -18
- data/lib/statsd/instrument/assertions.rb +7 -7
- data/lib/statsd/instrument/backend.rb +1 -1
- data/lib/statsd/instrument/client.rb +11 -10
- data/lib/statsd/instrument/datagram.rb +1 -2
- data/lib/statsd/instrument/datagram_builder.rb +1 -1
- data/lib/statsd/instrument/dogstatsd_datagram.rb +88 -0
- data/lib/statsd/instrument/dogstatsd_datagram_builder.rb +4 -0
- data/lib/statsd/instrument/expectation.rb +37 -1
- data/lib/statsd/instrument/legacy_client.rb +5 -5
- data/lib/statsd/instrument/metric.rb +2 -2
- data/lib/statsd/instrument/rubocop/metaprogramming_positional_arguments.rb +1 -1
- data/lib/statsd/instrument/rubocop/positional_arguments.rb +6 -6
- data/lib/statsd/instrument/rubocop/singleton_configuration.rb +1 -1
- data/lib/statsd/instrument/strict.rb +37 -17
- data/lib/statsd/instrument/version.rb +1 -1
- data/test/assertions_on_legacy_client_test.rb +1 -1
- data/test/assertions_test.rb +26 -1
- data/test/capture_sink_test.rb +1 -1
- data/test/client_test.rb +5 -5
- data/test/compatibility/dogstatsd_datagram_compatibility_test.rb +1 -1
- data/test/datagram_builder_test.rb +1 -1
- data/test/deprecations_test.rb +8 -1
- data/test/dogstatsd_datagram_builder_test.rb +41 -4
- data/test/environment_test.rb +1 -1
- data/test/integration_test.rb +1 -1
- data/test/log_sink_test.rb +1 -1
- data/test/null_sink_test.rb +1 -1
- data/test/rubocop/metric_prefix_argument_test.rb +1 -1
- data/test/rubocop/positional_arguments_test.rb +3 -3
- data/test/statsd_instrumentation_test.rb +11 -0
- data/test/statsd_test.rb +2 -9
- data/test/udp_backend_test.rb +3 -0
- data/test/udp_sink_test.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a52ac92cfb09e796f1eb8af9fde1a701255e61ac7377d32a7f6e92569c0e05
|
4
|
+
data.tar.gz: bae7f0b29a3ce2ed62486a0866e592ca29ac5d18c11ad0815e7cb71991de50a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87f9772a163d3ed4f400203f83db6c39dc946b75e21288fdd7a6ab7aa5b43646fcfa2fd3564d61b2795d192bcc82ae196dc1ec765d465b098620b9bcaf05c013
|
7
|
+
data.tar.gz: d74cc5375319064d64e23e8fd1a6bf7583781783d296c12fb1ae233e45ddaecff8dd4bbfa9c1bf912fcd48daacb8f47511b019d4bf26b74a2ca235267054012b
|
data/.github/workflows/ci.yml
CHANGED
@@ -9,17 +9,26 @@ jobs:
|
|
9
9
|
strategy:
|
10
10
|
fail-fast: false
|
11
11
|
matrix:
|
12
|
-
|
12
|
+
# Windows started failing on the following command for some reason.
|
13
|
+
#
|
14
|
+
# gem install bundler && bundle install --jobs 4 --retry 3
|
15
|
+
# ~~
|
16
|
+
# The token '&&' is not a valid statement separator in this version.
|
17
|
+
#
|
18
|
+
# Temporarily disable Windows builds to unblock CI.
|
19
|
+
#
|
20
|
+
# platform: [ubuntu-18.04, windows-2019, macOS-10.14]
|
21
|
+
platform: [ubuntu-18.04, macOS-10.14]
|
13
22
|
ruby: [2.3, 2.4, 2.5, 2.6]
|
14
23
|
|
15
24
|
exclude:
|
16
25
|
# The Windows environment does not support older Ruby versions. We only test against the latest version
|
17
|
-
- platform: windows-2019
|
18
|
-
|
19
|
-
- platform: windows-2019
|
20
|
-
|
21
|
-
- platform: windows-2019
|
22
|
-
|
26
|
+
# - platform: windows-2019
|
27
|
+
# ruby: 2.3
|
28
|
+
# - platform: windows-2019
|
29
|
+
# ruby: 2.4
|
30
|
+
# - platform: windows-2019
|
31
|
+
# ruby: 2.5
|
23
32
|
|
24
33
|
# On macOS, we only test against the Ruby version macOS ships with (2.3)
|
25
34
|
- platform: macOS-10.14
|
@@ -819,13 +819,13 @@ Layout/TrailingWhitespace:
|
|
819
819
|
Style/UnlessElse:
|
820
820
|
Enabled: true
|
821
821
|
|
822
|
-
Style/
|
822
|
+
Style/RedundantCapitalW:
|
823
823
|
Enabled: true
|
824
824
|
|
825
|
-
Style/
|
825
|
+
Style/RedundantInterpolation:
|
826
826
|
Enabled: true
|
827
827
|
|
828
|
-
Style/
|
828
|
+
Style/RedundantPercentQ:
|
829
829
|
Enabled: true
|
830
830
|
|
831
831
|
Style/VariableInterpolation:
|
@@ -956,13 +956,13 @@ Lint/UnderscorePrefixedVariableName:
|
|
956
956
|
Lint/UnifiedInteger:
|
957
957
|
Enabled: true
|
958
958
|
|
959
|
-
Lint/
|
959
|
+
Lint/RedundantCopDisableDirective:
|
960
960
|
Enabled: true
|
961
961
|
|
962
|
-
Lint/
|
962
|
+
Lint/RedundantCopEnableDirective:
|
963
963
|
Enabled: true
|
964
964
|
|
965
|
-
Lint/
|
965
|
+
Lint/RedundantSplatExpansion:
|
966
966
|
Enabled: true
|
967
967
|
|
968
968
|
Lint/UnreachableCode:
|
data/CHANGELOG.md
CHANGED
@@ -6,7 +6,29 @@ section below.
|
|
6
6
|
|
7
7
|
### Unreleased changes
|
8
8
|
|
9
|
-
|
9
|
+
- ⚠️ **DEPRECATION:** The `StatsD.key_value` metric method is deprecated
|
10
|
+
and will be removed in version 3.0. The new client does not have StatSite
|
11
|
+
support. Due to the lack of active contributors that can port this metric
|
12
|
+
type to the new client, we have decided to drop it until somebody else
|
13
|
+
steps up and re-adds it to the new client.
|
14
|
+
- Fix: metaprogramming methods will send metrics to the client assifgned to
|
15
|
+
`StatsD.singleton_client` when the metric is emitted, rather than the client
|
16
|
+
when the metaprogramming method was called.
|
17
|
+
- Metric methods (e.g. `StatsD.increment`) on the new client will now return a
|
18
|
+
`VOID` object that evaluates to `true` rather than nil. This is for better
|
19
|
+
backwards compatibility with the legacy client.
|
20
|
+
- Add support for variadic arguments to `assert_no_statsd_calls`. This allows
|
21
|
+
consolidation of assertions about specific metrics. For example:
|
22
|
+
```diff
|
23
|
+
-assert_no_statsd_calls('foo') do
|
24
|
+
- assert_no_statsd_calls('bar') do
|
25
|
+
- assert_no_statsd_calls('biz.baz') do
|
26
|
+
+assert_no_statsd_calls('foo', 'bar', 'biz.baz') do
|
27
|
+
# do work...
|
28
|
+
- end
|
29
|
+
- end
|
30
|
+
end
|
31
|
+
```
|
10
32
|
|
11
33
|
## Version 2.8.0
|
12
34
|
|
@@ -16,7 +38,7 @@ _Nothing yet_
|
|
16
38
|
However, if you are, you can capture StatsD datagrams using the
|
17
39
|
`capture_statsd_datagrams` method, and run your own assertions on the list.
|
18
40
|
- ⚠️ Remove `StatsD.client`. This was added in version 2.6.0 in order to
|
19
|
-
experiment with the new client. However, at this point
|
41
|
+
experiment with the new client. However, at this point there are better ways
|
20
42
|
to do this.
|
21
43
|
- You can set `StatsD.singleton_client` to a new client, which causes the
|
22
44
|
calls to the StatsD singleton to be handled by a new client. If you set
|
@@ -36,7 +58,7 @@ This release has some small fixes related to the new client only:
|
|
36
58
|
- Make it easier to instantiate new clients by specifying an implementation
|
37
59
|
(e.g. `datadog`) rather than a DatagramBuilder class.
|
38
60
|
- Change `NullSink#sample?` to always return `true`, so it's easier to verify
|
39
|
-
business rules by using a different
|
61
|
+
business rules by using a different DatagramBuilder in test suites.
|
40
62
|
|
41
63
|
## Version 2.7.0
|
42
64
|
|
@@ -56,7 +78,7 @@ and fix deprecations in your code base.
|
|
56
78
|
calls on the `StatsD` singleton will be delegated to this legacy client.
|
57
79
|
- By setting `STATSD_USE_NEW_CLIENT` as environment variable, these method
|
58
80
|
calls will be delegated to an instance of the new client instead. This
|
59
|
-
client is configured using the existing `
|
81
|
+
client is configured using the existing `STATSD_*` environment variables,
|
60
82
|
like `STATSD_ADDR` and `STATSD_IMPLEMENTATION`.
|
61
83
|
- You can also assign a custom client to `StatsD.singleton_client`.
|
62
84
|
|
@@ -188,7 +210,7 @@ deprecated patterns. See below for more info.
|
|
188
210
|
- Slight behaviour change when using the `assert_statsd_*` assertion methods in
|
189
211
|
combination with `assert_raises`: we now do not allow the block passed to the
|
190
212
|
`assert_statsd_` call to raise an exception. This may cause tests to fail that
|
191
|
-
|
213
|
+
previously were succeeding.
|
192
214
|
|
193
215
|
Consider the following example:
|
194
216
|
|
@@ -318,7 +340,7 @@ s
|
|
318
340
|
|
319
341
|
``` ruby
|
320
342
|
# In your Gemfile
|
321
|
-
gem '
|
343
|
+
gem 'statsd-instrument', require: 'statsd/instrument/strict'
|
322
344
|
|
323
345
|
# Or, in your test helper:
|
324
346
|
require 'statsd/instrument/strict'
|
data/CONTRIBUTING.md
CHANGED
@@ -4,7 +4,7 @@ This project is MIT licensed.
|
|
4
4
|
|
5
5
|
> **Note**: this project is currently not actively maintained, but is heavily used in production.
|
6
6
|
> As a result, pull requests and issues may not be responded to. Also, due to the limited time we have
|
7
|
-
>
|
7
|
+
> available to work on this library, we cannot accept PRs that do not maintain backwards compatibility,
|
8
8
|
> or PRs that would affect the performance of the hot code paths.
|
9
9
|
|
10
10
|
## Reporting issues
|
@@ -28,9 +28,9 @@ Some notes:
|
|
28
28
|
- Make sure to follow to coding style. This is enforced by Rubocop
|
29
29
|
- Make sure your changes are properly documented using [yardoc syntax](http://www.rubydoc.info/gems/yard/file/docs/GettingStarted.md).
|
30
30
|
- Add an entry to the "unreleased changes" section of [CHANGELOG.md](./CHANGELOG.md).
|
31
|
-
- **Do not** update `StatsD::Instrument::VERSION`. This will be done during the release
|
31
|
+
- **Do not** update `StatsD::Instrument::VERSION`. This will be done during the release procedure.
|
32
32
|
|
33
|
-
### On
|
33
|
+
### On performance & benchmarking
|
34
34
|
|
35
35
|
This gem is used in production at Shopify, and is used to instrument some of
|
36
36
|
our hottest code paths. This means that we are very careful about not
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ project](http://github.com/etsy/statsd).
|
|
15
15
|
|
16
16
|
## Configuration
|
17
17
|
|
18
|
-
It's recommended to configure this
|
18
|
+
It's recommended to configure this library by setting environment variables.
|
19
19
|
The following environment variables are supported:
|
20
20
|
|
21
21
|
- `STATSD_ADDR`: (default `localhost:8125`) The address to send the StatsD UDP
|
@@ -27,7 +27,7 @@ The following environment variables are supported:
|
|
27
27
|
explicitly, this will be determined based on other environment variables,
|
28
28
|
like `RAILS_ENV` or `ENV`. The library will behave differently:
|
29
29
|
|
30
|
-
- In the **production** and **staging** environment, thre
|
30
|
+
- In the **production** and **staging** environment, thre library will
|
31
31
|
actually send UDP packets.
|
32
32
|
- In the **test** environment, it will swallow all calls, but allows you to
|
33
33
|
capture them for testing purposes. See below for notes on writing tests.
|
@@ -41,7 +41,7 @@ The following environment variables are supported:
|
|
41
41
|
- `STATSD_PREFIX`: The prefix to apply to all metric names. This can be
|
42
42
|
overridden in a metric method call.
|
43
43
|
- `STATSD_DEFAULT_TAGS`: A comma-separated list of tags to apply to all metrics.
|
44
|
-
(Note: tags are not supported by all
|
44
|
+
(Note: tags are not supported by all implementations.)
|
45
45
|
|
46
46
|
## StatsD keys
|
47
47
|
|
@@ -110,28 +110,28 @@ StatsD.histogram('Order.value', order.value_in_usd.to_f tags: { source: 'POS' })
|
|
110
110
|
|
111
111
|
Because you are counting unique values, the results of using a sampling value less than 1.0 can lead to unexpected, hard to interpret results.
|
112
112
|
|
113
|
-
*Note: This is only supported by the beta datadog
|
113
|
+
*Note: This is only supported by the beta datadog implementation.*
|
114
114
|
|
115
115
|
#### StatsD.distribution
|
116
116
|
|
117
|
-
A modified gauge that submits a distribution of values over a sample period. Arithmetic and statistical calculations (
|
117
|
+
A modified gauge that submits a distribution of values over a sample period. Arithmetic and statistical calculations (percentiles, average, etc.) on the data set are performed server side rather than client side like a histogram.
|
118
118
|
|
119
119
|
```ruby
|
120
120
|
StatsD.distribution('shipit.redis_connection', 3)
|
121
121
|
```
|
122
122
|
|
123
|
-
*Note: This is only supported by the beta datadog
|
123
|
+
*Note: This is only supported by the beta datadog implementation.*
|
124
124
|
|
125
125
|
#### StatsD.event
|
126
126
|
|
127
|
-
An event is a (title, text) tuple that can be used to correlate metrics with something that
|
127
|
+
An event is a (title, text) tuple that can be used to correlate metrics with something that occurred within the system.
|
128
128
|
This is a good fit for instance to correlate response time variation with a deploy of the new code.
|
129
129
|
|
130
130
|
```ruby
|
131
131
|
StatsD.event('shipit.deploy', 'started', sample_rate: 1.0)
|
132
132
|
```
|
133
133
|
|
134
|
-
*Note: This is only supported by the [datadog
|
134
|
+
*Note: This is only supported by the [datadog implementation](https://docs.datadoghq.com/guides/dogstatsd/#events).*
|
135
135
|
|
136
136
|
Events support additional metadata such as `date_happened`, `hostname`, `aggregation_key`, `priority`, `source_type_name`, `alert_type`.
|
137
137
|
|
@@ -143,7 +143,7 @@ An event is a (check_name, status) tuple that can be used to monitor the status
|
|
143
143
|
StatsD.service_check('shipit.redis_connection', 'ok')
|
144
144
|
```
|
145
145
|
|
146
|
-
*Note: This is only supported by the [datadog
|
146
|
+
*Note: This is only supported by the [datadog implementation](https://docs.datadoghq.com/guides/dogstatsd/#service-checks).*
|
147
147
|
|
148
148
|
Service checks support additional metadata such as `timestamp`, `hostname`, `message`.
|
149
149
|
|
@@ -272,12 +272,12 @@ class MyTestcase < Minitest::Test
|
|
272
272
|
end
|
273
273
|
|
274
274
|
def test_no_udp_traffic
|
275
|
-
# Verifies no StatsD calls
|
275
|
+
# Verifies no StatsD calls occurred at all.
|
276
276
|
assert_no_statsd_calls do
|
277
277
|
do_some_work
|
278
278
|
end
|
279
279
|
|
280
|
-
# Verifies no StatsD calls
|
280
|
+
# Verifies no StatsD calls occurred for the given metric.
|
281
281
|
assert_no_statsd_calls('metric_name') do
|
282
282
|
do_some_work
|
283
283
|
end
|
data/lib/statsd/instrument.rb
CHANGED
@@ -89,7 +89,7 @@ module StatsD
|
|
89
89
|
extend self
|
90
90
|
|
91
91
|
# The StatsD::Instrument module provides metaprogramming methods to instrument your methods with
|
92
|
-
# StatsD metrics. E.g.,
|
92
|
+
# StatsD metrics. E.g., you can create counters on how often a method is called, how often it is
|
93
93
|
# successful, the duration of the methods call, etc.
|
94
94
|
module Instrument
|
95
95
|
# @private
|
@@ -139,8 +139,9 @@ module StatsD
|
|
139
139
|
# callable to dynamically generate a metric name
|
140
140
|
# @param metric_options (see StatsD#measure)
|
141
141
|
# @return [void]
|
142
|
-
def statsd_measure(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
143
|
-
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
142
|
+
def statsd_measure(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
143
|
+
as_dist: false, sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
144
|
+
prefix: nil, no_prefix: false, client: nil)
|
144
145
|
|
145
146
|
if as_dist
|
146
147
|
return statsd_distribution(method, name, # rubocop:disable StatsD/MetricPrefixArgument
|
@@ -149,9 +150,10 @@ module StatsD
|
|
149
150
|
|
150
151
|
add_to_method(method, name, :measure) do
|
151
152
|
define_method(method) do |*args, &block|
|
152
|
-
|
153
|
+
client ||= StatsD.singleton_client
|
154
|
+
prefix ||= client.prefix unless no_prefix
|
153
155
|
key = StatsD::Instrument.generate_metric_name(prefix, name, self, *args)
|
154
|
-
|
156
|
+
client.measure(key, sample_rate: sample_rate, tags: tags, no_prefix: true) do
|
155
157
|
super(*args, &block)
|
156
158
|
end
|
157
159
|
end
|
@@ -167,13 +169,15 @@ module StatsD
|
|
167
169
|
# @return [void]
|
168
170
|
# @note Supported by the datadog implementation only (in beta)
|
169
171
|
def statsd_distribution(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
170
|
-
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
172
|
+
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
173
|
+
prefix: nil, no_prefix: false, client: nil)
|
171
174
|
|
172
175
|
add_to_method(method, name, :distribution) do
|
173
176
|
define_method(method) do |*args, &block|
|
174
|
-
|
177
|
+
client ||= StatsD.singleton_client
|
178
|
+
prefix ||= client.prefix unless no_prefix
|
175
179
|
key = StatsD::Instrument.generate_metric_name(prefix, name, self, *args)
|
176
|
-
|
180
|
+
client.distribution(key, sample_rate: sample_rate, tags: tags, no_prefix: true) do
|
177
181
|
super(*args, &block)
|
178
182
|
end
|
179
183
|
end
|
@@ -192,11 +196,12 @@ module StatsD
|
|
192
196
|
# @yield You can pass a block to this method if you want to define yourself what is a successful call
|
193
197
|
# based on the return value of the method.
|
194
198
|
# @yieldparam result The return value of the instrumented method.
|
195
|
-
# @yieldreturn [Boolean] Return true iff the return value is
|
199
|
+
# @yieldreturn [Boolean] Return true iff the return value is considered a success, false otherwise.
|
196
200
|
# @return [void]
|
197
201
|
# @see #statsd_count_if
|
198
202
|
def statsd_count_success(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
199
|
-
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
203
|
+
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
204
|
+
prefix: nil, no_prefix: false, client: nil)
|
200
205
|
|
201
206
|
add_to_method(method, name, :count_success) do
|
202
207
|
define_method(method) do |*args, &block|
|
@@ -215,10 +220,12 @@ module StatsD
|
|
215
220
|
end
|
216
221
|
result
|
217
222
|
ensure
|
223
|
+
client ||= StatsD.singleton_client
|
218
224
|
suffix = truthiness == false ? 'failure' : 'success'
|
219
|
-
prefix ||=
|
225
|
+
prefix ||= client.prefix unless no_prefix
|
220
226
|
key = StatsD::Instrument.generate_metric_name(prefix, name, self, *args)
|
221
|
-
|
227
|
+
client.increment("#{key}.#{suffix}",
|
228
|
+
sample_rate: sample_rate, tags: tags, no_prefix: true)
|
222
229
|
end
|
223
230
|
end
|
224
231
|
end
|
@@ -237,7 +244,8 @@ module StatsD
|
|
237
244
|
# @return [void]
|
238
245
|
# @see #statsd_count_success
|
239
246
|
def statsd_count_if(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
240
|
-
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
247
|
+
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
248
|
+
prefix: nil, no_prefix: false, client: nil)
|
241
249
|
|
242
250
|
add_to_method(method, name, :count_if) do
|
243
251
|
define_method(method) do |*args, &block|
|
@@ -257,9 +265,10 @@ module StatsD
|
|
257
265
|
result
|
258
266
|
ensure
|
259
267
|
if truthiness
|
260
|
-
|
268
|
+
client ||= StatsD.singleton_client
|
269
|
+
prefix ||= client.prefix unless no_prefix
|
261
270
|
key = StatsD::Instrument.generate_metric_name(prefix, name, self, *args)
|
262
|
-
|
271
|
+
client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: true)
|
263
272
|
end
|
264
273
|
end
|
265
274
|
end
|
@@ -276,13 +285,15 @@ module StatsD
|
|
276
285
|
# @param metric_options (see #statsd_measure)
|
277
286
|
# @return [void]
|
278
287
|
def statsd_count(method, name, deprecated_sample_rate_arg = nil, deprecated_tags_arg = nil,
|
279
|
-
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
288
|
+
sample_rate: deprecated_sample_rate_arg, tags: deprecated_tags_arg,
|
289
|
+
prefix: nil, no_prefix: false, client: nil)
|
280
290
|
|
281
291
|
add_to_method(method, name, :count) do
|
282
292
|
define_method(method) do |*args, &block|
|
283
|
-
|
293
|
+
client ||= StatsD.singleton_client
|
294
|
+
prefix ||= client.prefix unless no_prefix
|
284
295
|
key = StatsD::Instrument.generate_metric_name(prefix, name, self, *args)
|
285
|
-
|
296
|
+
client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: true)
|
286
297
|
super(*args, &block)
|
287
298
|
end
|
288
299
|
end
|
@@ -333,6 +344,10 @@ module StatsD
|
|
333
344
|
remove_from_method(method, name, :distribution)
|
334
345
|
end
|
335
346
|
|
347
|
+
VoidClass = Class.new(BasicObject)
|
348
|
+
private_constant :VoidClass
|
349
|
+
VOID = VoidClass.new
|
350
|
+
|
336
351
|
private
|
337
352
|
|
338
353
|
def statsd_instrumentation_for(method, name, action)
|
@@ -5,7 +5,7 @@
|
|
5
5
|
#
|
6
6
|
# Every metric type has its own assertion method, like {#assert_statsd_increment}
|
7
7
|
# to assert `StatsD.increment` calls. You can also assert other properties of the
|
8
|
-
# metric that was emitted,
|
8
|
+
# metric that was emitted, like the sample rate or presence of tags.
|
9
9
|
# To check for the absence of metrics, use {#assert_no_statsd_calls}.
|
10
10
|
#
|
11
11
|
# @example Check for metric properties:
|
@@ -44,21 +44,21 @@ module StatsD::Instrument::Assertions
|
|
44
44
|
|
45
45
|
# Asserts no metric occurred during the execution of the provided block.
|
46
46
|
#
|
47
|
-
# @param [String]
|
48
|
-
# to happen inside the block. If this is set to `
|
49
|
-
# if any metric occurs.
|
47
|
+
# @param [Array<String>] metric_names (default: []) The metric names that are not
|
48
|
+
# allowed to happen inside the block. If this is set to `[]`, the assertion
|
49
|
+
# will fail if any metric occurs.
|
50
50
|
# @yield A block in which the specified metric should not occur. This block
|
51
51
|
# should not raise any exceptions.
|
52
52
|
# @return [void]
|
53
53
|
# @raise [Minitest::Assertion] If an exception occurs, or if any metric (with the
|
54
|
-
# provided
|
55
|
-
def assert_no_statsd_calls(
|
54
|
+
# provided names, or any), occurred during the execution of the provided block.
|
55
|
+
def assert_no_statsd_calls(*metric_names, datagrams: nil, client: nil, &block)
|
56
56
|
if datagrams.nil?
|
57
57
|
raise LocalJumpError, "assert_no_statsd_calls requires a block" unless block_given?
|
58
58
|
datagrams = capture_statsd_datagrams_with_exception_handling(client: client, &block)
|
59
59
|
end
|
60
60
|
|
61
|
-
datagrams.select! { |
|
61
|
+
datagrams.select! { |metric| metric_names.include?(metric.name) } unless metric_names.empty?
|
62
62
|
assert(datagrams.empty?, "No StatsD calls for metric #{datagrams.map(&:name).join(', ')} expected.")
|
63
63
|
end
|
64
64
|
|
@@ -8,7 +8,7 @@ class StatsD::Instrument::Backend
|
|
8
8
|
# @param metric [StatsD::Instrument::Metric] The metric to collect
|
9
9
|
# @return [void]
|
10
10
|
def collect_metric(_metric)
|
11
|
-
raise NotImplementedError, "Use a
|
11
|
+
raise NotImplementedError, "Use a concrete backend implementation"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'statsd/instrument/datagram'
|
4
|
+
require 'statsd/instrument/dogstatsd_datagram'
|
4
5
|
require 'statsd/instrument/datagram_builder'
|
5
6
|
require 'statsd/instrument/statsd_datagram_builder'
|
6
7
|
require 'statsd/instrument/dogstatsd_datagram_builder'
|
@@ -105,7 +106,7 @@ class StatsD::Instrument::Client
|
|
105
106
|
# @return [void]
|
106
107
|
def increment(name, value = 1, sample_rate: nil, tags: nil, no_prefix: false)
|
107
108
|
sample_rate ||= @default_sample_rate
|
108
|
-
return unless sample?(sample_rate)
|
109
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
109
110
|
emit(datagram_builder(no_prefix: no_prefix).c(name, value, sample_rate, tags))
|
110
111
|
end
|
111
112
|
|
@@ -122,7 +123,7 @@ class StatsD::Instrument::Client
|
|
122
123
|
end
|
123
124
|
|
124
125
|
sample_rate ||= @default_sample_rate
|
125
|
-
return unless sample?(sample_rate)
|
126
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
126
127
|
emit(datagram_builder(no_prefix: no_prefix).ms(name, value, sample_rate, tags))
|
127
128
|
end
|
128
129
|
|
@@ -141,7 +142,7 @@ class StatsD::Instrument::Client
|
|
141
142
|
# @return [void]
|
142
143
|
def gauge(name, value, sample_rate: nil, tags: nil, no_prefix: false)
|
143
144
|
sample_rate ||= @default_sample_rate
|
144
|
-
return unless sample?(sample_rate)
|
145
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
145
146
|
emit(datagram_builder(no_prefix: no_prefix).g(name, value, sample_rate, tags))
|
146
147
|
end
|
147
148
|
|
@@ -154,7 +155,7 @@ class StatsD::Instrument::Client
|
|
154
155
|
# @return [void]
|
155
156
|
def set(name, value, sample_rate: nil, tags: nil, no_prefix: false)
|
156
157
|
sample_rate ||= @default_sample_rate
|
157
|
-
return unless sample?(sample_rate)
|
158
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
158
159
|
emit(datagram_builder(no_prefix: no_prefix).s(name, value, sample_rate, tags))
|
159
160
|
end
|
160
161
|
|
@@ -162,7 +163,7 @@ class StatsD::Instrument::Client
|
|
162
163
|
# values.
|
163
164
|
#
|
164
165
|
# @note The distribution metric type is not available on all implementations.
|
165
|
-
# A `
|
166
|
+
# A `NotImplementedError` will be raised if you call this method, but
|
166
167
|
# the active implementation does not support it.
|
167
168
|
#
|
168
169
|
# @param name (see #increment)
|
@@ -176,14 +177,14 @@ class StatsD::Instrument::Client
|
|
176
177
|
end
|
177
178
|
|
178
179
|
sample_rate ||= @default_sample_rate
|
179
|
-
return unless sample?(sample_rate)
|
180
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
180
181
|
emit(datagram_builder(no_prefix: no_prefix).d(name, value, sample_rate, tags))
|
181
182
|
end
|
182
183
|
|
183
184
|
# Emits a histogram metric, which builds a histogram of the reported values.
|
184
185
|
#
|
185
186
|
# @note The histogram metric type is not available on all implementations.
|
186
|
-
# A `
|
187
|
+
# A `NotImplementedError` will be raised if you call this method, but
|
187
188
|
# the active implementation does not support it.
|
188
189
|
#
|
189
190
|
# @param name (see #increment)
|
@@ -193,7 +194,7 @@ class StatsD::Instrument::Client
|
|
193
194
|
# @return [void]
|
194
195
|
def histogram(name, value, sample_rate: nil, tags: nil, no_prefix: false)
|
195
196
|
sample_rate ||= @default_sample_rate
|
196
|
-
return unless sample?(sample_rate)
|
197
|
+
return StatsD::Instrument::VOID unless sample?(sample_rate)
|
197
198
|
emit(datagram_builder(no_prefix: no_prefix).h(name, value, sample_rate, tags))
|
198
199
|
end
|
199
200
|
|
@@ -208,7 +209,7 @@ class StatsD::Instrument::Client
|
|
208
209
|
# use the preferred metric type of the implementation. The default is `:ms`.
|
209
210
|
# Generally, you should not have to set this.
|
210
211
|
# @yield The latency (execution time) of the block
|
211
|
-
# @return The return value of the
|
212
|
+
# @return The return value of the provided block will be passed through.
|
212
213
|
def latency(name, sample_rate: nil, tags: nil, metric_type: nil, no_prefix: false)
|
213
214
|
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
214
215
|
begin
|
@@ -342,6 +343,6 @@ class StatsD::Instrument::Client
|
|
342
343
|
|
343
344
|
def emit(datagram)
|
344
345
|
@sink << datagram
|
345
|
-
|
346
|
+
StatsD::Instrument::VOID
|
346
347
|
end
|
347
348
|
end
|