fluent-plugin-kubernetes_metadata_filter 2.1.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +53 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +57 -0
  5. data/Gemfile +4 -2
  6. data/Gemfile.lock +159 -0
  7. data/README.md +49 -60
  8. data/Rakefile +15 -11
  9. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/cpu.png +0 -0
  10. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/latency.png +0 -0
  11. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/loss.png +0 -0
  12. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/mem.png +0 -0
  13. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/readme.md +88 -0
  14. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/results.html +127 -0
  15. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/cpu.png +0 -0
  16. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/latency.png +0 -0
  17. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/loss.png +0 -0
  18. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/mem.png +0 -0
  19. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/readme.md +97 -0
  20. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/results.html +136 -0
  21. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/cpu.png +0 -0
  22. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/latency.png +0 -0
  23. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/loss.png +0 -0
  24. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/mem.png +0 -0
  25. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/readme.md +97 -0
  26. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/results.html +136 -0
  27. data/fluent-plugin-kubernetes_metadata_filter.gemspec +25 -28
  28. data/lib/fluent/plugin/filter_kubernetes_metadata.rb +207 -187
  29. data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +30 -23
  30. data/lib/fluent/plugin/kubernetes_metadata_common.rb +66 -24
  31. data/lib/fluent/plugin/kubernetes_metadata_stats.rb +21 -5
  32. data/lib/fluent/plugin/kubernetes_metadata_test_api_adapter.rb +68 -0
  33. data/lib/fluent/plugin/kubernetes_metadata_util.rb +33 -0
  34. data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +154 -27
  35. data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +171 -29
  36. data/release_notes.md +42 -0
  37. data/test/cassettes/kubernetes_docker_metadata_annotations.yml +0 -34
  38. data/test/cassettes/{kubernetes_docker_metadata_dotted_labels.yml → kubernetes_docker_metadata_dotted_slashed_labels.yml} +0 -34
  39. data/test/cassettes/kubernetes_get_api_v1.yml +193 -0
  40. data/test/cassettes/kubernetes_get_api_v1_using_token.yml +195 -0
  41. data/test/cassettes/kubernetes_get_namespace_default.yml +72 -0
  42. data/test/cassettes/kubernetes_get_namespace_default_using_token.yml +71 -0
  43. data/test/cassettes/{kubernetes_docker_metadata.yml → kubernetes_get_pod.yml} +0 -82
  44. data/test/cassettes/kubernetes_get_pod_container_init.yml +145 -0
  45. data/test/cassettes/{metadata_with_namespace_id.yml → kubernetes_get_pod_using_token.yml} +2 -130
  46. data/test/cassettes/{kubernetes_docker_metadata_using_bearer_token.yml → kubernetes_get_pod_with_ownerrefs.yml} +17 -109
  47. data/test/cassettes/metadata_from_tag_and_journald_fields.yml +153 -0
  48. data/test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml +285 -0
  49. data/test/cassettes/{non_kubernetes_docker_metadata.yml → valid_kubernetes_api_server_using_token.yml} +4 -44
  50. data/test/helper.rb +20 -2
  51. data/test/plugin/test_cache_stats.rb +10 -13
  52. data/test/plugin/test_cache_strategy.rb +158 -160
  53. data/test/plugin/test_filter_kubernetes_metadata.rb +451 -314
  54. data/test/plugin/test_watch_namespaces.rb +209 -55
  55. data/test/plugin/test_watch_pods.rb +302 -71
  56. data/test/plugin/watch_test.rb +52 -33
  57. metadata +91 -70
  58. data/circle.yml +0 -17
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
3
5
  # Kubernetes metadata
@@ -17,11 +19,6 @@
17
19
  # limitations under the License.
18
20
  #
19
21
  require_relative '../helper'
20
- require 'fluent/test/driver/filter'
21
- require 'fluent/plugin/filter_kubernetes_metadata'
22
-
23
- require 'webmock/test_unit'
24
- WebMock.disable_net_connect!
25
22
 
26
23
  class KubernetesMetadataFilterTest < Test::Unit::TestCase
27
24
  include Fluent
@@ -31,7 +28,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
31
28
  @time = Fluent::Engine.now
32
29
  end
33
30
 
34
- DEFAULT_TAG = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
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'
35
33
 
36
34
  def create_driver(conf = '')
37
35
  Test::Driver::Filter.new(Plugin::KubernetesMetadataFilter).configure(conf)
@@ -43,6 +41,29 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
43
41
  assert_equal(1000, d.instance.cache_size)
44
42
  end
45
43
 
44
+ sub_test_case 'stats_interval' do
45
+
46
+ test 'enables stats when greater than zero' do
47
+ d = create_driver('stats_interval 1')
48
+ assert_equal(1, d.instance.stats_interval)
49
+ d.instance.dump_stats
50
+ assert_false(d.instance.instance_variable_get("@curr_time").nil?)
51
+ end
52
+
53
+ test 'disables stats when <= zero' do
54
+ d = create_driver('stats_interval 0')
55
+ assert_equal(0, d.instance.stats_interval)
56
+ d.instance.dump_stats
57
+ assert_nil(d.instance.instance_variable_get("@curr_time"))
58
+ end
59
+
60
+ end
61
+
62
+ test 'check test_api_adapter' do
63
+ d = create_driver('test_api_adapter KubernetesMetadata::TestApiAdapter')
64
+ assert_equal('KubernetesMetadata::TestApiAdapter', d.instance.test_api_adapter)
65
+ end
66
+
46
67
  test 'kubernetes url' do
47
68
  VCR.use_cassette('valid_kubernetes_api_server') do
48
69
  d = create_driver('
@@ -81,91 +102,183 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
81
102
 
82
103
  test 'service account credentials' do
83
104
  VCR.use_cassette('valid_kubernetes_api_server') do
84
- begin
85
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
86
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
105
+ ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
106
+ ENV['KUBERNETES_SERVICE_PORT'] = '8443'
87
107
 
88
- Dir.mktmpdir { |dir|
89
- # Fake token file and CA crt.
90
- expected_cert_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_CA_CERT)
91
- expected_token_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_TOKEN)
108
+ Dir.mktmpdir do |dir|
109
+ # Fake token file and CA crt.
110
+ expected_cert_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_CA_CERT)
111
+ expected_token_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_TOKEN)
92
112
 
93
- File.open(expected_cert_path, "w") {}
94
- File.open(expected_token_path, "w") {}
113
+ File.open(expected_cert_path, 'w')
114
+ File.open(expected_token_path, 'w')
95
115
 
96
- d = create_driver("
116
+ d = create_driver("
97
117
  watch false
98
118
  secret_dir #{dir}
99
119
  ")
100
120
 
101
- assert_equal(d.instance.kubernetes_url, "https://localhost:8443/api")
102
- assert_equal(d.instance.ca_file, expected_cert_path)
103
- assert_equal(d.instance.bearer_token_file, expected_token_path)
104
- }
105
- ensure
106
- ENV['KUBERNETES_SERVICE_HOST'] = nil
107
- ENV['KUBERNETES_SERVICE_PORT'] = nil
121
+ assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
122
+ assert_equal(d.instance.ca_file, expected_cert_path)
123
+ assert_equal(d.instance.bearer_token_file, expected_token_path)
108
124
  end
125
+ ensure
126
+ ENV['KUBERNETES_SERVICE_HOST'] = nil
127
+ ENV['KUBERNETES_SERVICE_PORT'] = nil
109
128
  end
110
129
  end
111
130
 
112
131
  test 'service account credential files are tested for existence' do
113
132
  VCR.use_cassette('valid_kubernetes_api_server') do
114
- begin
115
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
116
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
133
+ ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
134
+ ENV['KUBERNETES_SERVICE_PORT'] = '8443'
117
135
 
118
- Dir.mktmpdir { |dir|
119
- d = create_driver("
136
+ Dir.mktmpdir do |dir|
137
+ d = create_driver("
120
138
  watch false
121
139
  secret_dir #{dir}
122
140
  ")
123
- assert_equal(d.instance.kubernetes_url, "https://localhost:8443/api")
124
- assert_false(d.instance.ca_file.present?)
125
- assert_false(d.instance.bearer_token_file.present?)
126
- }
127
- ensure
128
- ENV['KUBERNETES_SERVICE_HOST'] = nil
129
- ENV['KUBERNETES_SERVICE_PORT'] = nil
141
+ assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
142
+ assert_nil(d.instance.ca_file, nil)
143
+ assert_nil(d.instance.bearer_token_file)
130
144
  end
145
+ ensure
146
+ ENV['KUBERNETES_SERVICE_HOST'] = nil
147
+ ENV['KUBERNETES_SERVICE_PORT'] = nil
131
148
  end
132
149
  end
133
150
  end
134
151
 
135
- sub_test_case 'filter_stream' do
136
-
137
- def emit(msg={}, config='
152
+ sub_test_case 'filter' do
153
+ def emit(msg = {}, config = '
138
154
  kubernetes_url https://localhost:8443
139
155
  watch false
140
156
  cache_size 1
141
157
  ', d: nil)
142
158
  d = create_driver(config) if d.nil?
143
- if ENV['LOGLEVEL']
144
- logger = Logger.new(STDOUT)
145
- logger.level = eval("Logger::#{ENV['LOGLEVEL'].upcase}")
146
- instance = d.instance
147
- instance.instance_variable_set(:@log,logger)
148
- end
149
- d.run(default_tag: DEFAULT_TAG) {
159
+ d.run(default_tag: VAR_LOG_CONTAINER_TAG) do
150
160
  d.feed(@time, msg)
151
- }
152
- d.filtered.map{|e| e.last}
161
+ end
162
+ d.filtered.map(&:last)
153
163
  end
154
164
 
155
- def emit_with_tag(tag, msg={}, config='
165
+ def emit_with_tag(tag, msg = {}, config = '
156
166
  kubernetes_url https://localhost:8443
157
167
  watch false
158
168
  cache_size 1
159
169
  ')
160
170
  d = create_driver(config)
161
- d.run(default_tag: tag) {
171
+ d.run(default_tag: tag) do
162
172
  d.feed(@time, msg)
163
- }
164
- d.filtered.map{|e| e.last}
173
+ end
174
+ d.filtered.map(&:last)
175
+ end
176
+
177
+ sub_test_case 'parsing_pod_metadata when container_status is missing from the pod status' do
178
+ test 'using the tag_to_kubernetes_name_regexp for /var/log/containers ' do
179
+ VCR.use_cassettes(
180
+ [
181
+ { name: 'valid_kubernetes_api_server' },
182
+ { name: 'kubernetes_get_api_v1' },
183
+ { name: 'kubernetes_get_namespace_default' },
184
+ { name: 'kubernetes_get_pod_container_init' }
185
+ ]) do
186
+ filtered = emit({}, "
187
+ kubernetes_url https://localhost:8443
188
+ watch false
189
+ cache_size 1
190
+ ")
191
+ expected_kube_metadata = {
192
+ 'docker' => {
193
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
194
+ },
195
+ 'kubernetes' => {
196
+ 'container_image'=>'fabric8/hawtio-kubernetes:latest',
197
+ 'container_name'=>'fabric8-console-container',
198
+ 'host' => 'jimmi-redhat.localnet',
199
+ 'pod_name' => 'fabric8-console-controller-98rqc',
200
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
201
+ 'namespace_name' => 'default',
202
+ 'namespace_labels' => {
203
+ 'tenant' => 'test'
204
+ },
205
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
206
+ 'pod_ip' => '172.17.0.8',
207
+ 'master_url' => 'https://localhost:8443',
208
+ 'labels' => {
209
+ 'component' => 'fabric8Console'
210
+ }
211
+ }
212
+ }
213
+ assert_equal(expected_kube_metadata, filtered[0])
214
+ end
215
+ end
216
+ test 'using the tag_to_kubernetes_name_regexp for /var/log/pods' do
217
+ VCR.use_cassettes(
218
+ [
219
+ { name: 'valid_kubernetes_api_server' },
220
+ { name: 'kubernetes_get_api_v1' },
221
+ { name: 'kubernetes_get_namespace_default' },
222
+ { name: 'kubernetes_get_pod_container_init' }
223
+ ]) do
224
+ filtered = emit_with_tag(VAR_LOG_POD_TAG,{}, "
225
+ kubernetes_url https://localhost:8443
226
+ watch false
227
+ cache_size 1
228
+ ")
229
+ expected_kube_metadata = {
230
+ 'kubernetes' => {
231
+ 'container_image'=>'fabric8/hawtio-kubernetes:latest',
232
+ 'container_name'=>'fabric8-console-container',
233
+ 'host' => 'jimmi-redhat.localnet',
234
+ 'pod_name' => 'fabric8-console-controller-98rqc',
235
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
236
+ 'namespace_name' => 'default',
237
+ 'namespace_labels' => {
238
+ 'tenant' => 'test'
239
+ },
240
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
241
+ 'pod_ip' => '172.17.0.8',
242
+ 'master_url' => 'https://localhost:8443',
243
+ 'labels' => {
244
+ 'component' => 'fabric8Console'
245
+ }
246
+ }
247
+ }
248
+ assert_equal(expected_kube_metadata, filtered[0])
249
+ end
250
+ end
251
+ end
252
+
253
+ test 'inability to connect to the api server handles exception and doensnt block pipeline' do
254
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
255
+ driver = create_driver('
256
+ kubernetes_url https://localhost:8443
257
+ watch false
258
+ cache_size 1
259
+ ')
260
+ stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_raise(SocketError.new('error from pod fetch'))
261
+ stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_raise(SocketError.new('socket error from namespace fetch'))
262
+ filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
263
+ expected_kube_metadata = {
264
+ 'time' => '2015-05-08T09:22:01Z',
265
+ 'docker'=>{
266
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
267
+ },
268
+ 'kubernetes' => {
269
+ 'pod_name' => 'fabric8-console-controller-98rqc',
270
+ 'container_name' => 'fabric8-console-container',
271
+ 'namespace_id' => 'orphaned',
272
+ 'namespace_name' => '.orphaned',
273
+ 'orphaned_namespace' => 'default'
274
+ }
275
+ }
276
+ assert_equal(expected_kube_metadata, filtered[0])
277
+ end
165
278
  end
166
279
 
167
280
  test 'with docker & kubernetes metadata where id cache hit and metadata miss' do
168
- VCR.use_cassette('kubernetes_docker_metadata') do
281
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
169
282
  driver = create_driver('
170
283
  kubernetes_url https://localhost:8443
171
284
  watch false
@@ -173,23 +286,23 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
173
286
  ')
174
287
  cache = driver.instance.instance_variable_get(:@id_cache)
175
288
  cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
176
- :pod_id =>'c76927af-f563-11e4-b32d-54ee7527188d',
177
- :namespace_id =>'898268c8-4a36-11e5-9d81-42010af0194c'
289
+ pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
290
+ namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
178
291
  }
179
292
  stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
180
293
  stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
181
- filtered = emit({'time'=>'2015-05-08T09:22:01Z'}, '', d:driver)
294
+ filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
182
295
  expected_kube_metadata = {
183
- 'time'=>'2015-05-08T09:22:01Z',
296
+ 'time' => '2015-05-08T09:22:01Z',
184
297
  'docker' => {
185
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
298
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
186
299
  },
187
300
  'kubernetes' => {
188
- 'pod_name' => 'fabric8-console-controller-98rqc',
301
+ 'pod_name' => 'fabric8-console-controller-98rqc',
189
302
  'container_name' => 'fabric8-console-container',
190
303
  'namespace_name' => 'default',
191
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
192
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
304
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
305
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d'
193
306
  }
194
307
  }
195
308
 
@@ -198,7 +311,7 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
198
311
  end
199
312
 
200
313
  test 'with docker & kubernetes metadata where id cache hit and metadata is reloaded' do
201
- VCR.use_cassette('kubernetes_docker_metadata') do
314
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
202
315
  driver = create_driver('
203
316
  kubernetes_url https://localhost:8443
204
317
  watch false
@@ -206,23 +319,29 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
206
319
  ')
207
320
  cache = driver.instance.instance_variable_get(:@id_cache)
208
321
  cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
209
- :pod_id =>'c76927af-f563-11e4-b32d-54ee7527188d',
210
- :namespace_id =>'898268c8-4a36-11e5-9d81-42010af0194c'
322
+ pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
323
+ namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
211
324
  }
212
- filtered = emit({'time'=>'2015-05-08T09:22:01Z'}, '', d:driver)
325
+ filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
213
326
  expected_kube_metadata = {
214
- 'time'=>'2015-05-08T09:22:01Z',
327
+ 'time' => '2015-05-08T09:22:01Z',
215
328
  'docker' => {
216
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
329
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
217
330
  },
218
331
  'kubernetes' => {
219
- 'host' => 'jimmi-redhat.localnet',
220
- 'pod_name' => 'fabric8-console-controller-98rqc',
332
+ 'host' => 'jimmi-redhat.localnet',
333
+ 'pod_name' => 'fabric8-console-controller-98rqc',
221
334
  'container_name' => 'fabric8-console-container',
335
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
336
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
222
337
  'namespace_name' => 'default',
223
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
224
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
225
- 'master_url' => 'https://localhost:8443',
338
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
339
+ 'namespace_labels' => {
340
+ 'tenant' => 'test'
341
+ },
342
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
343
+ 'pod_ip' => '172.17.0.8',
344
+ 'master_url' => 'https://localhost:8443',
226
345
  'labels' => {
227
346
  'component' => 'fabric8Console'
228
347
  }
@@ -234,21 +353,28 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
234
353
  end
235
354
 
236
355
  test 'with docker & kubernetes metadata' do
237
- VCR.use_cassette('kubernetes_docker_metadata') do
238
- filtered = emit({'time'=>'2015-05-08T09:22:01Z'})
356
+
357
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
358
+ filtered = emit({ 'time' => '2015-05-08T09:22:01Z' })
239
359
  expected_kube_metadata = {
240
- 'time'=>'2015-05-08T09:22:01Z',
360
+ 'time' => '2015-05-08T09:22:01Z',
241
361
  'docker' => {
242
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
362
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
243
363
  },
244
364
  'kubernetes' => {
245
- 'host' => 'jimmi-redhat.localnet',
246
- 'pod_name' => 'fabric8-console-controller-98rqc',
365
+ 'host' => 'jimmi-redhat.localnet',
366
+ 'pod_name' => 'fabric8-console-controller-98rqc',
247
367
  'container_name' => 'fabric8-console-container',
368
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
369
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
248
370
  'namespace_name' => 'default',
249
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
250
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
251
- 'master_url' => 'https://localhost:8443',
371
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
372
+ 'namespace_labels' => {
373
+ 'tenant' => 'test'
374
+ },
375
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
376
+ 'pod_ip' => '172.17.0.8',
377
+ 'master_url' => 'https://localhost:8443',
252
378
  'labels' => {
253
379
  'component' => 'fabric8Console'
254
380
  }
@@ -259,8 +385,26 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
259
385
  end
260
386
  end
261
387
 
388
+ test 'kubernetes metadata is cloned so it further processing does not modify the cache' do
389
+
390
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
391
+
392
+ d = create_driver('
393
+ kubernetes_url https://localhost:8443
394
+ watch false
395
+ cache_size 1')
396
+ d.run(default_tag: VAR_LOG_POD_TAG) do
397
+ d.feed(@time, { 'time' => '2015-05-08T09:22:01Z' })
398
+ d.feed(@time, { 'time' => '2015-05-08T09:22:01Z' })
399
+ end
400
+ filtered = d.filtered.map(&:last)
401
+ assert_not_equal(filtered[0]['kubernetes']['labels'].object_id, filtered[1]['kubernetes']['labels'].object_id, "Exp. meta to be cloned")
402
+ end
403
+ end
404
+
262
405
  test 'with docker & kubernetes metadata & namespace_id enabled' do
263
- VCR.use_cassette('metadata_with_namespace_id') do
406
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
407
+ { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } }]) do
264
408
  filtered = emit({}, '
265
409
  kubernetes_url https://localhost:8443
266
410
  watch false
@@ -268,16 +412,22 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
268
412
  ')
269
413
  expected_kube_metadata = {
270
414
  'docker' => {
271
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
415
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
272
416
  },
273
417
  'kubernetes' => {
274
- 'host' => 'jimmi-redhat.localnet',
275
- 'pod_name' => 'fabric8-console-controller-98rqc',
418
+ 'host' => 'jimmi-redhat.localnet',
419
+ 'pod_name' => 'fabric8-console-controller-98rqc',
276
420
  'container_name' => 'fabric8-console-container',
421
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
422
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
277
423
  'namespace_name' => 'default',
278
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
279
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
280
- 'master_url' => 'https://localhost:8443',
424
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
425
+ 'namespace_labels' => {
426
+ 'tenant' => 'test'
427
+ },
428
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
429
+ 'pod_ip' => '172.17.0.8',
430
+ 'master_url' => 'https://localhost:8443',
281
431
  'labels' => {
282
432
  'component' => 'fabric8Console'
283
433
  }
@@ -288,7 +438,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
288
438
  end
289
439
 
290
440
  test 'with docker & kubernetes metadata using bearer token' do
291
- VCR.use_cassette('kubernetes_docker_metadata_using_bearer_token') do
441
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server_using_token' }, { name: 'kubernetes_get_api_v1_using_token' },
442
+ { name: 'kubernetes_get_pod_using_token' }, { name: 'kubernetes_get_namespace_default_using_token' }]) do
292
443
  filtered = emit({}, '
293
444
  kubernetes_url https://localhost:8443
294
445
  verify_ssl false
@@ -300,13 +451,16 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
300
451
  'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
301
452
  },
302
453
  'kubernetes' => {
303
- 'host' => 'jimmi-redhat.localnet',
304
- 'pod_name' => 'fabric8-console-controller-98rqc',
454
+ 'host' => 'jimmi-redhat.localnet',
455
+ 'pod_name' => 'fabric8-console-controller-98rqc',
305
456
  'container_name' => 'fabric8-console-container',
457
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
458
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
306
459
  'namespace_name' => 'default',
307
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
308
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
309
- 'master_url' => 'https://localhost:8443',
460
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
461
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
462
+ 'pod_ip' => '172.17.0.8',
463
+ 'master_url' => 'https://localhost:8443',
310
464
  'labels' => {
311
465
  'component' => 'fabric8Console'
312
466
  }
@@ -319,14 +473,14 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
319
473
  test 'with docker & kubernetes metadata but no configured api server' do
320
474
  filtered = emit({}, '')
321
475
  expected_kube_metadata = {
322
- 'docker' => {
323
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
324
- },
325
- 'kubernetes' => {
326
- 'pod_name' => 'fabric8-console-controller-98rqc',
327
- 'container_name' => 'fabric8-console-container',
328
- 'namespace_name' => 'default',
329
- }
476
+ 'docker'=>{
477
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
478
+ },
479
+ 'kubernetes' => {
480
+ 'pod_name' => 'fabric8-console-controller-98rqc',
481
+ 'container_name' => 'fabric8-console-container',
482
+ 'namespace_name' => 'default'
483
+ }
330
484
  }
331
485
  assert_equal(expected_kube_metadata, filtered[0])
332
486
  end
@@ -339,13 +493,13 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
339
493
  )
340
494
  stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
341
495
  stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
342
- filtered = emit()
496
+ filtered = emit
343
497
  expected_kube_metadata = {
344
- 'docker' => {
345
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
498
+ 'docker'=>{
499
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
346
500
  },
347
501
  'kubernetes' => {
348
- 'pod_name' => 'fabric8-console-controller-98rqc',
502
+ 'pod_name' => 'fabric8-console-controller-98rqc',
349
503
  'container_name' => 'fabric8-console-container',
350
504
  'namespace_name' => '.orphaned',
351
505
  'orphaned_namespace' => 'default',
@@ -364,11 +518,11 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
364
518
  stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller.98rqc').to_timeout
365
519
  filtered = emit_with_tag('var.log.containers.fabric8-console-controller.98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log', {}, '')
366
520
  expected_kube_metadata = {
367
- 'docker' => {
368
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
521
+ 'docker'=>{
522
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
369
523
  },
370
524
  'kubernetes' => {
371
- 'pod_name' => 'fabric8-console-controller.98rqc',
525
+ 'pod_name' => 'fabric8-console-controller.98rqc',
372
526
  'container_name' => 'fabric8-console-container',
373
527
  'namespace_name' => 'default'
374
528
  }
@@ -378,42 +532,49 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
378
532
 
379
533
  test 'with docker metadata, non-kubernetes' do
380
534
  filtered = emit_with_tag('non-kubernetes', {}, '')
381
- assert_false(filtered[0].has_key?(:kubernetes))
535
+ assert_false(filtered[0].key?(:kubernetes))
382
536
  end
383
537
 
384
538
  test 'ignores invalid json in log field' do
385
539
  json_log = "{'foo':123}"
386
540
  msg = {
387
- 'log' => json_log
541
+ 'log' => json_log
388
542
  }
389
543
  filtered = emit_with_tag('non-kubernetes', msg, '')
390
544
  assert_equal(msg, filtered[0])
391
545
  end
392
546
 
393
- test 'with kubernetes dotted labels, de_dot enabled' do
394
- VCR.use_cassette('kubernetes_docker_metadata_dotted_labels') do
547
+ test 'with kubernetes annotations' do
548
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
549
+ { name: 'kubernetes_docker_metadata_annotations' },
550
+ { name: 'kubernetes_get_namespace_default' }]) do
395
551
  filtered = emit({}, '
396
552
  kubernetes_url https://localhost:8443
397
553
  watch false
398
554
  cache_size 1
555
+ annotation_match [ "^custom.+", "two"]
399
556
  ')
400
557
  expected_kube_metadata = {
401
558
  'docker' => {
402
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
559
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
403
560
  },
404
561
  'kubernetes' => {
405
- 'host' => 'jimmi-redhat.localnet',
406
- 'pod_name' => 'fabric8-console-controller-98rqc',
407
- 'container_name' => 'fabric8-console-container',
408
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
409
- 'namespace_labels' => {
410
- 'kubernetes_io/namespacetest' => 'somevalue'
411
- },
412
- 'namespace_name' => 'default',
413
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
414
- 'master_url' => 'https://localhost:8443',
562
+ 'host' => 'jimmi-redhat.localnet',
563
+ 'pod_name' => 'fabric8-console-controller-98rqc',
564
+ 'container_name' => 'fabric8-console-container',
565
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
566
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
567
+ 'namespace_name' => 'default',
568
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
569
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
570
+ 'pod_ip' => '172.17.0.8',
571
+ 'master_url' => 'https://localhost:8443',
415
572
  'labels' => {
416
- 'kubernetes_io/test' => 'somevalue'
573
+ 'component' => 'fabric8Console'
574
+ },
575
+ 'annotations' => {
576
+ 'custom.field1' => 'hello_kitty',
577
+ 'field.two' => 'value'
417
578
  }
418
579
  }
419
580
  }
@@ -421,31 +582,40 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
421
582
  end
422
583
  end
423
584
 
424
- test 'with kubernetes dotted labels, de_dot disabled' do
425
- VCR.use_cassette('kubernetes_docker_metadata_dotted_labels') do
585
+ test 'with kubernetes namespace annotations' do
586
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
587
+ { name: 'kubernetes_docker_metadata_annotations' },
588
+ { name: 'kubernetes_get_namespace_default' }]) do
426
589
  filtered = emit({}, '
427
590
  kubernetes_url https://localhost:8443
428
591
  watch false
429
592
  cache_size 1
430
- de_dot false
593
+ annotation_match [ "^custom.+", "two", "workspace*"]
431
594
  ')
432
595
  expected_kube_metadata = {
433
596
  'docker' => {
434
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
597
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
435
598
  },
436
599
  'kubernetes' => {
437
- 'host' => 'jimmi-redhat.localnet',
438
- 'pod_name' => 'fabric8-console-controller-98rqc',
439
- 'container_name' => 'fabric8-console-container',
440
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
441
- 'namespace_labels' => {
442
- 'kubernetes.io/namespacetest' => 'somevalue'
443
- },
444
- 'namespace_name' => 'default',
445
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
446
- 'master_url' => 'https://localhost:8443',
600
+ 'host' => 'jimmi-redhat.localnet',
601
+ 'pod_name' => 'fabric8-console-controller-98rqc',
602
+ 'container_name' => 'fabric8-console-container',
603
+ 'namespace_name' => 'default',
604
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
605
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
606
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
607
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
608
+ 'pod_ip' => '172.17.0.8',
609
+ 'master_url' => 'https://localhost:8443',
447
610
  'labels' => {
448
- 'kubernetes.io/test' => 'somevalue'
611
+ 'component' => 'fabric8Console'
612
+ },
613
+ 'annotations' => {
614
+ 'custom.field1' => 'hello_kitty',
615
+ 'field.two' => 'value'
616
+ },
617
+ 'namespace_annotations' => {
618
+ 'workspaceId' => 'myWorkspaceName'
449
619
  }
450
620
  }
451
621
  }
@@ -453,262 +623,229 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
453
623
  end
454
624
  end
455
625
 
456
- test 'invalid de_dot_separator config' do
457
- assert_raise Fluent::ConfigError do
458
- create_driver('
459
- de_dot_separator contains.
460
- ')
461
- end
462
- end
463
-
464
- test 'with records from journald and docker & kubernetes metadata' do
465
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
466
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
467
- msg = {
468
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
469
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
470
- 'randomfield' => 'randomvalue'
471
- }
472
- VCR.use_cassette('kubernetes_docker_metadata') do
473
- filtered = emit_with_tag(tag, msg, '
626
+ test 'with kubernetes namespace annotations no match' do
627
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
628
+ { name: 'kubernetes_docker_metadata_annotations' },
629
+ { name: 'kubernetes_get_namespace_default' }]) do
630
+ filtered = emit({}, '
474
631
  kubernetes_url https://localhost:8443
475
632
  watch false
476
633
  cache_size 1
477
- use_journal true
634
+ annotation_match [ "noMatch*"]
478
635
  ')
479
636
  expected_kube_metadata = {
480
637
  'docker' => {
481
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
638
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
482
639
  },
483
640
  'kubernetes' => {
484
- 'host' => 'jimmi-redhat.localnet',
485
- 'pod_name' => 'fabric8-console-controller-98rqc',
641
+ 'host' => 'jimmi-redhat.localnet',
642
+ 'pod_name' => 'fabric8-console-controller-98rqc',
486
643
  'container_name' => 'fabric8-console-container',
644
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
645
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
487
646
  'namespace_name' => 'default',
488
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
489
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
490
- 'master_url' => 'https://localhost:8443',
647
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
648
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
649
+ 'pod_ip' => '172.17.0.8',
650
+ 'master_url' => 'https://localhost:8443',
491
651
  'labels' => {
492
652
  'component' => 'fabric8Console'
493
653
  }
494
654
  }
495
- }.merge(msg)
655
+ }
496
656
  assert_equal(expected_kube_metadata, filtered[0])
497
657
  end
498
658
  end
499
659
 
500
- test 'with records from journald and docker & kubernetes metadata & namespace_id enabled' do
501
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
502
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
503
- msg = {
504
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
505
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
506
- 'randomfield' => 'randomvalue'
507
- }
508
- VCR.use_cassette('metadata_with_namespace_id') do
509
- filtered = emit_with_tag(tag, msg, '
660
+ test 'processes all events when reading from MessagePackEventStream' do
661
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
662
+ { name: 'kubernetes_get_api_v1' },
663
+ { name: 'kubernetes_get_pod' },
664
+ { name: 'kubernetes_get_namespace_default' }]) do
665
+ entries = [[@time, { 'time' => '2015-05-08T09:22:01Z' }], [@time, { 'time' => '2015-05-08T09:22:01Z' }]]
666
+ array_stream = Fluent::ArrayEventStream.new(entries)
667
+ msgpack_stream = Fluent::MessagePackEventStream.new(array_stream.to_msgpack_stream)
668
+
669
+ d = create_driver('
510
670
  kubernetes_url https://localhost:8443
511
671
  watch false
512
672
  cache_size 1
513
- use_journal true
673
+ stats_interval 0
514
674
  ')
675
+ d.run do
676
+ d.feed(VAR_LOG_CONTAINER_TAG, msgpack_stream)
677
+ end
678
+ filtered = d.filtered.map(&:last)
679
+
515
680
  expected_kube_metadata = {
681
+ 'time' => '2015-05-08T09:22:01Z',
516
682
  'docker' => {
517
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
683
+ 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
518
684
  },
519
685
  'kubernetes' => {
520
- 'host' => 'jimmi-redhat.localnet',
521
- 'pod_name' => 'fabric8-console-controller-98rqc',
686
+ 'host' => 'jimmi-redhat.localnet',
687
+ 'pod_name' => 'fabric8-console-controller-98rqc',
522
688
  'container_name' => 'fabric8-console-container',
689
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
690
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
523
691
  'namespace_name' => 'default',
524
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
525
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
526
- 'master_url' => 'https://localhost:8443',
692
+ 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
693
+ 'namespace_labels' => {
694
+ 'tenant' => 'test'
695
+ },
696
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
697
+ 'pod_ip' => '172.17.0.8',
698
+ 'master_url' => 'https://localhost:8443',
527
699
  'labels' => {
528
700
  'component' => 'fabric8Console'
529
701
  }
530
702
  }
531
- }.merge(msg)
703
+ }
704
+
532
705
  assert_equal(expected_kube_metadata, filtered[0])
706
+ assert_equal(expected_kube_metadata, filtered[1])
533
707
  end
534
708
  end
535
709
 
536
- test 'with kubernetes annotations' do
537
- VCR.use_cassette('kubernetes_docker_metadata_annotations') do
538
- filtered = emit({},'
710
+ test 'with docker & kubernetes metadata using skip config params' do
711
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
712
+ { name: 'kubernetes_get_namespace_default' }]) do
713
+ filtered = emit({}, '
539
714
  kubernetes_url https://localhost:8443
540
715
  watch false
541
716
  cache_size 1
542
- annotation_match [ "^custom.+", "two"]
717
+ skip_labels true
718
+ skip_container_metadata true
719
+ skip_master_url true
720
+ skip_namespace_metadata true
543
721
  ')
544
722
  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
- 'namespace_name' => 'default',
553
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
554
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
555
- 'master_url' => 'https://localhost:8443',
556
- 'labels' => {
557
- 'component' => 'fabric8Console'
558
- },
559
- 'annotations' => {
560
- 'custom_field1' => 'hello_kitty',
561
- 'field_two' => 'value'
562
- }
563
- }
723
+ 'docker'=>{
724
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
725
+ },
726
+ 'kubernetes' => {
727
+ 'host' => 'jimmi-redhat.localnet',
728
+ 'pod_name' => 'fabric8-console-controller-98rqc',
729
+ 'container_name' => 'fabric8-console-container',
730
+ 'namespace_name' => 'default',
731
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
732
+ 'pod_ip' => '172.17.0.8'
733
+ }
564
734
  }
735
+
565
736
  assert_equal(expected_kube_metadata, filtered[0])
566
737
  end
567
738
  end
568
739
 
569
- test 'with records from journald and docker & kubernetes metadata, alternate form' do
570
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
571
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
572
- msg = {
573
- 'CONTAINER_NAME' => 'alt_fabric8-console-container_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_0',
574
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
575
- 'randomfield' => 'randomvalue'
576
- }
577
- VCR.use_cassette('kubernetes_docker_metadata') do
578
- filtered = emit_with_tag(tag, msg, '
740
+ test 'with docker & kubernetes metadata using skip namespace labels config param' do
741
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
742
+ { name: 'kubernetes_get_namespace_default' }]) do
743
+ filtered = emit({}, '
579
744
  kubernetes_url https://localhost:8443
580
745
  watch false
581
746
  cache_size 1
582
- use_journal true
747
+ stats_interval 0
748
+ skip_namespace_labels true
749
+ skip_master_url true
583
750
  ')
584
751
  expected_kube_metadata = {
585
- 'docker' => {
586
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
752
+ 'docker'=>{
753
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
587
754
  },
588
755
  'kubernetes' => {
589
- 'host' => 'jimmi-redhat.localnet',
590
- 'pod_name' => 'fabric8-console-controller-98rqc',
756
+ 'host' => 'jimmi-redhat.localnet',
757
+ 'pod_name' => 'fabric8-console-controller-98rqc',
591
758
  'container_name' => 'fabric8-console-container',
759
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
760
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
592
761
  'namespace_name' => 'default',
593
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
594
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
595
- 'master_url' => 'https://localhost:8443',
762
+ "namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
763
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
764
+ 'pod_ip' => '172.17.0.8',
596
765
  'labels' => {
597
766
  'component' => 'fabric8Console'
598
767
  }
599
768
  }
600
- }.merge(msg)
601
- assert_equal(expected_kube_metadata, filtered[0])
602
- end
603
- end
604
-
605
- test 'with kubernetes namespace annotations' do
606
- VCR.use_cassette('kubernetes_docker_metadata_annotations') do
607
- filtered = emit({},'
608
- kubernetes_url https://localhost:8443
609
- watch false
610
- cache_size 1
611
- annotation_match [ "^custom.+", "two", "workspace*"]
612
- ')
613
- expected_kube_metadata = {
614
- 'docker' => {
615
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
616
- },
617
- 'kubernetes' => {
618
- 'host' => 'jimmi-redhat.localnet',
619
- 'pod_name' => 'fabric8-console-controller-98rqc',
620
- 'container_name' => 'fabric8-console-container',
621
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
622
- 'namespace_name' => 'default',
623
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
624
- 'master_url' => 'https://localhost:8443',
625
- 'labels' => {
626
- 'component' => 'fabric8Console'
627
- },
628
- 'annotations' => {
629
- 'custom_field1' => 'hello_kitty',
630
- 'field_two' => 'value'
631
- },
632
- 'namespace_annotations' => {
633
- 'workspaceId' => 'myWorkspaceName'
634
- }
635
- }
636
769
  }
637
- assert_equal(expected_kube_metadata, filtered[0])
638
- end
639
- end
640
770
 
641
- test 'with kubernetes namespace annotations no match' do
642
- VCR.use_cassette('kubernetes_docker_metadata_annotations') do
643
- filtered = emit({},'
644
- kubernetes_url https://localhost:8443
645
- watch false
646
- cache_size 1
647
- annotation_match [ "noMatch*"]
648
- ')
649
- expected_kube_metadata = {
650
- 'docker' => {
651
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
652
- },
653
- 'kubernetes' => {
654
- 'host' => 'jimmi-redhat.localnet',
655
- 'pod_name' => 'fabric8-console-controller-98rqc',
656
- 'container_name' => 'fabric8-console-container',
657
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
658
- 'namespace_name' => 'default',
659
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
660
- 'master_url' => 'https://localhost:8443',
661
- 'labels' => {
662
- 'component' => 'fabric8Console'
663
- }
664
- }
665
- }
666
771
  assert_equal(expected_kube_metadata, filtered[0])
667
772
  end
668
773
  end
669
- test 'with CONTAINER_NAME that does not match' do
670
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
671
- msg = {
672
- 'CONTAINER_NAME' => 'does_not_match',
673
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
674
- 'randomfield' => 'randomvalue'
675
- }
676
- VCR.use_cassette('kubernetes_docker_metadata_annotations') do
677
- filtered = emit_with_tag(tag, msg, '
774
+ test 'with docker & kubernetes metadata using skip pod labels config param' do
775
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
776
+ { name: 'kubernetes_get_namespace_default' }]) do
777
+ filtered = emit({}, '
678
778
  kubernetes_url https://localhost:8443
679
779
  watch false
680
780
  cache_size 1
681
- use_journal true
781
+ stats_interval 0
782
+ skip_pod_labels true
783
+ skip_master_url true
682
784
  ')
683
785
  expected_kube_metadata = {
684
- 'CONTAINER_NAME' => 'does_not_match',
685
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
686
- 'randomfield' => 'randomvalue'
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
+ 'namespace_labels' => {
798
+ 'tenant' => 'test'
799
+ },
800
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
801
+ 'pod_ip' => '172.17.0.8',
802
+ }
687
803
  }
804
+
688
805
  assert_equal(expected_kube_metadata, filtered[0])
689
806
  end
690
807
  end
691
- test 'with CONTAINER_NAME starts with k8s_ that does not match' do
692
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
693
- msg = {
694
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
695
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
696
- 'randomfield' => 'randomvalue'
697
- }
698
- VCR.use_cassette('kubernetes_docker_metadata_annotations') do
699
- filtered = emit_with_tag(tag, msg, '
808
+ test 'with docker & kubernetes metadata using include ownerrefs metadata' do
809
+ VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
810
+ { name: 'kubernetes_get_api_v1' },
811
+ { name: 'kubernetes_get_pod_with_ownerrefs' },
812
+ { name: 'kubernetes_get_namespace_default' }]) do
813
+ filtered = emit({}, '
700
814
  kubernetes_url https://localhost:8443
701
815
  watch false
702
816
  cache_size 1
703
- use_journal true
817
+ stats_interval 0
818
+ skip_pod_labels true
819
+ skip_master_url true
820
+ include_ownerrefs_metadata true
704
821
  ')
705
822
  expected_kube_metadata = {
706
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
707
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
708
- 'randomfield' => 'randomvalue'
823
+ 'docker'=>{
824
+ 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
825
+ },
826
+ 'kubernetes' => {
827
+ 'host' => 'jimmi-redhat.localnet',
828
+ 'pod_name' => 'fabric8-console-controller-98rqc',
829
+ 'container_name' => 'fabric8-console-container',
830
+ 'container_image' => 'fabric8/hawtio-kubernetes:latest',
831
+ 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
832
+ 'namespace_name' => 'default',
833
+ "namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
834
+ 'namespace_labels' => {
835
+ 'tenant' => 'test'
836
+ },
837
+ 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
838
+ 'pod_ip' => '172.17.0.8',
839
+ 'ownerrefs' => [{
840
+ 'kind' => 'ReplicaSet',
841
+ 'name' => 'fabric8-console-controller'
842
+ }]
843
+ }
709
844
  }
845
+
710
846
  assert_equal(expected_kube_metadata, filtered[0])
711
847
  end
712
848
  end
849
+
713
850
  end
714
851
  end