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: 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