Skip to content

Commit 314b2de

Browse files
Adding tests for metrics
1 parent 49e7de7 commit 314b2de

File tree

5 files changed

+109
-56
lines changed

5 files changed

+109
-56
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
*.gem
2+
nclude-dependencies
3+
Gemfile.lock

Gemfile.lock

Lines changed: 70 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,107 @@
11
PATH
22
remote: .
33
specs:
4-
fluent-plugin-throttle (0.0.5)
4+
fluent-plugin-throttle (0.0.6)
5+
fluent-plugin-prometheus (~> 2.1)
56
fluentd (~> 1.1)
7+
prometheus-client (~> 4.2)
68

79
GEM
810
remote: https://rubygems.org/
911
specs:
10-
addressable (2.5.2)
11-
public_suffix (>= 2.0.2, < 4.0)
12-
appraisal (2.2.0)
12+
addressable (2.8.6)
13+
public_suffix (>= 2.0.2, < 6.0)
14+
appraisal (2.5.0)
1315
bundler
1416
rake
1517
thor (>= 0.14.0)
16-
byebug (10.0.2)
17-
coderay (1.1.2)
18-
concurrent-ruby (1.1.6)
19-
cool.io (1.6.0)
20-
crack (0.4.3)
21-
safe_yaml (~> 1.0.0)
22-
fluentd (1.11.1)
18+
base64 (0.2.0)
19+
bigdecimal (3.1.8)
20+
byebug (11.1.3)
21+
coderay (1.1.3)
22+
concurrent-ruby (1.3.3)
23+
cool.io (1.8.1)
24+
crack (1.0.0)
25+
bigdecimal
26+
rexml
27+
csv (3.3.0)
28+
drb (2.2.1)
29+
fluent-plugin-prometheus (2.1.0)
30+
fluentd (>= 1.9.1, < 2)
31+
prometheus-client (>= 2.1.0)
32+
fluentd (1.17.0)
33+
base64 (~> 0.2)
34+
bundler
2335
cool.io (>= 1.4.5, < 2.0.0)
24-
http_parser.rb (>= 0.5.1, < 0.7.0)
36+
csv (~> 3.2)
37+
drb (~> 2.2)
38+
http_parser.rb (>= 0.5.1, < 0.9.0)
2539
msgpack (>= 1.3.1, < 2.0.0)
26-
serverengine (>= 2.0.4, < 3.0.0)
27-
sigdump (~> 0.2.2)
28-
strptime (>= 0.2.2, < 1.0.0)
40+
serverengine (>= 2.3.2, < 3.0.0)
41+
sigdump (~> 0.2.5)
42+
strptime (>= 0.2.4, < 1.0.0)
2943
tzinfo (>= 1.0, < 3.0)
3044
tzinfo-data (~> 1.0)
45+
webrick (~> 1.4)
3146
yajl-ruby (~> 1.0)
32-
hashdiff (0.3.7)
33-
http_parser.rb (0.6.0)
34-
maxitest (3.1.0)
35-
minitest (>= 5.0.0, < 5.12.0)
36-
metaclass (0.0.4)
37-
method_source (0.9.0)
38-
minitest (5.11.3)
39-
mocha (1.6.0)
40-
metaclass (~> 0.0.1)
41-
msgpack (1.3.3)
42-
power_assert (1.1.3)
43-
pry (0.11.3)
44-
coderay (~> 1.1.0)
45-
method_source (~> 0.9.0)
46-
pry-byebug (3.6.0)
47-
byebug (~> 10.0)
48-
pry (~> 0.10)
49-
public_suffix (3.0.2)
50-
rake (12.3.1)
51-
safe_yaml (1.0.4)
52-
serverengine (2.2.1)
47+
hashdiff (1.1.0)
48+
http_parser.rb (0.8.0)
49+
maxitest (5.5.0)
50+
minitest (>= 5.14.0, < 5.24.0)
51+
method_source (1.1.0)
52+
minitest (5.23.1)
53+
mocha (2.3.0)
54+
ruby2_keywords (>= 0.0.5)
55+
msgpack (1.7.2)
56+
power_assert (2.0.3)
57+
prometheus-client (4.2.2)
58+
pry (0.14.2)
59+
coderay (~> 1.1)
60+
method_source (~> 1.0)
61+
pry-byebug (3.10.1)
62+
byebug (~> 11.0)
63+
pry (>= 0.13, < 0.15)
64+
public_suffix (5.0.5)
65+
rake (13.2.1)
66+
rexml (3.3.0)
67+
strscan
68+
ruby2_keywords (0.0.5)
69+
serverengine (2.3.2)
5370
sigdump (~> 0.2.2)
54-
sigdump (0.2.4)
55-
single_cov (1.1.0)
56-
strptime (0.2.4)
57-
test-unit (3.2.8)
71+
sigdump (0.2.5)
72+
single_cov (1.11.0)
73+
strptime (0.2.5)
74+
strscan (3.1.0)
75+
test-unit (3.6.2)
5876
power_assert
59-
thor (0.20.0)
60-
tzinfo (2.0.2)
77+
thor (1.3.1)
78+
tzinfo (2.0.6)
6179
concurrent-ruby (~> 1.0)
62-
tzinfo-data (1.2020.1)
80+
tzinfo-data (1.2024.1)
6381
tzinfo (>= 1.0.0)
64-
webmock (3.4.2)
65-
addressable (>= 2.3.6)
82+
webmock (3.23.1)
83+
addressable (>= 2.8.0)
6684
crack (>= 0.3.2)
67-
hashdiff
68-
yajl-ruby (1.4.1)
85+
hashdiff (>= 0.4.0, < 2.0.0)
86+
webrick (1.8.1)
87+
yajl-ruby (1.4.3)
6988

7089
PLATFORMS
7190
ruby
91+
x86_64-darwin-23
7292

7393
DEPENDENCIES
7494
appraisal (~> 2.2)
75-
bundler (~> 1.16)
95+
bundler (~> 2.5)
7696
fluent-plugin-throttle!
7797
maxitest
7898
mocha
7999
pry
80100
pry-byebug
81-
rake (~> 12.3)
101+
rake (~> 13.2)
82102
single_cov
83103
test-unit (~> 3.2)
84104
webmock (~> 3.3)
85105

86106
BUNDLED WITH
87-
1.17.2
107+
2.5.12

fluent-plugin-throttle.gemspec

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@ Gem::Specification.new do |spec|
1616
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
1717
spec.require_paths = ["lib"]
1818

19-
spec.add_development_dependency "bundler", "~> 1.16"
20-
spec.add_development_dependency "rake", "~> 12.3"
19+
spec.add_development_dependency "bundler", "~> 2.5"
20+
spec.add_development_dependency "rake", "~> 13.2"
2121
spec.add_development_dependency "webmock", "~> 3.3"
2222
spec.add_development_dependency "test-unit", "~> 3.2"
2323
spec.add_development_dependency "appraisal", "~> 2.2"
2424
spec.add_development_dependency "mocha"
2525
spec.add_development_dependency "maxitest"
2626
spec.add_development_dependency "single_cov"
2727

28-
spec.add_runtime_dependency "prometheus-client", '>= 4.2.2'
29-
spec.add_runtime_dependency "fluentd", "~> 1.1"
28+
spec.add_dependency "prometheus-client", '~> 4.2'
29+
spec.add_dependency "fluentd", "~> 1.1"
30+
spec.add_dependency "fluent-plugin-prometheus", "~> 2.1"
3031
end

lib/fluent/plugin/filter_throttle.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class ThrottleFilter < Filter
77
Fluent::Plugin.register_filter('throttle', self)
88
include Fluent::Plugin::PrometheusLabelParser
99
include Fluent::Plugin::Prometheus
10+
attr_reader :registry
1011

1112
desc "Used to group logs. Groups are rate limited independently"
1213
config_param :group_key, :array, :default => ['kubernetes.container_name']
@@ -116,15 +117,15 @@ def filter(tag, time, record)
116117

117118
# Ruby hashes are ordered by insertion.
118119
# Deleting and inserting moves the item to the end of the hash (most recently used)
119-
counter = @counters[group] = @counters.delete(group) || Group.new(0, now, 0, 0, now, nil, 0)
120+
counter = @counters[group] = @counters.delete(group) || Group.new(0, now, 0, 0, now, nil, @group_bucket_limit)
120121

121122
counter.rate_count += 1
122123
since_last_rate_reset = now - counter.rate_last_reset
123124
if since_last_rate_reset >= 1
124125
# compute and store rate/s at most every second
125126
counter.aprox_rate = (counter.rate_count / since_last_rate_reset).round()
126127
counter.rate_count = 0
127-
counter.rate_count_last = 0
128+
counter.rate_count_last = @group_bucket_limit
128129
counter.rate_last_reset = now
129130
end
130131

test/fluent/plugin/filter_throttle_test.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22
require_relative '../../helper'
33
require 'fluent/plugin/filter_throttle'
4+
require 'fluent/plugin/prometheus'
45

56
SingleCov.covered!
67

@@ -178,5 +179,33 @@ def create_driver(conf='')
178179

179180
assert driver.logs.any? { |log| log.include?('rate back down') }
180181
end
182+
183+
it 'emit metrics when enabled and rate exceeds - multiple keys' do
184+
driver = create_driver <<~CONF
185+
group_key "group1,group2"
186+
group_bucket_period_s 1
187+
group_bucket_limit 5
188+
group_emit_metrics true
189+
CONF
190+
191+
driver.run(default_tag: "test") do
192+
driver.feed([[event_time, {"msg": "test", "group1": "a", "group2": "b"}]] * 100)
193+
driver.feed([[event_time, {"msg": "test", "group1": "b", "group2": "b"}]] * 50)
194+
driver.feed([[event_time, {"msg": "test", "group1": "c"}]] * 25)
195+
driver.feed([[event_time, {"msg": "test", "group2": "c"}]] * 10)
196+
end
197+
198+
groups = driver.filtered_records.group_by { |r| r[:group1] }
199+
groups.each { |k, g| groups[k] = g.group_by { |r| r[:group2] } }
200+
201+
assert_equal(5, groups["a"]["b"].size)
202+
assert_equal(5, groups["b"]["b"].size)
203+
assert_equal(5, groups["c"][nil].size)
204+
assert_equal(5, groups[nil]["c"].size)
205+
assert_equal(95, driver.instance.registry.get(:fluentd_throttle_rate_limit_exceeded).get(labels: {group1: "a", group2: "b"}))
206+
assert_equal(45, driver.instance.registry.get(:fluentd_throttle_rate_limit_exceeded).get(labels: {group1: "b", group2: "b"}))
207+
assert_equal(20, driver.instance.registry.get(:fluentd_throttle_rate_limit_exceeded).get(labels: {group1: "c", group2: nil}))
208+
assert_equal(5, driver.instance.registry.get(:fluentd_throttle_rate_limit_exceeded).get(labels: {group1: nil, group2: "c"}))
209+
end
181210
end
182211
end

0 commit comments

Comments
 (0)