fluent-plugin-kubernetes_metadata_filter 2.4.4 → 2.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/fluent-plugin-kubernetes_metadata_filter.gemspec +1 -1
- data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +14 -1
- data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +14 -3
- data/test/plugin/test_watch_namespaces.rb +39 -0
- data/test/plugin/test_watch_pods.rb +39 -0
- data/test/plugin/watch_test.rb +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e067ab263fb4e86956da0e6ee07540701e8c728b3f658a9e7d27fbca6ac28307
|
4
|
+
data.tar.gz: 155aff320729d471fe41a09b9a5b838ac70f4bc5d32de39f95735d8ec4cf2213
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afa694eaa98e032be272fcc94a6a6c9703185255f43d24475c0b1516e2ef3fb4f57040398e67197512701c5b3e14c04946c9516efee1dcefdf922342d592731c
|
7
|
+
data.tar.gz: 528302e11718e025dbadd349122fd7addd345284781b38c6a03d9bb8815b25d744248ec4cee866324fe13f40b340dedb424cbf33ec9a8e1f6a1782ba851aca29
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -208,6 +208,7 @@ Then output becomes as belows
|
|
208
208
|
"host": "jimmi-redhat.localnet",
|
209
209
|
"pod_name":"fabric8-console-controller-98rqc",
|
210
210
|
"pod_id": "c76927af-f563-11e4-b32d-54ee7527188d",
|
211
|
+
"pod_ip": "172.17.0.8",
|
211
212
|
"container_name": "fabric8-console-container",
|
212
213
|
"namespace_name": "default",
|
213
214
|
"namespace_id": "23437884-8e08-4d95-850b-e94378c9b2fd",
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "fluent-plugin-kubernetes_metadata_filter"
|
7
|
-
gem.version = "2.4.
|
7
|
+
gem.version = "2.4.5"
|
8
8
|
gem.authors = ["Jimmi Dyson"]
|
9
9
|
gem.email = ["jimmidyson@gmail.com"]
|
10
10
|
gem.description = %q{Filter plugin to add Kubernetes metadata}
|
@@ -29,7 +29,6 @@ module KubernetesMetadata
|
|
29
29
|
# the configuration.
|
30
30
|
namespace_watcher = start_namespace_watch
|
31
31
|
Thread.current[:namespace_watch_retry_backoff_interval] = @watch_retry_interval
|
32
|
-
Thread.current[:namespace_watch_retry_count] = 0
|
33
32
|
|
34
33
|
# Any failures / exceptions in the followup watcher notice
|
35
34
|
# processing will be swallowed and retried. These failures /
|
@@ -96,11 +95,19 @@ module KubernetesMetadata
|
|
96
95
|
watcher
|
97
96
|
end
|
98
97
|
|
98
|
+
# Reset namespace watch retry count and backoff interval as there is a
|
99
|
+
# successful watch notice.
|
100
|
+
def reset_namespace_watch_retry_stats
|
101
|
+
Thread.current[:namespace_watch_retry_count] = 0
|
102
|
+
Thread.current[:namespace_watch_retry_backoff_interval] = @watch_retry_interval
|
103
|
+
end
|
104
|
+
|
99
105
|
# Process a watcher notice and potentially raise an exception.
|
100
106
|
def process_namespace_watcher_notices(watcher)
|
101
107
|
watcher.each do |notice|
|
102
108
|
case notice.type
|
103
109
|
when 'MODIFIED'
|
110
|
+
reset_namespace_watch_retry_stats
|
104
111
|
cache_key = notice.object['metadata']['uid']
|
105
112
|
cached = @namespace_cache[cache_key]
|
106
113
|
if cached
|
@@ -110,10 +117,16 @@ module KubernetesMetadata
|
|
110
117
|
@stats.bump(:namespace_cache_watch_misses)
|
111
118
|
end
|
112
119
|
when 'DELETED'
|
120
|
+
reset_namespace_watch_retry_stats
|
113
121
|
# ignore and let age out for cases where
|
114
122
|
# deleted but still processing logs
|
115
123
|
@stats.bump(:namespace_cache_watch_deletes_ignored)
|
124
|
+
when 'ERROR'
|
125
|
+
@stats.bump(:namespace_watch_error_type_notices)
|
126
|
+
message = notice['object']['message'] if notice['object'] && notice['object']['message']
|
127
|
+
raise "Error while watching namespaces: #{message}"
|
116
128
|
else
|
129
|
+
reset_namespace_watch_retry_stats
|
117
130
|
# Don't pay attention to creations, since the created namespace may not
|
118
131
|
# be used by any namespace on this node.
|
119
132
|
@stats.bump(:namespace_cache_watch_ignored)
|
@@ -98,12 +98,19 @@ module KubernetesMetadata
|
|
98
98
|
watcher
|
99
99
|
end
|
100
100
|
|
101
|
+
# Reset pod watch retry count and backoff interval as there is a
|
102
|
+
# successful watch notice.
|
103
|
+
def reset_pod_watch_retry_stats
|
104
|
+
Thread.current[:pod_watch_retry_count] = 0
|
105
|
+
Thread.current[:pod_watch_retry_backoff_interval] = @watch_retry_interval
|
106
|
+
end
|
107
|
+
|
101
108
|
# Process a watcher notice and potentially raise an exception.
|
102
109
|
def process_pod_watcher_notices(watcher)
|
103
110
|
watcher.each do |notice|
|
104
111
|
case notice.type
|
105
112
|
when 'MODIFIED'
|
106
|
-
|
113
|
+
reset_pod_watch_retry_stats
|
107
114
|
cache_key = notice.object['metadata']['uid']
|
108
115
|
cached = @cache[cache_key]
|
109
116
|
if cached
|
@@ -116,12 +123,16 @@ module KubernetesMetadata
|
|
116
123
|
@stats.bump(:pod_cache_watch_misses)
|
117
124
|
end
|
118
125
|
when 'DELETED'
|
119
|
-
|
126
|
+
reset_pod_watch_retry_stats
|
120
127
|
# ignore and let age out for cases where pods
|
121
128
|
# deleted but still processing logs
|
122
129
|
@stats.bump(:pod_cache_watch_delete_ignored)
|
130
|
+
when 'ERROR'
|
131
|
+
@stats.bump(:pod_watch_error_type_notices)
|
132
|
+
message = notice['object']['message'] if notice['object'] && notice['object']['message']
|
133
|
+
raise "Error while watching pods: #{message}"
|
123
134
|
else
|
124
|
-
|
135
|
+
reset_pod_watch_retry_stats
|
125
136
|
# Don't pay attention to creations, since the created pod may not
|
126
137
|
# end up on this node.
|
127
138
|
@stats.bump(:pod_cache_watch_ignored)
|
@@ -70,6 +70,12 @@ class WatchNamespacesTestTest < WatchTest
|
|
70
70
|
}
|
71
71
|
}
|
72
72
|
)
|
73
|
+
@error = OpenStruct.new(
|
74
|
+
type: 'ERROR',
|
75
|
+
object: {
|
76
|
+
'message' => 'some error message'
|
77
|
+
}
|
78
|
+
)
|
73
79
|
end
|
74
80
|
|
75
81
|
test 'namespace list caches namespaces' do
|
@@ -137,6 +143,39 @@ class WatchNamespacesTestTest < WatchTest
|
|
137
143
|
assert_equal(3, @stats[:namespace_watch_failures])
|
138
144
|
assert_equal(2, Thread.current[:namespace_watch_retry_count])
|
139
145
|
assert_equal(4, Thread.current[:namespace_watch_retry_backoff_interval])
|
146
|
+
assert_nil(@stats[:namespace_watch_error_type_notices])
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
test 'namespace watch retries when error is received' do
|
152
|
+
@client.stub :get_namespaces, @initial do
|
153
|
+
@client.stub :watch_namespaces, [@error] do
|
154
|
+
assert_raise Fluent::UnrecoverableError do
|
155
|
+
set_up_namespace_thread
|
156
|
+
end
|
157
|
+
assert_equal(3, @stats[:namespace_watch_failures])
|
158
|
+
assert_equal(2, Thread.current[:namespace_watch_retry_count])
|
159
|
+
assert_equal(4, Thread.current[:namespace_watch_retry_backoff_interval])
|
160
|
+
assert_equal(3, @stats[:namespace_watch_error_type_notices])
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
test 'namespace watch continues after retries succeed' do
|
166
|
+
@client.stub :get_namespaces, @initial do
|
167
|
+
@client.stub :watch_namespaces, [@modified, @error, @modified] do
|
168
|
+
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
169
|
+
# no unrecoverable error was thrown during this period of time.
|
170
|
+
assert_raise Timeout::Error.new('execution expired') do
|
171
|
+
Timeout.timeout(3) do
|
172
|
+
set_up_namespace_thread
|
173
|
+
end
|
174
|
+
end
|
175
|
+
assert_operator(@stats[:namespace_watch_failures], :>=, 3)
|
176
|
+
assert_operator(Thread.current[:namespace_watch_retry_count], :<=, 1)
|
177
|
+
assert_operator(Thread.current[:namespace_watch_retry_backoff_interval], :<=, 1)
|
178
|
+
assert_operator(@stats[:namespace_watch_error_type_notices], :>=, 3)
|
140
179
|
end
|
141
180
|
end
|
142
181
|
end
|
@@ -136,6 +136,12 @@ class DefaultPodWatchStrategyTest < WatchTest
|
|
136
136
|
}
|
137
137
|
}
|
138
138
|
)
|
139
|
+
@error = OpenStruct.new(
|
140
|
+
type: 'ERROR',
|
141
|
+
object: {
|
142
|
+
'message' => 'some error message'
|
143
|
+
}
|
144
|
+
)
|
139
145
|
end
|
140
146
|
|
141
147
|
test 'pod list caches pods' do
|
@@ -219,6 +225,39 @@ class DefaultPodWatchStrategyTest < WatchTest
|
|
219
225
|
assert_equal(3, @stats[:pod_watch_failures])
|
220
226
|
assert_equal(2, Thread.current[:pod_watch_retry_count])
|
221
227
|
assert_equal(4, Thread.current[:pod_watch_retry_backoff_interval])
|
228
|
+
assert_nil(@stats[:pod_watch_error_type_notices])
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
test 'pod watch retries when error is received' do
|
234
|
+
@client.stub :get_pods, @initial do
|
235
|
+
@client.stub :watch_pods, [@error] do
|
236
|
+
assert_raise Fluent::UnrecoverableError do
|
237
|
+
set_up_pod_thread
|
238
|
+
end
|
239
|
+
assert_equal(3, @stats[:pod_watch_failures])
|
240
|
+
assert_equal(2, Thread.current[:pod_watch_retry_count])
|
241
|
+
assert_equal(4, Thread.current[:pod_watch_retry_backoff_interval])
|
242
|
+
assert_equal(3, @stats[:pod_watch_error_type_notices])
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
test 'pod watch continues after retries succeed' do
|
248
|
+
@client.stub :get_pods, @initial do
|
249
|
+
@client.stub :watch_pods, [@modified, @error, @modified] do
|
250
|
+
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
251
|
+
# no unrecoverable error was thrown during this period of time.
|
252
|
+
assert_raise Timeout::Error.new('execution expired') do
|
253
|
+
Timeout.timeout(3) do
|
254
|
+
set_up_pod_thread
|
255
|
+
end
|
256
|
+
end
|
257
|
+
assert_operator(@stats[:pod_watch_failures], :>=, 3)
|
258
|
+
assert_operator(Thread.current[:pod_watch_retry_count], :<=, 1)
|
259
|
+
assert_operator(Thread.current[:pod_watch_retry_backoff_interval], :<=, 1)
|
260
|
+
assert_operator(@stats[:pod_watch_error_type_notices], :>=, 3)
|
222
261
|
end
|
223
262
|
end
|
224
263
|
end
|
data/test/plugin/watch_test.rb
CHANGED
@@ -33,6 +33,8 @@ class WatchTest < Test::Unit::TestCase
|
|
33
33
|
@watch_retry_exponential_backoff_base = 2
|
34
34
|
@cache = {}
|
35
35
|
@stats = KubernetesMetadata::Stats.new
|
36
|
+
Thread.current[:pod_watch_retry_count] = 0
|
37
|
+
Thread.current[:namespace_watch_retry_count] = 0
|
36
38
|
|
37
39
|
@client = OpenStruct.new
|
38
40
|
def @client.resourceVersion
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-kubernetes_metadata_filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmi Dyson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|