fluent-plugin-kubernetes_metadata_filter 2.1.0 → 3.4.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 (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