fluent-plugin-kubernetes_metadata_filter 0.19.0 → 0.20.0
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
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
|