fluent-plugin-kubernetes_metadata_filter 2.4.4 → 2.4.5
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/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
|