statsd-instrument 2.3.2 → 2.6.0
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 +4 -4
 - data/.github/CODEOWNERS +1 -0
 - data/.github/workflows/benchmark.yml +32 -0
 - data/.github/workflows/ci.yml +47 -0
 - data/.gitignore +1 -0
 - data/.rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml +1027 -0
 - data/.rubocop.yml +50 -0
 - data/.yardopts +5 -0
 - data/CHANGELOG.md +288 -2
 - data/CONTRIBUTING.md +28 -6
 - data/Gemfile +5 -0
 - data/README.md +54 -46
 - data/Rakefile +4 -2
 - data/benchmark/README.md +29 -0
 - data/benchmark/datagram-client +41 -0
 - data/benchmark/send-metrics-to-dev-null-log +47 -0
 - data/benchmark/send-metrics-to-local-udp-receiver +57 -0
 - data/lib/statsd/instrument/assertions.rb +179 -30
 - data/lib/statsd/instrument/backend.rb +3 -2
 - data/lib/statsd/instrument/backends/capture_backend.rb +4 -1
 - data/lib/statsd/instrument/backends/logger_backend.rb +3 -3
 - data/lib/statsd/instrument/backends/null_backend.rb +2 -0
 - data/lib/statsd/instrument/backends/udp_backend.rb +39 -45
 - data/lib/statsd/instrument/capture_sink.rb +27 -0
 - data/lib/statsd/instrument/client.rb +313 -0
 - data/lib/statsd/instrument/datagram.rb +75 -0
 - data/lib/statsd/instrument/datagram_builder.rb +101 -0
 - data/lib/statsd/instrument/dogstatsd_datagram_builder.rb +71 -0
 - data/lib/statsd/instrument/environment.rb +108 -29
 - data/lib/statsd/instrument/helpers.rb +16 -8
 - data/lib/statsd/instrument/log_sink.rb +24 -0
 - data/lib/statsd/instrument/matchers.rb +14 -11
 - data/lib/statsd/instrument/metric.rb +72 -45
 - data/lib/statsd/instrument/metric_expectation.rb +32 -18
 - data/lib/statsd/instrument/null_sink.rb +13 -0
 - data/lib/statsd/instrument/railtie.rb +2 -1
 - data/lib/statsd/instrument/rubocop/measure_as_dist_argument.rb +39 -0
 - data/lib/statsd/instrument/rubocop/metaprogramming_positional_arguments.rb +42 -0
 - data/lib/statsd/instrument/rubocop/metric_prefix_argument.rb +37 -0
 - data/lib/statsd/instrument/rubocop/metric_return_value.rb +32 -0
 - data/lib/statsd/instrument/rubocop/metric_value_keyword_argument.rb +36 -0
 - data/lib/statsd/instrument/rubocop/positional_arguments.rb +99 -0
 - data/lib/statsd/instrument/rubocop/splat_arguments.rb +31 -0
 - data/lib/statsd/instrument/rubocop.rb +64 -0
 - data/lib/statsd/instrument/statsd_datagram_builder.rb +14 -0
 - data/lib/statsd/instrument/strict.rb +235 -0
 - data/lib/statsd/instrument/udp_sink.rb +62 -0
 - data/lib/statsd/instrument/version.rb +3 -1
 - data/lib/statsd/instrument.rb +340 -163
 - data/lib/statsd-instrument.rb +2 -0
 - data/statsd-instrument.gemspec +13 -10
 - data/test/assertions_test.rb +167 -156
 - data/test/benchmark/clock_gettime.rb +27 -0
 - data/test/benchmark/default_tags.rb +47 -0
 - data/test/benchmark/metrics.rb +9 -8
 - data/test/benchmark/tags.rb +5 -3
 - data/test/capture_backend_test.rb +4 -2
 - data/test/capture_sink_test.rb +44 -0
 - data/test/client_test.rb +164 -0
 - data/test/compatibility/dogstatsd_datagram_compatibility_test.rb +162 -0
 - data/test/datagram_builder_test.rb +120 -0
 - data/test/deprecations_test.rb +132 -0
 - data/test/dogstatsd_datagram_builder_test.rb +32 -0
 - data/test/environment_test.rb +75 -8
 - data/test/helpers/rubocop_helper.rb +47 -0
 - data/test/helpers_test.rb +2 -1
 - data/test/integration_test.rb +31 -7
 - data/test/log_sink_test.rb +37 -0
 - data/test/logger_backend_test.rb +10 -8
 - data/test/matchers_test.rb +42 -28
 - data/test/metric_test.rb +18 -22
 - data/test/null_sink_test.rb +13 -0
 - data/test/rubocop/measure_as_dist_argument_test.rb +44 -0
 - data/test/rubocop/metaprogramming_positional_arguments_test.rb +58 -0
 - data/test/rubocop/metric_prefix_argument_test.rb +38 -0
 - data/test/rubocop/metric_return_value_test.rb +78 -0
 - data/test/rubocop/metric_value_keyword_argument_test.rb +39 -0
 - data/test/rubocop/positional_arguments_test.rb +110 -0
 - data/test/rubocop/splat_arguments_test.rb +27 -0
 - data/test/statsd_datagram_builder_test.rb +22 -0
 - data/test/statsd_instrumentation_test.rb +109 -100
 - data/test/statsd_test.rb +113 -79
 - data/test/test_helper.rb +12 -1
 - data/test/udp_backend_test.rb +38 -36
 - data/test/udp_sink_test.rb +85 -0
 - metadata +85 -5
 - data/.travis.yml +0 -12
 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'statsd/instrument/rubocop'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rubocop
         
     | 
| 
      
 7 
     | 
    
         
            +
              class MetricPrefixArgumentTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                include RubocopHelper
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @cop = RuboCop::Cop::StatsD::MetricPrefixArgument.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def test_ok_for_metric_method_without_prefix_argument
         
     | 
| 
      
 15 
     | 
    
         
            +
                  assert_no_offenses("StatsD.measure('foo', 123) {}")
         
     | 
| 
      
 16 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 123, sample_rate: 3, no_prefix: true)")
         
     | 
| 
      
 17 
     | 
    
         
            +
                  assert_no_offenses("StatsD.gauge('foo', 123)")
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def test_ok_for_metaprogramming_method_without_prefix_argument
         
     | 
| 
      
 21 
     | 
    
         
            +
                  assert_no_offenses("statsd_measure(:method, 'metric_name')")
         
     | 
| 
      
 22 
     | 
    
         
            +
                  assert_no_offenses("statsd_count(:method, 'metric_name', sample_rate: 1, no_pefix: true)")
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_no_offenses("statsd_count_if(:method, 'metric_name', sample_rate: 1) {}")
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def test_offense_when_using_as_dist_with_measure_metric_method
         
     | 
| 
      
 27 
     | 
    
         
            +
                  assert_offense("StatsD.measure('foo', 123, sample_rate: 1, prefix: 'pre', tags: ['bar'])")
         
     | 
| 
      
 28 
     | 
    
         
            +
                  assert_offense("StatsD.gauge('foo', 123, prefix: nil)")
         
     | 
| 
      
 29 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', prefix: 'pre', &block)")
         
     | 
| 
      
 30 
     | 
    
         
            +
                  assert_offense("StatsD.set('foo', prefix: 'pre') { } ")
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def test_offense_when_using_as_dist_with_measure_metaprogramming_method
         
     | 
| 
      
 34 
     | 
    
         
            +
                  assert_offense("statsd_measure(:method, 'foo', prefix: 'foo')")
         
     | 
| 
      
 35 
     | 
    
         
            +
                  assert_offense("statsd_count_if(:method, 'foo', prefix: nil) { } ")
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,78 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'statsd/instrument/rubocop'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rubocop
         
     | 
| 
      
 7 
     | 
    
         
            +
              class MetricReturnValueTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                include RubocopHelper
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @cop = RuboCop::Cop::StatsD::MetricReturnValue.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def test_ok_for_non_metric_method
         
     | 
| 
      
 15 
     | 
    
         
            +
                  assert_no_offenses('backend = StatsD.backend')
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def test_ok_as_naked_statement
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo')")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  assert_no_offenses("StatsD.measure('foo') { foo }")
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def test_ok_as_multiple_statement
         
     | 
| 
      
 24 
     | 
    
         
            +
                  assert_no_offenses <<~RUBY
         
     | 
| 
      
 25 
     | 
    
         
            +
                    StatsD.increment 'foo'
         
     | 
| 
      
 26 
     | 
    
         
            +
                    StatsD.increment 'bar'
         
     | 
| 
      
 27 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def test_ok_inside_block
         
     | 
| 
      
 31 
     | 
    
         
            +
                  assert_no_offenses <<~RUBY
         
     | 
| 
      
 32 
     | 
    
         
            +
                    block do
         
     | 
| 
      
 33 
     | 
    
         
            +
                      StatsD.measure
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def test_ok_when_passing_a_block_as_param
         
     | 
| 
      
 39 
     | 
    
         
            +
                  assert_no_offenses("block_result = StatsD.measure('foo', &block)")
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                def test_ok_when_passing_a_curly_braces_block
         
     | 
| 
      
 43 
     | 
    
         
            +
                  assert_no_offenses("block_result = StatsD.measure('foo') { measure_me }")
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def test_ok_when_passing_do_end_block
         
     | 
| 
      
 47 
     | 
    
         
            +
                  assert_no_offenses <<~RUBY
         
     | 
| 
      
 48 
     | 
    
         
            +
                    block_result = StatsD.measure('foo') do
         
     | 
| 
      
 49 
     | 
    
         
            +
                      return_something_useful
         
     | 
| 
      
 50 
     | 
    
         
            +
                    end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                def test_offense_in_assignment
         
     | 
| 
      
 55 
     | 
    
         
            +
                  assert_offense("metric = StatsD.increment('foo')")
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                def test_offense_in_multi_assignment
         
     | 
| 
      
 59 
     | 
    
         
            +
                  assert_offense("foo, metric = bar, StatsD.increment('foo')")
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                def test_offense_in_hash
         
     | 
| 
      
 63 
     | 
    
         
            +
                  assert_offense("{ metric: StatsD.increment('foo') }")
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                def test_offense_in_method_call
         
     | 
| 
      
 67 
     | 
    
         
            +
                  assert_offense("process(StatsD.increment('foo'))")
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                def test_offense_when_returning
         
     | 
| 
      
 71 
     | 
    
         
            +
                  assert_offense("return StatsD.increment('foo')")
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                def test_offense_when_yielding
         
     | 
| 
      
 75 
     | 
    
         
            +
                  assert_offense("yield StatsD.increment('foo')")
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
              end
         
     | 
| 
      
 78 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,39 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'statsd/instrument/rubocop'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rubocop
         
     | 
| 
      
 7 
     | 
    
         
            +
              class MetricValueKeywordArgumentTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                include RubocopHelper
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @cop = RuboCop::Cop::StatsD::MetricValueKeywordArgument.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def test_ok_for_method_without_arguments
         
     | 
| 
      
 15 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment")
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def test_ok_for_non_metric_method
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert_no_offenses("StatsD.backend('foo', value: 1)")
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def test_ok_with_no_keywords
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 1)")
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def test_ok_with_no_matching_keyword
         
     | 
| 
      
 27 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 1, tags: ['foo'])")
         
     | 
| 
      
 28 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 1, tags: { value: 'bar' })")
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def test_offense_with_value_keyword
         
     | 
| 
      
 32 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', value: 1)")
         
     | 
| 
      
 33 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', :value => 1)")
         
     | 
| 
      
 34 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', 'value' => 1)")
         
     | 
| 
      
 35 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', sample_rate: 0.1, value: 1, tags: ['foo'])")
         
     | 
| 
      
 36 
     | 
    
         
            +
                  assert_offense("StatsD.increment('foo', value: 1, &block)")
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,110 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'statsd/instrument/rubocop'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rubocop
         
     | 
| 
      
 7 
     | 
    
         
            +
              class PositionalArgumentsTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                include RubocopHelper
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @cop = RuboCop::Cop::StatsD::PositionalArguments.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def test_no_offenses
         
     | 
| 
      
 15 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment 'foo'")
         
     | 
| 
      
 16 
     | 
    
         
            +
                  assert_no_offenses("StatsD.gauge('foo', 2)")
         
     | 
| 
      
 17 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 2, tags: ['foo:bar'])")
         
     | 
| 
      
 18 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 2, sample_rate: 0.1, tags: { foo: 'bar' })")
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 2) { foo }")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', 2, &block)")
         
     | 
| 
      
 21 
     | 
    
         
            +
                  assert_no_offenses("StatsD.gauge('foo', 2, **kwargs)")
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def test_no_offense_for_now_when_using_value_keyword_argumenr
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment 'foo', value: 3")
         
     | 
| 
      
 26 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment 'foo', value: 3, sample_rate: 0.5")
         
     | 
| 
      
 27 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment('foo', value: 3, tags: ['foo']) { foo }")
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def test_offense_when_using_method_or_constant
         
     | 
| 
      
 31 
     | 
    
         
            +
                  assert_offense("StatsD.gauge('foo', 2, SAMPLE_RATE_CONSTANT)")
         
     | 
| 
      
 32 
     | 
    
         
            +
                  assert_offense("StatsD.gauge('foo', 2, method_ruturning_a_hash)")
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def test_offense_when_using_local_variable
         
     | 
| 
      
 36 
     | 
    
         
            +
                  assert_offense("lambda { |x| StatsD.gauge('foo', 2, x) }")
         
     | 
| 
      
 37 
     | 
    
         
            +
                  assert_offense(<<~RUBY)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    x = foo
         
     | 
| 
      
 39 
     | 
    
         
            +
                    StatsD.gauge('foo', 2, x)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def test_offense_when_using_splat
         
     | 
| 
      
 44 
     | 
    
         
            +
                  assert_offense("StatsD.gauge('foo', 2, *options)")
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def test_no_autocorrect_when_using_method_or_constant
         
     | 
| 
      
 48 
     | 
    
         
            +
                  assert_no_autocorrect("StatsD.gauge('foo', 2, SAMPLE_RATE_CONSTANT)")
         
     | 
| 
      
 49 
     | 
    
         
            +
                  assert_no_autocorrect("StatsD.gauge('foo', 2, method_ruturning_a_hash)")
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                def test_autocorrect_only_sample_rate
         
     | 
| 
      
 53 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, 0.5)")
         
     | 
| 
      
 54 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, sample_rate: 0.5)", corrected
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                def test_autocorrect_only_sample_rate_as_int
         
     | 
| 
      
 58 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, 1)")
         
     | 
| 
      
 59 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, sample_rate: 1)", corrected
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                def test_autocorrect_only_tags
         
     | 
| 
      
 63 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, nil, ['foo', 'bar'])")
         
     | 
| 
      
 64 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, tags: ['foo', 'bar'])", corrected
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_tags_as_array
         
     | 
| 
      
 68 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, 0.5, ['foo', 'bar'])")
         
     | 
| 
      
 69 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, sample_rate: 0.5, tags: ['foo', 'bar'])", corrected
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_tags_as_hash_with_curly_braces
         
     | 
| 
      
 73 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, 0.5, { foo: 'bar' })")
         
     | 
| 
      
 74 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, sample_rate: 0.5, tags: { foo: 'bar' })", corrected
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_tags_as_hash_without_curly_braces
         
     | 
| 
      
 78 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.increment('foo', 2, 0.5, foo: 'bar')")
         
     | 
| 
      
 79 
     | 
    
         
            +
                  assert_equal "StatsD.increment('foo', 2, sample_rate: 0.5, tags: { foo: 'bar' })", corrected
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_block_pass
         
     | 
| 
      
 83 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.distribution('foo', 2, 0.5, &block)")
         
     | 
| 
      
 84 
     | 
    
         
            +
                  assert_equal "StatsD.distribution('foo', 2, sample_rate: 0.5, &block)", corrected
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                def test_autocorrect_sample_rate_tags_and_block_pass
         
     | 
| 
      
 88 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.measure('foo', 2, nil, foo: 'bar', &block)")
         
     | 
| 
      
 89 
     | 
    
         
            +
                  assert_equal "StatsD.measure('foo', 2, tags: { foo: 'bar' }, &block)", corrected
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_curly_braces_block
         
     | 
| 
      
 93 
     | 
    
         
            +
                  corrected = autocorrect_source("StatsD.measure('foo', 2, 0.5) { foo }")
         
     | 
| 
      
 94 
     | 
    
         
            +
                  assert_equal "StatsD.measure('foo', 2, sample_rate: 0.5) { foo }", corrected
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                def test_autocorrect_sample_rate_and_do_end_block
         
     | 
| 
      
 98 
     | 
    
         
            +
                  corrected = autocorrect_source(<<~RUBY)
         
     | 
| 
      
 99 
     | 
    
         
            +
                    StatsD.distribution 'foo', 124, 0.6, ['bar'] do
         
     | 
| 
      
 100 
     | 
    
         
            +
                      foo
         
     | 
| 
      
 101 
     | 
    
         
            +
                    end
         
     | 
| 
      
 102 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 103 
     | 
    
         
            +
                  assert_equal <<~RUBY, corrected
         
     | 
| 
      
 104 
     | 
    
         
            +
                    StatsD.distribution 'foo', 124, sample_rate: 0.6, tags: ['bar'] do
         
     | 
| 
      
 105 
     | 
    
         
            +
                      foo
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                  RUBY
         
     | 
| 
      
 108 
     | 
    
         
            +
                end
         
     | 
| 
      
 109 
     | 
    
         
            +
              end
         
     | 
| 
      
 110 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'statsd/instrument/rubocop'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rubocop
         
     | 
| 
      
 7 
     | 
    
         
            +
              class SplatArgumentsTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                include RubocopHelper
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @cop = RuboCop::Cop::StatsD::SplatArguments.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def test_no_offenses
         
     | 
| 
      
 15 
     | 
    
         
            +
                  assert_no_offenses("StatsD.increment 'foo'")
         
     | 
| 
      
 16 
     | 
    
         
            +
                  assert_no_offenses("StatsD.gauge('foo', 2, tags: 'foo')")
         
     | 
| 
      
 17 
     | 
    
         
            +
                  assert_no_offenses("StatsD.measure('foo', 2, **kwargs)")
         
     | 
| 
      
 18 
     | 
    
         
            +
                  assert_no_offenses("StatsD.measure('foo', 2, **kwargs) { }")
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def test_offenses
         
     | 
| 
      
 22 
     | 
    
         
            +
                  assert_offense("StatsD.increment(*increment_arguments)")
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_offense("StatsD.gauge('foo', 2, *options)")
         
     | 
| 
      
 24 
     | 
    
         
            +
                  assert_offense("StatsD.measure('foo', 2, *options, &block)")
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'statsd/instrument/client'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class StatsDDatagramBuilderTest < Minitest::Test
         
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                @datagram_builder = StatsD::Instrument::StatsDDatagramBuilder.new
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def test_raises_on_unsupported_metrics
         
     | 
| 
      
 13 
     | 
    
         
            +
                assert_raises(NotImplementedError) { @datagram_builder.h('fo:o', 10, nil, nil) }
         
     | 
| 
      
 14 
     | 
    
         
            +
                assert_raises(NotImplementedError) { @datagram_builder.d('fo:o', 10, nil, nil) }
         
     | 
| 
      
 15 
     | 
    
         
            +
                assert_raises(NotImplementedError) { @datagram_builder.kv('fo:o', 10, nil, nil) }
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def test_raises_when_using_tags
         
     | 
| 
      
 19 
     | 
    
         
            +
                assert_raises(NotImplementedError) { @datagram_builder.c('fo:o', 10, nil, foo: 'bar') }
         
     | 
| 
      
 20 
     | 
    
         
            +
                assert_raises(NotImplementedError) { StatsD::Instrument::StatsDDatagramBuilder.new(default_tags: ['foo']) }
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,73 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require 'test_helper'
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                  'OK'
         
     | 
| 
       8 
     | 
    
         
            -
                else
         
     | 
| 
       9 
     | 
    
         
            -
                  raise 'Not OK'
         
     | 
| 
       10 
     | 
    
         
            -
                end
         
     | 
| 
       11 
     | 
    
         
            -
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
            class StatsDInstrumentationTest < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              module ActiveMerchant
         
     | 
| 
      
 7 
     | 
    
         
            +
                class Base
         
     | 
| 
      
 8 
     | 
    
         
            +
                  extend StatsD::Instrument
         
     | 
| 
       12 
9 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
                  def ssl_post(arg)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    if arg
         
     | 
| 
      
 12 
     | 
    
         
            +
                      'OK'
         
     | 
| 
      
 13 
     | 
    
         
            +
                    else
         
     | 
| 
      
 14 
     | 
    
         
            +
                      raise 'Not OK'
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
       22 
     | 
    
         
            -
              rescue
         
     | 
| 
       23 
     | 
    
         
            -
                false
         
     | 
| 
       24 
     | 
    
         
            -
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  def post_with_block(&block)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    block.call if block_given?
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
       25 
22 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                class Gateway < Base
         
     | 
| 
      
 24 
     | 
    
         
            +
                  def purchase(arg)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    ssl_post(arg)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    true
         
     | 
| 
      
 27 
     | 
    
         
            +
                  rescue
         
     | 
| 
      
 28 
     | 
    
         
            +
                    false
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
       29 
30 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
            end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  def self.sync
         
     | 
| 
      
 32 
     | 
    
         
            +
                    true
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            class  
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
                class UniqueGateway < Base
         
     | 
| 
      
 37 
     | 
    
         
            +
                  def ssl_post(arg)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    { success: arg }
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
       39 
40 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
                  def purchase(arg)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    ssl_post(arg)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
       42 
45 
     | 
    
         
             
              end
         
     | 
| 
       43 
     | 
    
         
            -
            end
         
     | 
| 
       44 
46 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
            class GatewaySubClass < ActiveMerchant::Gateway
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
              class GatewaySubClass < ActiveMerchant::Gateway
         
     | 
| 
      
 48 
     | 
    
         
            +
                def metric_name
         
     | 
| 
      
 49 
     | 
    
         
            +
                  'subgateway'
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
       47 
52 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
            class InstrumentedClass
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
              class InstrumentedClass
         
     | 
| 
      
 54 
     | 
    
         
            +
                extend StatsD::Instrument
         
     | 
| 
       50 
55 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
                def public_and_instrumented
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
                statsd_count :public_and_instrumented, 'InstrumentedClass.public_and_instrumented'
         
     | 
| 
       54 
59 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
      
 60 
     | 
    
         
            +
                protected
         
     | 
| 
       56 
61 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
      
 62 
     | 
    
         
            +
                def protected_and_instrumented
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
                statsd_count :protected_and_instrumented, 'InstrumentedClass.protected_and_instrumented'
         
     | 
| 
       60 
65 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 66 
     | 
    
         
            +
                private
         
     | 
| 
       62 
67 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 68 
     | 
    
         
            +
                def private_and_instrumented
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
                statsd_count :private_and_instrumented, 'InstrumentedClass.private_and_instrumented'
         
     | 
| 
       64 
71 
     | 
    
         
             
              end
         
     | 
| 
       65 
     | 
    
         
            -
              statsd_count :private_and_instrumented, 'InstrumentedClass.private_and_instrumented'
         
     | 
| 
       66 
     | 
    
         
            -
            end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
            ActiveMerchant::Base.extend StatsD::Instrument
         
     | 
| 
       69 
72 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
            class StatsDInstrumentationTest < Minitest::Test
         
     | 
| 
       71 
73 
     | 
    
         
             
              include StatsD::Instrument::Assertions
         
     | 
| 
       72 
74 
     | 
    
         | 
| 
       73 
75 
     | 
    
         
             
              def test_statsd_count_if
         
     | 
| 
         @@ -87,7 +89,7 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       87 
89 
     | 
    
         
             
                end
         
     | 
| 
       88 
90 
     | 
    
         | 
| 
       89 
91 
     | 
    
         
             
                assert_statsd_increment('ActiveMerchant.Base.post_with_block') do
         
     | 
| 
       90 
     | 
    
         
            -
                  assert_equal 'true', 
     | 
| 
      
 92 
     | 
    
         
            +
                  assert_equal 'true', ActiveMerchant::Base.new.post_with_block { 'true' }
         
     | 
| 
       91 
93 
     | 
    
         
             
                  assert_equal 'false', ActiveMerchant::Base.new.post_with_block { 'false' }
         
     | 
| 
       92 
94 
     | 
    
         
             
                end
         
     | 
| 
       93 
95 
     | 
    
         
             
              ensure
         
     | 
| 
         @@ -108,7 +110,7 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       108 
110 
     | 
    
         
             
              end
         
     | 
| 
       109 
111 
     | 
    
         | 
| 
       110 
112 
     | 
    
         
             
              def test_statsd_count_success
         
     | 
| 
       111 
     | 
    
         
            -
                ActiveMerchant::Gateway.statsd_count_success :ssl_post, 'ActiveMerchant.Gateway', 0.5
         
     | 
| 
      
 113 
     | 
    
         
            +
                ActiveMerchant::Gateway.statsd_count_success :ssl_post, 'ActiveMerchant.Gateway', sample_rate: 0.5
         
     | 
| 
       112 
114 
     | 
    
         | 
| 
       113 
115 
     | 
    
         
             
                assert_statsd_increment('ActiveMerchant.Gateway.success', sample_rate: 0.5, times: 1) do
         
     | 
| 
       114 
116 
     | 
    
         
             
                  ActiveMerchant::Gateway.new.purchase(true)
         
     | 
| 
         @@ -168,11 +170,22 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       168 
170 
     | 
    
         
             
              end
         
     | 
| 
       169 
171 
     | 
    
         | 
| 
       170 
172 
     | 
    
         
             
              def test_statsd_count_with_name_as_lambda
         
     | 
| 
       171 
     | 
    
         
            -
                metric_namer = lambda { |object, args| object. 
     | 
| 
      
 173 
     | 
    
         
            +
                metric_namer = lambda { |object, args| "#{object.metric_name}.#{args.first}" }
         
     | 
| 
       172 
174 
     | 
    
         
             
                ActiveMerchant::Gateway.statsd_count(:ssl_post, metric_namer)
         
     | 
| 
       173 
175 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
                assert_statsd_increment(' 
     | 
| 
       175 
     | 
    
         
            -
                  GatewaySubClass.new.purchase( 
     | 
| 
      
 176 
     | 
    
         
            +
                assert_statsd_increment('subgateway.foo') do
         
     | 
| 
      
 177 
     | 
    
         
            +
                  GatewaySubClass.new.purchase('foo')
         
     | 
| 
      
 178 
     | 
    
         
            +
                end
         
     | 
| 
      
 179 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 180 
     | 
    
         
            +
                ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
         
     | 
| 
      
 181 
     | 
    
         
            +
              end
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
              def test_statsd_count_with_name_as_proc
         
     | 
| 
      
 184 
     | 
    
         
            +
                metric_namer = proc { |object, args| "#{object.metric_name}.#{args.first}" }
         
     | 
| 
      
 185 
     | 
    
         
            +
                ActiveMerchant::Gateway.statsd_count(:ssl_post, metric_namer)
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
                assert_statsd_increment('subgateway.foo') do
         
     | 
| 
      
 188 
     | 
    
         
            +
                  GatewaySubClass.new.purchase('foo')
         
     | 
| 
       176 
189 
     | 
    
         
             
                end
         
     | 
| 
       177 
190 
     | 
    
         
             
              ensure
         
     | 
| 
       178 
191 
     | 
    
         
             
                ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
         
     | 
| 
         @@ -225,47 +238,16 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       225 
238 
     | 
    
         
             
                ActiveMerchant::Base.statsd_remove_measure :post_with_block, 'ActiveMerchant.Base.post_with_block'
         
     | 
| 
       226 
239 
     | 
    
         
             
              end
         
     | 
| 
       227 
240 
     | 
    
         | 
| 
       228 
     | 
    
         
            -
              def  
     | 
| 
       229 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post', 1
         
     | 
| 
       230 
     | 
    
         
            -
             
     | 
| 
       231 
     | 
    
         
            -
                assert_statsd_measure('ActiveMerchant.Gateway.ssl_post') do
         
     | 
| 
       232 
     | 
    
         
            -
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       233 
     | 
    
         
            -
                end
         
     | 
| 
       234 
     | 
    
         
            -
              ensure
         
     | 
| 
       235 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
         
     | 
| 
       236 
     | 
    
         
            -
              end
         
     | 
| 
       237 
     | 
    
         
            -
             
     | 
| 
       238 
     | 
    
         
            -
              def test_statsd_measure_with_value_and_options
         
     | 
| 
       239 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post', 1, sample_rate: 0.45
         
     | 
| 
      
 241 
     | 
    
         
            +
              def test_statsd_measure_with_sample_rate
         
     | 
| 
      
 242 
     | 
    
         
            +
                ActiveMerchant::UniqueGateway.statsd_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post', sample_rate: 0.1
         
     | 
| 
       240 
243 
     | 
    
         | 
| 
       241 
     | 
    
         
            -
                assert_statsd_measure('ActiveMerchant.Gateway.ssl_post', sample_rate: 0. 
     | 
| 
      
 244 
     | 
    
         
            +
                assert_statsd_measure('ActiveMerchant.Gateway.ssl_post', sample_rate: 0.1) do
         
     | 
| 
       242 
245 
     | 
    
         
             
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       243 
246 
     | 
    
         
             
                end
         
     | 
| 
       244 
247 
     | 
    
         
             
              ensure
         
     | 
| 
       245 
248 
     | 
    
         
             
                ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
         
     | 
| 
       246 
249 
     | 
    
         
             
              end
         
     | 
| 
       247 
250 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
              def test_statsd_measure_with_value_and_distribution
         
     | 
| 
       249 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post', 1, as_dist: true
         
     | 
| 
       250 
     | 
    
         
            -
             
     | 
| 
       251 
     | 
    
         
            -
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post') do
         
     | 
| 
       252 
     | 
    
         
            -
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       253 
     | 
    
         
            -
                end
         
     | 
| 
       254 
     | 
    
         
            -
              ensure
         
     | 
| 
       255 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
         
     | 
| 
       256 
     | 
    
         
            -
              end
         
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
              def test_statsd_measure_without_value_as_distribution
         
     | 
| 
       259 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post', as_dist: true
         
     | 
| 
       260 
     | 
    
         
            -
             
     | 
| 
       261 
     | 
    
         
            -
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post') do
         
     | 
| 
       262 
     | 
    
         
            -
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       263 
     | 
    
         
            -
                end
         
     | 
| 
       264 
     | 
    
         
            -
              ensure
         
     | 
| 
       265 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_remove_measure :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
         
     | 
| 
       266 
     | 
    
         
            -
              end
         
     | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
       268 
     | 
    
         
            -
             
     | 
| 
       269 
251 
     | 
    
         
             
              def test_statsd_distribution
         
     | 
| 
       270 
252 
     | 
    
         
             
                ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', sample_rate: 0.3
         
     | 
| 
       271 
253 
     | 
    
         | 
| 
         @@ -303,20 +285,20 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       303 
285 
     | 
    
         
             
                ActiveMerchant::Base.statsd_remove_distribution :post_with_block, 'ActiveMerchant.Base.post_with_block'
         
     | 
| 
       304 
286 
     | 
    
         
             
              end
         
     | 
| 
       305 
287 
     | 
    
         | 
| 
       306 
     | 
    
         
            -
              def  
     | 
| 
       307 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post',  
     | 
| 
      
 288 
     | 
    
         
            +
              def test_statsd_distribution_with_tags
         
     | 
| 
      
 289 
     | 
    
         
            +
                ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', tags: ['foo']
         
     | 
| 
       308 
290 
     | 
    
         | 
| 
       309 
     | 
    
         
            -
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post') do
         
     | 
| 
      
 291 
     | 
    
         
            +
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post', tags: ['foo']) do
         
     | 
| 
       310 
292 
     | 
    
         
             
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       311 
293 
     | 
    
         
             
                end
         
     | 
| 
       312 
294 
     | 
    
         
             
              ensure
         
     | 
| 
       313 
295 
     | 
    
         
             
                ActiveMerchant::UniqueGateway.statsd_remove_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post'
         
     | 
| 
       314 
296 
     | 
    
         
             
              end
         
     | 
| 
       315 
297 
     | 
    
         | 
| 
       316 
     | 
    
         
            -
              def  
     | 
| 
       317 
     | 
    
         
            -
                ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post',  
     | 
| 
      
 298 
     | 
    
         
            +
              def test_statsd_distribution_with_sample_rate
         
     | 
| 
      
 299 
     | 
    
         
            +
                ActiveMerchant::UniqueGateway.statsd_distribution :ssl_post, 'ActiveMerchant.Gateway.ssl_post', sample_rate: 0.1
         
     | 
| 
       318 
300 
     | 
    
         | 
| 
       319 
     | 
    
         
            -
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post', sample_rate: 0. 
     | 
| 
      
 301 
     | 
    
         
            +
                assert_statsd_distribution('ActiveMerchant.Gateway.ssl_post', sample_rate: 0.1) do
         
     | 
| 
       320 
302 
     | 
    
         
             
                  ActiveMerchant::UniqueGateway.new.purchase(true)
         
     | 
| 
       321 
303 
     | 
    
         
             
                end
         
     | 
| 
       322 
304 
     | 
    
         
             
              ensure
         
     | 
| 
         @@ -345,6 +327,34 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       345 
327 
     | 
    
         
             
                ActiveMerchant::Gateway.singleton_class.statsd_remove_count :sync, 'ActiveMerchant.Gateway.sync'
         
     | 
| 
       346 
328 
     | 
    
         
             
              end
         
     | 
| 
       347 
329 
     | 
    
         | 
| 
      
 330 
     | 
    
         
            +
              def test_statsd_respects_global_prefix_changes
         
     | 
| 
      
 331 
     | 
    
         
            +
                StatsD.prefix = 'Foo'
         
     | 
| 
      
 332 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.extend StatsD::Instrument
         
     | 
| 
      
 333 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.statsd_count :sync, 'ActiveMerchant.Gateway.sync'
         
     | 
| 
      
 334 
     | 
    
         
            +
                StatsD.prefix = 'Quc'
         
     | 
| 
      
 335 
     | 
    
         
            +
             
     | 
| 
      
 336 
     | 
    
         
            +
                statsd_calls = capture_statsd_calls { ActiveMerchant::Gateway.sync }
         
     | 
| 
      
 337 
     | 
    
         
            +
                assert_equal 1, statsd_calls.length
         
     | 
| 
      
 338 
     | 
    
         
            +
                assert_equal "Quc.ActiveMerchant.Gateway.sync", statsd_calls.first.name
         
     | 
| 
      
 339 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 340 
     | 
    
         
            +
                StatsD.prefix = nil
         
     | 
| 
      
 341 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.statsd_remove_count :sync, 'ActiveMerchant.Gateway.sync'
         
     | 
| 
      
 342 
     | 
    
         
            +
              end
         
     | 
| 
      
 343 
     | 
    
         
            +
             
     | 
| 
      
 344 
     | 
    
         
            +
              def test_statsd_macro_can_disable_prefix
         
     | 
| 
      
 345 
     | 
    
         
            +
                StatsD.prefix = 'Foo'
         
     | 
| 
      
 346 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.extend StatsD::Instrument
         
     | 
| 
      
 347 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.statsd_count_success :sync, 'ActiveMerchant.Gateway.sync', no_prefix: true
         
     | 
| 
      
 348 
     | 
    
         
            +
                StatsD.prefix = 'Quc'
         
     | 
| 
      
 349 
     | 
    
         
            +
             
     | 
| 
      
 350 
     | 
    
         
            +
                statsd_calls = capture_statsd_calls { ActiveMerchant::Gateway.sync }
         
     | 
| 
      
 351 
     | 
    
         
            +
                assert_equal 1, statsd_calls.length
         
     | 
| 
      
 352 
     | 
    
         
            +
                assert_equal "ActiveMerchant.Gateway.sync.success", statsd_calls.first.name
         
     | 
| 
      
 353 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 354 
     | 
    
         
            +
                StatsD.prefix = nil
         
     | 
| 
      
 355 
     | 
    
         
            +
                ActiveMerchant::Gateway.singleton_class.statsd_remove_count_success :sync, 'ActiveMerchant.Gateway.sync'
         
     | 
| 
      
 356 
     | 
    
         
            +
              end
         
     | 
| 
      
 357 
     | 
    
         
            +
             
     | 
| 
       348 
358 
     | 
    
         
             
              def test_statsd_doesnt_change_method_scope_of_public_method
         
     | 
| 
       349 
359 
     | 
    
         
             
                assert_scope InstrumentedClass, :public_and_instrumented, :public
         
     | 
| 
       350 
360 
     | 
    
         | 
| 
         @@ -412,10 +422,9 @@ class StatsDInstrumentationTest < Minitest::Test 
     | 
|
| 
       412 
422 
     | 
    
         
             
              private
         
     | 
| 
       413 
423 
     | 
    
         | 
| 
       414 
424 
     | 
    
         
             
              def assert_scope(klass, method, expected_scope)
         
     | 
| 
       415 
     | 
    
         
            -
                method_scope =  
     | 
| 
       416 
     | 
    
         
            -
                when klass.private_method_defined?(method)
         
     | 
| 
      
 425 
     | 
    
         
            +
                method_scope = if klass.private_method_defined?(method)
         
     | 
| 
       417 
426 
     | 
    
         
             
                  :private
         
     | 
| 
       418 
     | 
    
         
            -
                 
     | 
| 
      
 427 
     | 
    
         
            +
                elsif klass.protected_method_defined?(method)
         
     | 
| 
       419 
428 
     | 
    
         
             
                  :protected
         
     | 
| 
       420 
429 
     | 
    
         
             
                else
         
     | 
| 
       421 
430 
     | 
    
         
             
                  :public
         
     |