statsd-instrument 3.0.1 → 3.1.2
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/workflows/lint.yml +22 -0
- data/.github/workflows/{ci.yml → tests.yml} +3 -21
- data/.rubocop.yml +2 -1
- data/CHANGELOG.md +18 -0
- data/Gemfile +8 -10
- data/README.md +7 -4
- data/Rakefile +6 -6
- data/benchmark/send-metrics-to-dev-null-log +14 -14
- data/benchmark/send-metrics-to-local-udp-receiver +18 -18
- data/lib/statsd/instrument/assertions.rb +7 -7
- data/lib/statsd/instrument/batched_udp_sink.rb +159 -0
- data/lib/statsd/instrument/client.rb +3 -3
- data/lib/statsd/instrument/datagram.rb +1 -1
- data/lib/statsd/instrument/datagram_builder.rb +10 -22
- data/lib/statsd/instrument/dogstatsd_datagram_builder.rb +2 -2
- data/lib/statsd/instrument/environment.rb +19 -11
- data/lib/statsd/instrument/expectation.rb +6 -18
- data/lib/statsd/instrument/matchers.rb +8 -4
- data/lib/statsd/instrument/railtie.rb +1 -1
- data/lib/statsd/instrument/rubocop/measure_as_dist_argument.rb +1 -1
- data/lib/statsd/instrument/rubocop/metaprogramming_positional_arguments.rb +2 -2
- data/lib/statsd/instrument/rubocop/metric_prefix_argument.rb +1 -1
- data/lib/statsd/instrument/rubocop/metric_return_value.rb +3 -3
- data/lib/statsd/instrument/rubocop/metric_value_keyword_argument.rb +1 -1
- data/lib/statsd/instrument/rubocop/positional_arguments.rb +4 -4
- data/lib/statsd/instrument/rubocop/singleton_configuration.rb +1 -1
- data/lib/statsd/instrument/rubocop/splat_arguments.rb +2 -2
- data/lib/statsd/instrument/rubocop.rb +13 -34
- data/lib/statsd/instrument/strict.rb +1 -1
- data/lib/statsd/instrument/udp_sink.rb +11 -13
- data/lib/statsd/instrument/version.rb +1 -1
- data/lib/statsd/instrument.rb +56 -59
- data/lib/statsd-instrument.rb +1 -1
- data/statsd-instrument.gemspec +2 -0
- data/test/assertions_test.rb +200 -155
- data/test/benchmark/clock_gettime.rb +1 -1
- data/test/benchmark/metrics.rb +8 -8
- data/test/benchmark/tags.rb +4 -4
- data/test/capture_sink_test.rb +11 -11
- data/test/client_test.rb +64 -64
- data/test/datagram_builder_test.rb +41 -41
- data/test/datagram_test.rb +5 -5
- data/test/dogstatsd_datagram_builder_test.rb +22 -22
- data/test/environment_test.rb +26 -17
- data/test/helpers/rubocop_helper.rb +3 -3
- data/test/helpers_test.rb +12 -12
- data/test/integration_test.rb +6 -6
- data/test/log_sink_test.rb +2 -2
- data/test/matchers_test.rb +46 -46
- data/test/null_sink_test.rb +2 -2
- data/test/rubocop/measure_as_dist_argument_test.rb +2 -2
- data/test/rubocop/metaprogramming_positional_arguments_test.rb +2 -2
- data/test/rubocop/metric_prefix_argument_test.rb +2 -2
- data/test/rubocop/metric_return_value_test.rb +3 -3
- data/test/rubocop/metric_value_keyword_argument_test.rb +3 -3
- data/test/rubocop/positional_arguments_test.rb +2 -2
- data/test/rubocop/singleton_configuration_test.rb +8 -8
- data/test/rubocop/splat_arguments_test.rb +2 -2
- data/test/statsd_datagram_builder_test.rb +6 -6
- data/test/statsd_instrumentation_test.rb +104 -104
- data/test/statsd_test.rb +35 -35
- data/test/test_helper.rb +13 -6
- data/test/udp_sink_test.rb +142 -44
- metadata +21 -7
- data/test/benchmark/default_tags.rb +0 -47
    
        data/test/statsd_test.rb
    CHANGED
    
    | @@ -1,33 +1,33 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 3 | 
            +
            require "test_helper"
         | 
| 4 4 |  | 
| 5 5 | 
             
            class StatsDTest < Minitest::Test
         | 
| 6 6 | 
             
              include StatsD::Instrument::Assertions
         | 
| 7 7 |  | 
| 8 8 | 
             
              def test_statsd_measure_with_explicit_value
         | 
| 9 | 
            -
                metric = capture_statsd_call { StatsD.measure( | 
| 10 | 
            -
                assert_equal( | 
| 9 | 
            +
                metric = capture_statsd_call { StatsD.measure("values.foobar", 42) }
         | 
| 10 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 11 11 | 
             
                assert_equal(42, metric.value)
         | 
| 12 12 | 
             
                assert_equal(:ms, metric.type)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 15 | 
             
              def test_statsd_measure_with_explicit_value_and_sample_rate
         | 
| 16 | 
            -
                metric = capture_statsd_call { StatsD.measure( | 
| 16 | 
            +
                metric = capture_statsd_call { StatsD.measure("values.foobar", 42, sample_rate: 0.1) }
         | 
| 17 17 | 
             
                assert_equal(0.1, metric.sample_rate)
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 20 | 
             
              def test_statsd_measure_with_benchmarked_block_duration
         | 
| 21 21 | 
             
                Process.stubs(:clock_gettime).returns(5.0, 5.0 + 1.12)
         | 
| 22 22 | 
             
                metric = capture_statsd_call do
         | 
| 23 | 
            -
                  StatsD.measure( | 
| 23 | 
            +
                  StatsD.measure("values.foobar") { "foo" }
         | 
| 24 24 | 
             
                end
         | 
| 25 25 | 
             
                assert_equal(1120.0, metric.value)
         | 
| 26 26 | 
             
              end
         | 
| 27 27 |  | 
| 28 28 | 
             
              def test_statsd_measure_returns_return_value_of_block
         | 
| 29 | 
            -
                return_value = StatsD.measure( | 
| 30 | 
            -
                assert_equal( | 
| 29 | 
            +
                return_value = StatsD.measure("values.foobar") { "sarah" }
         | 
| 30 | 
            +
                assert_equal("sarah", return_value)
         | 
| 31 31 | 
             
              end
         | 
| 32 32 |  | 
| 33 33 | 
             
              def test_statsd_measure_with_return_in_block_still_captures
         | 
| @@ -35,13 +35,13 @@ class StatsDTest < Minitest::Test | |
| 35 35 | 
             
                result = nil
         | 
| 36 36 | 
             
                metric = capture_statsd_call do
         | 
| 37 37 | 
             
                  lambda = -> do
         | 
| 38 | 
            -
                    StatsD.measure( | 
| 38 | 
            +
                    StatsD.measure("values.foobar") { return "from lambda" }
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 |  | 
| 41 41 | 
             
                  result = lambda.call
         | 
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 | 
            -
                assert_equal( | 
| 44 | 
            +
                assert_equal("from lambda", result)
         | 
| 45 45 | 
             
                assert_equal(1120.0, metric.value)
         | 
| 46 46 | 
             
              end
         | 
| 47 47 |  | 
| @@ -50,7 +50,7 @@ class StatsDTest < Minitest::Test | |
| 50 50 | 
             
                result = nil
         | 
| 51 51 | 
             
                metric = capture_statsd_call do
         | 
| 52 52 | 
             
                  lambda = -> do
         | 
| 53 | 
            -
                    StatsD.measure( | 
| 53 | 
            +
                    StatsD.measure("values.foobar") { raise "from lambda" }
         | 
| 54 54 | 
             
                  end
         | 
| 55 55 |  | 
| 56 56 | 
             
                  begin
         | 
| @@ -65,56 +65,56 @@ class StatsDTest < Minitest::Test | |
| 65 65 | 
             
              end
         | 
| 66 66 |  | 
| 67 67 | 
             
              def test_statsd_increment
         | 
| 68 | 
            -
                metric = capture_statsd_call { StatsD.increment( | 
| 68 | 
            +
                metric = capture_statsd_call { StatsD.increment("values.foobar", 3) }
         | 
| 69 69 | 
             
                assert_equal(:c, metric.type)
         | 
| 70 | 
            -
                assert_equal( | 
| 70 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 71 71 | 
             
                assert_equal(3, metric.value)
         | 
| 72 72 | 
             
              end
         | 
| 73 73 |  | 
| 74 74 | 
             
              def test_statsd_increment_with_hash_argument
         | 
| 75 | 
            -
                metric = capture_statsd_call { StatsD.increment( | 
| 75 | 
            +
                metric = capture_statsd_call { StatsD.increment("values.foobar", tags: ["test"]) }
         | 
| 76 76 | 
             
                assert_equal(StatsD.singleton_client.default_sample_rate, metric.sample_rate)
         | 
| 77 | 
            -
                assert_equal([ | 
| 77 | 
            +
                assert_equal(["test"], metric.tags)
         | 
| 78 78 | 
             
                assert_equal(1, metric.value)
         | 
| 79 79 | 
             
              end
         | 
| 80 80 |  | 
| 81 81 | 
             
              def test_statsd_gauge
         | 
| 82 | 
            -
                metric = capture_statsd_call { StatsD.gauge( | 
| 82 | 
            +
                metric = capture_statsd_call { StatsD.gauge("values.foobar", 12) }
         | 
| 83 83 | 
             
                assert_equal(:g, metric.type)
         | 
| 84 | 
            -
                assert_equal( | 
| 84 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 85 85 | 
             
                assert_equal(12, metric.value)
         | 
| 86 86 | 
             
              end
         | 
| 87 87 |  | 
| 88 88 | 
             
              def test_statsd_gauge_without_value
         | 
| 89 | 
            -
                assert_raises(ArgumentError) { StatsD.gauge( | 
| 89 | 
            +
                assert_raises(ArgumentError) { StatsD.gauge("values.foobar") }
         | 
| 90 90 | 
             
              end
         | 
| 91 91 |  | 
| 92 92 | 
             
              def test_statsd_set
         | 
| 93 | 
            -
                metric = capture_statsd_call { StatsD.set( | 
| 93 | 
            +
                metric = capture_statsd_call { StatsD.set("values.foobar", "unique_identifier") }
         | 
| 94 94 | 
             
                assert_equal(:s, metric.type)
         | 
| 95 | 
            -
                assert_equal( | 
| 96 | 
            -
                assert_equal( | 
| 95 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 96 | 
            +
                assert_equal("unique_identifier", metric.value)
         | 
| 97 97 | 
             
              end
         | 
| 98 98 |  | 
| 99 99 | 
             
              def test_statsd_histogram
         | 
| 100 | 
            -
                metric = capture_statsd_call { StatsD.histogram( | 
| 100 | 
            +
                metric = capture_statsd_call { StatsD.histogram("values.foobar", 42) }
         | 
| 101 101 | 
             
                assert_equal(:h, metric.type)
         | 
| 102 | 
            -
                assert_equal( | 
| 102 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 103 103 | 
             
                assert_equal(42, metric.value)
         | 
| 104 104 | 
             
              end
         | 
| 105 105 |  | 
| 106 106 | 
             
              def test_statsd_distribution
         | 
| 107 | 
            -
                metric = capture_statsd_call { StatsD.distribution( | 
| 107 | 
            +
                metric = capture_statsd_call { StatsD.distribution("values.foobar", 42) }
         | 
| 108 108 | 
             
                assert_equal(:d, metric.type)
         | 
| 109 | 
            -
                assert_equal( | 
| 109 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 110 110 | 
             
                assert_equal(42, metric.value)
         | 
| 111 111 | 
             
              end
         | 
| 112 112 |  | 
| 113 113 | 
             
              def test_statsd_distribution_with_benchmarked_block_duration
         | 
| 114 114 | 
             
                Process.stubs(:clock_gettime).returns(5.0, 5.0 + 1.12)
         | 
| 115 115 | 
             
                metric = capture_statsd_call do
         | 
| 116 | 
            -
                  result = StatsD.distribution( | 
| 117 | 
            -
                  assert_equal | 
| 116 | 
            +
                  result = StatsD.distribution("values.foobar") { "foo" }
         | 
| 117 | 
            +
                  assert_equal("foo", result)
         | 
| 118 118 | 
             
                end
         | 
| 119 119 | 
             
                assert_equal(:d, metric.type)
         | 
| 120 120 | 
             
                assert_equal(1120.0, metric.value)
         | 
| @@ -125,14 +125,14 @@ class StatsDTest < Minitest::Test | |
| 125 125 | 
             
                result = nil
         | 
| 126 126 | 
             
                metric = capture_statsd_call do
         | 
| 127 127 | 
             
                  lambda = -> do
         | 
| 128 | 
            -
                    StatsD.distribution( | 
| 128 | 
            +
                    StatsD.distribution("values.foobar") { return "from lambda" }
         | 
| 129 129 | 
             
                    flunk("This code should not be reached")
         | 
| 130 130 | 
             
                  end
         | 
| 131 131 |  | 
| 132 132 | 
             
                  result = lambda.call
         | 
| 133 133 | 
             
                end
         | 
| 134 134 |  | 
| 135 | 
            -
                assert_equal( | 
| 135 | 
            +
                assert_equal("from lambda", result)
         | 
| 136 136 | 
             
                assert_equal(:d, metric.type)
         | 
| 137 137 | 
             
                assert_equal(1120.0, metric.value)
         | 
| 138 138 | 
             
              end
         | 
| @@ -142,7 +142,7 @@ class StatsDTest < Minitest::Test | |
| 142 142 | 
             
                result = nil
         | 
| 143 143 | 
             
                metric = capture_statsd_call do
         | 
| 144 144 | 
             
                  lambda = -> do
         | 
| 145 | 
            -
                    StatsD.distribution( | 
| 145 | 
            +
                    StatsD.distribution("values.foobar") { raise "from lambda" }
         | 
| 146 146 | 
             
                  end
         | 
| 147 147 |  | 
| 148 148 | 
             
                  begin
         | 
| @@ -160,21 +160,21 @@ class StatsDTest < Minitest::Test | |
| 160 160 | 
             
              def test_statsd_distribution_with_block_and_options
         | 
| 161 161 | 
             
                Process.stubs(:clock_gettime).returns(5.0, 5.0 + 1.12)
         | 
| 162 162 | 
             
                metric = capture_statsd_call do
         | 
| 163 | 
            -
                  StatsD.distribution( | 
| 163 | 
            +
                  StatsD.distribution("values.foobar", tags: ["test"], sample_rate: 0.9) { "foo" }
         | 
| 164 164 | 
             
                end
         | 
| 165 165 | 
             
                assert_equal(1120.0, metric.value)
         | 
| 166 | 
            -
                assert_equal( | 
| 166 | 
            +
                assert_equal("values.foobar", metric.name)
         | 
| 167 167 | 
             
                assert_equal(0.9, metric.sample_rate)
         | 
| 168 | 
            -
                assert_equal([ | 
| 168 | 
            +
                assert_equal(["test"], metric.tags)
         | 
| 169 169 | 
             
              end
         | 
| 170 170 |  | 
| 171 171 | 
             
              def test_statsd_distribution_returns_return_value_of_block
         | 
| 172 | 
            -
                return_value = StatsD.distribution( | 
| 173 | 
            -
                assert_equal( | 
| 172 | 
            +
                return_value = StatsD.distribution("values.foobar") { "sarah" }
         | 
| 173 | 
            +
                assert_equal("sarah", return_value)
         | 
| 174 174 | 
             
              end
         | 
| 175 175 |  | 
| 176 176 | 
             
              def test_statsd_measure_returns_return_value_of_block_even_if_nil
         | 
| 177 | 
            -
                return_value = StatsD.distribution( | 
| 177 | 
            +
                return_value = StatsD.distribution("values.foobar") { nil }
         | 
| 178 178 | 
             
                assert_nil(return_value)
         | 
| 179 179 | 
             
              end
         | 
| 180 180 |  | 
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -1,13 +1,17 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            if Warning.respond_to?(:[]=)
         | 
| 4 | 
            +
              Warning[:deprecated] = true
         | 
| 5 | 
            +
            end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ENV["ENV"] = "test"
         | 
| 4 8 |  | 
| 5 | 
            -
            require  | 
| 6 | 
            -
            require  | 
| 7 | 
            -
            require  | 
| 8 | 
            -
            require  | 
| 9 | 
            +
            require "minitest/autorun"
         | 
| 10 | 
            +
            require "minitest/pride"
         | 
| 11 | 
            +
            require "mocha/minitest"
         | 
| 12 | 
            +
            require "statsd-instrument"
         | 
| 9 13 |  | 
| 10 | 
            -
            require_relative  | 
| 14 | 
            +
            require_relative "helpers/rubocop_helper"
         | 
| 11 15 |  | 
| 12 16 | 
             
            module StatsD
         | 
| 13 17 | 
             
              module Instrument
         | 
| @@ -19,3 +23,6 @@ module StatsD | |
| 19 23 | 
             
            end
         | 
| 20 24 |  | 
| 21 25 | 
             
            StatsD.logger = Logger.new(File::NULL)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            Thread.abort_on_exception = true
         | 
| 28 | 
            +
            Thread.report_on_exception = true
         | 
    
        data/test/udp_sink_test.rb
    CHANGED
    
    | @@ -1,29 +1,27 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 4 | 
            -
             | 
| 5 | 
            -
            class UDPSinkTest < Minitest::Test
         | 
| 6 | 
            -
              def setup
         | 
| 7 | 
            -
                @receiver = UDPSocket.new
         | 
| 8 | 
            -
                @receiver.bind('localhost', 0)
         | 
| 9 | 
            -
                @host = @receiver.addr[2]
         | 
| 10 | 
            -
                @port = @receiver.addr[1]
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              def teardown
         | 
| 14 | 
            -
                @receiver.close
         | 
| 15 | 
            -
              end
         | 
| 3 | 
            +
            require "test_helper"
         | 
| 16 4 |  | 
| 5 | 
            +
            module UDPSinkTests
         | 
| 17 6 | 
             
              def test_udp_sink_sends_data_over_udp
         | 
| 18 | 
            -
                udp_sink =  | 
| 19 | 
            -
                udp_sink <<  | 
| 7 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 8 | 
            +
                udp_sink << "foo:1|c"
         | 
| 20 9 |  | 
| 21 10 | 
             
                datagram, _source = @receiver.recvfrom(100)
         | 
| 22 | 
            -
                assert_equal( | 
| 11 | 
            +
                assert_equal("foo:1|c", datagram)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def large_datagram
         | 
| 15 | 
            +
                datagram = "#{"a" * 1000}:1|c"
         | 
| 16 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 17 | 
            +
                udp_sink << datagram
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                datagram, _source = @receiver.recvfrom(1500)
         | 
| 20 | 
            +
                assert_equal(datagram, datagram)
         | 
| 23 21 | 
             
              end
         | 
| 24 22 |  | 
| 25 23 | 
             
              def test_sample?
         | 
| 26 | 
            -
                udp_sink =  | 
| 24 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 27 25 | 
             
                assert(udp_sink.sample?(1))
         | 
| 28 26 | 
             
                refute(udp_sink.sample?(0))
         | 
| 29 27 |  | 
| @@ -35,49 +33,149 @@ class UDPSinkTest < Minitest::Test | |
| 35 33 | 
             
              end
         | 
| 36 34 |  | 
| 37 35 | 
             
              def test_parallelism
         | 
| 38 | 
            -
                udp_sink =  | 
| 39 | 
            -
                50.times { |i| Thread.new { udp_sink << "foo:#{i}|c" << "bar:#{i}|c" } }
         | 
| 36 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 37 | 
            +
                50.times.map { |i| Thread.new { udp_sink << "foo:#{i}|c" << "bar:#{i}|c" } }
         | 
| 40 38 | 
             
                datagrams = []
         | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                   | 
| 39 | 
            +
             | 
| 40 | 
            +
                while @receiver.wait_readable(2)
         | 
| 41 | 
            +
                  datagram, _source = @receiver.recvfrom(4000)
         | 
| 42 | 
            +
                  datagrams += datagram.split("\n")
         | 
| 44 43 | 
             
                end
         | 
| 45 44 |  | 
| 46 45 | 
             
                assert_equal(100, datagrams.size)
         | 
| 47 46 | 
             
              end
         | 
| 48 47 |  | 
| 49 | 
            -
               | 
| 50 | 
            -
                 | 
| 51 | 
            -
             | 
| 52 | 
            -
                 | 
| 53 | 
            -
                socket.expects(:connect).with('localhost', 8125).in_sequence(seq)
         | 
| 54 | 
            -
                socket.expects(:send).raises(Errno::EDESTADDRREQ).in_sequence(seq)
         | 
| 55 | 
            -
                socket.expects(:connect).with('localhost', 8125).in_sequence(seq)
         | 
| 56 | 
            -
                socket.expects(:send).returns(1).in_sequence(seq)
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                udp_sink = StatsD::Instrument::UDPSink.new('localhost', 8125)
         | 
| 59 | 
            -
                udp_sink << 'foo:1|c'
         | 
| 60 | 
            -
                udp_sink << 'bar:1|c'
         | 
| 48 | 
            +
              class SimpleFormatter < ::Logger::Formatter
         | 
| 49 | 
            +
                def call(_severity, _timestamp, _progname, msg)
         | 
| 50 | 
            +
                  "#{String === msg ? msg : msg.inspect}\n"
         | 
| 51 | 
            +
                end
         | 
| 61 52 | 
             
              end
         | 
| 62 53 |  | 
| 63 54 | 
             
              def test_sends_datagram_in_signal_handler
         | 
| 64 | 
            -
                udp_sink =  | 
| 65 | 
            -
                 | 
| 66 | 
            -
                  Signal.trap('TERM') do
         | 
| 67 | 
            -
                    udp_sink << "exiting:1|c"
         | 
| 68 | 
            -
                    Process.exit!(0)
         | 
| 69 | 
            -
                  end
         | 
| 55 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 56 | 
            +
                Signal.trap("USR1") { udp_sink << "exiting:1|c" }
         | 
| 70 57 |  | 
| 71 | 
            -
             | 
| 58 | 
            +
                pid = fork do
         | 
| 59 | 
            +
                  sleep(5)
         | 
| 72 60 | 
             
                end
         | 
| 73 61 |  | 
| 74 | 
            -
                 | 
| 75 | 
            -
                _, exit_status = Process.waitpid2(pid)
         | 
| 62 | 
            +
                Signal.trap("USR1", "DEFAULT")
         | 
| 76 63 |  | 
| 77 | 
            -
                 | 
| 64 | 
            +
                Process.kill("USR1", pid)
         | 
| 65 | 
            +
                @receiver.wait_readable(1)
         | 
| 78 66 | 
             
                assert_equal("exiting:1|c", @receiver.recvfrom_nonblock(100).first)
         | 
| 67 | 
            +
                Process.kill("KILL", pid)
         | 
| 68 | 
            +
              rescue NotImplementedError
         | 
| 69 | 
            +
                pass("Fork is not implemented on #{RUBY_PLATFORM}")
         | 
| 70 | 
            +
              end
         | 
| 79 71 |  | 
| 72 | 
            +
              def test_sends_datagram_before_exit
         | 
| 73 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 74 | 
            +
                fork do
         | 
| 75 | 
            +
                  udp_sink << "exiting:1|c"
         | 
| 76 | 
            +
                  Process.exit(0)
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                @receiver.wait_readable(1)
         | 
| 80 | 
            +
                assert_equal("exiting:1|c", @receiver.recvfrom_nonblock(100).first)
         | 
| 81 | 
            +
              rescue NotImplementedError
         | 
| 82 | 
            +
                pass("Fork is not implemented on #{RUBY_PLATFORM}")
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              def test_sends_datagram_when_termed
         | 
| 86 | 
            +
                udp_sink = build_sink(@host, @port)
         | 
| 87 | 
            +
                fork do
         | 
| 88 | 
            +
                  udp_sink << "exiting:1|c"
         | 
| 89 | 
            +
                  Process.kill("TERM", Process.pid)
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                @receiver.wait_readable(1)
         | 
| 93 | 
            +
                assert_equal("exiting:1|c", @receiver.recvfrom_nonblock(100).first)
         | 
| 80 94 | 
             
              rescue NotImplementedError
         | 
| 81 95 | 
             
                pass("Fork is not implemented on #{RUBY_PLATFORM}")
         | 
| 82 96 | 
             
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              private
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              def build_sink(host = @host, port = @port)
         | 
| 101 | 
            +
                @sink_class.new(host, port)
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              class UDPSinkTest < Minitest::Test
         | 
| 105 | 
            +
                include UDPSinkTests
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                def setup
         | 
| 108 | 
            +
                  @receiver = UDPSocket.new
         | 
| 109 | 
            +
                  @receiver.bind("localhost", 0)
         | 
| 110 | 
            +
                  @host = @receiver.addr[2]
         | 
| 111 | 
            +
                  @port = @receiver.addr[1]
         | 
| 112 | 
            +
                  @sink_class = StatsD::Instrument::UDPSink
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                def teardown
         | 
| 116 | 
            +
                  @receiver.close
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                def test_socket_error_should_invalidate_socket
         | 
| 120 | 
            +
                  previous_logger = StatsD.logger
         | 
| 121 | 
            +
                  begin
         | 
| 122 | 
            +
                    logs = StringIO.new
         | 
| 123 | 
            +
                    StatsD.logger = Logger.new(logs)
         | 
| 124 | 
            +
                    StatsD.logger.formatter = SimpleFormatter.new
         | 
| 125 | 
            +
                    UDPSocket.stubs(:new).returns(socket = mock("socket"))
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                    seq = sequence("connect_fail_connect_succeed")
         | 
| 128 | 
            +
                    socket.expects(:connect).with("localhost", 8125).in_sequence(seq)
         | 
| 129 | 
            +
                    socket.expects(:send).raises(Errno::EDESTADDRREQ).in_sequence(seq)
         | 
| 130 | 
            +
                    socket.expects(:connect).with("localhost", 8125).in_sequence(seq)
         | 
| 131 | 
            +
                    socket.expects(:send).returns(1).in_sequence(seq)
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                    udp_sink = build_sink("localhost", 8125)
         | 
| 134 | 
            +
                    udp_sink << "foo:1|c"
         | 
| 135 | 
            +
                    udp_sink << "bar:1|c"
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    assert_equal(
         | 
| 138 | 
            +
                      "[#{@sink_class}] Resetting connection because of " \
         | 
| 139 | 
            +
                      "Errno::EDESTADDRREQ: Destination address required\n",
         | 
| 140 | 
            +
                      logs.string,
         | 
| 141 | 
            +
                    )
         | 
| 142 | 
            +
                  ensure
         | 
| 143 | 
            +
                    StatsD.logger = previous_logger
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
                end
         | 
| 146 | 
            +
              end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
              class BatchedUDPSinkTest < Minitest::Test
         | 
| 149 | 
            +
                include UDPSinkTests
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                def setup
         | 
| 152 | 
            +
                  @receiver = UDPSocket.new
         | 
| 153 | 
            +
                  @receiver.bind("localhost", 0)
         | 
| 154 | 
            +
                  @host = @receiver.addr[2]
         | 
| 155 | 
            +
                  @port = @receiver.addr[1]
         | 
| 156 | 
            +
                  @sink_class = StatsD::Instrument::BatchedUDPSink
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                def teardown
         | 
| 160 | 
            +
                  @receiver.close
         | 
| 161 | 
            +
                end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                def test_parallelism_buffering
         | 
| 164 | 
            +
                  udp_sink = build_sink(@host, @port)
         | 
| 165 | 
            +
                  50.times.map do |i|
         | 
| 166 | 
            +
                    Thread.new do
         | 
| 167 | 
            +
                      udp_sink << "foo:#{i}|c" << "bar:#{i}|c" << "baz:#{i}|c" << "plop:#{i}|c"
         | 
| 168 | 
            +
                    end
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  datagrams = []
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                  while @receiver.wait_readable(2)
         | 
| 174 | 
            +
                    datagram, _source = @receiver.recvfrom(1000)
         | 
| 175 | 
            +
                    datagrams += datagram.split("\n")
         | 
| 176 | 
            +
                  end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                  assert_equal(200, datagrams.size)
         | 
| 179 | 
            +
                end
         | 
| 180 | 
            +
              end
         | 
| 83 181 | 
             
            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. | 
| 4 | 
            +
              version: 3.1.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jesse Storimer
         | 
| @@ -10,8 +10,22 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date:  | 
| 14 | 
            -
            dependencies: | 
| 13 | 
            +
            date: 2021-09-02 00:00:00.000000000 Z
         | 
| 14 | 
            +
            dependencies:
         | 
| 15 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 16 | 
            +
              name: concurrent-ruby
         | 
| 17 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 18 | 
            +
                requirements:
         | 
| 19 | 
            +
                - - ">="
         | 
| 20 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            +
                    version: '0'
         | 
| 22 | 
            +
              type: :development
         | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            +
                requirements:
         | 
| 26 | 
            +
                - - ">="
         | 
| 27 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 28 | 
            +
                    version: '0'
         | 
| 15 29 | 
             
            description: A StatsD client for Ruby apps. Provides metaprogramming methods to inject
         | 
| 16 30 | 
             
              StatsD instrumentation into your code.
         | 
| 17 31 | 
             
            email:
         | 
| @@ -23,7 +37,8 @@ files: | |
| 23 37 | 
             
            - ".github/CODEOWNERS"
         | 
| 24 38 | 
             
            - ".github/probots.yml"
         | 
| 25 39 | 
             
            - ".github/workflows/benchmark.yml"
         | 
| 26 | 
            -
            - ".github/workflows/ | 
| 40 | 
            +
            - ".github/workflows/lint.yml"
         | 
| 41 | 
            +
            - ".github/workflows/tests.yml"
         | 
| 27 42 | 
             
            - ".gitignore"
         | 
| 28 43 | 
             
            - ".rubocop.yml"
         | 
| 29 44 | 
             
            - ".yardopts"
         | 
| @@ -41,6 +56,7 @@ files: | |
| 41 56 | 
             
            - lib/statsd-instrument.rb
         | 
| 42 57 | 
             
            - lib/statsd/instrument.rb
         | 
| 43 58 | 
             
            - lib/statsd/instrument/assertions.rb
         | 
| 59 | 
            +
            - lib/statsd/instrument/batched_udp_sink.rb
         | 
| 44 60 | 
             
            - lib/statsd/instrument/capture_sink.rb
         | 
| 45 61 | 
             
            - lib/statsd/instrument/client.rb
         | 
| 46 62 | 
             
            - lib/statsd/instrument/datagram.rb
         | 
| @@ -71,7 +87,6 @@ files: | |
| 71 87 | 
             
            - statsd-instrument.gemspec
         | 
| 72 88 | 
             
            - test/assertions_test.rb
         | 
| 73 89 | 
             
            - test/benchmark/clock_gettime.rb
         | 
| 74 | 
            -
            - test/benchmark/default_tags.rb
         | 
| 75 90 | 
             
            - test/benchmark/metrics.rb
         | 
| 76 91 | 
             
            - test/benchmark/tags.rb
         | 
| 77 92 | 
             
            - test/capture_sink_test.rb
         | 
| @@ -119,14 +134,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 119 134 | 
             
                - !ruby/object:Gem::Version
         | 
| 120 135 | 
             
                  version: '0'
         | 
| 121 136 | 
             
            requirements: []
         | 
| 122 | 
            -
            rubygems_version: 3. | 
| 137 | 
            +
            rubygems_version: 3.2.20
         | 
| 123 138 | 
             
            signing_key: 
         | 
| 124 139 | 
             
            specification_version: 4
         | 
| 125 140 | 
             
            summary: A StatsD client for Ruby apps
         | 
| 126 141 | 
             
            test_files:
         | 
| 127 142 | 
             
            - test/assertions_test.rb
         | 
| 128 143 | 
             
            - test/benchmark/clock_gettime.rb
         | 
| 129 | 
            -
            - test/benchmark/default_tags.rb
         | 
| 130 144 | 
             
            - test/benchmark/metrics.rb
         | 
| 131 145 | 
             
            - test/benchmark/tags.rb
         | 
| 132 146 | 
             
            - test/capture_sink_test.rb
         |