statsd-instrument 2.9.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +14 -21
  3. data/.rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml +15 -15
  4. data/CHANGELOG.md +44 -0
  5. data/benchmark/send-metrics-to-dev-null-log +5 -2
  6. data/benchmark/send-metrics-to-local-udp-receiver +8 -6
  7. data/lib/statsd/instrument.rb +79 -146
  8. data/lib/statsd/instrument/assertions.rb +12 -24
  9. data/lib/statsd/instrument/client.rb +125 -35
  10. data/lib/statsd/instrument/environment.rb +1 -23
  11. data/lib/statsd/instrument/expectation.rb +12 -16
  12. data/lib/statsd/instrument/helpers.rb +1 -30
  13. data/lib/statsd/instrument/matchers.rb +0 -1
  14. data/lib/statsd/instrument/railtie.rb +0 -4
  15. data/lib/statsd/instrument/strict.rb +12 -123
  16. data/lib/statsd/instrument/version.rb +1 -1
  17. data/test/assertions_test.rb +21 -9
  18. data/test/client_test.rb +11 -0
  19. data/test/environment_test.rb +1 -37
  20. data/test/integration_test.rb +9 -24
  21. data/test/statsd_instrumentation_test.rb +25 -50
  22. data/test/statsd_test.rb +6 -31
  23. data/test/test_helper.rb +1 -1
  24. metadata +2 -24
  25. data/benchmark/datagram-client +0 -40
  26. data/lib/statsd/instrument/backend.rb +0 -18
  27. data/lib/statsd/instrument/backends/capture_backend.rb +0 -32
  28. data/lib/statsd/instrument/backends/logger_backend.rb +0 -20
  29. data/lib/statsd/instrument/backends/null_backend.rb +0 -9
  30. data/lib/statsd/instrument/backends/udp_backend.rb +0 -152
  31. data/lib/statsd/instrument/legacy_client.rb +0 -301
  32. data/lib/statsd/instrument/metric.rb +0 -155
  33. data/test/assertions_on_legacy_client_test.rb +0 -344
  34. data/test/capture_backend_test.rb +0 -26
  35. data/test/compatibility/dogstatsd_datagram_compatibility_test.rb +0 -161
  36. data/test/deprecations_test.rb +0 -139
  37. data/test/logger_backend_test.rb +0 -22
  38. data/test/metric_test.rb +0 -47
  39. data/test/udp_backend_test.rb +0 -228
@@ -71,8 +71,8 @@ module StatsD::Instrument::Assertions
71
71
  # @return [void]
72
72
  # @raise [Minitest::Assertion] If an exception occurs, or if the metric did
73
73
  # not occur as specified during the execution the block.
74
- def assert_statsd_increment(metric_name, datagrams: nil, client: nil, **options, &block)
75
- expectation = StatsD::Instrument::Expectation.increment(metric_name, **options)
74
+ def assert_statsd_increment(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
75
+ expectation = StatsD::Instrument::Expectation.increment(metric_name, value, **options)
76
76
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
77
77
  end
78
78
 
@@ -83,8 +83,8 @@ module StatsD::Instrument::Assertions
83
83
  # @yield (see #assert_statsd_increment)
84
84
  # @return [void]
85
85
  # @raise (see #assert_statsd_increment)
86
- def assert_statsd_measure(metric_name, datagrams: nil, client: nil, **options, &block)
87
- expectation = StatsD::Instrument::Expectation.measure(metric_name, **options)
86
+ def assert_statsd_measure(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
87
+ expectation = StatsD::Instrument::Expectation.measure(metric_name, value, **options)
88
88
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
89
89
  end
90
90
 
@@ -95,8 +95,8 @@ module StatsD::Instrument::Assertions
95
95
  # @yield (see #assert_statsd_increment)
96
96
  # @return [void]
97
97
  # @raise (see #assert_statsd_increment)
98
- def assert_statsd_gauge(metric_name, datagrams: nil, client: nil, **options, &block)
99
- expectation = StatsD::Instrument::Expectation.gauge(metric_name, **options)
98
+ def assert_statsd_gauge(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
99
+ expectation = StatsD::Instrument::Expectation.gauge(metric_name, value, **options)
100
100
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
101
101
  end
102
102
 
@@ -107,8 +107,8 @@ module StatsD::Instrument::Assertions
107
107
  # @yield (see #assert_statsd_increment)
108
108
  # @return [void]
109
109
  # @raise (see #assert_statsd_increment)
110
- def assert_statsd_histogram(metric_name, datagrams: nil, client: nil, **options, &block)
111
- expectation = StatsD::Instrument::Expectation.histogram(metric_name, **options)
110
+ def assert_statsd_histogram(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
111
+ expectation = StatsD::Instrument::Expectation.histogram(metric_name, value, **options)
112
112
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
113
113
  end
114
114
 
@@ -119,8 +119,8 @@ module StatsD::Instrument::Assertions
119
119
  # @yield (see #assert_statsd_increment)
120
120
  # @return [void]
121
121
  # @raise (see #assert_statsd_increment)
122
- def assert_statsd_distribution(metric_name, datagrams: nil, client: nil, **options, &block)
123
- expectation = StatsD::Instrument::Expectation.distribution(metric_name, **options)
122
+ def assert_statsd_distribution(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
123
+ expectation = StatsD::Instrument::Expectation.distribution(metric_name, value, **options)
124
124
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
125
125
  end
126
126
 
@@ -131,20 +131,8 @@ module StatsD::Instrument::Assertions
131
131
  # @yield (see #assert_statsd_increment)
132
132
  # @return [void]
133
133
  # @raise (see #assert_statsd_increment)
134
- def assert_statsd_set(metric_name, datagrams: nil, client: nil, **options, &block)
135
- expectation = StatsD::Instrument::Expectation.set(metric_name, **options)
136
- assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
137
- end
138
-
139
- # Asserts that a given key/value metric occurred inside the provided block.
140
- #
141
- # @param metric_name (see #assert_statsd_increment)
142
- # @param options (see #assert_statsd_increment)
143
- # @yield (see #assert_statsd_increment)
144
- # @return [void]
145
- # @raise (see #assert_statsd_increment)
146
- def assert_statsd_key_value(metric_name, datagrams: nil, client: nil, **options, &block)
147
- expectation = StatsD::Instrument::Expectation.key_value(metric_name, **options)
134
+ def assert_statsd_set(metric_name, value = nil, datagrams: nil, client: nil, **options, &block)
135
+ expectation = StatsD::Instrument::Expectation.set(metric_name, value, **options)
148
136
  assert_statsd_expectation(expectation, datagrams: datagrams, client: client, &block)
149
137
  end
150
138
 
@@ -1,22 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'statsd/instrument/datagram'
4
- require 'statsd/instrument/dogstatsd_datagram'
5
- require 'statsd/instrument/datagram_builder'
6
- require 'statsd/instrument/statsd_datagram_builder'
7
- require 'statsd/instrument/dogstatsd_datagram_builder'
8
- require 'statsd/instrument/null_sink'
9
- require 'statsd/instrument/udp_sink'
10
- require 'statsd/instrument/capture_sink'
11
- require 'statsd/instrument/log_sink'
12
-
13
- # The Client is the main interface for using StatsD.
3
+ # The Client is the main interface for using StatsD. It defines the metric
4
+ # methods that you would normally call from your application.
14
5
  #
15
- # @note This new Client implementation is intended to become the new default in the
16
- # next major release of this library. While this class may already be functional,
17
- # we provide no guarantees about the API and the behavior may change.
6
+ # The client set to {StatsD.singleton_client} will handle all metric calls made
7
+ # against the StatsD singleton, e.g. `StatsD.increment`.
8
+ #
9
+ # We recommend that the configuration of the StatsD setup is provided through
10
+ # environment variables
11
+ #
12
+ # You are encouraged to instantiate multiple clients, and instantiate variants
13
+ # of an existing clients using {#clone_with_options}. We recommend instantiating
14
+ # a separate client for every logical component of your application using
15
+ # `clone_with_options`, and setting a different metric `prefix`.
16
+ #
17
+ # @see StatsD.singleton_client
18
+ # @see #clone_with_options
18
19
  class StatsD::Instrument::Client
19
20
  class << self
21
+ # Instantiates a StatsD::Instrument::Client using configuration values provided in
22
+ # environment variables.
23
+ #
24
+ # @see StatsD::Instrument::Environment
20
25
  def from_env(
21
26
  env = StatsD::Instrument::Environment.current,
22
27
  prefix: env.statsd_prefix,
@@ -36,7 +41,14 @@ class StatsD::Instrument::Client
36
41
  )
37
42
  end
38
43
 
44
+ # Finds the right DatagramBuilder class for a given implementation.
39
45
  # @private
46
+ # @param [Symbol, String] implementation The name of the implementation, e.g.
47
+ # `"statsd"` or `:datadog`.
48
+ # @return [Class] The subclass of {StatsD::Instrument::DatagramBuilder}
49
+ # builder to use to generate UDP datagrams for the given implementation.
50
+ # @raise `NotImplementedError` if the implementation is not recognized or
51
+ # supported.
40
52
  def datagram_builder_class_for_implementation(implementation)
41
53
  case implementation.to_s
42
54
  when 'statsd'
@@ -49,8 +61,87 @@ class StatsD::Instrument::Client
49
61
  end
50
62
  end
51
63
 
52
- attr_reader :sink, :datagram_builder_class, :prefix, :default_tags, :default_sample_rate
64
+ # The class to use to build StatsD datagrams. To build the actual datagrams,
65
+ # the class will be instantiated, potentially multiple times, by the client.
66
+ #
67
+ # @return [Class] A subclass of {StatsD::Instrument::DatagramBuilder}
68
+ # @see .datagram_builder_class_for_implementation
69
+ attr_reader :datagram_builder_class
70
+
71
+ # The sink to send UDP datagrams to.
72
+ #
73
+ # This can be set to any object that responds to the following methods:
74
+ #
75
+ # - `sample?` which should return true if the metric should be sampled, i.e.
76
+ # actually sent to the sink.
77
+ # - `#<<` which takes a UDP datagram as string to emit the datagram. This
78
+ # method will only be called if `sample?` returned `true`.
79
+ #
80
+ # Generally, you should use an instance of one of the following classes that
81
+ # ship with this library:
82
+ #
83
+ # - {StatsD::Instrument::UDPSink} A sink that will actually emit the provided
84
+ # datagrams over UDP.
85
+ # - {StatsD::Instrument::NullSink} A sink that will simply swallow every
86
+ # datagram. This sink is for use when testing your application.
87
+ # - {StatsD::Instrument::LogSink} A sink that log all provided datagrams to
88
+ # a Logger, normally {StatsD.logger}.
89
+ #
90
+ # @return [#sample?, #<<]
91
+ attr_reader :sink
92
+
93
+ # The prefix to prepend to the metric names that are emitted through this
94
+ # client, using a dot (`.`) as namespace separator. E.g. when the prefix is
95
+ # set to `foo`, and you emit a metric named `bar`, the metric name will be
96
+ # `foo.bar`.
97
+ #
98
+ # Generally all the metrics you emit to the same StatsD server will share a
99
+ # single, global namespace. If you are emitting metrics from multiple
100
+ # applications, using a prefix is recommended to prevent metric name
101
+ # collisions.
102
+ #
103
+ # You can also leave this value to be `nil` if you don't want to prefix your
104
+ # metric names.
105
+ #
106
+ # @return [String, nil]
107
+ #
108
+ # @note The `prefix` can be overriden by any metric call by setting the
109
+ # `no_prefix` keyword argument to `true`. We recommend against doing this,
110
+ # but this behavior is retained for backwards compatibility.
111
+ # Rather, when you feel the need to do this, we recommend instantiating
112
+ # a new client without prefix (using {#clone_with_options}), and using it
113
+ # to emit the metric.
114
+ attr_reader :prefix
115
+
116
+ # The tags to apply to all the metrics emitted through this client.
117
+ #
118
+ # The tags can be supplied in normal form: an array of strings. You can also
119
+ # provide a hash, which will be turned into normal form by concatanting the
120
+ # key and the value using a colon. To not use any default tags, set to `nil`.
121
+ # Note that other components of your StatsD metric pipeline may also add tags
122
+ # to metrics. E.g. the DataDog agent may add add tags like `hostname`.
123
+ #
124
+ # We generally recommend to not use default tags, or use them sparingly.
125
+ # Adding tags to every metric easily introduces carninality explosions, which
126
+ # will make metrics less precise due to the lossy nature of aggregation. It
127
+ # also makes your infrastructure more expsnive to run, and the user interface
128
+ # of your metric explorer less responsive.
129
+ #
130
+ # @return [Array<String>, Hash, nil]
131
+ attr_reader :default_tags
53
132
 
133
+ # The default sample rate to use for metrics that are emitted without a
134
+ # sample rate set. This should be a value between 0 (never emit a metric) and
135
+ # 1.0 (always emit). If it is not set, the default value 1.0 is used.
136
+ #
137
+ # We generally recommend setting sample rates on individual metrics based
138
+ # on their frequency, rather than changing the default sample rate.
139
+ #
140
+ # @return [Float] (default: 1.0) A value between 0.0 and 1.0.
141
+ attr_reader :default_sample_rate
142
+
143
+ # Instantiates a new client.
144
+ # @see .from_env to instantiate a client using environment variables.
54
145
  def initialize(
55
146
  prefix: nil,
56
147
  default_sample_rate: 1.0,
@@ -226,18 +317,15 @@ class StatsD::Instrument::Client
226
317
  end
227
318
  end
228
319
 
229
- # Emits a service check.
230
- #
231
- # @param [String] title Event title.
232
- # @param [String] text Event description. Newlines are allowed.
233
- # @param [Time] timestamp The of the event. If not provided,
234
- # Datadog will interpret it as the current timestamp.
235
- # @param [String] hostname A hostname to associate with the event.
236
- # @param [String] aggregation_key An aggregation key to group events with the same key.
237
- # @param [String] priority Priority of the event. Either "normal" (default) or "low".
238
- # @param [String] source_type_name The source type of the event.
239
- # @param [String] alert_type Either "error", "warning", "info" (default) or "success".
240
- # @param [Array, Hash] tags Tags to associate with the event.
320
+ # Emits a service check. Services Checks allow you to characterize the status
321
+ # of a service in order to monitor it within Datadog.
322
+ #
323
+ # @param name (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
324
+ # @param status (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
325
+ # @param timestamp (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
326
+ # @param hostname (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
327
+ # @param tags (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
328
+ # @param message (see StatsD::Instrument::DogStatsDDatagramBuilder#_sc)
241
329
  # @return [void]
242
330
  #
243
331
  # @note Supported by the Datadog implementation only.
@@ -246,15 +334,17 @@ class StatsD::Instrument::Client
246
334
  timestamp: timestamp, hostname: hostname, tags: tags, message: message))
247
335
  end
248
336
 
249
- # Emits an event.
337
+ # Emits an event. An event represents any record of activity noteworthy for engineers.
250
338
  #
251
- # @param [String] name Name of the service
252
- # @param [Symbol] status Either `:ok`, `:warning`, `:critical` or `:unknown`
253
- # @param [Time] timestamp The moment when the service was checked. If not provided,
254
- # Datadog will interpret it as the current timestamp.
255
- # @param [String] hostname A hostname to associate with the check.
256
- # @param [Array, Hash] tags Tags to associate with the check.
257
- # @param [String] message A message describing the current state of the service check.
339
+ # @param title (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
340
+ # @param text (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
341
+ # @param timestamp (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
342
+ # @param hostname (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
343
+ # @param aggregation_key (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
344
+ # @param priority (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
345
+ # @param source_type_name (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
346
+ # @param alert_type (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
347
+ # @param tags (see StatsD::Instrument::DogStatsDDatagramBuilder#_e)
258
348
  # @return [void]
259
349
  #
260
350
  # @note Supported by the Datadog implementation only.
@@ -19,21 +19,6 @@ class StatsD::Instrument::Environment
19
19
  current.environment
20
20
  end
21
21
 
22
- # Instantiates a default backend for the current environment.
23
- #
24
- # @return [StatsD::Instrument::Backend]
25
- # @see #environment
26
- def default_backend
27
- case environment
28
- when 'production', 'staging'
29
- StatsD::Instrument::Backends::UDPBackend.new(current.statsd_addr, current.statsd_implementation)
30
- when 'test'
31
- StatsD::Instrument::Backends::NullBackend.new
32
- else
33
- StatsD::Instrument::Backends::LoggerBackend.new(StatsD.logger)
34
- end
35
- end
36
-
37
22
  # Sets default values for sample rate and logger.
38
23
  #
39
24
  # - Default sample rate is set to the value in the STATSD_SAMPLE_RATE environment variable,
@@ -45,9 +30,6 @@ class StatsD::Instrument::Environment
45
30
  #
46
31
  # @return [void]
47
32
  def setup
48
- StatsD.prefix = current.statsd_prefix
49
- StatsD.default_tags = current.statsd_default_tags
50
- StatsD.default_sample_rate = current.statsd_sample_rate
51
33
  StatsD.logger = Logger.new($stderr)
52
34
  end
53
35
  end
@@ -96,11 +78,7 @@ class StatsD::Instrument::Environment
96
78
  end
97
79
 
98
80
  def client
99
- if env.key?('STATSD_USE_NEW_CLIENT')
100
- StatsD::Instrument::Client.from_env(self)
101
- else
102
- StatsD::Instrument::LegacyClient.singleton
103
- end
81
+ StatsD::Instrument::Client.from_env(self)
104
82
  end
105
83
 
106
84
  def default_sink_for_environment
@@ -3,32 +3,28 @@
3
3
  # @private
4
4
  class StatsD::Instrument::Expectation
5
5
  class << self
6
- def increment(name, **options)
7
- new(type: :c, name: name, **options)
6
+ def increment(name, value = nil, **options)
7
+ new(type: :c, name: name, value: value, **options)
8
8
  end
9
9
 
10
- def measure(name, **options)
11
- new(type: :ms, name: name, **options)
10
+ def measure(name, value = nil, **options)
11
+ new(type: :ms, name: name, value: value, **options)
12
12
  end
13
13
 
14
- def gauge(name, **options)
15
- new(type: :g, name: name, **options)
14
+ def gauge(name, value = nil, **options)
15
+ new(type: :g, name: name, value: value, **options)
16
16
  end
17
17
 
18
- def set(name, **options)
19
- new(type: :s, name: name, **options)
18
+ def set(name, value = nil, **options)
19
+ new(type: :s, name: name, value: value, **options)
20
20
  end
21
21
 
22
- def key_value(name, **options)
23
- new(type: :kv, name: name, **options)
22
+ def distribution(name, value = nil, **options)
23
+ new(type: :d, name: name, value: value, **options)
24
24
  end
25
25
 
26
- def distribution(name, **options)
27
- new(type: :d, name: name, **options)
28
- end
29
-
30
- def histogram(name, **options)
31
- new(type: :h, name: name, **options)
26
+ def histogram(name, value = nil, **options)
27
+ new(type: :h, name: name, value: value, **options)
32
28
  end
33
29
  end
34
30
 
@@ -3,38 +3,9 @@
3
3
  module StatsD::Instrument::Helpers
4
4
  def capture_statsd_datagrams(client: nil, &block)
5
5
  client ||= StatsD.singleton_client
6
- case client
7
- when StatsD.legacy_singleton_client
8
- capture_statsd_metrics_on_legacy_client(&block)
9
- when StatsD::Instrument::Client
10
- client.capture(&block)
11
- else
12
- raise ArgumentError, "Don't know how to capture StatsD datagrams from #{client.inspect}!"
13
- end
6
+ client.capture(&block)
14
7
  end
15
8
 
16
9
  # For backwards compatibility
17
10
  alias_method :capture_statsd_calls, :capture_statsd_datagrams
18
-
19
- def capture_statsd_metrics_on_legacy_client(&block)
20
- capture_backend = StatsD::Instrument::Backends::CaptureBackend.new
21
- with_capture_backend(capture_backend, &block)
22
- capture_backend.collected_metrics
23
- end
24
-
25
- private
26
-
27
- def with_capture_backend(backend)
28
- if StatsD.legacy_singleton_client.backend.is_a?(StatsD::Instrument::Backends::CaptureBackend)
29
- backend.parent = StatsD.legacy_singleton_client.backend
30
- end
31
-
32
- old_backend = StatsD.legacy_singleton_client.backend
33
- begin
34
- StatsD.legacy_singleton_client.backend = backend
35
- yield
36
- ensure
37
- StatsD.legacy_singleton_client.backend = old_backend
38
- end
39
- end
40
11
  end
@@ -11,7 +11,6 @@ module StatsD::Instrument::Matchers
11
11
  histogram: :h,
12
12
  distribution: :d,
13
13
  set: :s,
14
- key_value: :kv,
15
14
  }
16
15
 
17
16
  class Matcher
@@ -8,8 +8,4 @@ class StatsD::Instrument::Railtie < Rails::Railtie
8
8
  initializer 'statsd-instrument.use_rails_logger' do
9
9
  ::StatsD.logger = Rails.logger
10
10
  end
11
-
12
- initializer 'statsd-instrument.setup_backend', after: 'statsd-instrument.use_rails_logger' do
13
- ::StatsD.backend = ::StatsD::Instrument::Environment.default_backend
14
- end
15
11
  end
@@ -55,9 +55,7 @@ module StatsD
55
55
  super
56
56
  end
57
57
 
58
- def service_check(name, status, tags: nil, no_prefix: false,
59
- hostname: nil, timestamp: nil, message: nil)
60
-
58
+ def service_check(name, status, tags: nil, no_prefix: false, hostname: nil, timestamp: nil, message: nil)
61
59
  super
62
60
  end
63
61
 
@@ -81,11 +79,6 @@ module StatsD
81
79
  super
82
80
  end
83
81
 
84
- def key_value(*)
85
- raise NotImplementedError, "The key_value metric type will be removed " \
86
- "from the next major version of statsd-instrument"
87
- end
88
-
89
82
  private
90
83
 
91
84
  def check_block_or_numeric_value(value)
@@ -106,133 +99,30 @@ module StatsD
106
99
  end
107
100
  end
108
101
 
109
- module VoidCollectMetric
110
- protected
111
-
112
- def collect_metric(type, name, value, sample_rate:, tags: nil, prefix:, metadata: nil)
113
- super
114
- StatsD::Instrument::VOID
115
- end
116
- end
117
-
118
102
  module StrictMetaprogramming
119
- def statsd_measure(method, name, sample_rate: nil, tags: nil,
120
- no_prefix: false, client: StatsD.singleton_client)
121
-
103
+ def statsd_measure(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
122
104
  check_method_and_metric_name(method, name)
123
-
124
- # Unfortunately, we have to inline the new method implementation because we have to fix the
125
- # Stats.measure call to not use the `as_dist` and `prefix` arguments.
126
- add_to_method(method, name, :measure) do
127
- define_method(method) do |*args, &block|
128
- key = StatsD::Instrument.generate_metric_name(nil, name, self, *args)
129
- client.measure(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
130
- super(*args, &block)
131
- end
132
- end
133
- end
105
+ super
134
106
  end
135
107
 
136
- def statsd_distribution(method, name, sample_rate: nil, tags: nil,
137
- no_prefix: false, client: StatsD.singleton_client)
138
-
108
+ def statsd_distribution(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
139
109
  check_method_and_metric_name(method, name)
140
-
141
- # Unfortunately, we have to inline the new method implementation because we have to fix the
142
- # Stats.distribution call to not use the `prefix` argument.
143
-
144
- add_to_method(method, name, :distribution) do
145
- define_method(method) do |*args, &block|
146
- key = StatsD::Instrument.generate_metric_name(nil, name, self, *args)
147
- client.distribution(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
148
- super(*args, &block)
149
- end
150
- end
151
- end
110
+ super
152
111
  end
153
112
 
154
- def statsd_count_success(method, name, sample_rate: nil, tags: nil,
155
- no_prefix: false, client: StatsD.singleton_client)
156
-
113
+ def statsd_count_success(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
157
114
  check_method_and_metric_name(method, name)
158
-
159
- # Unfortunately, we have to inline the new method implementation because we have to fix the
160
- # Stats.increment call to not use the `prefix` argument.
161
-
162
- add_to_method(method, name, :count_success) do
163
- define_method(method) do |*args, &block|
164
- begin
165
- truthiness = result = super(*args, &block)
166
- rescue
167
- truthiness = false
168
- raise
169
- else
170
- if block_given?
171
- begin
172
- truthiness = yield(result)
173
- rescue
174
- truthiness = false
175
- end
176
- end
177
- result
178
- ensure
179
- suffix = truthiness == false ? 'failure' : 'success'
180
- key = "#{StatsD::Instrument.generate_metric_name(nil, name, self, *args)}.#{suffix}"
181
- client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
182
- end
183
- end
184
- end
115
+ super
185
116
  end
186
117
 
187
- def statsd_count_if(method, name, sample_rate: nil, tags: nil,
188
- no_prefix: false, client: StatsD.singleton_client)
189
-
118
+ def statsd_count_if(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
190
119
  check_method_and_metric_name(method, name)
191
-
192
- # Unfortunately, we have to inline the new method implementation because we have to fix the
193
- # Stats.increment call to not use the `prefix` argument.
194
-
195
- add_to_method(method, name, :count_if) do
196
- define_method(method) do |*args, &block|
197
- begin
198
- truthiness = result = super(*args, &block)
199
- rescue
200
- truthiness = false
201
- raise
202
- else
203
- if block_given?
204
- begin
205
- truthiness = yield(result)
206
- rescue
207
- truthiness = false
208
- end
209
- end
210
- result
211
- ensure
212
- if truthiness
213
- key = StatsD::Instrument.generate_metric_name(nil, name, self, *args)
214
- client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
215
- end
216
- end
217
- end
218
- end
120
+ super
219
121
  end
220
122
 
221
- def statsd_count(method, name, sample_rate: nil, tags: nil,
222
- no_prefix: false, client: StatsD.singleton_client)
223
-
123
+ def statsd_count(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
224
124
  check_method_and_metric_name(method, name)
225
-
226
- # Unfortunately, we have to inline the new method implementation because we have to fix the
227
- # Stats.increment call to not use the `prefix` argument.
228
-
229
- add_to_method(method, name, :count) do
230
- define_method(method) do |*args, &block|
231
- key = StatsD::Instrument.generate_metric_name(nil, name, self, *args)
232
- client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
233
- super(*args, &block)
234
- end
235
- end
125
+ super
236
126
  end
237
127
 
238
128
  private
@@ -250,6 +140,5 @@ module StatsD
250
140
  end
251
141
  end
252
142
 
253
- StatsD.singleton_class.prepend(StatsD::Instrument::Strict)
254
- StatsD::Instrument::LegacyClient.prepend(StatsD::Instrument::VoidCollectMetric)
143
+ StatsD::Instrument::Client.prepend(StatsD::Instrument::Strict)
255
144
  StatsD::Instrument.prepend(StatsD::Instrument::StrictMetaprogramming)