statsd-instrument 2.3.2 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|