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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +53 -0
- data/.gitignore +0 -2
- data/.rubocop.yml +57 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +159 -0
- data/README.md +49 -60
- data/Rakefile +15 -11
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/cpu.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/latency.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/loss.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/mem.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/readme.md +88 -0
- data/doc/benchmark/5m-1-2500lps-256b-baseline-01/results.html +127 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/cpu.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/latency.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/loss.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/mem.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/readme.md +97 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/results.html +136 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/cpu.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/latency.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/loss.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/mem.png +0 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/readme.md +97 -0
- data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/results.html +136 -0
- data/fluent-plugin-kubernetes_metadata_filter.gemspec +25 -28
- data/lib/fluent/plugin/filter_kubernetes_metadata.rb +207 -187
- data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +30 -23
- data/lib/fluent/plugin/kubernetes_metadata_common.rb +66 -24
- data/lib/fluent/plugin/kubernetes_metadata_stats.rb +21 -5
- data/lib/fluent/plugin/kubernetes_metadata_test_api_adapter.rb +68 -0
- data/lib/fluent/plugin/kubernetes_metadata_util.rb +33 -0
- data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +154 -27
- data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +171 -29
- data/release_notes.md +42 -0
- data/test/cassettes/kubernetes_docker_metadata_annotations.yml +0 -34
- data/test/cassettes/{kubernetes_docker_metadata_dotted_labels.yml → kubernetes_docker_metadata_dotted_slashed_labels.yml} +0 -34
- data/test/cassettes/kubernetes_get_api_v1.yml +193 -0
- data/test/cassettes/kubernetes_get_api_v1_using_token.yml +195 -0
- data/test/cassettes/kubernetes_get_namespace_default.yml +72 -0
- data/test/cassettes/kubernetes_get_namespace_default_using_token.yml +71 -0
- data/test/cassettes/{kubernetes_docker_metadata.yml → kubernetes_get_pod.yml} +0 -82
- data/test/cassettes/kubernetes_get_pod_container_init.yml +145 -0
- data/test/cassettes/{metadata_with_namespace_id.yml → kubernetes_get_pod_using_token.yml} +2 -130
- data/test/cassettes/{kubernetes_docker_metadata_using_bearer_token.yml → kubernetes_get_pod_with_ownerrefs.yml} +17 -109
- data/test/cassettes/metadata_from_tag_and_journald_fields.yml +153 -0
- data/test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml +285 -0
- data/test/cassettes/{non_kubernetes_docker_metadata.yml → valid_kubernetes_api_server_using_token.yml} +4 -44
- data/test/helper.rb +20 -2
- data/test/plugin/test_cache_stats.rb +10 -13
- data/test/plugin/test_cache_strategy.rb +158 -160
- data/test/plugin/test_filter_kubernetes_metadata.rb +451 -314
- data/test/plugin/test_watch_namespaces.rb +209 -55
- data/test/plugin/test_watch_pods.rb +302 -71
- data/test/plugin/watch_test.rb +52 -33
- metadata +91 -70
- 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
|
-
|
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
|
-
|
85
|
-
|
86
|
-
ENV['KUBERNETES_SERVICE_PORT'] = '8443'
|
105
|
+
ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
|
106
|
+
ENV['KUBERNETES_SERVICE_PORT'] = '8443'
|
87
107
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
94
|
-
|
113
|
+
File.open(expected_cert_path, 'w')
|
114
|
+
File.open(expected_token_path, 'w')
|
95
115
|
|
96
|
-
|
116
|
+
d = create_driver("
|
97
117
|
watch false
|
98
118
|
secret_dir #{dir}
|
99
119
|
")
|
100
120
|
|
101
|
-
|
102
|
-
|
103
|
-
|
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
|
-
|
115
|
-
|
116
|
-
ENV['KUBERNETES_SERVICE_PORT'] = '8443'
|
133
|
+
ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
|
134
|
+
ENV['KUBERNETES_SERVICE_PORT'] = '8443'
|
117
135
|
|
118
|
-
|
119
|
-
|
136
|
+
Dir.mktmpdir do |dir|
|
137
|
+
d = create_driver("
|
120
138
|
watch false
|
121
139
|
secret_dir #{dir}
|
122
140
|
")
|
123
|
-
|
124
|
-
|
125
|
-
|
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 '
|
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
|
-
|
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
|
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
|
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.
|
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
|
-
|
177
|
-
|
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
|
-
|
298
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
186
299
|
},
|
187
300
|
'kubernetes' => {
|
188
|
-
'pod_name'
|
301
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
189
302
|
'container_name' => 'fabric8-console-container',
|
190
303
|
'namespace_name' => 'default',
|
191
|
-
'namespace_id'
|
192
|
-
'pod_id'
|
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.
|
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
|
-
|
210
|
-
|
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
|
-
|
329
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
217
330
|
},
|
218
331
|
'kubernetes' => {
|
219
|
-
'host'
|
220
|
-
'pod_name'
|
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'
|
224
|
-
'
|
225
|
-
|
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
|
-
|
238
|
-
|
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
|
-
|
362
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
243
363
|
},
|
244
364
|
'kubernetes' => {
|
245
|
-
'host'
|
246
|
-
'pod_name'
|
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'
|
250
|
-
'
|
251
|
-
|
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.
|
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
|
-
|
415
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
272
416
|
},
|
273
417
|
'kubernetes' => {
|
274
|
-
'host'
|
275
|
-
'pod_name'
|
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'
|
279
|
-
'
|
280
|
-
|
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.
|
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'
|
304
|
-
'pod_name'
|
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'
|
308
|
-
'pod_id'
|
309
|
-
'
|
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
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
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'
|
498
|
+
'docker'=>{
|
499
|
+
'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
346
500
|
},
|
347
501
|
'kubernetes' => {
|
348
|
-
'pod_name'
|
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'
|
521
|
+
'docker'=>{
|
522
|
+
'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
369
523
|
},
|
370
524
|
'kubernetes' => {
|
371
|
-
'pod_name'
|
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].
|
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
|
-
|
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
|
394
|
-
VCR.
|
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
|
-
|
559
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
403
560
|
},
|
404
561
|
'kubernetes' => {
|
405
|
-
'host'
|
406
|
-
'pod_name'
|
407
|
-
'container_name'
|
408
|
-
'
|
409
|
-
'
|
410
|
-
|
411
|
-
|
412
|
-
'
|
413
|
-
'
|
414
|
-
'master_url'
|
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
|
-
'
|
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
|
425
|
-
VCR.
|
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
|
-
|
593
|
+
annotation_match [ "^custom.+", "two", "workspace*"]
|
431
594
|
')
|
432
595
|
expected_kube_metadata = {
|
433
596
|
'docker' => {
|
434
|
-
|
597
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
435
598
|
},
|
436
599
|
'kubernetes' => {
|
437
|
-
'host'
|
438
|
-
'pod_name'
|
439
|
-
'container_name'
|
440
|
-
'
|
441
|
-
'
|
442
|
-
|
443
|
-
|
444
|
-
'
|
445
|
-
'
|
446
|
-
'master_url'
|
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
|
-
'
|
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 '
|
457
|
-
|
458
|
-
|
459
|
-
|
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
|
-
|
634
|
+
annotation_match [ "noMatch*"]
|
478
635
|
')
|
479
636
|
expected_kube_metadata = {
|
480
637
|
'docker' => {
|
481
|
-
|
638
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
482
639
|
},
|
483
640
|
'kubernetes' => {
|
484
|
-
'host'
|
485
|
-
'pod_name'
|
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'
|
489
|
-
'pod_id'
|
490
|
-
'
|
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
|
-
}
|
655
|
+
}
|
496
656
|
assert_equal(expected_kube_metadata, filtered[0])
|
497
657
|
end
|
498
658
|
end
|
499
659
|
|
500
|
-
test '
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
'
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
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
|
-
|
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
|
-
|
683
|
+
'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
518
684
|
},
|
519
685
|
'kubernetes' => {
|
520
|
-
'host'
|
521
|
-
'pod_name'
|
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'
|
525
|
-
'
|
526
|
-
|
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
|
-
}
|
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
|
537
|
-
VCR.
|
538
|
-
|
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
|
-
|
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
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
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
|
570
|
-
|
571
|
-
|
572
|
-
|
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
|
-
|
747
|
+
stats_interval 0
|
748
|
+
skip_namespace_labels true
|
749
|
+
skip_master_url true
|
583
750
|
')
|
584
751
|
expected_kube_metadata = {
|
585
|
-
'docker'
|
586
|
-
|
752
|
+
'docker'=>{
|
753
|
+
'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
587
754
|
},
|
588
755
|
'kubernetes' => {
|
589
|
-
'host'
|
590
|
-
'pod_name'
|
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
|
-
|
594
|
-
'pod_id'
|
595
|
-
'
|
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
|
670
|
-
|
671
|
-
|
672
|
-
|
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
|
-
|
781
|
+
stats_interval 0
|
782
|
+
skip_pod_labels true
|
783
|
+
skip_master_url true
|
682
784
|
')
|
683
785
|
expected_kube_metadata = {
|
684
|
-
'
|
685
|
-
|
686
|
-
|
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
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
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
|
-
|
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
|
-
'
|
707
|
-
|
708
|
-
|
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
|