fluent-plugin-kubernetes_metadata_filter 2.13.0 → 3.8.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -55
  3. data/Rakefile +3 -4
  4. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/cpu.png +0 -0
  5. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/latency.png +0 -0
  6. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/loss.png +0 -0
  7. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/mem.png +0 -0
  8. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/readme.md +88 -0
  9. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/results.html +127 -0
  10. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/cpu.png +0 -0
  11. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/latency.png +0 -0
  12. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/loss.png +0 -0
  13. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/mem.png +0 -0
  14. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/readme.md +97 -0
  15. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/results.html +136 -0
  16. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/cpu.png +0 -0
  17. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/latency.png +0 -0
  18. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/loss.png +0 -0
  19. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/mem.png +0 -0
  20. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/readme.md +97 -0
  21. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/results.html +136 -0
  22. data/lib/fluent/plugin/filter_kubernetes_metadata.rb +308 -330
  23. data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +15 -11
  24. data/lib/fluent/plugin/kubernetes_metadata_common.rb +45 -49
  25. data/lib/fluent/plugin/kubernetes_metadata_stats.rb +18 -4
  26. data/lib/fluent/plugin/kubernetes_metadata_test_api_adapter.rb +39 -36
  27. data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +15 -12
  28. data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +19 -18
  29. metadata +29 -182
  30. data/.circleci/config.yml +0 -53
  31. data/.gitignore +0 -19
  32. data/.rubocop.yml +0 -57
  33. data/Gemfile +0 -9
  34. data/Gemfile.lock +0 -158
  35. data/fluent-plugin-kubernetes_metadata_filter.gemspec +0 -34
  36. data/lib/fluent/plugin/kubernetes_metadata_util.rb +0 -53
  37. data/test/cassettes/invalid_api_server_config.yml +0 -53
  38. data/test/cassettes/kubernetes_docker_metadata_annotations.yml +0 -205
  39. data/test/cassettes/kubernetes_docker_metadata_dotted_slashed_labels.yml +0 -197
  40. data/test/cassettes/kubernetes_get_api_v1.yml +0 -193
  41. data/test/cassettes/kubernetes_get_api_v1_using_token.yml +0 -195
  42. data/test/cassettes/kubernetes_get_namespace_default.yml +0 -69
  43. data/test/cassettes/kubernetes_get_namespace_default_using_token.yml +0 -71
  44. data/test/cassettes/kubernetes_get_pod.yml +0 -146
  45. data/test/cassettes/kubernetes_get_pod_container_init.yml +0 -145
  46. data/test/cassettes/kubernetes_get_pod_using_token.yml +0 -148
  47. data/test/cassettes/metadata_from_tag_and_journald_fields.yml +0 -153
  48. data/test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml +0 -285
  49. data/test/cassettes/valid_kubernetes_api_server.yml +0 -55
  50. data/test/cassettes/valid_kubernetes_api_server_using_token.yml +0 -57
  51. data/test/helper.rb +0 -82
  52. data/test/plugin/test.token +0 -1
  53. data/test/plugin/test_cache_stats.rb +0 -33
  54. data/test/plugin/test_cache_strategy.rb +0 -194
  55. data/test/plugin/test_filter_kubernetes_metadata.rb +0 -1093
  56. data/test/plugin/test_utils.rb +0 -56
  57. data/test/plugin/test_watch_namespaces.rb +0 -245
  58. data/test/plugin/test_watch_pods.rb +0 -344
  59. data/test/plugin/watch_test.rb +0 -76
@@ -1,1093 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
5
- # Kubernetes metadata
6
- #
7
- # Copyright 2015 Red Hat, Inc.
8
- #
9
- # Licensed under the Apache License, Version 2.0 (the "License");
10
- # you may not use this file except in compliance with the License.
11
- # You may obtain a copy of the License at
12
- #
13
- # http://www.apache.org/licenses/LICENSE-2.0
14
- #
15
- # Unless required by applicable law or agreed to in writing, software
16
- # distributed under the License is distributed on an "AS IS" BASIS,
17
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- # See the License for the specific language governing permissions and
19
- # limitations under the License.
20
- #
21
- require_relative '../helper'
22
-
23
- class KubernetesMetadataFilterTest < Test::Unit::TestCase
24
- include Fluent
25
-
26
- setup do
27
- Fluent::Test.setup
28
- @time = Fluent::Engine.now
29
- end
30
-
31
- VAR_LOG_CONTAINER_TAG = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
32
- VAR_LOG_POD_TAG = 'var.log.pods.default_fabric8-console-controller-98rqc_c76927af-f563-11e4-b32d-54ee7527188d.fabric8-console-container.0.log'
33
-
34
- def create_driver(conf = '')
35
- Test::Driver::Filter.new(Plugin::KubernetesMetadataFilter).configure(conf)
36
- end
37
-
38
- sub_test_case 'configure' do
39
- test 'check default' do
40
- d = create_driver
41
- assert_equal(1000, d.instance.cache_size)
42
- end
43
-
44
- test 'check test_api_adapter' do
45
- d = create_driver('test_api_adapter KubernetesMetadata::TestApiAdapter')
46
- assert_equal('KubernetesMetadata::TestApiAdapter', d.instance.test_api_adapter)
47
- end
48
-
49
- test 'kubernetes url' do
50
- VCR.use_cassette('valid_kubernetes_api_server') do
51
- d = create_driver('
52
- kubernetes_url https://localhost:8443
53
- watch false
54
- ')
55
- assert_equal('https://localhost:8443', d.instance.kubernetes_url)
56
- assert_equal(1000, d.instance.cache_size)
57
- end
58
- end
59
-
60
- test 'cache size' do
61
- VCR.use_cassette('valid_kubernetes_api_server') do
62
- d = create_driver('
63
- kubernetes_url https://localhost:8443
64
- watch false
65
- cache_size 1
66
- ')
67
- assert_equal('https://localhost:8443', d.instance.kubernetes_url)
68
- assert_equal(1, d.instance.cache_size)
69
- end
70
- end
71
-
72
- test 'invalid API server config' do
73
- VCR.use_cassette('invalid_api_server_config') do
74
- assert_raise Fluent::ConfigError do
75
- create_driver('
76
- kubernetes_url https://localhost:8443
77
- bearer_token_file test/plugin/test.token
78
- watch false
79
- verify_ssl false
80
- ')
81
- end
82
- end
83
- end
84
-
85
- test 'service account credentials' do
86
- VCR.use_cassette('valid_kubernetes_api_server') do
87
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
88
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
89
-
90
- Dir.mktmpdir do |dir|
91
- # Fake token file and CA crt.
92
- expected_cert_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_CA_CERT)
93
- expected_token_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_TOKEN)
94
-
95
- File.open(expected_cert_path, 'w')
96
- File.open(expected_token_path, 'w')
97
-
98
- d = create_driver("
99
- watch false
100
- secret_dir #{dir}
101
- ")
102
-
103
- assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
104
- assert_equal(d.instance.ca_file, expected_cert_path)
105
- assert_equal(d.instance.bearer_token_file, expected_token_path)
106
- end
107
- ensure
108
- ENV['KUBERNETES_SERVICE_HOST'] = nil
109
- ENV['KUBERNETES_SERVICE_PORT'] = nil
110
- end
111
- end
112
-
113
- test 'service account credential files are tested for existence' do
114
- VCR.use_cassette('valid_kubernetes_api_server') do
115
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
116
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
117
-
118
- Dir.mktmpdir do |dir|
119
- d = create_driver("
120
- watch false
121
- secret_dir #{dir}
122
- ")
123
- assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
124
- assert_nil(d.instance.ca_file, nil)
125
- assert_nil(d.instance.bearer_token_file)
126
- end
127
- ensure
128
- ENV['KUBERNETES_SERVICE_HOST'] = nil
129
- ENV['KUBERNETES_SERVICE_PORT'] = nil
130
- end
131
- end
132
- end
133
-
134
- sub_test_case 'filter' do
135
- def emit(msg = {}, config = '
136
- kubernetes_url https://localhost:8443
137
- watch false
138
- cache_size 1
139
- ', d: nil)
140
- d = create_driver(config) if d.nil?
141
- d.run(default_tag: VAR_LOG_CONTAINER_TAG) do
142
- d.feed(@time, msg)
143
- end
144
- d.filtered.map(&:last)
145
- end
146
-
147
- def emit_with_tag(tag, msg = {}, config = '
148
- kubernetes_url https://localhost:8443
149
- watch false
150
- cache_size 1
151
- ')
152
- d = create_driver(config)
153
- d.run(default_tag: tag) do
154
- d.feed(@time, msg)
155
- end
156
- d.filtered.map(&:last)
157
- end
158
-
159
- sub_test_case 'parsing_pod_metadata when container_status is missing from the pod status' do
160
- test 'using the tag_to_kubernetes_name_regexp for /var/log/containers ' do
161
- VCR.use_cassettes(
162
- [
163
- { name: 'valid_kubernetes_api_server' },
164
- { name: 'kubernetes_get_api_v1' },
165
- { name: 'kubernetes_get_namespace_default' },
166
- { name: 'kubernetes_get_pod_container_init' }
167
- ]) do
168
- filtered = emit({}, "
169
- kubernetes_url https://localhost:8443
170
- watch false
171
- cache_size 1
172
- ")
173
- expected_kube_metadata = {
174
- 'docker' => {
175
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
176
- },
177
- 'kubernetes' => {
178
- 'container_image'=>'fabric8/hawtio-kubernetes:latest',
179
- 'container_name'=>'fabric8-console-container',
180
- 'host' => 'jimmi-redhat.localnet',
181
- 'pod_name' => 'fabric8-console-controller-98rqc',
182
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
183
- 'namespace_name' => 'default',
184
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
185
- 'pod_ip' => '172.17.0.8',
186
- 'master_url' => 'https://localhost:8443',
187
- 'labels' => {
188
- 'component' => 'fabric8Console'
189
- }
190
- }
191
- }
192
- assert_equal(expected_kube_metadata, filtered[0])
193
- end
194
- end
195
- test 'using the tag_to_kubernetes_name_regexp for /var/log/pods' do
196
- VCR.use_cassettes(
197
- [
198
- { name: 'valid_kubernetes_api_server' },
199
- { name: 'kubernetes_get_api_v1' },
200
- { name: 'kubernetes_get_namespace_default' },
201
- { name: 'kubernetes_get_pod_container_init' }
202
- ]) do
203
- filtered = emit_with_tag(VAR_LOG_POD_TAG,{}, "
204
- kubernetes_url https://localhost:8443
205
- watch false
206
- cache_size 1
207
- ")
208
- expected_kube_metadata = {
209
- 'kubernetes' => {
210
- 'container_image'=>'fabric8/hawtio-kubernetes:latest',
211
- 'container_name'=>'fabric8-console-container',
212
- 'host' => 'jimmi-redhat.localnet',
213
- 'pod_name' => 'fabric8-console-controller-98rqc',
214
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
215
- 'namespace_name' => 'default',
216
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
217
- 'pod_ip' => '172.17.0.8',
218
- 'master_url' => 'https://localhost:8443',
219
- 'labels' => {
220
- 'component' => 'fabric8Console'
221
- }
222
- }
223
- }
224
- assert_equal(expected_kube_metadata, filtered[0])
225
- end
226
- end
227
- end
228
-
229
- test 'inability to connect to the api server handles exception and doensnt block pipeline' do
230
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
231
- driver = create_driver('
232
- kubernetes_url https://localhost:8443
233
- watch false
234
- cache_size 1
235
- ')
236
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_raise(SocketError.new('error from pod fetch'))
237
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_raise(SocketError.new('socket error from namespace fetch'))
238
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
239
- expected_kube_metadata = {
240
- 'time' => '2015-05-08T09:22:01Z',
241
- 'docker'=>{
242
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
243
- },
244
- 'kubernetes' => {
245
- 'pod_name' => 'fabric8-console-controller-98rqc',
246
- 'container_name' => 'fabric8-console-container',
247
- 'namespace_id' => 'orphaned',
248
- 'namespace_name' => '.orphaned',
249
- 'orphaned_namespace' => 'default'
250
- }
251
- }
252
- assert_equal(expected_kube_metadata, filtered[0])
253
- end
254
- end
255
-
256
- test 'with docker & kubernetes metadata where id cache hit and metadata miss' do
257
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
258
- driver = create_driver('
259
- kubernetes_url https://localhost:8443
260
- watch false
261
- cache_size 1
262
- ')
263
- cache = driver.instance.instance_variable_get(:@id_cache)
264
- cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
265
- pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
266
- namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
267
- }
268
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
269
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
270
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
271
- expected_kube_metadata = {
272
- 'time' => '2015-05-08T09:22:01Z',
273
- 'docker' => {
274
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
275
- },
276
- 'kubernetes' => {
277
- 'pod_name' => 'fabric8-console-controller-98rqc',
278
- 'container_name' => 'fabric8-console-container',
279
- 'namespace_name' => 'default',
280
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
281
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d'
282
- }
283
- }
284
-
285
- assert_equal(expected_kube_metadata, filtered[0])
286
- end
287
- end
288
-
289
- test 'with docker & kubernetes metadata where id cache hit and metadata is reloaded' do
290
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
291
- driver = create_driver('
292
- kubernetes_url https://localhost:8443
293
- watch false
294
- cache_size 1
295
- ')
296
- cache = driver.instance.instance_variable_get(:@id_cache)
297
- cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
298
- pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
299
- namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
300
- }
301
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
302
- expected_kube_metadata = {
303
- 'time' => '2015-05-08T09:22:01Z',
304
- 'docker' => {
305
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
306
- },
307
- 'kubernetes' => {
308
- 'host' => 'jimmi-redhat.localnet',
309
- 'pod_name' => 'fabric8-console-controller-98rqc',
310
- 'container_name' => 'fabric8-console-container',
311
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
312
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
313
- 'namespace_name' => 'default',
314
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
315
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
316
- 'pod_ip' => '172.17.0.8',
317
- 'master_url' => 'https://localhost:8443',
318
- 'labels' => {
319
- 'component' => 'fabric8Console'
320
- }
321
- }
322
- }
323
-
324
- assert_equal(expected_kube_metadata, filtered[0])
325
- end
326
- end
327
-
328
- test 'with docker & kubernetes metadata' do
329
-
330
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
331
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' })
332
- expected_kube_metadata = {
333
- 'time' => '2015-05-08T09:22:01Z',
334
- 'docker' => {
335
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
336
- },
337
- 'kubernetes' => {
338
- 'host' => 'jimmi-redhat.localnet',
339
- 'pod_name' => 'fabric8-console-controller-98rqc',
340
- 'container_name' => 'fabric8-console-container',
341
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
342
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
343
- 'namespace_name' => 'default',
344
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
345
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
346
- 'pod_ip' => '172.17.0.8',
347
- 'master_url' => 'https://localhost:8443',
348
- 'labels' => {
349
- 'component' => 'fabric8Console'
350
- }
351
- }
352
- }
353
-
354
- assert_equal(expected_kube_metadata, filtered[0])
355
- end
356
- end
357
-
358
- test 'with docker & kubernetes metadata & namespace_id enabled' do
359
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
360
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } }]) do
361
- filtered = emit({}, '
362
- kubernetes_url https://localhost:8443
363
- watch false
364
- cache_size 1
365
- ')
366
- expected_kube_metadata = {
367
- 'docker' => {
368
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
369
- },
370
- 'kubernetes' => {
371
- 'host' => 'jimmi-redhat.localnet',
372
- 'pod_name' => 'fabric8-console-controller-98rqc',
373
- 'container_name' => 'fabric8-console-container',
374
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
375
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
376
- 'namespace_name' => 'default',
377
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
378
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
379
- 'pod_ip' => '172.17.0.8',
380
- 'master_url' => 'https://localhost:8443',
381
- 'labels' => {
382
- 'component' => 'fabric8Console'
383
- }
384
- }
385
- }
386
- assert_equal(expected_kube_metadata, filtered[0])
387
- end
388
- end
389
-
390
- test 'with docker & kubernetes metadata using bearer token' do
391
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server_using_token' }, { name: 'kubernetes_get_api_v1_using_token' },
392
- { name: 'kubernetes_get_pod_using_token' }, { name: 'kubernetes_get_namespace_default_using_token' }]) do
393
- filtered = emit({}, '
394
- kubernetes_url https://localhost:8443
395
- verify_ssl false
396
- watch false
397
- bearer_token_file test/plugin/test.token
398
- ')
399
- expected_kube_metadata = {
400
- 'docker' => {
401
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
402
- },
403
- 'kubernetes' => {
404
- 'host' => 'jimmi-redhat.localnet',
405
- 'pod_name' => 'fabric8-console-controller-98rqc',
406
- 'container_name' => 'fabric8-console-container',
407
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
408
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
409
- 'namespace_name' => 'default',
410
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
411
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
412
- 'pod_ip' => '172.17.0.8',
413
- 'master_url' => 'https://localhost:8443',
414
- 'labels' => {
415
- 'component' => 'fabric8Console'
416
- }
417
- }
418
- }
419
- assert_equal(expected_kube_metadata, filtered[0])
420
- end
421
- end
422
-
423
- test 'with docker & kubernetes metadata but no configured api server' do
424
- filtered = emit({}, '')
425
- expected_kube_metadata = {
426
- 'docker'=>{
427
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
428
- },
429
- 'kubernetes' => {
430
- 'pod_name' => 'fabric8-console-controller-98rqc',
431
- 'container_name' => 'fabric8-console-container',
432
- 'namespace_name' => 'default'
433
- }
434
- }
435
- assert_equal(expected_kube_metadata, filtered[0])
436
- end
437
-
438
- test 'with docker & inaccessible kubernetes metadata' do
439
- stub_request(:any, 'https://localhost:8443/api').to_return(
440
- 'body' => {
441
- 'versions' => ['v1beta3', 'v1']
442
- }.to_json
443
- )
444
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
445
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
446
- filtered = emit
447
- expected_kube_metadata = {
448
- 'docker'=>{
449
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
450
- },
451
- 'kubernetes' => {
452
- 'pod_name' => 'fabric8-console-controller-98rqc',
453
- 'container_name' => 'fabric8-console-container',
454
- 'namespace_name' => '.orphaned',
455
- 'orphaned_namespace' => 'default',
456
- 'namespace_id' => 'orphaned'
457
- }
458
- }
459
- assert_equal(expected_kube_metadata, filtered[0])
460
- end
461
-
462
- test 'with dot in pod name' do
463
- stub_request(:any, 'https://localhost:8443/api').to_return(
464
- 'body' => {
465
- 'versions' => ['v1beta3', 'v1']
466
- }.to_json
467
- )
468
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller.98rqc').to_timeout
469
- filtered = emit_with_tag('var.log.containers.fabric8-console-controller.98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log', {}, '')
470
- expected_kube_metadata = {
471
- 'docker'=>{
472
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
473
- },
474
- 'kubernetes' => {
475
- 'pod_name' => 'fabric8-console-controller.98rqc',
476
- 'container_name' => 'fabric8-console-container',
477
- 'namespace_name' => 'default'
478
- }
479
- }
480
- assert_equal(expected_kube_metadata, filtered[0])
481
- end
482
-
483
- test 'with docker metadata, non-kubernetes' do
484
- filtered = emit_with_tag('non-kubernetes', {}, '')
485
- assert_false(filtered[0].key?(:kubernetes))
486
- end
487
-
488
- test 'ignores invalid json in log field' do
489
- json_log = "{'foo':123}"
490
- msg = {
491
- 'log' => json_log
492
- }
493
- filtered = emit_with_tag('non-kubernetes', msg, '')
494
- assert_equal(msg, filtered[0])
495
- end
496
-
497
- test 'with kubernetes dotted and slashed labels, de_dot and de_slash enabled' do
498
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
499
- { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
500
- filtered = emit({}, '
501
- kubernetes_url https://localhost:8443
502
- watch false
503
- cache_size 1
504
- de_dot true
505
- de_slash true
506
- ')
507
- expected_kube_metadata = {
508
- 'docker' => {
509
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
510
- },
511
- 'kubernetes' => {
512
- 'host' => 'jimmi-redhat.localnet',
513
- 'pod_name' => 'fabric8-console-controller-98rqc',
514
- 'container_name' => 'fabric8-console-container',
515
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
516
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
517
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
518
- 'namespace_labels' => {
519
- 'kubernetes_io__namespacetest' => 'somevalue'
520
- },
521
- 'namespace_name' => 'default',
522
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
523
- 'pod_ip' => '172.17.0.8',
524
- 'master_url' => 'https://localhost:8443',
525
- 'labels' => {
526
- 'kubernetes_io__test' => 'somevalue'
527
- }
528
- }
529
- }
530
- assert_equal(expected_kube_metadata, filtered[0])
531
- end
532
- end
533
-
534
- test 'with kubernetes dotted and slashed labels, de_dot and de_slash disabled' do
535
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
536
- { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
537
- filtered = emit({}, '
538
- kubernetes_url https://localhost:8443
539
- watch false
540
- cache_size 1
541
- de_dot false
542
- de_slash false
543
- ')
544
- expected_kube_metadata = {
545
- 'docker' => {
546
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
547
- },
548
- 'kubernetes' => {
549
- 'host' => 'jimmi-redhat.localnet',
550
- 'pod_name' => 'fabric8-console-controller-98rqc',
551
- 'container_name' => 'fabric8-console-container',
552
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
553
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
554
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
555
- 'namespace_labels' => {
556
- 'kubernetes.io/namespacetest' => 'somevalue'
557
- },
558
- 'namespace_name' => 'default',
559
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
560
- 'pod_ip' => '172.17.0.8',
561
- 'master_url' => 'https://localhost:8443',
562
- 'labels' => {
563
- 'kubernetes.io/test' => 'somevalue'
564
- }
565
- }
566
- }
567
- assert_equal(expected_kube_metadata, filtered[0])
568
- end
569
- end
570
-
571
- test 'invalid de_dot_separator config' do
572
- assert_raise Fluent::ConfigError do
573
- create_driver('
574
- de_dot true
575
- de_dot_separator contains.
576
- ')
577
- end
578
- end
579
-
580
- test 'invalid de_slash_separator config' do
581
- assert_raise Fluent::ConfigError do
582
- create_driver('
583
- de_slash true
584
- de_slash_separator contains/
585
- ')
586
- end
587
- end
588
-
589
- test 'with records from journald and docker & kubernetes metadata' do
590
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
591
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
592
- msg = {
593
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
594
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
595
- 'randomfield' => 'randomvalue'
596
- }
597
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
598
- { name: 'kubernetes_get_namespace_default' }]) do
599
- filtered = emit_with_tag(tag, msg, '
600
- kubernetes_url https://localhost:8443
601
- watch false
602
- cache_size 1
603
- use_journal true
604
- ')
605
- expected_kube_metadata = {
606
- 'docker' => {
607
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
608
- },
609
- 'kubernetes' => {
610
- 'host' => 'jimmi-redhat.localnet',
611
- 'pod_name' => 'fabric8-console-controller-98rqc',
612
- 'container_name' => 'fabric8-console-container',
613
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
614
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
615
- 'namespace_name' => 'default',
616
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
617
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
618
- 'pod_ip' => '172.17.0.8',
619
- 'master_url' => 'https://localhost:8443',
620
- 'labels' => {
621
- 'component' => 'fabric8Console'
622
- }
623
- }
624
- }.merge(msg)
625
- assert_equal(expected_kube_metadata, filtered[0])
626
- end
627
- end
628
-
629
- test 'with records from journald and docker & kubernetes metadata & namespace_id enabled' do
630
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
631
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
632
- msg = {
633
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
634
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
635
- 'randomfield' => 'randomvalue'
636
- }
637
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
638
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } }]) do
639
- filtered = emit_with_tag(tag, msg, '
640
- kubernetes_url https://localhost:8443
641
- watch false
642
- cache_size 1
643
- use_journal true
644
- ')
645
- expected_kube_metadata = {
646
- 'docker' => {
647
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
648
- },
649
- 'kubernetes' => {
650
- 'host' => 'jimmi-redhat.localnet',
651
- 'pod_name' => 'fabric8-console-controller-98rqc',
652
- 'container_name' => 'fabric8-console-container',
653
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
654
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
655
- 'namespace_name' => 'default',
656
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
657
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
658
- 'pod_ip' => '172.17.0.8',
659
- 'master_url' => 'https://localhost:8443',
660
- 'labels' => {
661
- 'component' => 'fabric8Console'
662
- }
663
- }
664
- }.merge(msg)
665
- assert_equal(expected_kube_metadata, filtered[0])
666
- end
667
- end
668
-
669
- test 'with records from journald and docker & kubernetes metadata with use_journal unset' do
670
- # with use_journal unset, should still use the journal fields instead of tag fields
671
- tag = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
672
- msg = {
673
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
674
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
675
- 'kubernetes' => {
676
- 'namespace_name' => 'k8s-namespace-name',
677
- 'pod_name' => 'k8s-pod-name',
678
- 'container_name' => 'k8s-container-name'
679
- },
680
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
681
- 'randomfield' => 'randomvalue'
682
- }
683
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
684
- { name: 'kubernetes_get_namespace_default' },
685
- { name: 'metadata_from_tag_journald_and_kubernetes_fields' }]) do
686
- es = emit_with_tag(tag, msg, '
687
- kubernetes_url https://localhost:8443
688
- watch false
689
- cache_size 1
690
- ')
691
- expected_kube_metadata = {
692
- 'docker' => {
693
- 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95'
694
- },
695
- 'kubernetes' => {
696
- 'host' => 'jimmi-redhat.localnet',
697
- 'pod_name' => 'k8s-pod-name',
698
- 'container_name' => 'k8s-container-name',
699
- 'container_image' => 'k8s-container-image:latest',
700
- 'container_image_id' => 'docker://d78c5217c41e9af08d37d9ae2cb070afa1fe3da6bc77bfb18879a8b4bfdf8a34',
701
- 'namespace_name' => 'k8s-namespace-name',
702
- 'namespace_id' => '8e0dc8fc-59f2-49f7-a3e2-ed0913e19d9f',
703
- 'pod_id' => 'ebabf749-5fcd-4750-a3f0-aedd89476da8',
704
- 'pod_ip' => '172.17.0.8',
705
- 'master_url' => 'https://localhost:8443',
706
- 'labels' => {
707
- 'component' => 'k8s-test'
708
- }
709
- }
710
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
711
- assert_equal(expected_kube_metadata, es[0])
712
- end
713
- end
714
-
715
- test 'with records from journald and docker & kubernetes metadata with lookup_from_k8s_field false' do
716
- # with use_journal unset, should still use the journal fields instead of tag fields
717
- tag = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
718
- msg = {
719
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
720
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
721
- 'kubernetes' => {
722
- 'namespace_name' => 'k8s-namespace-name',
723
- 'pod_name' => 'k8s-pod-name',
724
- 'container_name' => 'k8s-container-name'
725
- },
726
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
727
- 'randomfield' => 'randomvalue'
728
- }
729
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
730
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } },
731
- { name: 'metadata_from_tag_and_journald_fields' }]) do
732
- es = emit_with_tag(tag, msg, '
733
- kubernetes_url https://localhost:8443
734
- watch false
735
- cache_size 1
736
- lookup_from_k8s_field false
737
- ')
738
- expected_kube_metadata = {
739
- 'docker' => {
740
- 'container_id' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b'
741
- },
742
- 'kubernetes' => {
743
- 'host' => 'jimmi-redhat.localnet',
744
- 'pod_name' => 'journald-pod-name',
745
- 'container_name' => 'journald-container-name',
746
- 'container_image' => 'journald-container-image:latest',
747
- 'container_image_id' => 'docker://dda4c95705fb7050b701b10a7fe928ca5bc971a1dcb521ae3c339194cbf36b47',
748
- 'namespace_name' => 'journald-namespace-name',
749
- 'namespace_id' => '8282888f-733f-4f23-a3d3-1fdfa3bdacf2',
750
- 'pod_id' => '5e1c1e27-b637-4e81-80b6-6d8a8c404d3b',
751
- 'pod_ip' => '172.17.0.8',
752
- 'master_url' => 'https://localhost:8443',
753
- 'labels' => {
754
- 'component' => 'journald-test'
755
- }
756
- }
757
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
758
- assert_equal(expected_kube_metadata, es[0])
759
- end
760
- end
761
-
762
- test 'uses metadata from tag if use_journal false and lookup_from_k8s_field false' do
763
- # with use_journal unset, should still use the journal fields instead of tag fields
764
- msg = {
765
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
766
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
767
- 'kubernetes' => {
768
- 'namespace_name' => 'k8s-namespace-name',
769
- 'pod_name' => 'k8s-pod-name',
770
- 'container_name' => 'k8s-container-name'
771
- },
772
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
773
- 'randomfield' => 'randomvalue'
774
- }
775
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
776
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } },
777
- { name: 'metadata_from_tag_and_journald_fields' }]) do
778
- es = emit_with_tag(VAR_LOG_CONTAINER_TAG, msg, "
779
- kubernetes_url https://localhost:8443
780
- watch false
781
- cache_size 1
782
- lookup_from_k8s_field false
783
- use_journal false
784
- ")
785
- expected_kube_metadata = {
786
- 'docker' => {
787
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
788
- },
789
- 'kubernetes' => {
790
- 'host' => 'jimmi-redhat.localnet',
791
- 'pod_name' => 'fabric8-console-controller-98rqc',
792
- 'container_name' => 'fabric8-console-container',
793
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
794
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
795
- 'namespace_name' => 'default',
796
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
797
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
798
- 'pod_ip' => '172.17.0.8',
799
- 'master_url' => 'https://localhost:8443',
800
- 'labels' => {
801
- 'component' => 'fabric8Console'
802
- }
803
- }
804
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
805
- assert_equal(expected_kube_metadata, es[0])
806
- end
807
- end
808
-
809
- test 'with kubernetes annotations' do
810
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
811
- { name: 'kubernetes_docker_metadata_annotations' },
812
- { name: 'kubernetes_get_namespace_default' }]) do
813
- filtered = emit({}, '
814
- kubernetes_url https://localhost:8443
815
- watch false
816
- cache_size 1
817
- annotation_match [ "^custom.+", "two"]
818
- ')
819
- expected_kube_metadata = {
820
- 'docker' => {
821
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
822
- },
823
- 'kubernetes' => {
824
- 'host' => 'jimmi-redhat.localnet',
825
- 'pod_name' => 'fabric8-console-controller-98rqc',
826
- 'container_name' => 'fabric8-console-container',
827
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
828
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
829
- 'namespace_name' => 'default',
830
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
831
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
832
- 'pod_ip' => '172.17.0.8',
833
- 'master_url' => 'https://localhost:8443',
834
- 'labels' => {
835
- 'component' => 'fabric8Console'
836
- },
837
- 'annotations' => {
838
- 'custom_field1' => 'hello_kitty',
839
- 'field_two' => 'value'
840
- }
841
- }
842
- }
843
- assert_equal(expected_kube_metadata, filtered[0])
844
- end
845
- end
846
-
847
- test 'with records from journald and docker & kubernetes metadata, alternate form' do
848
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
849
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
850
- msg = {
851
- 'CONTAINER_NAME' => 'alt_fabric8-console-container_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_0',
852
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
853
- 'randomfield' => 'randomvalue'
854
- }
855
- VCR.use_cassettes([
856
- { name: 'valid_kubernetes_api_server' },
857
- { name: 'kubernetes_get_api_v1' },
858
- { name: 'kubernetes_get_pod' },
859
- { name: 'kubernetes_get_namespace_default' },
860
- { name: 'metadata_from_tag_and_journald_fields' }
861
- ]) do
862
- filtered = emit_with_tag(tag, msg, '
863
- kubernetes_url https://localhost:8443
864
- watch false
865
- cache_size 1
866
- use_journal true
867
- ')
868
- expected_kube_metadata = {
869
- 'docker' => {
870
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
871
- },
872
- 'kubernetes' => {
873
- 'host' => 'jimmi-redhat.localnet',
874
- 'pod_name' => 'fabric8-console-controller-98rqc',
875
- 'container_name' => 'fabric8-console-container',
876
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
877
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
878
- 'namespace_name' => 'default',
879
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
880
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
881
- 'pod_ip' => '172.17.0.8',
882
- 'master_url' => 'https://localhost:8443',
883
- 'labels' => {
884
- 'component' => 'fabric8Console'
885
- }
886
- }
887
- }.merge(msg)
888
- assert_equal(expected_kube_metadata, filtered[0])
889
- end
890
- end
891
-
892
- test 'with kubernetes namespace annotations' do
893
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
894
- { name: 'kubernetes_docker_metadata_annotations' },
895
- { name: 'kubernetes_get_namespace_default' }]) do
896
- filtered = emit({}, '
897
- kubernetes_url https://localhost:8443
898
- watch false
899
- cache_size 1
900
- annotation_match [ "^custom.+", "two", "workspace*"]
901
- ')
902
- expected_kube_metadata = {
903
- 'docker' => {
904
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
905
- },
906
- 'kubernetes' => {
907
- 'host' => 'jimmi-redhat.localnet',
908
- 'pod_name' => 'fabric8-console-controller-98rqc',
909
- 'container_name' => 'fabric8-console-container',
910
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
911
- 'namespace_name' => 'default',
912
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
913
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
914
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
915
- 'pod_ip' => '172.17.0.8',
916
- 'master_url' => 'https://localhost:8443',
917
- 'labels' => {
918
- 'component' => 'fabric8Console'
919
- },
920
- 'annotations' => {
921
- 'custom_field1' => 'hello_kitty',
922
- 'field_two' => 'value'
923
- },
924
- 'namespace_annotations' => {
925
- 'workspaceId' => 'myWorkspaceName'
926
- }
927
- }
928
- }
929
- assert_equal(expected_kube_metadata, filtered[0])
930
- end
931
- end
932
-
933
- test 'with kubernetes namespace annotations no match' do
934
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
935
- { name: 'kubernetes_docker_metadata_annotations' },
936
- { name: 'kubernetes_get_namespace_default' }]) do
937
- filtered = emit({}, '
938
- kubernetes_url https://localhost:8443
939
- watch false
940
- cache_size 1
941
- annotation_match [ "noMatch*"]
942
- ')
943
- expected_kube_metadata = {
944
- 'docker' => {
945
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
946
- },
947
- 'kubernetes' => {
948
- 'host' => 'jimmi-redhat.localnet',
949
- 'pod_name' => 'fabric8-console-controller-98rqc',
950
- 'container_name' => 'fabric8-console-container',
951
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
952
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
953
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
954
- 'namespace_name' => 'default',
955
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
956
- 'pod_ip' => '172.17.0.8',
957
- 'master_url' => 'https://localhost:8443',
958
- 'labels' => {
959
- 'component' => 'fabric8Console'
960
- }
961
- }
962
- }
963
- assert_equal(expected_kube_metadata, filtered[0])
964
- end
965
- end
966
-
967
- test 'with CONTAINER_NAME that does not match' do
968
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
969
- msg = {
970
- 'CONTAINER_NAME' => 'does_not_match',
971
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
972
- 'randomfield' => 'randomvalue'
973
- }
974
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
975
- { name: 'kubernetes_docker_metadata_annotations' },
976
- { name: 'kubernetes_get_namespace_default' }]) do
977
- filtered = emit_with_tag(tag, msg, '
978
- kubernetes_url https://localhost:8443
979
- watch false
980
- cache_size 1
981
- use_journal true
982
- ')
983
- expected_kube_metadata = {
984
- 'CONTAINER_NAME' => 'does_not_match',
985
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
986
- 'randomfield' => 'randomvalue'
987
- }
988
- assert_equal(expected_kube_metadata, filtered[0])
989
- end
990
- end
991
-
992
- test 'with CONTAINER_NAME starts with k8s_ that does not match' do
993
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
994
- msg = {
995
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
996
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
997
- 'randomfield' => 'randomvalue'
998
- }
999
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
1000
- { name: 'kubernetes_docker_metadata_annotations' },
1001
- { name: 'kubernetes_get_namespace_default' }]) do
1002
- filtered = emit_with_tag(tag, msg, '
1003
- kubernetes_url https://localhost:8443
1004
- watch false
1005
- cache_size 1
1006
- use_journal true
1007
- ')
1008
- expected_kube_metadata = {
1009
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
1010
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
1011
- 'randomfield' => 'randomvalue'
1012
- }
1013
- assert_equal(expected_kube_metadata, filtered[0])
1014
- end
1015
- end
1016
-
1017
- test 'processes all events when reading from MessagePackEventStream' do
1018
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
1019
- { name: 'kubernetes_get_api_v1' },
1020
- { name: 'kubernetes_get_pod' },
1021
- { name: 'kubernetes_get_namespace_default' }]) do
1022
- entries = [[@time, { 'time' => '2015-05-08T09:22:01Z' }], [@time, { 'time' => '2015-05-08T09:22:01Z' }]]
1023
- array_stream = Fluent::ArrayEventStream.new(entries)
1024
- msgpack_stream = Fluent::MessagePackEventStream.new(array_stream.to_msgpack_stream)
1025
-
1026
- d = create_driver('
1027
- kubernetes_url https://localhost:8443
1028
- watch false
1029
- cache_size 1
1030
- ')
1031
- d.run do
1032
- d.feed(VAR_LOG_CONTAINER_TAG, msgpack_stream)
1033
- end
1034
- filtered = d.filtered.map(&:last)
1035
-
1036
- expected_kube_metadata = {
1037
- 'time' => '2015-05-08T09:22:01Z',
1038
- 'docker' => {
1039
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
1040
- },
1041
- 'kubernetes' => {
1042
- 'host' => 'jimmi-redhat.localnet',
1043
- 'pod_name' => 'fabric8-console-controller-98rqc',
1044
- 'container_name' => 'fabric8-console-container',
1045
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
1046
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
1047
- 'namespace_name' => 'default',
1048
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
1049
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
1050
- 'pod_ip' => '172.17.0.8',
1051
- 'master_url' => 'https://localhost:8443',
1052
- 'labels' => {
1053
- 'component' => 'fabric8Console'
1054
- }
1055
- }
1056
- }
1057
-
1058
- assert_equal(expected_kube_metadata, filtered[0])
1059
- assert_equal(expected_kube_metadata, filtered[1])
1060
- end
1061
- end
1062
-
1063
- test 'with docker & kubernetes metadata using skip config params' do
1064
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
1065
- { name: 'kubernetes_get_namespace_default' }]) do
1066
- filtered = emit({}, '
1067
- kubernetes_url https://localhost:8443
1068
- watch false
1069
- cache_size 1
1070
- skip_labels true
1071
- skip_container_metadata true
1072
- skip_master_url true
1073
- skip_namespace_metadata true
1074
- ')
1075
- expected_kube_metadata = {
1076
- 'docker'=>{
1077
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
1078
- },
1079
- 'kubernetes' => {
1080
- 'host' => 'jimmi-redhat.localnet',
1081
- 'pod_name' => 'fabric8-console-controller-98rqc',
1082
- 'container_name' => 'fabric8-console-container',
1083
- 'namespace_name' => 'default',
1084
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
1085
- 'pod_ip' => '172.17.0.8'
1086
- }
1087
- }
1088
-
1089
- assert_equal(expected_kube_metadata, filtered[0])
1090
- end
1091
- end
1092
- end
1093
- end