fluent-plugin-kubernetes_metadata_filter 3.2.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 +4 -4
- data/Gemfile.lock +10 -10
- data/README.md +3 -0
- data/fluent-plugin-kubernetes_metadata_filter.gemspec +1 -1
- data/lib/fluent/plugin/filter_kubernetes_metadata.rb +5 -2
- data/lib/fluent/plugin/kubernetes_metadata_common.rb +17 -4
- data/test/cassettes/kubernetes_get_namespace_default.yml +4 -1
- data/test/cassettes/kubernetes_get_pod_with_ownerrefs.yml +156 -0
- data/test/plugin/test_filter_kubernetes_metadata.rb +133 -4
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0754e97a3a06ac6c24eee7004490eb0e06bfb51f63a2c973e07d9edfc593a239
|
|
4
|
+
data.tar.gz: 340c6bdc268bc2ff009fd63e58ec460e043f65636d1a03f9a3726467e84821f5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: de4fa7d241b0b7efacd1cde9e2c18c0bb3c8553d13e13528e9ccc16aa3ab974c12b1a88ce43a7bd186c9060d29ba649f8aa0365c3a9ecc4eed2c2354e1092dc9
|
|
7
|
+
data.tar.gz: 02ca1c7a7703e85962e206571b25a8416be206ef18d706958dfc894c598a068727e53abb3bd3beb059f1245211f957072b0b4c38a21a9d4c1ed114286306ffc9
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
fluent-plugin-kubernetes_metadata_filter (3.
|
|
4
|
+
fluent-plugin-kubernetes_metadata_filter (3.4.0)
|
|
5
5
|
fluentd (>= 0.14.0, < 1.17)
|
|
6
6
|
kubeclient (>= 4.0.0, < 5.0.0)
|
|
7
7
|
lru_redux
|
|
@@ -17,7 +17,7 @@ GEM
|
|
|
17
17
|
codeclimate-test-reporter (0.6.0)
|
|
18
18
|
simplecov (>= 0.7.1, < 1.0.0)
|
|
19
19
|
concurrent-ruby (1.2.2)
|
|
20
|
-
cool.io (1.
|
|
20
|
+
cool.io (1.8.0)
|
|
21
21
|
copyright-header (1.0.22)
|
|
22
22
|
github-linguist
|
|
23
23
|
crack (0.4.5)
|
|
@@ -26,17 +26,17 @@ GEM
|
|
|
26
26
|
domain_name (0.5.20190701)
|
|
27
27
|
unf (>= 0.0.5, < 1.0.0)
|
|
28
28
|
escape_utils (1.2.2)
|
|
29
|
-
ffi (1.
|
|
29
|
+
ffi (1.16.2)
|
|
30
30
|
ffi-compiler (1.0.1)
|
|
31
31
|
ffi (>= 1.0.0)
|
|
32
32
|
rake
|
|
33
|
-
fluentd (1.16.
|
|
33
|
+
fluentd (1.16.2)
|
|
34
34
|
bundler
|
|
35
35
|
cool.io (>= 1.4.5, < 2.0.0)
|
|
36
36
|
http_parser.rb (>= 0.5.1, < 0.9.0)
|
|
37
37
|
msgpack (>= 1.3.1, < 2.0.0)
|
|
38
38
|
serverengine (>= 2.3.2, < 3.0.0)
|
|
39
|
-
sigdump (~> 0.2.
|
|
39
|
+
sigdump (~> 0.2.5)
|
|
40
40
|
strptime (>= 0.2.4, < 1.0.0)
|
|
41
41
|
tzinfo (>= 1.0, < 3.0)
|
|
42
42
|
tzinfo-data (~> 1.0)
|
|
@@ -58,7 +58,7 @@ GEM
|
|
|
58
58
|
domain_name (~> 0.5)
|
|
59
59
|
http-form_data (2.3.0)
|
|
60
60
|
http_parser.rb (0.8.0)
|
|
61
|
-
jsonpath (1.1.
|
|
61
|
+
jsonpath (1.1.4)
|
|
62
62
|
multi_json
|
|
63
63
|
kubeclient (4.11.0)
|
|
64
64
|
http (>= 3.0, < 6.0)
|
|
@@ -69,12 +69,12 @@ GEM
|
|
|
69
69
|
ffi-compiler (~> 1.0)
|
|
70
70
|
rake (~> 13.0)
|
|
71
71
|
lru_redux (1.1.0)
|
|
72
|
-
mime-types (3.
|
|
72
|
+
mime-types (3.5.1)
|
|
73
73
|
mime-types-data (~> 3.2015)
|
|
74
|
-
mime-types-data (3.2023.
|
|
74
|
+
mime-types-data (3.2023.0808)
|
|
75
75
|
mini_mime (1.1.2)
|
|
76
76
|
minitest (4.7.5)
|
|
77
|
-
msgpack (1.7.
|
|
77
|
+
msgpack (1.7.2)
|
|
78
78
|
multi_json (1.15.0)
|
|
79
79
|
netrc (0.11.0)
|
|
80
80
|
parallel (1.22.1)
|
|
@@ -108,7 +108,7 @@ GEM
|
|
|
108
108
|
rugged (1.4.3)
|
|
109
109
|
serverengine (2.3.2)
|
|
110
110
|
sigdump (~> 0.2.2)
|
|
111
|
-
sigdump (0.2.
|
|
111
|
+
sigdump (0.2.5)
|
|
112
112
|
simplecov (0.21.2)
|
|
113
113
|
docile (~> 1.1)
|
|
114
114
|
simplecov-html (~> 0.11)
|
data/README.md
CHANGED
|
@@ -55,6 +55,8 @@ when true (default: `true`)
|
|
|
55
55
|
to trust the intermediate CA certs we do have, set this to `true` - this corresponds to
|
|
56
56
|
the `openssl s_client -partial_chain` flag and `X509_V_FLAG_PARTIAL_CHAIN` (default: `false`)
|
|
57
57
|
* `skip_labels` - Skip all label fields from the metadata.
|
|
58
|
+
* `skip_pod_labels` - Skip only pod label fields from the metadata.
|
|
59
|
+
* `skip_namespace_labels` - Skip only namespace label fields from the metadata.
|
|
58
60
|
* `skip_container_metadata` - Skip some of the container data of the metadata. The metadata will not contain the container_image and container_image_id fields.
|
|
59
61
|
* `skip_master_url` - Skip the master_url field from the metadata.
|
|
60
62
|
* `skip_namespace_metadata` - Skip the namespace_id field from the metadata. The fetch_namespace_metadata function will be skipped. The plugin will be faster and cpu consumption will be less.
|
|
@@ -62,6 +64,7 @@ when true (default: `true`)
|
|
|
62
64
|
* `watch_retry_interval` - The time interval in seconds for retry backoffs when watch connections fail. (default: `10`)
|
|
63
65
|
* `open_timeout` - The time in seconds to wait for a connection to kubernetes service. (default: `3`)
|
|
64
66
|
* `read_timeout` - The time in seconds to wait for a read from kubernetes service. (default: `10`)
|
|
67
|
+
* `include_ownerrefs_metadata` - If set to true, it will include metadata (`kind` & `name`) in `kubernetes.ownerrefs` about the controller that owns the pod. (default: `false`)
|
|
65
68
|
|
|
66
69
|
|
|
67
70
|
Reading from a JSON formatted log files with `in_tail` and wildcard filenames while respecting the CRI-o log format with the same config you need the fluent-plugin "multi-format-parser":
|
|
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |gem|
|
|
7
7
|
gem.name = 'fluent-plugin-kubernetes_metadata_filter'
|
|
8
|
-
gem.version = '3.
|
|
8
|
+
gem.version = '3.4.0'
|
|
9
9
|
gem.authors = ['OpenShift Cluster Logging','Jimmi Dyson']
|
|
10
10
|
gem.email = ['team-logging@redhat.com','jimmidyson@gmail.com']
|
|
11
11
|
gem.description = 'Filter plugin to add Kubernetes metadata'
|
|
@@ -77,9 +77,12 @@ module Fluent::Plugin
|
|
|
77
77
|
# the openssl s_client -partial_chain flag and X509_V_FLAG_PARTIAL_CHAIN
|
|
78
78
|
config_param :ssl_partial_chain, :bool, default: false
|
|
79
79
|
config_param :skip_labels, :bool, default: false
|
|
80
|
+
config_param :skip_pod_labels, :bool, default: false
|
|
81
|
+
config_param :skip_namespace_labels, :bool, default: false
|
|
80
82
|
config_param :skip_container_metadata, :bool, default: false
|
|
81
83
|
config_param :skip_master_url, :bool, default: false
|
|
82
84
|
config_param :skip_namespace_metadata, :bool, default: false
|
|
85
|
+
config_param :include_ownerrefs_metadata, :bool, default: false
|
|
83
86
|
|
|
84
87
|
# A classname in the form of Test::APIAdapter which will try
|
|
85
88
|
# to be resolved from a relative named file 'test_api_adapter'
|
|
@@ -198,7 +201,7 @@ module Fluent::Plugin
|
|
|
198
201
|
@namespace_cache = LruRedux::TTL::ThreadSafeCache.new(@cache_size, @cache_ttl)
|
|
199
202
|
|
|
200
203
|
@tag_to_kubernetes_name_regexp_compiled = Regexp.compile(@tag_to_kubernetes_name_regexp)
|
|
201
|
-
|
|
204
|
+
|
|
202
205
|
# Use Kubernetes default service account if we're in a pod.
|
|
203
206
|
if @kubernetes_url.nil?
|
|
204
207
|
log.debug 'Kubernetes URL is not set - inspecting environ'
|
|
@@ -351,7 +354,7 @@ module Fluent::Plugin
|
|
|
351
354
|
tag_match_data['pod_uuid']
|
|
352
355
|
else
|
|
353
356
|
tag_match_data['docker_id']
|
|
354
|
-
end
|
|
357
|
+
end
|
|
355
358
|
docker_id = tag_match_data.names.include?('docker_id') ? tag_match_data['docker_id'] : nil
|
|
356
359
|
metadata = get_metadata_for_record(tag_match_data['namespace'], tag_match_data['pod_name'], tag_match_data['container_name'],
|
|
357
360
|
cache_key, time, batch_miss_cache, docker_id)
|
|
@@ -40,7 +40,7 @@ module KubernetesMetadata
|
|
|
40
40
|
|
|
41
41
|
def parse_namespace_metadata(namespace_object)
|
|
42
42
|
labels = ''
|
|
43
|
-
labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless @skip_labels
|
|
43
|
+
labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless (@skip_labels || @skip_namespace_labels)
|
|
44
44
|
|
|
45
45
|
annotations = match_annotations(syms_to_strs(namespace_object[:metadata][:annotations].to_h))
|
|
46
46
|
|
|
@@ -55,7 +55,7 @@ module KubernetesMetadata
|
|
|
55
55
|
|
|
56
56
|
def parse_pod_metadata(pod_object)
|
|
57
57
|
labels = ''
|
|
58
|
-
labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless @skip_labels
|
|
58
|
+
labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless (@skip_labels || @skip_pod_labels)
|
|
59
59
|
|
|
60
60
|
annotations = match_annotations(syms_to_strs(pod_object[:metadata][:annotations].to_h))
|
|
61
61
|
|
|
@@ -82,14 +82,27 @@ module KubernetesMetadata
|
|
|
82
82
|
log.warn("parsing container meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}")
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
+
ownerrefs_meta = []
|
|
86
|
+
begin
|
|
87
|
+
pod_object[:metadata][:ownerReferences].each do |owner_reference|
|
|
88
|
+
ownerrefs_meta.append({
|
|
89
|
+
'kind' => owner_reference[:kind],
|
|
90
|
+
'name' => owner_reference[:name]
|
|
91
|
+
})
|
|
92
|
+
end
|
|
93
|
+
rescue StandardError => e
|
|
94
|
+
log.warn("parsing ownerrefs meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}")
|
|
95
|
+
end if @include_ownerrefs_metadata && pod_object[:metadata][:ownerReferences]
|
|
96
|
+
|
|
85
97
|
kubernetes_metadata = {
|
|
86
98
|
'namespace_name' => pod_object[:metadata][:namespace],
|
|
87
99
|
'pod_id' => pod_object[:metadata][:uid],
|
|
88
100
|
'pod_name' => pod_object[:metadata][:name],
|
|
89
101
|
'pod_ip' => pod_object[:status][:podIP],
|
|
90
102
|
'containers' => syms_to_strs(container_meta),
|
|
91
|
-
'host' => pod_object[:spec][:nodeName]
|
|
92
|
-
|
|
103
|
+
'host' => pod_object[:spec][:nodeName],
|
|
104
|
+
'ownerrefs' => (ownerrefs_meta if @include_ownerrefs_metadata)
|
|
105
|
+
}.compact
|
|
93
106
|
kubernetes_metadata['annotations'] = annotations unless annotations.empty?
|
|
94
107
|
kubernetes_metadata['labels'] = labels unless labels.empty?
|
|
95
108
|
kubernetes_metadata['master_url'] = @kubernetes_url unless @skip_master_url
|
|
@@ -53,7 +53,10 @@ http_interactions:
|
|
|
53
53
|
"selfLink": "/api/v1/namespaces/default",
|
|
54
54
|
"uid": "898268c8-4a36-11e5-9d81-42010af0194c",
|
|
55
55
|
"resourceVersion": "6",
|
|
56
|
-
"creationTimestamp": "2015-05-08T09:22:01Z"
|
|
56
|
+
"creationTimestamp": "2015-05-08T09:22:01Z",
|
|
57
|
+
"labels": {
|
|
58
|
+
"tenant": "test"
|
|
59
|
+
}
|
|
57
60
|
},
|
|
58
61
|
"spec": {
|
|
59
62
|
"finalizers": [
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
|
|
3
|
+
# Kubernetes metadata
|
|
4
|
+
#
|
|
5
|
+
# Copyright 2015 Red Hat, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
---
|
|
20
|
+
http_interactions:
|
|
21
|
+
- request:
|
|
22
|
+
method: get
|
|
23
|
+
uri: https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc
|
|
24
|
+
body:
|
|
25
|
+
encoding: US-ASCII
|
|
26
|
+
string: ''
|
|
27
|
+
headers:
|
|
28
|
+
Accept:
|
|
29
|
+
- "*/*; q=0.5, application/xml"
|
|
30
|
+
Accept-Encoding:
|
|
31
|
+
- gzip, deflate
|
|
32
|
+
User-Agent:
|
|
33
|
+
- Ruby
|
|
34
|
+
response:
|
|
35
|
+
status:
|
|
36
|
+
code: 200
|
|
37
|
+
message: OK
|
|
38
|
+
headers:
|
|
39
|
+
Content-Type:
|
|
40
|
+
- application/json
|
|
41
|
+
Date:
|
|
42
|
+
- Fri, 08 May 2015 10:35:37 GMT
|
|
43
|
+
Transfer-Encoding:
|
|
44
|
+
- chunked
|
|
45
|
+
body:
|
|
46
|
+
encoding: UTF-8
|
|
47
|
+
string: |-
|
|
48
|
+
{
|
|
49
|
+
"kind": "Pod",
|
|
50
|
+
"apiVersion": "v1",
|
|
51
|
+
"metadata": {
|
|
52
|
+
"name": "fabric8-console-controller-98rqc",
|
|
53
|
+
"generateName": "fabric8-console-controller-",
|
|
54
|
+
"namespace": "default",
|
|
55
|
+
"selfLink": "/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc",
|
|
56
|
+
"uid": "c76927af-f563-11e4-b32d-54ee7527188d",
|
|
57
|
+
"resourceVersion": "122",
|
|
58
|
+
"creationTimestamp": "2015-05-08T09:22:42Z",
|
|
59
|
+
"labels": {
|
|
60
|
+
"component": "fabric8Console"
|
|
61
|
+
},
|
|
62
|
+
"ownerReferences": [
|
|
63
|
+
{
|
|
64
|
+
"apiVersion": "apps/v1",
|
|
65
|
+
"blockOwnerDeletion": true,
|
|
66
|
+
"controller": true,
|
|
67
|
+
"kind": "ReplicaSet",
|
|
68
|
+
"name": "fabric8-console-controller",
|
|
69
|
+
"uid": "dd1ac3e1-bc88-4c54-be0f-26ac2406d884"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"spec": {
|
|
74
|
+
"volumes": [
|
|
75
|
+
{
|
|
76
|
+
"name": "openshift-cert-secrets",
|
|
77
|
+
"hostPath": null,
|
|
78
|
+
"emptyDir": null,
|
|
79
|
+
"gcePersistentDisk": null,
|
|
80
|
+
"gitRepo": null,
|
|
81
|
+
"secret": {
|
|
82
|
+
"secretName": "openshift-cert-secrets"
|
|
83
|
+
},
|
|
84
|
+
"nfs": null,
|
|
85
|
+
"iscsi": null,
|
|
86
|
+
"glusterfs": null
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"containers": [
|
|
90
|
+
{
|
|
91
|
+
"name": "fabric8-console-container",
|
|
92
|
+
"image": "fabric8/hawtio-kubernetes:latest",
|
|
93
|
+
"ports": [
|
|
94
|
+
{
|
|
95
|
+
"containerPort": 9090,
|
|
96
|
+
"protocol": "TCP"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"env": [
|
|
100
|
+
{
|
|
101
|
+
"name": "OAUTH_CLIENT_ID",
|
|
102
|
+
"value": "fabric8-console"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "OAUTH_AUTHORIZE_URI",
|
|
106
|
+
"value": "https://localhost:8443/oauth/authorize"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"resources": {},
|
|
110
|
+
"volumeMounts": [
|
|
111
|
+
{
|
|
112
|
+
"name": "openshift-cert-secrets",
|
|
113
|
+
"readOnly": true,
|
|
114
|
+
"mountPath": "/etc/secret-volume"
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"terminationMessagePath": "/dev/termination-log",
|
|
118
|
+
"imagePullPolicy": "IfNotPresent",
|
|
119
|
+
"capabilities": {}
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"restartPolicy": "Always",
|
|
123
|
+
"dnsPolicy": "ClusterFirst",
|
|
124
|
+
"nodeName": "jimmi-redhat.localnet"
|
|
125
|
+
},
|
|
126
|
+
"status": {
|
|
127
|
+
"phase": "Running",
|
|
128
|
+
"Condition": [
|
|
129
|
+
{
|
|
130
|
+
"type": "Ready",
|
|
131
|
+
"status": "True"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"hostIP": "172.17.42.1",
|
|
135
|
+
"podIP": "172.17.0.8",
|
|
136
|
+
"containerStatuses": [
|
|
137
|
+
{
|
|
138
|
+
"name": "fabric8-console-container",
|
|
139
|
+
"state": {
|
|
140
|
+
"running": {
|
|
141
|
+
"startedAt": "2015-05-08T09:22:44Z"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"lastState": {},
|
|
145
|
+
"ready": true,
|
|
146
|
+
"restartCount": 0,
|
|
147
|
+
"image": "fabric8/hawtio-kubernetes:latest",
|
|
148
|
+
"imageID": "docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303",
|
|
149
|
+
"containerID": "docker://49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459"
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
http_version:
|
|
155
|
+
recorded_at: Fri, 08 May 2015 10:35:37 GMT
|
|
156
|
+
recorded_with: VCR 2.9.3
|
|
@@ -49,7 +49,7 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
49
49
|
d.instance.dump_stats
|
|
50
50
|
assert_false(d.instance.instance_variable_get("@curr_time").nil?)
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
test 'disables stats when <= zero' do
|
|
54
54
|
d = create_driver('stats_interval 0')
|
|
55
55
|
assert_equal(0, d.instance.stats_interval)
|
|
@@ -199,6 +199,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
199
199
|
'pod_name' => 'fabric8-console-controller-98rqc',
|
|
200
200
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
201
201
|
'namespace_name' => 'default',
|
|
202
|
+
'namespace_labels' => {
|
|
203
|
+
'tenant' => 'test'
|
|
204
|
+
},
|
|
202
205
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
203
206
|
'pod_ip' => '172.17.0.8',
|
|
204
207
|
'master_url' => 'https://localhost:8443',
|
|
@@ -231,6 +234,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
231
234
|
'pod_name' => 'fabric8-console-controller-98rqc',
|
|
232
235
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
233
236
|
'namespace_name' => 'default',
|
|
237
|
+
'namespace_labels' => {
|
|
238
|
+
'tenant' => 'test'
|
|
239
|
+
},
|
|
234
240
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
235
241
|
'pod_ip' => '172.17.0.8',
|
|
236
242
|
'master_url' => 'https://localhost:8443',
|
|
@@ -330,6 +336,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
330
336
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
331
337
|
'namespace_name' => 'default',
|
|
332
338
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
339
|
+
'namespace_labels' => {
|
|
340
|
+
'tenant' => 'test'
|
|
341
|
+
},
|
|
333
342
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
334
343
|
'pod_ip' => '172.17.0.8',
|
|
335
344
|
'master_url' => 'https://localhost:8443',
|
|
@@ -360,6 +369,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
360
369
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
361
370
|
'namespace_name' => 'default',
|
|
362
371
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
372
|
+
'namespace_labels' => {
|
|
373
|
+
'tenant' => 'test'
|
|
374
|
+
},
|
|
363
375
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
364
376
|
'pod_ip' => '172.17.0.8',
|
|
365
377
|
'master_url' => 'https://localhost:8443',
|
|
@@ -410,6 +422,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
410
422
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
411
423
|
'namespace_name' => 'default',
|
|
412
424
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
425
|
+
'namespace_labels' => {
|
|
426
|
+
'tenant' => 'test'
|
|
427
|
+
},
|
|
413
428
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
414
429
|
'pod_ip' => '172.17.0.8',
|
|
415
430
|
'master_url' => 'https://localhost:8443',
|
|
@@ -585,8 +600,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
585
600
|
'host' => 'jimmi-redhat.localnet',
|
|
586
601
|
'pod_name' => 'fabric8-console-controller-98rqc',
|
|
587
602
|
'container_name' => 'fabric8-console-container',
|
|
588
|
-
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
589
603
|
'namespace_name' => 'default',
|
|
604
|
+
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
590
605
|
'container_image' => 'fabric8/hawtio-kubernetes:latest',
|
|
591
606
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
592
607
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
@@ -628,8 +643,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
628
643
|
'container_name' => 'fabric8-console-container',
|
|
629
644
|
'container_image' => 'fabric8/hawtio-kubernetes:latest',
|
|
630
645
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
631
|
-
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
632
646
|
'namespace_name' => 'default',
|
|
647
|
+
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
633
648
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
634
649
|
'pod_ip' => '172.17.0.8',
|
|
635
650
|
'master_url' => 'https://localhost:8443',
|
|
@@ -643,7 +658,7 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
643
658
|
end
|
|
644
659
|
|
|
645
660
|
test 'processes all events when reading from MessagePackEventStream' do
|
|
646
|
-
VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
|
|
661
|
+
VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
|
|
647
662
|
{ name: 'kubernetes_get_api_v1' },
|
|
648
663
|
{ name: 'kubernetes_get_pod' },
|
|
649
664
|
{ name: 'kubernetes_get_namespace_default' }]) do
|
|
@@ -675,6 +690,9 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
675
690
|
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
676
691
|
'namespace_name' => 'default',
|
|
677
692
|
'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
|
|
693
|
+
'namespace_labels' => {
|
|
694
|
+
'tenant' => 'test'
|
|
695
|
+
},
|
|
678
696
|
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
679
697
|
'pod_ip' => '172.17.0.8',
|
|
680
698
|
'master_url' => 'https://localhost:8443',
|
|
@@ -718,5 +736,116 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
|
|
|
718
736
|
assert_equal(expected_kube_metadata, filtered[0])
|
|
719
737
|
end
|
|
720
738
|
end
|
|
739
|
+
|
|
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({}, '
|
|
744
|
+
kubernetes_url https://localhost:8443
|
|
745
|
+
watch false
|
|
746
|
+
cache_size 1
|
|
747
|
+
stats_interval 0
|
|
748
|
+
skip_namespace_labels true
|
|
749
|
+
skip_master_url true
|
|
750
|
+
')
|
|
751
|
+
expected_kube_metadata = {
|
|
752
|
+
'docker'=>{
|
|
753
|
+
'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
|
754
|
+
},
|
|
755
|
+
'kubernetes' => {
|
|
756
|
+
'host' => 'jimmi-redhat.localnet',
|
|
757
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
|
758
|
+
'container_name' => 'fabric8-console-container',
|
|
759
|
+
'container_image' => 'fabric8/hawtio-kubernetes:latest',
|
|
760
|
+
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
761
|
+
'namespace_name' => 'default',
|
|
762
|
+
"namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
|
|
763
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
764
|
+
'pod_ip' => '172.17.0.8',
|
|
765
|
+
'labels' => {
|
|
766
|
+
'component' => 'fabric8Console'
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
assert_equal(expected_kube_metadata, filtered[0])
|
|
772
|
+
end
|
|
773
|
+
end
|
|
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({}, '
|
|
778
|
+
kubernetes_url https://localhost:8443
|
|
779
|
+
watch false
|
|
780
|
+
cache_size 1
|
|
781
|
+
stats_interval 0
|
|
782
|
+
skip_pod_labels true
|
|
783
|
+
skip_master_url true
|
|
784
|
+
')
|
|
785
|
+
expected_kube_metadata = {
|
|
786
|
+
'docker'=>{
|
|
787
|
+
'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
|
788
|
+
},
|
|
789
|
+
'kubernetes' => {
|
|
790
|
+
'host' => 'jimmi-redhat.localnet',
|
|
791
|
+
'pod_name' => 'fabric8-console-controller-98rqc',
|
|
792
|
+
'container_name' => 'fabric8-console-container',
|
|
793
|
+
'container_image' => 'fabric8/hawtio-kubernetes:latest',
|
|
794
|
+
'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
|
795
|
+
'namespace_name' => 'default',
|
|
796
|
+
"namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
|
|
797
|
+
'namespace_labels' => {
|
|
798
|
+
'tenant' => 'test'
|
|
799
|
+
},
|
|
800
|
+
'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
|
|
801
|
+
'pod_ip' => '172.17.0.8',
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
assert_equal(expected_kube_metadata, filtered[0])
|
|
806
|
+
end
|
|
807
|
+
end
|
|
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({}, '
|
|
814
|
+
kubernetes_url https://localhost:8443
|
|
815
|
+
watch false
|
|
816
|
+
cache_size 1
|
|
817
|
+
stats_interval 0
|
|
818
|
+
skip_pod_labels true
|
|
819
|
+
skip_master_url true
|
|
820
|
+
include_ownerrefs_metadata true
|
|
821
|
+
')
|
|
822
|
+
expected_kube_metadata = {
|
|
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
|
+
}
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
assert_equal(expected_kube_metadata, filtered[0])
|
|
847
|
+
end
|
|
848
|
+
end
|
|
849
|
+
|
|
721
850
|
end
|
|
722
851
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fluent-plugin-kubernetes_metadata_filter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- OpenShift Cluster Logging
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2023-
|
|
12
|
+
date: 2023-10-02 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: fluentd
|
|
@@ -259,6 +259,7 @@ files:
|
|
|
259
259
|
- test/cassettes/kubernetes_get_pod.yml
|
|
260
260
|
- test/cassettes/kubernetes_get_pod_container_init.yml
|
|
261
261
|
- test/cassettes/kubernetes_get_pod_using_token.yml
|
|
262
|
+
- test/cassettes/kubernetes_get_pod_with_ownerrefs.yml
|
|
262
263
|
- test/cassettes/metadata_from_tag_and_journald_fields.yml
|
|
263
264
|
- test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml
|
|
264
265
|
- test/cassettes/valid_kubernetes_api_server.yml
|
|
@@ -290,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
290
291
|
- !ruby/object:Gem::Version
|
|
291
292
|
version: '0'
|
|
292
293
|
requirements: []
|
|
293
|
-
rubygems_version: 3.
|
|
294
|
+
rubygems_version: 3.3.3
|
|
294
295
|
signing_key:
|
|
295
296
|
specification_version: 4
|
|
296
297
|
summary: Fluentd filter plugin to add Kubernetes metadata
|