statsd-instrument 3.4.0 → 3.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -27
- data/README.md +11 -1
- data/lib/statsd/instrument/strict.rb +2 -2
- data/lib/statsd/instrument/version.rb +1 -1
- data/lib/statsd/instrument.rb +16 -1
- data/test/changelog_test.rb +37 -0
- data/test/statsd_instrumentation_test.rb +30 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45499b5743c8202fb33807dfbea271ce432b9e28cf4cb360ecde628b4aacee1d
|
4
|
+
data.tar.gz: 9faea13d1feb7b2d26d1f26334a306e881c87d12df52fece199047af0ecf62b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d75637c2b6761835723a8dd343a7238c29137c5ca082784e859a6c79303432639d2be9f55cc98a3188fb45b2cd163c9b82086c256d8d4f673e3bae918807a40
|
7
|
+
data.tar.gz: 986d8661bdd02ba809ea03a56bde2fefee5d98e4c73ef823c62fc5dff4efc616ba0f881e6f1b9be8a295da3649e48a2cc74b159f8c9380db2b0ae658b72e385b
|
data/CHANGELOG.md
CHANGED
@@ -4,7 +4,17 @@ This file documents the changes between releases of this library. When
|
|
4
4
|
creating a pull request, please add an entry to the "unreleased changes"
|
5
5
|
section below.
|
6
6
|
|
7
|
-
|
7
|
+
## Unreleased changes
|
8
|
+
|
9
|
+
## Version 3.5.1
|
10
|
+
|
11
|
+
- Fix bug when passing a lambda function to dynamically set the tags in the strict mode.
|
12
|
+
|
13
|
+
## Version 3.5.0
|
14
|
+
|
15
|
+
- Allow user to provide a lambda function to dynamically set metric tags
|
16
|
+
|
17
|
+
## Version 3.4.0
|
8
18
|
|
9
19
|
- UDP Batching has been largely refactored again. The `STATSD_FLUSH_INTERVAL` environment variable
|
10
20
|
is deprecated. It still disable batching if set to `0`, but other than that is has no effect.
|
@@ -516,123 +526,123 @@ average metric considerably.
|
|
516
526
|
|
517
527
|
- Add mutex around UDP socket invalidation (#147)
|
518
528
|
|
519
|
-
|
529
|
+
## Version 2.3.0
|
520
530
|
|
521
531
|
- No changes from `beta6`, distributions are GA at DataDog so making the distribution changes GA in gem
|
522
532
|
|
523
|
-
|
533
|
+
## Version 2.3.0.beta6
|
524
534
|
|
525
535
|
- Fix invalidate socket on connectivity issues in UDP (#135)
|
526
536
|
|
527
|
-
|
537
|
+
## Version 2.3.0.beta5
|
528
538
|
|
529
539
|
- Fixes bug in return value for blocks used in distributions (#132)
|
530
540
|
|
531
|
-
|
541
|
+
## Version 2.3.0.beta4
|
532
542
|
|
533
543
|
- Add support for distribution to accept a block
|
534
544
|
- Add class method for defining and removing a distribution from a method (same as a measure)
|
535
545
|
- Refactor most instrument methods to reduce code duplication
|
536
546
|
|
537
|
-
|
547
|
+
## Version 2.3.0.beta3
|
538
548
|
|
539
549
|
- fix for `:as_dist` parameter in the `statsd_measure` class method
|
540
550
|
|
541
|
-
|
551
|
+
## Version 2.3.0.beta2
|
542
552
|
|
543
553
|
- Add support for specifying a measure to emit as a distribution using `:as_dist` parameter
|
544
554
|
|
545
|
-
|
555
|
+
## Version 2.3.0.beta
|
546
556
|
|
547
557
|
- Add support for beta, Datadog specific distribution metrics
|
548
558
|
- Invalidate socket on connectivity issues
|
549
559
|
|
550
|
-
|
560
|
+
## Version 2.2.1
|
551
561
|
|
552
562
|
- Fix performance regression from v2.2.0
|
553
563
|
|
554
|
-
|
564
|
+
## Version 2.2.0
|
555
565
|
|
556
566
|
- Add support for two new Datadog specific metric types: events and service checks.
|
557
567
|
|
558
|
-
|
568
|
+
## Version 2.1.3
|
559
569
|
|
560
570
|
- The `assert_statsd_calls` test helper will now raise an exception whenever a block isn't passed.
|
561
571
|
- Sending stats inside an exit handler will no longer cause programs to exit abruptly.
|
562
572
|
|
563
|
-
|
573
|
+
## Version 2.1.2
|
564
574
|
|
565
575
|
- Use `prepend` instead of rewriting classes for metaprogramming methods.
|
566
576
|
- RSpec: make matchers more flexible.
|
567
577
|
- Bugfix: Only ask Rails for the environment when it's actually loaded.
|
568
578
|
|
569
|
-
|
579
|
+
## Version 2.1.1
|
570
580
|
|
571
581
|
- Add `assert_statsd_calls` to from validating cases where one has multiple metrics with the same name and type being recorded, but with different options.
|
572
582
|
|
573
|
-
|
583
|
+
## Version 2.1.0
|
574
584
|
|
575
585
|
- Fix rspec-rails compatibility
|
576
586
|
- Add `value` keyword argument to all metric types.
|
577
587
|
|
578
|
-
|
588
|
+
## Version 2.0.12
|
579
589
|
|
580
590
|
- Make StatsD client thread-safe
|
581
591
|
- Assertions: Ensure sample rates have proper values.
|
582
592
|
- Assertions: Make tag assertions work more intuitively
|
583
593
|
- RSpec: Add backwards compatibility for RSpec 2
|
584
594
|
|
585
|
-
|
595
|
+
## Version 2.0.11
|
586
596
|
|
587
597
|
- Don't change method visibility when adding instrumentation to methods using metaprogramming
|
588
598
|
- RSpec: add support for Compound expectations
|
589
599
|
|
590
|
-
|
600
|
+
## Version 2.0.10
|
591
601
|
|
592
602
|
- Assertions: allow ignoring certain tags when asserting for other tags to be present.
|
593
603
|
|
594
|
-
|
604
|
+
## Version 2.0.9
|
595
605
|
|
596
606
|
- Better error message for `assert_no_statsd_calls`
|
597
607
|
|
598
|
-
|
608
|
+
## Version 2.0.8
|
599
609
|
|
600
610
|
- More tag handling performance improvements.
|
601
611
|
- RSpec matchers documentation improvements
|
602
612
|
|
603
|
-
|
613
|
+
## Version 2.0.7
|
604
614
|
|
605
615
|
- Tag handling performance improvements.
|
606
616
|
- Test against Ruby 2.2.
|
607
617
|
- Drop support for Ruby 1.9.3.
|
608
618
|
|
609
|
-
|
619
|
+
## Version 2.0.6
|
610
620
|
|
611
621
|
- Fix some loading order issues in Rails environments.
|
612
622
|
- Default behavior: in a **staging** environment, the defaults are now the same as in a **production environment**.
|
613
623
|
- Documentation overhaul
|
614
624
|
|
615
|
-
|
625
|
+
## Version 2.0.5
|
616
626
|
|
617
627
|
- Allow for nested assertions using the `assert_statsd_*` assertion methods.
|
618
628
|
|
619
|
-
|
629
|
+
## Version 2.0.4
|
620
630
|
|
621
631
|
- Add a Railtie to fix some initialization issues.
|
622
632
|
|
623
|
-
|
633
|
+
## Version 2.0.3
|
624
634
|
|
625
635
|
- Assertion method bugfixes
|
626
636
|
|
627
|
-
|
637
|
+
## Version 2.0.2
|
628
638
|
|
629
639
|
- Documentation fixes
|
630
640
|
|
631
|
-
|
641
|
+
## Version 2.0.1
|
632
642
|
|
633
643
|
- Add assertion methods `assert_statsd_histogram`, `assert_statsd_set`, and `assert_statsd_key_value`.
|
634
644
|
|
635
|
-
|
645
|
+
## Version 2.0.0
|
636
646
|
|
637
647
|
- Complete rewrite using pluggable backends.
|
638
648
|
- Add assertion methods in `StatsD::Instrument::Assertions` to make testing easier and less brittle.
|
data/README.md
CHANGED
@@ -21,7 +21,7 @@ The following environment variables are supported:
|
|
21
21
|
- `STATSD_ADDR`: (default `localhost:8125`) The address to send the StatsD UDP
|
22
22
|
datagrams to.
|
23
23
|
- `STATSD_IMPLEMENTATION`: (default: `datadog`). The StatsD implementation you
|
24
|
-
are using. `statsd
|
24
|
+
are using. `statsd` and `datadog` are supported. Some features
|
25
25
|
are only available on certain implementations,
|
26
26
|
- `STATSD_ENV`: The environment StatsD will run in. If this is not set
|
27
27
|
explicitly, this will be determined based on other environment variables,
|
@@ -255,6 +255,16 @@ GoogleBase.statsd_count :insert, 'GoogleBase.insert', tags: ['env:production']
|
|
255
255
|
If implementation is not set to `:datadog`, tags will not be included in the UDP packets, and a
|
256
256
|
warning is logged to `StatsD.logger`.
|
257
257
|
|
258
|
+
You can use lambda function that instead of a list of tags to set the metric tags.
|
259
|
+
Like the dynamic metric name, the lambda function must accept two arguments:
|
260
|
+
the object the function is being called on and the array of arguments
|
261
|
+
passed.
|
262
|
+
|
263
|
+
``` ruby
|
264
|
+
metric_tagger = lambda { |object, args| { "key": args.first } }
|
265
|
+
GoogleBase.statsd_count(:insert, 'GoogleBase.insert', tags: metric_tagger)
|
266
|
+
```
|
267
|
+
|
258
268
|
## Testing
|
259
269
|
|
260
270
|
This library comes with a module called `StatsD::Instrument::Assertions` and `StatsD::Instrument::Matchers` to help you write tests
|
@@ -97,8 +97,8 @@ module StatsD
|
|
97
97
|
unless sample_rate.nil? || sample_rate.is_a?(Numeric)
|
98
98
|
raise ArgumentError, "The sample_rate argument should be a number, got #{sample_rate}"
|
99
99
|
end
|
100
|
-
unless tags.nil? || tags.is_a?(Hash) || tags.is_a?(Array)
|
101
|
-
raise ArgumentError, "The tags argument should be a hash or an array, got #{tags.inspect}"
|
100
|
+
unless tags.nil? || tags.is_a?(Hash) || tags.is_a?(Array) || tags.is_a?(Proc)
|
101
|
+
raise ArgumentError, "The tags argument should be a hash, a proc or an array, got #{tags.inspect}"
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
data/lib/statsd/instrument.rb
CHANGED
@@ -34,6 +34,15 @@ module StatsD
|
|
34
34
|
name.respond_to?(:call) ? name.call(callee, args).gsub("::", ".") : name.gsub("::", ".")
|
35
35
|
end
|
36
36
|
|
37
|
+
# Generates the tags for an instrumented method.
|
38
|
+
# @private
|
39
|
+
# @return [Array[String]]
|
40
|
+
def self.generate_tags(tags, callee, *args)
|
41
|
+
return if tags.nil?
|
42
|
+
|
43
|
+
tags.respond_to?(:call) ? tags.call(callee, args) : tags
|
44
|
+
end
|
45
|
+
|
37
46
|
# Even though this method is considered private, and is no longer used internally,
|
38
47
|
# applications in the wild rely on it. As a result, we cannot remove this method
|
39
48
|
# until the next major version.
|
@@ -61,6 +70,8 @@ module StatsD
|
|
61
70
|
# @param method [Symbol] The name of the method to instrument.
|
62
71
|
# @param name [String, #call] The name of the metric to use. You can also pass in a
|
63
72
|
# callable to dynamically generate a metric name
|
73
|
+
# @param tags [Hash, #call] The tags to be associated with the metric. You can also
|
74
|
+
# pass in a callable to dynamically generate the tags key and values
|
64
75
|
# @param metric_options (see StatsD#measure)
|
65
76
|
# @return [void]
|
66
77
|
def statsd_measure(method, name, sample_rate: nil, tags: nil, no_prefix: false, client: nil)
|
@@ -68,6 +79,7 @@ module StatsD
|
|
68
79
|
define_method(method) do |*args, &block|
|
69
80
|
client ||= StatsD.singleton_client
|
70
81
|
key = StatsD::Instrument.generate_metric_name(name, self, *args)
|
82
|
+
tags = StatsD::Instrument.generate_tags(tags, self, *args)
|
71
83
|
client.measure(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
|
72
84
|
super(*args, &block)
|
73
85
|
end
|
@@ -88,6 +100,7 @@ module StatsD
|
|
88
100
|
define_method(method) do |*args, &block|
|
89
101
|
client ||= StatsD.singleton_client
|
90
102
|
key = StatsD::Instrument.generate_metric_name(name, self, *args)
|
103
|
+
tags = StatsD::Instrument.generate_tags(tags, self, *args)
|
91
104
|
client.distribution(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix) do
|
92
105
|
super(*args, &block)
|
93
106
|
end
|
@@ -132,7 +145,7 @@ module StatsD
|
|
132
145
|
client ||= StatsD.singleton_client
|
133
146
|
suffix = truthiness == false ? "failure" : "success"
|
134
147
|
key = StatsD::Instrument.generate_metric_name(name, self, *args)
|
135
|
-
|
148
|
+
tags = StatsD::Instrument.generate_tags(tags, self, *args)
|
136
149
|
tags = Helpers.add_tag(tags, :error_class, error.class.name) if tag_error_class && error
|
137
150
|
|
138
151
|
client.increment("#{key}.#{suffix}", sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
|
@@ -172,6 +185,7 @@ module StatsD
|
|
172
185
|
if truthiness
|
173
186
|
client ||= StatsD.singleton_client
|
174
187
|
key = StatsD::Instrument.generate_metric_name(name, self, *args)
|
188
|
+
tags = StatsD::Instrument.generate_tags(tags, self, *args)
|
175
189
|
client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
|
176
190
|
end
|
177
191
|
end
|
@@ -192,6 +206,7 @@ module StatsD
|
|
192
206
|
define_method(method) do |*args, &block|
|
193
207
|
client ||= StatsD.singleton_client
|
194
208
|
key = StatsD::Instrument.generate_metric_name(name, self, *args)
|
209
|
+
tags = StatsD::Instrument.generate_tags(tags, self, *args)
|
195
210
|
client.increment(key, sample_rate: sample_rate, tags: tags, no_prefix: no_prefix)
|
196
211
|
super(*args, &block)
|
197
212
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class ChangelogTest < Minitest::Test
|
6
|
+
def test_has_heading_for_current_version
|
7
|
+
assert_includes(changelog_headings, current_version_heading)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_headings_are_consistent
|
11
|
+
invalid_headings = changelog_headings.reject do |heading|
|
12
|
+
next true if heading == "# Changelog"
|
13
|
+
next true if heading == "## Unreleased changes"
|
14
|
+
|
15
|
+
# Remaining headings are <h2> if and only if they are version headings, and must be formatted correctly.
|
16
|
+
if heading.start_with?("## ") || heading.include?("Version")
|
17
|
+
next heading.match?(/^## Version \d+\.\d+\.\d+/)
|
18
|
+
end
|
19
|
+
|
20
|
+
next true if heading.start_with?("###") # <h3> and lower are permitted
|
21
|
+
|
22
|
+
false # All other headings are forbidden
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_empty(invalid_headings, "Headings must follow formatting conventions")
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def current_version_heading
|
31
|
+
"## Version #{StatsD::Instrument::VERSION}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def changelog_headings
|
35
|
+
File.read("CHANGELOG.md").each_line.grep(/^#/).map(&:strip)
|
36
|
+
end
|
37
|
+
end
|
@@ -7,7 +7,7 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
7
7
|
class Base
|
8
8
|
extend StatsD::Instrument
|
9
9
|
|
10
|
-
def ssl_post(arg)
|
10
|
+
def ssl_post(arg, async: false)
|
11
11
|
if arg
|
12
12
|
"OK"
|
13
13
|
else
|
@@ -21,8 +21,8 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class Gateway < Base
|
24
|
-
def purchase(arg)
|
25
|
-
ssl_post(arg)
|
24
|
+
def purchase(arg, async: false)
|
25
|
+
ssl_post(arg, async: async)
|
26
26
|
true
|
27
27
|
rescue
|
28
28
|
false
|
@@ -34,12 +34,12 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
34
34
|
end
|
35
35
|
|
36
36
|
class UniqueGateway < Base
|
37
|
-
def ssl_post(arg)
|
37
|
+
def ssl_post(arg, async: false)
|
38
38
|
{ success: arg }
|
39
39
|
end
|
40
40
|
|
41
|
-
def purchase(arg)
|
42
|
-
ssl_post(arg)
|
41
|
+
def purchase(arg, async: false)
|
42
|
+
ssl_post(arg, async: async)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -223,6 +223,30 @@ class StatsDInstrumentationTest < Minitest::Test
|
|
223
223
|
ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
|
224
224
|
end
|
225
225
|
|
226
|
+
def test_statsd_count_with_tags_as_lambda
|
227
|
+
metric_namer = lambda { |object, args| "#{object.metric_name}.#{args.first}" }
|
228
|
+
metric_tagger = lambda { |_object, args| { "key": args.first } }
|
229
|
+
ActiveMerchant::Gateway.statsd_count(:ssl_post, metric_namer, tags: metric_tagger)
|
230
|
+
|
231
|
+
assert_statsd_increment("subgateway.foo", tags: { "key": "foo" }) do
|
232
|
+
GatewaySubClass.new.purchase("foo")
|
233
|
+
end
|
234
|
+
ensure
|
235
|
+
ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_statsd_count_with_tags_as_proc
|
239
|
+
metric_namer = proc { |object, args| "#{object.metric_name}.#{args.first}" }
|
240
|
+
metric_tagger = proc { |_object, args| { "key": args.first } }
|
241
|
+
ActiveMerchant::Gateway.statsd_count(:ssl_post, metric_namer, tags: metric_tagger)
|
242
|
+
|
243
|
+
assert_statsd_increment("subgateway.foo", tags: { "key": "foo" }) do
|
244
|
+
GatewaySubClass.new.purchase("foo")
|
245
|
+
end
|
246
|
+
ensure
|
247
|
+
ActiveMerchant::Gateway.statsd_remove_count(:ssl_post, metric_namer)
|
248
|
+
end
|
249
|
+
|
226
250
|
def test_statsd_count_with_method_receiving_block
|
227
251
|
ActiveMerchant::Base.statsd_count(:post_with_block, "ActiveMerchant.Base.post_with_block")
|
228
252
|
|
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.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Storimer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2023-01-03 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: A StatsD client for Ruby apps. Provides metaprogramming methods to inject
|
16
16
|
StatsD instrumentation into your code.
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- test/benchmark/metrics.rb
|
78
78
|
- test/benchmark/tags.rb
|
79
79
|
- test/capture_sink_test.rb
|
80
|
+
- test/changelog_test.rb
|
80
81
|
- test/client_test.rb
|
81
82
|
- test/datagram_builder_test.rb
|
82
83
|
- test/datagram_test.rb
|
@@ -131,6 +132,7 @@ test_files:
|
|
131
132
|
- test/benchmark/metrics.rb
|
132
133
|
- test/benchmark/tags.rb
|
133
134
|
- test/capture_sink_test.rb
|
135
|
+
- test/changelog_test.rb
|
134
136
|
- test/client_test.rb
|
135
137
|
- test/datagram_builder_test.rb
|
136
138
|
- test/datagram_test.rb
|