fluent-plugin-kubernetes_metadata_filter 0.19.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5406b418d455a9baa0cd3ae7ea62cc271bb3c501
|
4
|
+
data.tar.gz: ed73b4f32c33630d0ebbe441de8ca39ce85bf591
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfc5fdb6c7872041f4663714fae3c22371a613eff290fd1e0bfdc647d6ee4667e43c798f8dfa9e7bd4f1a7bfa37250f8d5a9b00fe3097028ca5e39eb375c858a
|
7
|
+
data.tar.gz: 949e6b18f786f4f3b267b43163834f1a689ed8c2e0226117ed2670db5984ef1a4cfbf2625bffdd77977d5e0096b97771a70e4f539b4c3020158b6941e22cf137
|
data/README.md
CHANGED
@@ -87,8 +87,9 @@ Then output becomes as belows
|
|
87
87
|
1. Fork it
|
88
88
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
89
89
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
90
|
-
4.
|
91
|
-
5.
|
90
|
+
4. Test it (`GEM_HOME=vendor bundle install; GEM_HOME=vendor bundle exec rake test`)
|
91
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
92
|
+
6. Create new Pull Request
|
92
93
|
|
93
94
|
## Copyright
|
94
95
|
Copyright (c) 2015 jimmidyson
|
@@ -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 = "0.
|
7
|
+
gem.version = "0.20.0"
|
8
8
|
gem.authors = ["Jimmi Dyson"]
|
9
9
|
gem.email = ["jimmidyson@gmail.com"]
|
10
10
|
gem.description = %q{Filter plugin to add Kubernetes metadata}
|
@@ -42,21 +42,36 @@ module Fluent
|
|
42
42
|
config_param :de_dot, :bool, default: true
|
43
43
|
config_param :de_dot_separator, :string, default: '_'
|
44
44
|
|
45
|
+
def syms_to_strs(hsh)
|
46
|
+
newhsh = {}
|
47
|
+
hsh.each_pair do |kk,vv|
|
48
|
+
if vv.is_a?(Hash)
|
49
|
+
vv = syms_to_strs(vv)
|
50
|
+
end
|
51
|
+
if kk.is_a?(Symbol)
|
52
|
+
newhsh[kk.to_s] = vv
|
53
|
+
else
|
54
|
+
newhsh[kk] = vv
|
55
|
+
end
|
56
|
+
end
|
57
|
+
newhsh
|
58
|
+
end
|
59
|
+
|
45
60
|
def get_metadata(namespace_name, pod_name, container_name)
|
46
61
|
begin
|
47
62
|
metadata = @client.get_pod(pod_name, namespace_name)
|
48
63
|
return if !metadata
|
49
|
-
labels = metadata['metadata']['labels'].to_h
|
64
|
+
labels = syms_to_strs(metadata['metadata']['labels'].to_h)
|
50
65
|
if @de_dot
|
51
66
|
self.de_dot!(labels)
|
52
67
|
end
|
53
68
|
return {
|
54
|
-
namespace_name
|
55
|
-
pod_id
|
56
|
-
pod_name
|
57
|
-
container_name
|
58
|
-
labels
|
59
|
-
host
|
69
|
+
'namespace_name' => namespace_name,
|
70
|
+
'pod_id' => metadata['metadata']['uid'],
|
71
|
+
'pod_name' => pod_name,
|
72
|
+
'container_name' => container_name,
|
73
|
+
'labels' => labels,
|
74
|
+
'host' => metadata['spec']['nodeName']
|
60
75
|
}
|
61
76
|
rescue KubeException
|
62
77
|
nil
|
@@ -147,6 +162,8 @@ module Fluent
|
|
147
162
|
end
|
148
163
|
end
|
149
164
|
|
165
|
+
# NOTE: fluentd requires that records/hashes have string keys, not symbol keys
|
166
|
+
# http://docs.fluentd.org/articles/plugin-development#record-format
|
150
167
|
def filter_stream(tag, es)
|
151
168
|
new_es = MultiEventStream.new
|
152
169
|
|
@@ -154,38 +171,38 @@ module Fluent
|
|
154
171
|
|
155
172
|
if match_data
|
156
173
|
metadata = {
|
157
|
-
docker
|
158
|
-
container_id
|
174
|
+
'docker' => {
|
175
|
+
'container_id' => match_data['docker_id']
|
159
176
|
},
|
160
|
-
kubernetes
|
161
|
-
namespace_name
|
162
|
-
pod_name
|
163
|
-
container_name
|
177
|
+
'kubernetes' => {
|
178
|
+
'namespace_name' => match_data['namespace'],
|
179
|
+
'pod_name' => match_data['pod_name'],
|
180
|
+
'container_name' => match_data['container_name']
|
164
181
|
}
|
165
182
|
}
|
166
183
|
|
167
184
|
if @kubernetes_url.present?
|
168
|
-
cache_key = "#{metadata[
|
185
|
+
cache_key = "#{metadata['kubernetes']['namespace_name']}_#{metadata['kubernetes']['pod_name']}_#{metadata['kubernetes']['container_name']}"
|
169
186
|
|
170
187
|
this = self
|
171
188
|
metadata = @cache.getset(cache_key) {
|
172
189
|
if metadata
|
173
190
|
kubernetes_metadata = this.get_metadata(
|
174
|
-
metadata[
|
175
|
-
metadata[
|
176
|
-
metadata[
|
191
|
+
metadata['kubernetes']['namespace_name'],
|
192
|
+
metadata['kubernetes']['pod_name'],
|
193
|
+
metadata['kubernetes']['container_name']
|
177
194
|
)
|
178
|
-
metadata[
|
195
|
+
metadata['kubernetes'] = kubernetes_metadata if kubernetes_metadata
|
179
196
|
metadata
|
180
197
|
end
|
181
198
|
}
|
182
199
|
if @include_namespace_id
|
183
|
-
namespace_name = metadata[
|
200
|
+
namespace_name = metadata['kubernetes']['namespace_name']
|
184
201
|
namespace_id = @namespace_cache.getset(namespace_name) {
|
185
202
|
namespace = @client.get_namespace(namespace_name)
|
186
203
|
namespace['metadata']['uid'] if namespace
|
187
204
|
}
|
188
|
-
metadata[
|
205
|
+
metadata['kubernetes']['namespace_id'] = namespace_id if namespace_id
|
189
206
|
end
|
190
207
|
end
|
191
208
|
end
|
@@ -219,7 +236,7 @@ module Fluent
|
|
219
236
|
if h[ref] && ref =~ /\./
|
220
237
|
v = h.delete(ref)
|
221
238
|
newref = ref.to_s.gsub('.', @de_dot_separator)
|
222
|
-
h[newref
|
239
|
+
h[newref] = v
|
223
240
|
end
|
224
241
|
end
|
225
242
|
end
|
@@ -242,11 +259,11 @@ module Fluent
|
|
242
259
|
cached = @cache[cache_key]
|
243
260
|
if cached
|
244
261
|
# Only thing that can be modified is labels
|
245
|
-
labels = notice.object.metadata.labels.to_h
|
262
|
+
labels = syms_to_strs(notice.object.metadata.labels.to_h)
|
246
263
|
if @de_dot
|
247
264
|
self.de_dot!(labels)
|
248
265
|
end
|
249
|
-
cached[
|
266
|
+
cached['kubernetes']['labels'] = labels
|
250
267
|
@cache[cache_key] = cached
|
251
268
|
end
|
252
269
|
}
|
@@ -157,17 +157,17 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
157
157
|
VCR.use_cassette('kubernetes_docker_metadata') do
|
158
158
|
es = emit()
|
159
159
|
expected_kube_metadata = {
|
160
|
-
docker
|
161
|
-
container_id
|
160
|
+
'docker' => {
|
161
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
162
162
|
},
|
163
|
-
kubernetes
|
164
|
-
host
|
165
|
-
pod_name
|
166
|
-
container_name
|
167
|
-
namespace_name
|
168
|
-
pod_id
|
169
|
-
labels
|
170
|
-
component
|
163
|
+
'kubernetes' => {
|
164
|
+
'host' => 'jimmi-redhat.localnet',
|
165
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
166
|
+
'container_name' => 'fabric8-console-container',
|
167
|
+
'namespace_name' => 'default',
|
168
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
169
|
+
'labels' => {
|
170
|
+
'component' => 'fabric8Console'
|
171
171
|
}
|
172
172
|
}
|
173
173
|
}
|
@@ -184,18 +184,18 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
184
184
|
include_namespace_id true
|
185
185
|
')
|
186
186
|
expected_kube_metadata = {
|
187
|
-
docker
|
188
|
-
container_id
|
187
|
+
'docker' => {
|
188
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
189
189
|
},
|
190
|
-
kubernetes
|
191
|
-
host
|
192
|
-
pod_name
|
193
|
-
container_name
|
194
|
-
namespace_name
|
195
|
-
namespace_id
|
196
|
-
pod_id
|
197
|
-
labels
|
198
|
-
component
|
190
|
+
'kubernetes' => {
|
191
|
+
'host' => 'jimmi-redhat.localnet',
|
192
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
193
|
+
'container_name' => 'fabric8-console-container',
|
194
|
+
'namespace_name' => 'default',
|
195
|
+
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
196
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
197
|
+
'labels' => {
|
198
|
+
'component' => 'fabric8Console'
|
199
199
|
}
|
200
200
|
}
|
201
201
|
}
|
@@ -212,17 +212,17 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
212
212
|
bearer_token_file test/plugin/test.token
|
213
213
|
')
|
214
214
|
expected_kube_metadata = {
|
215
|
-
docker
|
216
|
-
container_id
|
215
|
+
'docker' => {
|
216
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
217
217
|
},
|
218
|
-
kubernetes
|
219
|
-
host
|
220
|
-
pod_name
|
221
|
-
container_name
|
222
|
-
namespace_name
|
223
|
-
pod_id
|
224
|
-
labels
|
225
|
-
component
|
218
|
+
'kubernetes' => {
|
219
|
+
'host' => 'jimmi-redhat.localnet',
|
220
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
221
|
+
'container_name' => 'fabric8-console-container',
|
222
|
+
'namespace_name' => 'default',
|
223
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
224
|
+
'labels' => {
|
225
|
+
'component' => 'fabric8Console'
|
226
226
|
}
|
227
227
|
}
|
228
228
|
}
|
@@ -233,13 +233,13 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
233
233
|
test 'with docker & kubernetes metadata but no configured api server' do
|
234
234
|
es = emit({}, '')
|
235
235
|
expected_kube_metadata = {
|
236
|
-
docker
|
237
|
-
container_id
|
236
|
+
'docker' => {
|
237
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
238
238
|
},
|
239
|
-
kubernetes
|
240
|
-
pod_name
|
241
|
-
container_name
|
242
|
-
namespace_name
|
239
|
+
'kubernetes' => {
|
240
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
241
|
+
'container_name' => 'fabric8-console-container',
|
242
|
+
'namespace_name' => 'default',
|
243
243
|
}
|
244
244
|
}
|
245
245
|
assert_equal(expected_kube_metadata, es.instance_variable_get(:@record_array)[0])
|
@@ -247,20 +247,20 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
247
247
|
|
248
248
|
test 'with docker & inaccessible kubernetes metadata' do
|
249
249
|
stub_request(:any, 'https://localhost:8443/api').to_return(
|
250
|
-
body
|
251
|
-
versions
|
250
|
+
'body' => {
|
251
|
+
'versions' => ['v1beta3', 'v1']
|
252
252
|
}.to_json
|
253
253
|
)
|
254
254
|
stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
|
255
255
|
es = emit()
|
256
256
|
expected_kube_metadata = {
|
257
|
-
docker
|
258
|
-
container_id
|
257
|
+
'docker' => {
|
258
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
259
259
|
},
|
260
|
-
kubernetes
|
261
|
-
pod_name
|
262
|
-
container_name
|
263
|
-
namespace_name
|
260
|
+
'kubernetes' => {
|
261
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
262
|
+
'container_name' => 'fabric8-console-container',
|
263
|
+
'namespace_name' => 'default'
|
264
264
|
}
|
265
265
|
}
|
266
266
|
assert_equal(expected_kube_metadata, es.instance_variable_get(:@record_array)[0])
|
@@ -268,20 +268,20 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
268
268
|
|
269
269
|
test 'with dot in pod name' do
|
270
270
|
stub_request(:any, 'https://localhost:8443/api').to_return(
|
271
|
-
body
|
272
|
-
versions
|
271
|
+
'body' => {
|
272
|
+
'versions' => ['v1beta3', 'v1']
|
273
273
|
}.to_json
|
274
274
|
)
|
275
275
|
stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller.98rqc').to_timeout
|
276
276
|
es = emit_with_tag('var.log.containers.fabric8-console-controller.98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log', {}, '')
|
277
277
|
expected_kube_metadata = {
|
278
|
-
docker
|
279
|
-
container_id
|
278
|
+
'docker' => {
|
279
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
280
280
|
},
|
281
|
-
kubernetes
|
282
|
-
pod_name
|
283
|
-
container_name
|
284
|
-
namespace_name
|
281
|
+
'kubernetes' => {
|
282
|
+
'pod_name' => 'fabric8-console-controller.98rqc',
|
283
|
+
'container_name' => 'fabric8-console-container',
|
284
|
+
'namespace_name' => 'default'
|
285
285
|
}
|
286
286
|
}
|
287
287
|
assert_equal(expected_kube_metadata, es.instance_variable_get(:@record_array)[0])
|
@@ -324,17 +324,17 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
324
324
|
VCR.use_cassette('kubernetes_docker_metadata_dotted_labels') do
|
325
325
|
es = emit()
|
326
326
|
expected_kube_metadata = {
|
327
|
-
docker
|
328
|
-
container_id
|
327
|
+
'docker' => {
|
328
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
329
329
|
},
|
330
|
-
kubernetes
|
331
|
-
host
|
332
|
-
pod_name
|
333
|
-
container_name
|
334
|
-
namespace_name
|
335
|
-
pod_id
|
336
|
-
labels
|
337
|
-
'kubernetes_io/test'
|
330
|
+
'kubernetes' => {
|
331
|
+
'host' => 'jimmi-redhat.localnet',
|
332
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
333
|
+
'container_name' => 'fabric8-console-container',
|
334
|
+
'namespace_name' => 'default',
|
335
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
336
|
+
'labels' => {
|
337
|
+
'kubernetes_io/test' => 'somevalue'
|
338
338
|
}
|
339
339
|
}
|
340
340
|
}
|
@@ -351,17 +351,17 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
351
351
|
de_dot false
|
352
352
|
')
|
353
353
|
expected_kube_metadata = {
|
354
|
-
docker
|
355
|
-
container_id
|
354
|
+
'docker' => {
|
355
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
356
356
|
},
|
357
|
-
kubernetes
|
358
|
-
host
|
359
|
-
pod_name
|
360
|
-
container_name
|
361
|
-
namespace_name
|
362
|
-
pod_id
|
363
|
-
labels
|
364
|
-
'kubernetes.io/test'
|
357
|
+
'kubernetes' => {
|
358
|
+
'host' => 'jimmi-redhat.localnet',
|
359
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
360
|
+
'container_name' => 'fabric8-console-container',
|
361
|
+
'namespace_name' => 'default',
|
362
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
363
|
+
'labels' => {
|
364
|
+
'kubernetes.io/test' => 'somevalue'
|
365
365
|
}
|
366
366
|
}
|
367
367
|
}
|
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: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmi Dyson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|