statsd-instrument 3.5.8 → 3.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 704d6e657601de493dc28e4a99f3d68529582693b7a74981a63a9837e99119e7
4
- data.tar.gz: b801455560f15650dd460cd25cf3de3efde71ec180842016899b2d51896b4a78
3
+ metadata.gz: 58bc5f73b44ea7c3ac8268feaeb9defc2da36b9a7a5565cb11d34324f84f5381
4
+ data.tar.gz: 0d781d4945f02d7e1eb1bc89e68d647bac0b7062f7d26371b8aef95821080e06
5
5
  SHA512:
6
- metadata.gz: 5a47689d821aeaab37d72af1021af0d1892d420bfbb3d75ded3f2318f73f16f2e36dde3706f82bf5c95b33b3669a028ceb11315f66fac6025c27da6da325ab59
7
- data.tar.gz: 64388d0ec0a6a1107d455d54dc2b26d5a5caf26d7a1a6051ad117d2d4088cc1cb6527490f87bacd706a13be4d04f4146e3806fe7f5d5e2336f9f9e23ef8609ec
6
+ metadata.gz: 901993924629290a116505b73eea09c84dd422fb1fd96a274733e9b26223b73ec3087599b419e325c1e4728fd45f964bb2a800d881ae207fb90e84c4950e8e02
7
+ data.tar.gz: cdd79db9829b2317795330fba20238a122a04cfa15b65b53d2b910a50bb315d961bbcf1714a479c61adbf4a4a378272e71dd9132afe9607eaa96611b20ce332a
@@ -13,7 +13,7 @@ jobs:
13
13
  - name: Set up Ruby
14
14
  uses: ruby/setup-ruby@v1
15
15
  with:
16
- ruby-version: 2.6
16
+ ruby-version: 2.7
17
17
  bundler-cache: true
18
18
 
19
19
  - name: Run Rubocop
data/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ section below.
6
6
 
7
7
  ## Unreleased changes
8
8
 
9
+ ## Version 3.5.10
10
+
11
+ - Fix rubocop 1.30 compatibilitty
12
+
13
+ ## Version 3.5.9
14
+
15
+ - Fix dynamic tags being evaluated only once.
16
+
9
17
  ## Version 3.5.8
10
18
 
11
19
  - Allow the `tag_error_class` option for `statsd_count_success` in strict mode.
data/Gemfile CHANGED
@@ -8,6 +8,6 @@ gem "minitest"
8
8
  gem "rspec"
9
9
  gem "mocha"
10
10
  gem "yard"
11
- gem "rubocop", [">= 1.0", "< 1.30"] # TODO: Our cops are broken by rubocop 1.30, we need to figure out why
11
+ gem "rubocop", ">= 1.0"
12
12
  gem "rubocop-shopify", require: false
13
13
  gem "benchmark-ips"
data/bin/rake CHANGED
@@ -9,8 +9,10 @@
9
9
  #
10
10
 
11
11
  require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
13
+ "../../Gemfile",
14
+ Pathname.new(__FILE__).realpath,
15
+ )
14
16
 
15
17
  bundle_binstub = File.expand_path("../bundle", __FILE__)
16
18
 
data/bin/rubocop CHANGED
@@ -9,8 +9,10 @@
9
9
  #
10
10
 
11
11
  require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
13
+ "../../Gemfile",
14
+ Pathname.new(__FILE__).realpath,
15
+ )
14
16
 
15
17
  bundle_binstub = File.expand_path("../bundle", __FILE__)
16
18
 
@@ -10,14 +10,14 @@ module StatsD
10
10
  # https://docs.datadoghq.com/developers/dogstatsd/high_throughput/?code-lang=ruby#ensure-proper-packet-sizes
11
11
  DEFAULT_MAX_PACKET_SIZE = 1472
12
12
 
13
- def self.for_addr(addr, **kwargs)
14
- host, port_as_string = addr.split(":", 2)
15
- new(host, Integer(port_as_string), **kwargs)
16
- end
17
-
18
13
  attr_reader :host, :port
19
14
 
20
15
  class << self
16
+ def for_addr(addr, **kwargs)
17
+ host, port_as_string = addr.split(":", 2)
18
+ new(host, Integer(port_as_string), **kwargs)
19
+ end
20
+
21
21
  def finalize(dispatcher)
22
22
  proc { dispatcher.shutdown }
23
23
  end
@@ -122,7 +122,7 @@ module StatsD
122
122
 
123
123
  packet << next_datagram
124
124
  next_datagram = nil
125
- unless packet.bytesize > @max_packet_size
125
+ if packet.bytesize <= @max_packet_size
126
126
  while (next_datagram = @buffer.pop_nonblock)
127
127
  if @max_packet_size - packet.bytesize - 1 > next_datagram.bytesize
128
128
  packet << NEWLINE << next_datagram
@@ -338,8 +338,14 @@ module StatsD
338
338
  #
339
339
  # @note Supported by the Datadog implementation only.
340
340
  def service_check(name, status, timestamp: nil, hostname: nil, tags: nil, message: nil, no_prefix: false)
341
- emit(datagram_builder(no_prefix: no_prefix)._sc(name, status,
342
- timestamp: timestamp, hostname: hostname, tags: tags, message: message))
341
+ emit(datagram_builder(no_prefix: no_prefix)._sc(
342
+ name,
343
+ status,
344
+ timestamp: timestamp,
345
+ hostname: hostname,
346
+ tags: tags,
347
+ message: message,
348
+ ))
343
349
  end
344
350
 
345
351
  # Emits an event. An event represents any record of activity noteworthy for engineers.
@@ -359,9 +365,17 @@ module StatsD
359
365
  def event(title, text, timestamp: nil, hostname: nil, aggregation_key: nil, priority: nil,
360
366
  source_type_name: nil, alert_type: nil, tags: nil, no_prefix: false)
361
367
 
362
- emit(datagram_builder(no_prefix: no_prefix)._e(title, text, timestamp: timestamp,
363
- hostname: hostname, tags: tags, aggregation_key: aggregation_key, priority: priority,
364
- source_type_name: source_type_name, alert_type: alert_type))
368
+ emit(datagram_builder(no_prefix: no_prefix)._e(
369
+ title,
370
+ text,
371
+ timestamp: timestamp,
372
+ hostname: hostname,
373
+ tags: tags,
374
+ aggregation_key: aggregation_key,
375
+ priority: priority,
376
+ source_type_name: source_type_name,
377
+ alert_type: alert_type,
378
+ ))
365
379
  end
366
380
 
367
381
  # Instantiates a new StatsD client that uses the settings of the current client,
@@ -378,9 +392,13 @@ module StatsD
378
392
  default_tags: nil,
379
393
  datagram_builder_class: nil
380
394
  )
381
- client = clone_with_options(sink: sink, prefix: prefix,
382
- default_sample_rate: default_sample_rate, default_tags: default_tags,
383
- datagram_builder_class: datagram_builder_class)
395
+ client = clone_with_options(
396
+ sink: sink,
397
+ prefix: prefix,
398
+ default_sample_rate: default_sample_rate,
399
+ default_tags: default_tags,
400
+ datagram_builder_class: datagram_builder_class,
401
+ )
384
402
 
385
403
  yield(client)
386
404
  end
@@ -40,7 +40,7 @@ module StatsD
40
40
  end
41
41
 
42
42
  def tags
43
- @tags ||= parsed_datagram[:tags] ? parsed_datagram[:tags].split(",") : nil
43
+ @tags ||= parsed_datagram[:tags]&.split(",")
44
44
  end
45
45
 
46
46
  def inspect
@@ -5,16 +5,18 @@ module StatsD
5
5
  # @note This class is part of the new Client implementation that is intended
6
6
  # to become the new default in the next major release of this library.
7
7
  class DatagramBuilder
8
- def self.unsupported_datagram_types(*types)
9
- types.each do |type|
10
- define_method(type) do |_, _, _, _|
11
- raise NotImplementedError, "Type #{type} metrics are not supported by #{self.class.name}."
8
+ class << self
9
+ def unsupported_datagram_types(*types)
10
+ types.each do |type|
11
+ define_method(type) do |_, _, _, _|
12
+ raise NotImplementedError, "Type #{type} metrics are not supported by #{self.class.name}."
13
+ end
12
14
  end
13
15
  end
14
- end
15
16
 
16
- def self.datagram_class
17
- StatsD::Instrument::Datagram
17
+ def datagram_class
18
+ StatsD::Instrument::Datagram
19
+ end
18
20
  end
19
21
 
20
22
  def initialize(prefix: nil, default_tags: nil)
@@ -7,10 +7,11 @@ module StatsD
7
7
  class DogStatsDDatagramBuilder < StatsD::Instrument::DatagramBuilder
8
8
  unsupported_datagram_types :kv
9
9
 
10
- def self.datagram_class
11
- StatsD::Instrument::DogStatsDDatagram
10
+ class << self
11
+ def datagram_class
12
+ StatsD::Instrument::DogStatsDDatagram
13
+ end
12
14
  end
13
-
14
15
  def latency_metric_type
15
16
  :d
16
17
  end
@@ -11,32 +11,34 @@ module StatsD
11
11
  # For backwards compatibility
12
12
  alias_method :capture_statsd_calls, :capture_statsd_datagrams
13
13
 
14
- def self.add_tag(tags, key, value)
15
- tags = tags.dup || {}
16
-
17
- if tags.is_a?(String)
18
- tags = tags.empty? ? "#{key}:#{value}" : "#{tags},#{key}:#{value}"
19
- elsif tags.is_a?(Array)
20
- tags << "#{key}:#{value}"
21
- elsif tags.is_a?(Hash)
22
- tags[key] = value
23
- else
24
- raise ArgumentError, "add_tag only supports string, array or hash, #{tags.class} provided"
14
+ class << self
15
+ def add_tag(tags, key, value)
16
+ tags = tags.dup || {}
17
+
18
+ if tags.is_a?(String)
19
+ tags = tags.empty? ? "#{key}:#{value}" : "#{tags},#{key}:#{value}"
20
+ elsif tags.is_a?(Array)
21
+ tags << "#{key}:#{value}"
22
+ elsif tags.is_a?(Hash)
23
+ tags[key] = value
24
+ else
25
+ raise ArgumentError, "add_tag only supports string, array or hash, #{tags.class} provided"
26
+ end
27
+
28
+ tags
25
29
  end
26
30
 
27
- tags
28
- end
29
-
30
- def self.prefix_metric(metric_name, client: nil)
31
- client ||= StatsD.singleton_client
32
- client&.prefix ? "#{client.prefix}.#{metric_name}" : metric_name
33
- end
31
+ def prefix_metric(metric_name, client: nil)
32
+ client ||= StatsD.singleton_client
33
+ client&.prefix ? "#{client.prefix}.#{metric_name}" : metric_name
34
+ end
34
35
 
35
- def self.prefixed_metric?(metric_name, client: nil)
36
- client ||= StatsD.singleton_client
37
- return false unless client&.prefix
36
+ def prefixed_metric?(metric_name, client: nil)
37
+ client ||= StatsD.singleton_client
38
+ return false unless client&.prefix
38
39
 
39
- metric_name =~ /\A#{Regexp.escape(client.prefix)}\./
40
+ metric_name =~ /\A#{Regexp.escape(client.prefix)}\./
41
+ end
40
42
  end
41
43
  end
42
44
  end
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -14,7 +14,8 @@ module RuboCop
14
14
  # --only StatsD/PositionalArguments
15
15
  #
16
16
  # This cop can autocorrect some offenses it finds, but not all of them.
17
- class PositionalArguments < Cop
17
+ class PositionalArguments < Base
18
+ extend AutoCorrector
18
19
  include RuboCop::Cop::StatsD
19
20
 
20
21
  MSG = "Use keyword arguments for StatsD calls"
@@ -31,7 +32,9 @@ module RuboCop
31
32
  if metric_method?(node) && node.arguments.length >= 3
32
33
  case node.arguments[2].type
33
34
  when *REFUSED_ARGUMENT_TYPES
34
- add_offense(node)
35
+ add_offense(node) do |corrector|
36
+ autocorrect(corrector, node)
37
+ end
35
38
  when *ACCEPTED_ARGUMENT_TYPES
36
39
  nil
37
40
  else
@@ -40,57 +43,56 @@ module RuboCop
40
43
  end
41
44
  end
42
45
 
43
- def autocorrect(node)
44
- ->(corrector) do
45
- positional_arguments = if node.arguments.last.type == :block_pass
46
- node.arguments[2...node.arguments.length - 1]
47
- else
48
- node.arguments[2...node.arguments.length]
49
- end
46
+ def autocorrect(corrector, node)
47
+ positional_arguments = if node.arguments.last.type == :block_pass
48
+ node.arguments[2...node.arguments.length - 1]
49
+ else
50
+ node.arguments[2...node.arguments.length]
51
+ end
50
52
 
51
- case positional_arguments[0].type
52
- when *UNKNOWN_ARGUMENT_TYPES
53
- # We don't know whether the method returns a hash, in which case it would be interpreted
54
- # as keyword arguments. In this case, the fix would be to add a keyword splat:
55
- #
56
- # `StatsD.instrument('foo', 1, method_call)`
57
- # => `StatsD.instrument('foo', 1, **method_call)`
58
- #
59
- # However, it's also possible this method returns a sample rate, in which case the fix
60
- # above will not do the right thing.
61
- #
62
- # `StatsD.instrument('foo', 1, SAMPLE_RATE_CONSTANT)`
63
- # => `StatsD.instrument('foo', 1, sample_rate: SAMPLE_RATE_CONSTANT)`
64
- #
65
- # Because of this, we will not auto-correct and let the user fix the issue manually.
66
- return
53
+ case positional_arguments[0].type
54
+ when *UNKNOWN_ARGUMENT_TYPES
55
+ # We don't know whether the method returns a hash, in which case it would be interpreted
56
+ # as keyword arguments. In this case, the fix would be to add a keyword splat:
57
+ #
58
+ # `StatsD.instrument('foo', 1, method_call)`
59
+ # => `StatsD.instrument('foo', 1, **method_call)`
60
+ #
61
+ # However, it's also possible this method returns a sample rate, in which case the fix
62
+ # above will not do the right thing.
63
+ #
64
+ # `StatsD.instrument('foo', 1, SAMPLE_RATE_CONSTANT)`
65
+ # => `StatsD.instrument('foo', 1, sample_rate: SAMPLE_RATE_CONSTANT)`
66
+ #
67
+ # Because of this, we will not auto-correct and let the user fix the issue manually.
68
+ nil
67
69
 
68
- when *POSITIONAL_ARGUMENT_TYPES
69
- value_argument = node.arguments[1]
70
- from = value_argument.source_range.end_pos
71
- to = positional_arguments.last.source_range.end_pos
72
- range = Parser::Source::Range.new(node.source_range.source_buffer, from, to)
73
- corrector.remove(range)
70
+ when *POSITIONAL_ARGUMENT_TYPES
71
+ value_argument = node.arguments[1]
72
+ from = value_argument.source_range.end_pos
73
+ to = positional_arguments.last.source_range.end_pos
74
+ range = Parser::Source::Range.new(node.source_range.source_buffer, from, to)
75
+ corrector.remove(range)
74
76
 
75
- keyword_arguments = []
76
- sample_rate = positional_arguments[0]
77
- if sample_rate && sample_rate.type != :nil
78
- keyword_arguments << "sample_rate: #{sample_rate.source}"
79
- end
77
+ keyword_arguments = []
78
+ sample_rate = positional_arguments[0]
79
+ if sample_rate && sample_rate.type != :nil
80
+ keyword_arguments << "sample_rate: #{sample_rate.source}"
81
+ end
80
82
 
81
- tags = positional_arguments[1]
82
- if tags && tags.type != :nil
83
- keyword_arguments << if tags.type == :hash && tags.source[0] != "{"
84
- "tags: { #{tags.source} }"
85
- else
86
- "tags: #{tags.source}"
87
- end
83
+ tags = positional_arguments[1]
84
+ if tags && tags.type != :nil
85
+ keyword_arguments << if tags.type == :hash && tags.source[0] != "{"
86
+ "tags: { #{tags.source} }"
87
+ else
88
+ "tags: #{tags.source}"
88
89
  end
90
+ end
89
91
 
90
- unless keyword_arguments.empty?
91
- corrector.insert_after(value_argument.source_range, ", #{keyword_arguments.join(", ")}")
92
- end
92
+ unless keyword_arguments.empty?
93
+ corrector.insert_after(value_argument.source_range, ", #{keyword_arguments.join(", ")}")
93
94
  end
95
+
94
96
  end
95
97
  end
96
98
  end
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen-string-literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
@@ -5,11 +5,24 @@ module RuboCop
5
5
  module StatsD
6
6
  METRIC_METHODS = [:increment, :gauge, :measure, :set, :histogram, :distribution, :key_value]
7
7
 
8
- METAPROGRAMMING_METHODS = [:statsd_measure, :statsd_distribution, :statsd_count_success, :statsd_count_if,
9
- :statsd_count,]
8
+ METAPROGRAMMING_METHODS = [
9
+ :statsd_measure,
10
+ :statsd_distribution,
11
+ :statsd_count_success,
12
+ :statsd_count_if,
13
+ :statsd_count,
14
+ ]
10
15
 
11
- SINGLETON_CONFIGURATION_METHODS = [:backend, :"backend=", :prefix, :"prefix=", :default_tags, :"default_tags=",
12
- :default_sample_rate, :"default_sample_rate=",]
16
+ SINGLETON_CONFIGURATION_METHODS = [
17
+ :backend,
18
+ :"backend=",
19
+ :prefix,
20
+ :"prefix=",
21
+ :default_tags,
22
+ :"default_tags=",
23
+ :default_sample_rate,
24
+ :"default_sample_rate=",
25
+ ]
13
26
 
14
27
  private
15
28
 
@@ -5,9 +5,11 @@ module StatsD
5
5
  # @note This class is part of the new Client implementation that is intended
6
6
  # to become the new default in the next major release of this library.
7
7
  class UDPSink
8
- def self.for_addr(addr)
9
- host, port_as_string = addr.split(":", 2)
10
- new(host, Integer(port_as_string))
8
+ class << self
9
+ def for_addr(addr)
10
+ host, port_as_string = addr.split(":", 2)
11
+ new(host, Integer(port_as_string))
12
+ end
11
13
  end
12
14
 
13
15
  attr_reader :host, :port
@@ -2,6 +2,6 @@
2
2
 
3
3
  module StatsD
4
4
  module Instrument
5
- VERSION = "3.5.8"
5
+ VERSION = "3.5.10"
6
6
  end
7
7
  end
@@ -27,42 +27,44 @@ module StatsD
27
27
  end
28
28
  end
29
29
 
30
- # Generates a metric name for an instrumented method.
31
- # @private
32
- # @return [String]
33
- def self.generate_metric_name(name, callee, *args)
34
- name.respond_to?(:call) ? name.call(callee, args).gsub("::", ".") : name.gsub("::", ".")
35
- end
30
+ class << self
31
+ # Generates a metric name for an instrumented method.
32
+ # @private
33
+ # @return [String]
34
+ def generate_metric_name(name, callee, *args)
35
+ name.respond_to?(:call) ? name.call(callee, args).gsub("::", ".") : name.gsub("::", ".")
36
+ end
36
37
 
37
- # Generates the tags for an instrumented method.
38
- # @private
39
- # @return [Array[String]]
40
- def self.generate_tags(tags, callee, *args)
41
- return if tags.nil?
38
+ # Generates the tags for an instrumented method.
39
+ # @private
40
+ # @return [Array[String]]
41
+ def generate_tags(tags, callee, *args)
42
+ return if tags.nil?
42
43
 
43
- tags.respond_to?(:call) ? tags.call(callee, args) : tags
44
- end
44
+ tags.respond_to?(:call) ? tags.call(callee, args) : tags
45
+ end
45
46
 
46
- # Even though this method is considered private, and is no longer used internally,
47
- # applications in the wild rely on it. As a result, we cannot remove this method
48
- # until the next major version.
49
- #
50
- # @deprecated Use Process.clock_gettime(Process::CLOCK_MONOTONIC) instead.
51
- def self.current_timestamp
52
- Process.clock_gettime(Process::CLOCK_MONOTONIC)
53
- end
47
+ # Even though this method is considered private, and is no longer used internally,
48
+ # applications in the wild rely on it. As a result, we cannot remove this method
49
+ # until the next major version.
50
+ #
51
+ # @deprecated Use Process.clock_gettime(Process::CLOCK_MONOTONIC) instead.
52
+ def current_timestamp
53
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
54
+ end
54
55
 
55
- # Even though this method is considered private, and is no longer used internally,
56
- # applications in the wild rely on it. As a result, we cannot remove this method
57
- # until the next major version.
58
- #
59
- # @deprecated You can implement similar functionality yourself using
60
- # `Process.clock_gettime(Process::CLOCK_MONOTONIC)`. Think about what will
61
- # happen if an exception happens during the block execution though.
62
- def self.duration
63
- start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
64
- yield
65
- Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
56
+ # Even though this method is considered private, and is no longer used internally,
57
+ # applications in the wild rely on it. As a result, we cannot remove this method
58
+ # until the next major version.
59
+ #
60
+ # @deprecated You can implement similar functionality yourself using
61
+ # `Process.clock_gettime(Process::CLOCK_MONOTONIC)`. Think about what will
62
+ # happen if an exception happens during the block execution though.
63
+ def duration
64
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
65
+ yield
66
+ Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
67
+ end
66
68
  end
67
69
 
68
70
  # Adds execution duration instrumentation to a method as a timing.
@@ -79,8 +81,8 @@ module StatsD
79
81
  define_method(method) do |*args, &block|
80
82
  client ||= StatsD.singleton_client
81
83
  key = StatsD::Instrument.generate_metric_name(name, self, *args)
82
- tags = StatsD::Instrument.generate_tags(tags, self, *args)
83
- client.measure(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
84
+ generated_tags = StatsD::Instrument.generate_tags(tags, self, *args)
85
+ client.measure(key, sample_rate: sample_rate, tags: generated_tags, no_prefix: no_prefix) do
84
86
  super(*args, &block)
85
87
  end
86
88
  end
@@ -100,8 +102,8 @@ module StatsD
100
102
  define_method(method) do |*args, &block|
101
103
  client ||= StatsD.singleton_client
102
104
  key = StatsD::Instrument.generate_metric_name(name, self, *args)
103
- tags = StatsD::Instrument.generate_tags(tags, self, *args)
104
- client.distribution(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
105
+ generated_tags = StatsD::Instrument.generate_tags(tags, self, *args)
106
+ client.distribution(key, sample_rate: sample_rate, tags: generated_tags, no_prefix: no_prefix) do
105
107
  super(*args, &block)
106
108
  end
107
109
  end
@@ -145,10 +147,10 @@ module StatsD
145
147
  client ||= StatsD.singleton_client
146
148
  suffix = truthiness == false ? "failure" : "success"
147
149
  key = StatsD::Instrument.generate_metric_name(name, self, *args)
148
- tags = StatsD::Instrument.generate_tags(tags, self, *args)
149
- tags = Helpers.add_tag(tags, :error_class, error.class.name) if tag_error_class && error
150
+ generated_tags = StatsD::Instrument.generate_tags(tags, self, *args)
151
+ generated_tags = Helpers.add_tag(generated_tags, :error_class, error.class.name) if tag_error_class && error
150
152
 
151
- client.increment("#{key}.#{suffix}", sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
153
+ client.increment("#{key}.#{suffix}", sample_rate: sample_rate, tags: generated_tags, no_prefix: no_prefix)
152
154
  end
153
155
  end
154
156
  end
@@ -185,8 +187,8 @@ module StatsD
185
187
  if truthiness
186
188
  client ||= StatsD.singleton_client
187
189
  key = StatsD::Instrument.generate_metric_name(name, self, *args)
188
- tags = StatsD::Instrument.generate_tags(tags, self, *args)
189
- client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
190
+ generated_tags = StatsD::Instrument.generate_tags(tags, self, *args)
191
+ client.increment(key, sample_rate: sample_rate, tags: generated_tags, no_prefix: no_prefix)
190
192
  end
191
193
  end
192
194
  end
@@ -206,8 +208,8 @@ module StatsD
206
208
  define_method(method) do |*args, &block|
207
209
  client ||= StatsD.singleton_client
208
210
  key = StatsD::Instrument.generate_metric_name(name, self, *args)
209
- tags = StatsD::Instrument.generate_tags(tags, self, *args)
210
- client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
211
+ generated_tags = StatsD::Instrument.generate_tags(tags, self, *args)
212
+ client.increment(key, sample_rate: sample_rate, tags: generated_tags, no_prefix: no_prefix)
211
213
  super(*args, &block)
212
214
  end
213
215
  end
@@ -294,7 +296,12 @@ module StatsD
294
296
  if instrumentation_module.respond_to?(:ruby2_keywords, true)
295
297
  instrumentation_module.send(:ruby2_keywords, method)
296
298
  end
297
- prepend(instrumentation_module) unless self < instrumentation_module
299
+
300
+ if self < instrumentation_module
301
+ return
302
+ end
303
+
304
+ prepend(instrumentation_module)
298
305
  end
299
306
 
300
307
  def remove_from_method(method, name, action)
@@ -358,8 +365,15 @@ module StatsD
358
365
  # @!method service_check(name, status, tags: nil, hostname: nil, timestamp: nil, message: nil)
359
366
  # (see StatsD::Instrument::Client#service_check)
360
367
 
361
- def_delegators :singleton_client, :increment, :gauge, :set, :measure,
362
- :histogram, :distribution, :event, :service_check
368
+ def_delegators :singleton_client,
369
+ :increment,
370
+ :gauge,
371
+ :set,
372
+ :measure,
373
+ :histogram,
374
+ :distribution,
375
+ :event,
376
+ :service_check
363
377
 
364
378
  private
365
379
 
@@ -385,6 +399,6 @@ require "statsd/instrument/environment"
385
399
  require "statsd/instrument/helpers"
386
400
  require "statsd/instrument/assertions"
387
401
  require "statsd/instrument/expectation"
388
- require "statsd/instrument/matchers" if defined?(::RSpec)
389
- require "statsd/instrument/railtie" if defined?(::Rails::Railtie)
402
+ require "statsd/instrument/matchers" if defined?(RSpec)
403
+ require "statsd/instrument/railtie" if defined?(Rails::Railtie)
390
404
  require "statsd/instrument/strict" if ENV["STATSD_STRICT_MODE"]
@@ -89,7 +89,7 @@ class AssertionsTest < Minitest::Test
89
89
  assert_equal(assertion.message, "No StatsD calls for metric prefix.counter expected.")
90
90
 
91
91
  @test_case.expects(:warn).with(
92
- "`assert_no_statsd_calls` will prefix metrics by default. `prefix.counter` skipped due to existing prefix."
92
+ "`assert_no_statsd_calls` will prefix metrics by default. `prefix.counter` skipped due to existing prefix.",
93
93
  )
94
94
  assertion = assert_raises(Minitest::Assertion) do
95
95
  @test_case.assert_no_statsd_calls("prefix.counter", client: client) do
data/test/client_test.rb CHANGED
@@ -48,8 +48,12 @@ class ClientTest < Minitest::Test
48
48
  "STATSD_IMPLEMENTATION" => "statsd",
49
49
  "STATSD_ADDR" => "1.2.3.4:8125",
50
50
  )
51
- client = StatsD::Instrument::Client.from_env(env,
52
- prefix: "bar", implementation: "dogstatsd", sink: StatsD::Instrument::NullSink.new)
51
+ client = StatsD::Instrument::Client.from_env(
52
+ env,
53
+ prefix: "bar",
54
+ implementation: "dogstatsd",
55
+ sink: StatsD::Instrument::NullSink.new,
56
+ )
53
57
 
54
58
  assert_equal(0.1, client.default_sample_rate)
55
59
  assert_equal("bar", client.prefix)
@@ -21,8 +21,14 @@ class DogStatsDDatagramBuilderTest < Minitest::Test
21
21
  end
22
22
 
23
23
  def test_complex_service_check
24
- datagram = @datagram_builder._sc("service", :warning, timestamp: Time.parse("2019-09-30T04:22:12Z"),
25
- hostname: "localhost", tags: { foo: "bar|baz" }, message: "blah")
24
+ datagram = @datagram_builder._sc(
25
+ "service",
26
+ :warning,
27
+ timestamp: Time.parse("2019-09-30T04:22:12Z"),
28
+ hostname: "localhost",
29
+ tags: { foo: "bar|baz" },
30
+ message: "blah",
31
+ )
26
32
  assert_equal("_sc|service|1|h:localhost|d:1569817332|#foo:barbaz|m:blah", datagram)
27
33
 
28
34
  parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
@@ -46,11 +52,22 @@ class DogStatsDDatagramBuilderTest < Minitest::Test
46
52
  end
47
53
 
48
54
  def test_complex_event
49
- datagram = @datagram_builder._e("testing", "with\nnewline", timestamp: Time.parse("2019-09-30T04:22:12Z"),
50
- hostname: "localhost", aggregation_key: "my-key", priority: "low", source_type_name: "source",
51
- alert_type: "success", tags: { foo: "bar|baz" })
52
- assert_equal('_e{7,13}:testing|with\\nnewline|h:localhost|d:1569817332|k:my-key|' \
53
- "p:low|s:source|t:success|#foo:barbaz", datagram)
55
+ datagram = @datagram_builder._e(
56
+ "testing",
57
+ "with\nnewline",
58
+ timestamp: Time.parse("2019-09-30T04:22:12Z"),
59
+ hostname: "localhost",
60
+ aggregation_key: "my-key",
61
+ priority: "low",
62
+ source_type_name: "source",
63
+ alert_type: "success",
64
+ tags: { foo: "bar|baz" },
65
+ )
66
+ assert_equal(
67
+ '_e{7,13}:testing|with\\nnewline|h:localhost|d:1569817332|k:my-key|' \
68
+ "p:low|s:source|t:success|#foo:barbaz",
69
+ datagram,
70
+ )
54
71
 
55
72
  parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
56
73
  assert_equal(:_e, parsed_datagram.type)
@@ -12,13 +12,13 @@ module RubocopHelper
12
12
  private_constant :RUBY_VERSION
13
13
 
14
14
  def assert_no_offenses(source)
15
- investigate(RuboCop::ProcessedSource.new(source, RUBY_VERSION, nil))
16
- assert_predicate(cop.offenses, :empty?, "Did not expect Rubocop to find offenses")
15
+ report = investigate(RuboCop::ProcessedSource.new(source, RUBY_VERSION, nil))
16
+ assert_predicate(report.offenses, :empty?, "Did not expect Rubocop to find offenses")
17
17
  end
18
18
 
19
19
  def assert_offense(source)
20
- investigate(RuboCop::ProcessedSource.new(source, RUBY_VERSION, nil))
21
- refute_predicate(cop.offenses, :empty?, "Expected Rubocop to find offenses")
20
+ report = investigate(RuboCop::ProcessedSource.new(source, RUBY_VERSION, nil))
21
+ refute_predicate(report.offenses, :empty?, "Expected Rubocop to find offenses")
22
22
  end
23
23
 
24
24
  def assert_no_autocorrect(source)
@@ -29,13 +29,27 @@ module RubocopHelper
29
29
  def autocorrect_source(source)
30
30
  RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
31
31
  RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
32
- cop.instance_variable_get(:@options)[:auto_correct] = true
32
+ cop.instance_variable_get(:@options)[:autocorrect] = true
33
+ cop.instance_variable_get(:@options)[:raise_error] = true
33
34
 
34
35
  processed_source = RuboCop::ProcessedSource.new(source, RUBY_VERSION, nil)
35
- investigate(processed_source)
36
+ report = investigate(processed_source)
37
+ corrector = RuboCop::Cop::Legacy::Corrector.new(
38
+ processed_source.buffer,
39
+ correctors(report),
40
+ )
41
+ corrector.process
42
+ end
43
+
44
+ def correctors(report)
45
+ correctors = report.correctors.reject(&:nil?)
46
+ if correctors.empty?
47
+ return []
48
+ end
36
49
 
37
- corrector = RuboCop::Cop::Legacy::Corrector.new(processed_source.buffer, cop.corrections)
38
- corrector.rewrite
50
+ corrections_proxy = RuboCop::Cop::Legacy::CorrectionsProxy.new(correctors.first)
51
+ correctors.drop(1).each { |c| corrections_proxy.concat(c) }
52
+ corrections_proxy
39
53
  end
40
54
 
41
55
  def investigate(processed_source)
@@ -43,8 +57,7 @@ module RubocopHelper
43
57
  instances << klass.new([cop])
44
58
  end
45
59
 
46
- commissioner = RuboCop::Cop::Commissioner.new([cop], forces, raise_error: true)
60
+ commissioner = RuboCop::Cop::Commissioner.new([cop], forces)
47
61
  commissioner.investigate(processed_source)
48
- commissioner
49
62
  end
50
63
  end
@@ -28,8 +28,10 @@ class StatsDInstrumentationTest < Minitest::Test
28
28
  false
29
29
  end
30
30
 
31
- def self.sync
32
- true
31
+ class << self
32
+ def sync
33
+ true
34
+ end
33
35
  end
34
36
  end
35
37
 
@@ -231,6 +233,9 @@ class StatsDInstrumentationTest < Minitest::Test
231
233
  assert_statsd_increment("subgateway.foo", tags: { "key": "foo" }) do
232
234
  GatewaySubClass.new.purchase("foo")
233
235
  end
236
+ assert_statsd_increment("subgateway.bar", tags: { "key": "bar" }) do
237
+ GatewaySubClass.new.purchase("bar")
238
+ end
234
239
  ensure
235
240
  ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
236
241
  end
@@ -243,6 +248,9 @@ class StatsDInstrumentationTest < Minitest::Test
243
248
  assert_statsd_increment("subgateway.foo", tags: { "key": "foo" }) do
244
249
  GatewaySubClass.new.purchase("foo")
245
250
  end
251
+ assert_statsd_increment("subgateway.bar", tags: { "key": "bar" }) do
252
+ GatewaySubClass.new.purchase("bar")
253
+ end
246
254
  ensure
247
255
  ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
248
256
  end
@@ -411,8 +419,12 @@ class StatsDInstrumentationTest < Minitest::Test
411
419
  def test_statsd_macro_can_disable_prefix
412
420
  client = StatsD::Instrument::Client.new(prefix: "foo")
413
421
  ActiveMerchant::Gateway.singleton_class.extend(StatsD::Instrument)
414
- ActiveMerchant::Gateway.singleton_class.statsd_count_success(:sync,
415
- "ActiveMerchant.Gateway.sync", no_prefix: true, client: client)
422
+ ActiveMerchant::Gateway.singleton_class.statsd_count_success(
423
+ :sync,
424
+ "ActiveMerchant.Gateway.sync",
425
+ no_prefix: true,
426
+ client: client,
427
+ )
416
428
 
417
429
  datagrams = client.capture { ActiveMerchant::Gateway.sync }
418
430
  assert_equal(1, datagrams.length)
data/test/test_helper.rb CHANGED
@@ -15,9 +15,11 @@ require_relative "helpers/rubocop_helper"
15
15
 
16
16
  module StatsD
17
17
  module Instrument
18
- def self.strict_mode_enabled?
19
- StatsD::Instrument.const_defined?(:Strict) &&
20
- StatsD.singleton_class.ancestors.include?(StatsD::Instrument::Strict)
18
+ class << self
19
+ def strict_mode_enabled?
20
+ StatsD::Instrument.const_defined?(:Strict) &&
21
+ StatsD.singleton_class.ancestors.include?(StatsD::Instrument::Strict)
22
+ end
21
23
  end
22
24
  end
23
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statsd-instrument
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.8
4
+ version: 3.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Storimer
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-04-27 00:00:00.000000000 Z
13
+ date: 2023-06-05 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.
@@ -122,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  requirements: []
125
- rubygems_version: 3.4.12
125
+ rubygems_version: 3.4.13
126
126
  signing_key:
127
127
  specification_version: 4
128
128
  summary: A StatsD client for Ruby apps