fluent-plugin-kubernetes_metadata_filter 2.4.6 → 2.5.3
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 +4 -4
- data/.circleci/config.yml +6 -6
- data/Gemfile.lock +37 -30
- data/README.md +1 -0
- data/fluent-plugin-kubernetes_metadata_filter.gemspec +3 -6
- data/lib/fluent/plugin/filter_kubernetes_metadata.rb +41 -62
- data/lib/fluent/plugin/kubernetes_metadata_common.rb +26 -46
- data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +29 -13
- data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +46 -17
- data/test/helper.rb +17 -1
- data/test/plugin/test_cache_stats.rb +2 -5
- data/test/plugin/test_cache_strategy.rb +5 -8
- data/test/plugin/test_filter_kubernetes_metadata.rb +11 -10
- data/test/plugin/test_watch_namespaces.rb +116 -54
- data/test/plugin/test_watch_pods.rb +188 -119
- data/test/plugin/watch_test.rb +3 -10
- metadata +7 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8eada7adb2f8305fc4f14d91c04a2f8d7293f4f622713b0e7d463d85b2ed15d3
|
4
|
+
data.tar.gz: 890266f08cda7757d459d99c728f7638c17f1c01ffa042c89c53d74da6c97c0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5874033154af1f111f41e6197295134b66ab1ac94777fe2158e112880ae15343a69449fb78d2958cc0ad7a99e8db5249bd91e074fd17993d31fd48a859fe370d
|
7
|
+
data.tar.gz: 6dfc784c4f9696ec7618fffaf6b95e0fe797266ea8fe13e1bc0ee9fb0e51e48f1da77b6a0d1b7f0fd3e407608ac467f58bcc9081ddaf56daaccf8fb1eef572e0
|
data/.circleci/config.yml
CHANGED
@@ -14,21 +14,21 @@ missingdeps: &missingdeps
|
|
14
14
|
sudo cp /tmp/sources.list /etc/apt/sources.list
|
15
15
|
sudo apt-get update
|
16
16
|
sudo apt-get install cmake libicu-dev libssl-dev
|
17
|
-
|
17
|
+
|
18
18
|
test: &test
|
19
19
|
name: Test bundle
|
20
20
|
command: bundle exec rake test
|
21
21
|
|
22
22
|
executors:
|
23
|
-
ruby-2-4:
|
24
|
-
docker:
|
25
|
-
- image: circleci/ruby:2.4.6
|
26
23
|
ruby-2-5:
|
27
24
|
docker:
|
28
25
|
- image: circleci/ruby:2.5.5
|
29
26
|
ruby-2-6:
|
30
27
|
docker:
|
31
28
|
- image: circleci/ruby:2.6.3
|
29
|
+
ruby-2-7:
|
30
|
+
docker:
|
31
|
+
- image: circleci/ruby:2.7.1
|
32
32
|
jobs:
|
33
33
|
"ruby-test":
|
34
34
|
parameters:
|
@@ -49,9 +49,9 @@ jobs:
|
|
49
49
|
workflows:
|
50
50
|
"test_multiple_ruby_versions":
|
51
51
|
jobs:
|
52
|
-
- ruby-test:
|
53
|
-
ruby-version: ruby-2-4
|
54
52
|
- ruby-test:
|
55
53
|
ruby-version: ruby-2-5
|
56
54
|
- ruby-test:
|
57
55
|
ruby-version: ruby-2-6
|
56
|
+
- ruby-test:
|
57
|
+
ruby-version: ruby-2-7
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-kubernetes_metadata_filter (2.
|
5
|
-
fluentd (>= 0.14.0, < 1.
|
4
|
+
fluent-plugin-kubernetes_metadata_filter (2.5.3)
|
5
|
+
fluentd (>= 0.14.0, < 1.12)
|
6
6
|
kubeclient (< 5)
|
7
7
|
lru_redux
|
8
8
|
|
@@ -11,13 +11,13 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
addressable (2.7.0)
|
13
13
|
public_suffix (>= 2.0.2, < 5.0)
|
14
|
-
ast (2.4.
|
14
|
+
ast (2.4.1)
|
15
15
|
bump (0.9.0)
|
16
16
|
charlock_holmes (0.7.7)
|
17
17
|
codeclimate-test-reporter (0.6.0)
|
18
18
|
simplecov (>= 0.7.1, < 1.0.0)
|
19
|
-
concurrent-ruby (1.1.
|
20
|
-
cool.io (1.
|
19
|
+
concurrent-ruby (1.1.8)
|
20
|
+
cool.io (1.7.0)
|
21
21
|
copyright-header (1.0.22)
|
22
22
|
github-linguist
|
23
23
|
crack (0.4.3)
|
@@ -26,21 +26,21 @@ GEM
|
|
26
26
|
domain_name (0.5.20190701)
|
27
27
|
unf (>= 0.0.5, < 1.0.0)
|
28
28
|
escape_utils (1.2.1)
|
29
|
-
ffi (1.
|
29
|
+
ffi (1.14.2)
|
30
30
|
ffi-compiler (1.0.1)
|
31
31
|
ffi (>= 1.0.0)
|
32
32
|
rake
|
33
|
-
fluentd (1.
|
33
|
+
fluentd (1.11.5)
|
34
34
|
cool.io (>= 1.4.5, < 2.0.0)
|
35
35
|
http_parser.rb (>= 0.5.1, < 0.7.0)
|
36
36
|
msgpack (>= 1.3.1, < 2.0.0)
|
37
|
-
serverengine (>= 2.
|
37
|
+
serverengine (>= 2.2.2, < 3.0.0)
|
38
38
|
sigdump (~> 0.2.2)
|
39
39
|
strptime (>= 0.2.2, < 1.0.0)
|
40
40
|
tzinfo (>= 1.0, < 3.0)
|
41
41
|
tzinfo-data (~> 1.0)
|
42
42
|
yajl-ruby (~> 1.0)
|
43
|
-
github-linguist (7.
|
43
|
+
github-linguist (7.9.0)
|
44
44
|
charlock_holmes (~> 0.7.6)
|
45
45
|
escape_utils (~> 1.2.0)
|
46
46
|
mini_mime (~> 1.0)
|
@@ -55,30 +55,34 @@ GEM
|
|
55
55
|
http-cookie (1.0.3)
|
56
56
|
domain_name (~> 0.5)
|
57
57
|
http-form_data (2.3.0)
|
58
|
-
http-parser (1.2.
|
58
|
+
http-parser (1.2.3)
|
59
59
|
ffi-compiler (>= 1.0, < 2.0)
|
60
60
|
http_parser.rb (0.6.0)
|
61
|
-
|
62
|
-
|
61
|
+
jsonpath (1.1.0)
|
62
|
+
multi_json
|
63
|
+
kubeclient (4.9.1)
|
63
64
|
http (>= 3.0, < 5.0)
|
64
|
-
|
65
|
+
jsonpath (~> 1.0)
|
66
|
+
recursive-open-struct (~> 1.1, >= 1.1.1)
|
65
67
|
rest-client (~> 2.0)
|
66
68
|
lru_redux (1.1.0)
|
67
69
|
mime-types (3.3.1)
|
68
70
|
mime-types-data (~> 3.2015)
|
69
|
-
mime-types-data (3.2020.
|
71
|
+
mime-types-data (3.2020.1104)
|
70
72
|
mini_mime (1.0.2)
|
71
73
|
minitest (4.7.5)
|
72
74
|
msgpack (1.3.3)
|
75
|
+
multi_json (1.15.0)
|
73
76
|
netrc (0.11.0)
|
74
|
-
parallel (1.19.
|
75
|
-
parser (2.7.
|
76
|
-
ast (~> 2.4.
|
77
|
-
power_assert (1.
|
78
|
-
public_suffix (4.0.
|
77
|
+
parallel (1.19.2)
|
78
|
+
parser (2.7.1.4)
|
79
|
+
ast (~> 2.4.1)
|
80
|
+
power_assert (1.2.0)
|
81
|
+
public_suffix (4.0.5)
|
79
82
|
rainbow (3.0.0)
|
80
83
|
rake (13.0.1)
|
81
|
-
recursive-open-struct (1.1.
|
84
|
+
recursive-open-struct (1.1.3)
|
85
|
+
regexp_parser (1.7.1)
|
82
86
|
rest-client (2.1.0)
|
83
87
|
http-accept (>= 1.7.0, < 2.0)
|
84
88
|
http-cookie (>= 1.0.2, < 2.0)
|
@@ -86,39 +90,42 @@ GEM
|
|
86
90
|
netrc (~> 0.8)
|
87
91
|
rexml (3.2.4)
|
88
92
|
rr (1.2.1)
|
89
|
-
rubocop (0.
|
90
|
-
jaro_winkler (~> 1.5.1)
|
93
|
+
rubocop (0.86.0)
|
91
94
|
parallel (~> 1.10)
|
92
95
|
parser (>= 2.7.0.1)
|
93
96
|
rainbow (>= 2.2.2, < 4.0)
|
97
|
+
regexp_parser (>= 1.7)
|
94
98
|
rexml
|
99
|
+
rubocop-ast (>= 0.0.3, < 1.0)
|
95
100
|
ruby-progressbar (~> 1.7)
|
96
|
-
unicode-display_width (>= 1.4.0, <
|
101
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
102
|
+
rubocop-ast (0.1.0)
|
103
|
+
parser (>= 2.7.0.1)
|
97
104
|
ruby-progressbar (1.10.1)
|
98
|
-
rugged (0.
|
105
|
+
rugged (1.0.1)
|
99
106
|
safe_yaml (1.0.5)
|
100
|
-
serverengine (2.2.
|
107
|
+
serverengine (2.2.2)
|
101
108
|
sigdump (~> 0.2.2)
|
102
109
|
sigdump (0.2.4)
|
103
110
|
simplecov (0.18.5)
|
104
111
|
docile (~> 1.1)
|
105
112
|
simplecov-html (~> 0.11)
|
106
113
|
simplecov-html (0.12.2)
|
107
|
-
strptime (0.2.
|
114
|
+
strptime (0.2.5)
|
108
115
|
test-unit (3.0.9)
|
109
116
|
power_assert
|
110
117
|
test-unit-rr (1.0.5)
|
111
118
|
rr (>= 1.1.1)
|
112
119
|
test-unit (>= 2.5.2)
|
113
|
-
tzinfo (2.0.
|
120
|
+
tzinfo (2.0.4)
|
114
121
|
concurrent-ruby (~> 1.0)
|
115
|
-
tzinfo-data (1.2020.
|
122
|
+
tzinfo-data (1.2020.6)
|
116
123
|
tzinfo (>= 1.0.0)
|
117
124
|
unf (0.1.4)
|
118
125
|
unf_ext
|
119
126
|
unf_ext (0.0.7.7)
|
120
|
-
unicode-display_width (1.
|
121
|
-
vcr (
|
127
|
+
unicode-display_width (1.7.0)
|
128
|
+
vcr (6.0.0)
|
122
129
|
webmock (3.8.3)
|
123
130
|
addressable (>= 2.3.6)
|
124
131
|
crack (>= 0.3.2)
|
data/README.md
CHANGED
@@ -15,6 +15,7 @@ that rely on the authenticity of the namespace for proper log isolation.
|
|
15
15
|
|
16
16
|
| fluent-plugin-kubernetes_metadata_filter | fluentd | ruby |
|
17
17
|
|-------------------|---------|------|
|
18
|
+
| >= 2.5.0 | >= v1.10.0 | >= 2.5 |
|
18
19
|
| >= 2.0.0 | >= v0.14.20 | >= 2.1 |
|
19
20
|
| < 2.0.0 | >= v0.12.0 | >= 1.9 |
|
20
21
|
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "fluent-plugin-kubernetes_metadata_filter"
|
7
|
-
gem.version = "2.
|
7
|
+
gem.version = "2.5.3"
|
8
8
|
gem.authors = ["Jimmi Dyson"]
|
9
9
|
gem.email = ["jimmidyson@gmail.com"]
|
10
10
|
gem.description = %q{Filter plugin to add Kubernetes metadata}
|
@@ -13,13 +13,10 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.license = "Apache-2.0"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
|
-
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
-
gem.require_paths = ["lib"]
|
19
16
|
|
20
|
-
gem.required_ruby_version = '>= 2.
|
17
|
+
gem.required_ruby_version = '>= 2.5.0'
|
21
18
|
|
22
|
-
gem.add_runtime_dependency 'fluentd', ['>= 0.14.0', '< 1.
|
19
|
+
gem.add_runtime_dependency 'fluentd', ['>= 0.14.0', '< 1.12']
|
23
20
|
gem.add_runtime_dependency "lru_redux"
|
24
21
|
gem.add_runtime_dependency "kubeclient", '< 5'
|
25
22
|
|
@@ -82,37 +82,23 @@ module Fluent::Plugin
|
|
82
82
|
config_param :skip_master_url, :bool, default: false
|
83
83
|
config_param :skip_namespace_metadata, :bool, default: false
|
84
84
|
# The time interval in seconds for retry backoffs when watch connections fail.
|
85
|
-
config_param :watch_retry_interval, :
|
85
|
+
config_param :watch_retry_interval, :integer, default: 1
|
86
86
|
# The base number of exponential backoff for retries.
|
87
|
-
config_param :watch_retry_exponential_backoff_base, :
|
87
|
+
config_param :watch_retry_exponential_backoff_base, :integer, default: 2
|
88
88
|
# The maximum number of times to retry pod and namespace watches.
|
89
|
-
config_param :watch_retry_max_times, :
|
89
|
+
config_param :watch_retry_max_times, :integer, default: 10
|
90
90
|
|
91
91
|
def fetch_pod_metadata(namespace_name, pod_name)
|
92
92
|
log.trace("fetching pod metadata: #{namespace_name}/#{pod_name}") if log.trace?
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@stats.bump(:pod_cache_api_updates)
|
103
|
-
log.trace("parsed metadata for #{namespace_name}/#{pod_name}: #{metadata}") if log.trace?
|
104
|
-
@cache[metadata['pod_id']] = metadata
|
105
|
-
return metadata
|
106
|
-
rescue Exception=>e
|
107
|
-
log.debug(e)
|
108
|
-
@stats.bump(:pod_cache_api_nil_bad_resp_payload)
|
109
|
-
log.trace("returning empty metadata for #{namespace_name}/#{pod_name} due to error '#{e}'") if log.trace?
|
110
|
-
end
|
111
|
-
end
|
112
|
-
rescue Exception=>e
|
113
|
-
@stats.bump(:pod_cache_api_nil_error)
|
114
|
-
log.debug "Exception '#{e}' encountered fetching pod metadata from Kubernetes API #{@apiVersion} endpoint #{@kubernetes_url}"
|
115
|
-
end
|
93
|
+
pod_object = @client.get_pod(pod_name, namespace_name)
|
94
|
+
log.trace("raw metadata for #{namespace_name}/#{pod_name}: #{pod_object}") if log.trace?
|
95
|
+
metadata = parse_pod_metadata(pod_object)
|
96
|
+
@stats.bump(:pod_cache_api_updates)
|
97
|
+
log.trace("parsed metadata for #{namespace_name}/#{pod_name}: #{metadata}") if log.trace?
|
98
|
+
@cache[metadata['pod_id']] = metadata
|
99
|
+
rescue => e
|
100
|
+
@stats.bump(:pod_cache_api_nil_error)
|
101
|
+
log.debug "Exception '#{e}' encountered fetching pod metadata from Kubernetes API #{@apiVersion} endpoint #{@kubernetes_url}"
|
116
102
|
{}
|
117
103
|
end
|
118
104
|
|
@@ -132,29 +118,15 @@ module Fluent::Plugin
|
|
132
118
|
|
133
119
|
def fetch_namespace_metadata(namespace_name)
|
134
120
|
log.trace("fetching namespace metadata: #{namespace_name}") if log.trace?
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
@stats.bump(:namespace_cache_api_updates)
|
145
|
-
log.trace("parsed metadata for #{namespace_name}: #{metadata}") if log.trace?
|
146
|
-
@namespace_cache[metadata['namespace_id']] = metadata
|
147
|
-
return metadata
|
148
|
-
rescue Exception => e
|
149
|
-
log.debug(e)
|
150
|
-
@stats.bump(:namespace_cache_api_nil_bad_resp_payload)
|
151
|
-
log.trace("returning empty metadata for #{namespace_name} due to error '#{e}'") if log.trace?
|
152
|
-
end
|
153
|
-
end
|
154
|
-
rescue Exception => kube_error
|
155
|
-
@stats.bump(:namespace_cache_api_nil_error)
|
156
|
-
log.debug "Exception '#{kube_error}' encountered fetching namespace metadata from Kubernetes API #{@apiVersion} endpoint #{@kubernetes_url}"
|
157
|
-
end
|
121
|
+
namespace_object = @client.get_namespace(namespace_name)
|
122
|
+
log.trace("raw metadata for #{namespace_name}: #{namespace_object}") if log.trace?
|
123
|
+
metadata = parse_namespace_metadata(namespace_object)
|
124
|
+
@stats.bump(:namespace_cache_api_updates)
|
125
|
+
log.trace("parsed metadata for #{namespace_name}: #{metadata}") if log.trace?
|
126
|
+
@namespace_cache[metadata['namespace_id']] = metadata
|
127
|
+
rescue => kube_error
|
128
|
+
@stats.bump(:namespace_cache_api_nil_error)
|
129
|
+
log.debug "Exception '#{kube_error}' encountered fetching namespace metadata from Kubernetes API #{@apiVersion} endpoint #{@kubernetes_url}"
|
158
130
|
{}
|
159
131
|
end
|
160
132
|
|
@@ -174,7 +146,7 @@ module Fluent::Plugin
|
|
174
146
|
require 'lru_redux'
|
175
147
|
@stats = KubernetesMetadata::Stats.new
|
176
148
|
|
177
|
-
if @de_dot &&
|
149
|
+
if @de_dot && @de_dot_separator.include?(".")
|
178
150
|
raise Fluent::ConfigError, "Invalid de_dot_separator: cannot be or contain '.'"
|
179
151
|
end
|
180
152
|
|
@@ -201,7 +173,7 @@ module Fluent::Plugin
|
|
201
173
|
|
202
174
|
env_host = ENV['KUBERNETES_SERVICE_HOST']
|
203
175
|
env_port = ENV['KUBERNETES_SERVICE_PORT']
|
204
|
-
if
|
176
|
+
if present?(env_host) && present?(env_port)
|
205
177
|
if env_host =~ Resolv::IPv6::Regex
|
206
178
|
# Brackets are needed around IPv6 addresses
|
207
179
|
env_host = "[#{env_host}]"
|
@@ -219,22 +191,21 @@ module Fluent::Plugin
|
|
219
191
|
ca_cert = File.join(@secret_dir, K8_POD_CA_CERT)
|
220
192
|
pod_token = File.join(@secret_dir, K8_POD_TOKEN)
|
221
193
|
|
222
|
-
if
|
194
|
+
if !present?(@ca_file) and File.exist?(ca_cert)
|
223
195
|
log.debug "Found CA certificate: #{ca_cert}"
|
224
196
|
@ca_file = ca_cert
|
225
197
|
end
|
226
198
|
|
227
|
-
if
|
199
|
+
if !present?(@bearer_token_file) and File.exist?(pod_token)
|
228
200
|
log.debug "Found pod token: #{pod_token}"
|
229
201
|
@bearer_token_file = pod_token
|
230
202
|
end
|
231
203
|
end
|
232
204
|
|
233
|
-
if @kubernetes_url
|
234
|
-
|
205
|
+
if present?(@kubernetes_url)
|
235
206
|
ssl_options = {
|
236
|
-
client_cert: @client_cert
|
237
|
-
client_key: @client_key
|
207
|
+
client_cert: present?(@client_cert) ? OpenSSL::X509::Certificate.new(File.read(@client_cert)) : nil,
|
208
|
+
client_key: present?(@client_key) ? OpenSSL::PKey::RSA.new(File.read(@client_key)) : nil,
|
238
209
|
ca_file: @ca_file,
|
239
210
|
verify_ssl: @verify_ssl ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
240
211
|
}
|
@@ -256,15 +227,19 @@ module Fluent::Plugin
|
|
256
227
|
|
257
228
|
auth_options = {}
|
258
229
|
|
259
|
-
if @bearer_token_file
|
230
|
+
if present?(@bearer_token_file)
|
260
231
|
bearer_token = File.read(@bearer_token_file)
|
261
232
|
auth_options[:bearer_token] = bearer_token
|
262
233
|
end
|
263
234
|
|
264
235
|
log.debug "Creating K8S client"
|
265
|
-
@client = Kubeclient::Client.new
|
266
|
-
|
267
|
-
|
236
|
+
@client = Kubeclient::Client.new(
|
237
|
+
@kubernetes_url,
|
238
|
+
@apiVersion,
|
239
|
+
ssl_options: ssl_options,
|
240
|
+
auth_options: auth_options,
|
241
|
+
as: :parsed_symbolized
|
242
|
+
)
|
268
243
|
|
269
244
|
begin
|
270
245
|
@client.api_valid?
|
@@ -305,7 +280,7 @@ module Fluent::Plugin
|
|
305
280
|
'pod_name' => pod_name
|
306
281
|
}
|
307
282
|
}
|
308
|
-
if @kubernetes_url
|
283
|
+
if present?(@kubernetes_url)
|
309
284
|
pod_metadata = get_pod_metadata(container_id, namespace_name, pod_name, create_time, batch_miss_cache)
|
310
285
|
|
311
286
|
if (pod_metadata.include? 'containers') && (pod_metadata['containers'].include? container_id) && !@skip_container_metadata
|
@@ -396,5 +371,9 @@ module Fluent::Plugin
|
|
396
371
|
end
|
397
372
|
end
|
398
373
|
|
374
|
+
# copied from activesupport
|
375
|
+
def present?(object)
|
376
|
+
object.respond_to?(:empty?) ? !object.empty? : !!object
|
377
|
+
end
|
399
378
|
end
|
400
379
|
end
|
@@ -19,6 +19,12 @@
|
|
19
19
|
module KubernetesMetadata
|
20
20
|
module Common
|
21
21
|
|
22
|
+
class GoneError < StandardError
|
23
|
+
def initialize(msg="410 Gone")
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
22
28
|
def match_annotations(annotations)
|
23
29
|
result = {}
|
24
30
|
@annotations_regexps.each do |regexp|
|
@@ -33,65 +39,65 @@ module KubernetesMetadata
|
|
33
39
|
|
34
40
|
def parse_namespace_metadata(namespace_object)
|
35
41
|
labels = String.new
|
36
|
-
labels = syms_to_strs(namespace_object[
|
42
|
+
labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless @skip_labels
|
37
43
|
|
38
|
-
annotations = match_annotations(syms_to_strs(namespace_object[
|
44
|
+
annotations = match_annotations(syms_to_strs(namespace_object[:metadata][:annotations].to_h))
|
39
45
|
if @de_dot
|
40
46
|
self.de_dot!(labels) unless @skip_labels
|
41
47
|
self.de_dot!(annotations)
|
42
48
|
end
|
43
49
|
kubernetes_metadata = {
|
44
|
-
'namespace_id' => namespace_object[
|
45
|
-
'creation_timestamp' => namespace_object[
|
50
|
+
'namespace_id' => namespace_object[:metadata][:uid],
|
51
|
+
'creation_timestamp' => namespace_object[:metadata][:creationTimestamp]
|
46
52
|
}
|
47
53
|
kubernetes_metadata['namespace_labels'] = labels unless labels.empty?
|
48
54
|
kubernetes_metadata['namespace_annotations'] = annotations unless annotations.empty?
|
49
|
-
|
55
|
+
kubernetes_metadata
|
50
56
|
end
|
51
57
|
|
52
58
|
def parse_pod_metadata(pod_object)
|
53
59
|
labels = String.new
|
54
|
-
labels = syms_to_strs(pod_object[
|
60
|
+
labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless @skip_labels
|
55
61
|
|
56
|
-
annotations = match_annotations(syms_to_strs(pod_object[
|
62
|
+
annotations = match_annotations(syms_to_strs(pod_object[:metadata][:annotations].to_h))
|
57
63
|
if @de_dot
|
58
64
|
self.de_dot!(labels) unless @skip_labels
|
59
65
|
self.de_dot!(annotations)
|
60
66
|
end
|
61
67
|
|
62
|
-
# collect container
|
68
|
+
# collect container information
|
63
69
|
container_meta = {}
|
64
70
|
begin
|
65
|
-
pod_object[
|
71
|
+
pod_object[:status][:containerStatuses].each do|container_status|
|
66
72
|
# get plain container id (eg. docker://hash -> hash)
|
67
|
-
container_id = container_status[
|
73
|
+
container_id = container_status[:containerID].sub /^[-_a-zA-Z0-9]+:\/\//, ''
|
68
74
|
unless @skip_container_metadata
|
69
75
|
container_meta[container_id] = {
|
70
|
-
'name' => container_status[
|
71
|
-
'image' => container_status[
|
72
|
-
'image_id' => container_status[
|
76
|
+
'name' => container_status[:name],
|
77
|
+
'image' => container_status[:image],
|
78
|
+
'image_id' => container_status[:imageID]
|
73
79
|
}
|
74
80
|
else
|
75
81
|
container_meta[container_id] = {
|
76
|
-
'name' => container_status[
|
82
|
+
'name' => container_status[:name]
|
77
83
|
}
|
78
84
|
end
|
79
85
|
end
|
80
86
|
rescue
|
81
|
-
log.debug("parsing container meta information failed for: #{pod_object[
|
87
|
+
log.debug("parsing container meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]} ")
|
82
88
|
end
|
83
89
|
|
84
90
|
kubernetes_metadata = {
|
85
|
-
'namespace_name' => pod_object[
|
86
|
-
'pod_id' => pod_object[
|
87
|
-
'pod_name' => pod_object[
|
91
|
+
'namespace_name' => pod_object[:metadata][:namespace],
|
92
|
+
'pod_id' => pod_object[:metadata][:uid],
|
93
|
+
'pod_name' => pod_object[:metadata][:name],
|
88
94
|
'containers' => syms_to_strs(container_meta),
|
89
|
-
'host' => pod_object[
|
95
|
+
'host' => pod_object[:spec][:nodeName]
|
90
96
|
}
|
91
97
|
kubernetes_metadata['annotations'] = annotations unless annotations.empty?
|
92
98
|
kubernetes_metadata['labels'] = labels unless labels.empty?
|
93
99
|
kubernetes_metadata['master_url'] = @kubernetes_url unless @skip_master_url
|
94
|
-
|
100
|
+
kubernetes_metadata
|
95
101
|
end
|
96
102
|
|
97
103
|
def syms_to_strs(hsh)
|
@@ -111,29 +117,3 @@ module KubernetesMetadata
|
|
111
117
|
|
112
118
|
end
|
113
119
|
end
|
114
|
-
|
115
|
-
# copied from activesupport
|
116
|
-
class Object
|
117
|
-
# An object is blank if it's false, empty, or a whitespace string.
|
118
|
-
# For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
|
119
|
-
#
|
120
|
-
# This simplifies
|
121
|
-
#
|
122
|
-
# !address || address.empty?
|
123
|
-
#
|
124
|
-
# to
|
125
|
-
#
|
126
|
-
# address.blank?
|
127
|
-
#
|
128
|
-
# @return [true, false]
|
129
|
-
def blank?
|
130
|
-
respond_to?(:empty?) ? !!empty? : !self
|
131
|
-
end
|
132
|
-
|
133
|
-
# An object is present if it's not blank.
|
134
|
-
#
|
135
|
-
# @return [true, false]
|
136
|
-
def present?
|
137
|
-
!blank?
|
138
|
-
end
|
139
|
-
end
|