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: d416c5f8475c4e31bddd005256a2851e78a74e38
4
- data.tar.gz: 7809e9ab94d1245534d3b02af1ed11b456cfb8e8
3
+ metadata.gz: 5406b418d455a9baa0cd3ae7ea62cc271bb3c501
4
+ data.tar.gz: ed73b4f32c33630d0ebbe441de8ca39ce85bf591
5
5
  SHA512:
6
- metadata.gz: c5df22798cf63a8118dac365e1d3617192e9bbe1d5420425f4ece9948c52abc5242283b1b50c165a3ed33b6571540e05ab9a84b939ab5613a5026cf2c518ad8a
7
- data.tar.gz: 4b8868d31d5395bb41a3109285857282cce6b98b5b5e9fc27a5822e8e5cbd02204f78061cc7532f2d9294d521687ab85444029cf7cffa1d666e98ccd5684a6a2
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. Push to the branch (`git push origin my-new-feature`)
91
- 5. Create new Pull Request
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.19.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: namespace_name,
55
- pod_id: metadata['metadata']['uid'],
56
- pod_name: pod_name,
57
- container_name: container_name,
58
- labels: labels,
59
- host: metadata['spec']['nodeName']
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: match_data['docker_id']
174
+ 'docker' => {
175
+ 'container_id' => match_data['docker_id']
159
176
  },
160
- kubernetes: {
161
- namespace_name: match_data['namespace'],
162
- pod_name: match_data['pod_name'],
163
- container_name: match_data['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[:kubernetes][:namespace_name]}_#{metadata[:kubernetes][:pod_name]}_#{metadata[:kubernetes][:container_name]}"
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[:kubernetes][:namespace_name],
175
- metadata[:kubernetes][:pod_name],
176
- metadata[:kubernetes][:container_name]
191
+ metadata['kubernetes']['namespace_name'],
192
+ metadata['kubernetes']['pod_name'],
193
+ metadata['kubernetes']['container_name']
177
194
  )
178
- metadata[:kubernetes] = kubernetes_metadata if kubernetes_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[:kubernetes][:namespace_name]
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[:kubernetes][:namespace_id] = namespace_id if namespace_id
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.to_sym] = v
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[:kubernetes][:labels] = labels
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
160
+ 'docker' => {
161
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
162
162
  },
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'
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
187
+ 'docker' => {
188
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
189
189
  },
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'
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
215
+ 'docker' => {
216
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
217
217
  },
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'
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
236
+ 'docker' => {
237
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
238
238
  },
239
- kubernetes: {
240
- pod_name: 'fabric8-console-controller-98rqc',
241
- container_name: 'fabric8-console-container',
242
- namespace_name: 'default',
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: ['v1beta3', 'v1']
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
257
+ 'docker' => {
258
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
259
259
  },
260
- kubernetes: {
261
- pod_name: 'fabric8-console-controller-98rqc',
262
- container_name: 'fabric8-console-container',
263
- namespace_name: 'default'
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: ['v1beta3', 'v1']
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
278
+ 'docker' => {
279
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
280
280
  },
281
- kubernetes: {
282
- pod_name: 'fabric8-console-controller.98rqc',
283
- container_name: 'fabric8-console-container',
284
- namespace_name: 'default'
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
327
+ 'docker' => {
328
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
329
329
  },
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'
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: '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
354
+ 'docker' => {
355
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
356
356
  },
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'
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.19.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-08 00:00:00.000000000 Z
11
+ date: 2016-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd