fluent-plugin-k8s-metrics-agg 1.1.0 → 1.1.5
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 +19 -36
- data/.circleci/trigger_func_test.sh +42 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- data/.github/ISSUE_TEMPLATE/enhancement_request.md +14 -0
- data/.github/ISSUE_TEMPLATE/failing_test.md +18 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- data/.gitignore +4 -0
- data/CLA.md +18 -0
- data/Gemfile.lock +55 -48
- data/Makefile +35 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/docker/Dockerfile +30 -45
- data/docker/Gemfile +18 -0
- data/docker/Gemfile.lock +170 -0
- data/docker/build.sh +20 -0
- data/fluent-plugin-k8s-metrics-agg.gemspec +7 -7
- data/lib/fluent/plugin/in_kubernetes_metrics_aggregator.rb +35 -24
- data/test/helper.rb +55 -71
- data/test/plugin/test_in_kubernetes_metrics_aggregator.rb +137 -104
- metadata +30 -24
- data/.circleci/build_and_push.sh +0 -10
- data/.circleci/build_and_push_to_dockerhub.sh +0 -11
- data/.circleci/build_and_push_to_github_release.sh +0 -11
- data/.circleci/push_gem.sh +0 -7
data/Rakefile
CHANGED
@@ -24,6 +24,6 @@ namespace :docker do
|
|
24
24
|
raise 'Argument `tag` was not provided.' unless args.tag
|
25
25
|
|
26
26
|
cp Dir['pkg/fluent-plugin-k8s-metrics-agg-*.gem'], 'docker/'
|
27
|
-
sh "docker build
|
27
|
+
sh "docker build --no-cache --pull --build-arg VERSION=$(cat VERSION) -t splunk/fluent-plugin-k8s-metrics-agg:#{args.tag} ./docker"
|
28
28
|
end
|
29
29
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.5
|
data/docker/Dockerfile
CHANGED
@@ -1,52 +1,37 @@
|
|
1
|
-
FROM
|
2
|
-
|
3
|
-
LABEL maintainer="Splunk Inc. <DataEdge@splunk.com>"
|
4
|
-
LABEL Description="Splunk Connect for Kubernetes docker image" Vendor="Splunk Inc."
|
1
|
+
FROM registry.access.redhat.com/ubi8/ruby-27
|
5
2
|
|
6
3
|
ARG VERSION
|
4
|
+
ARG NODEJS_VERSION
|
5
|
+
|
6
|
+
LABEL name="Splunk Connect for Kubernetes Metrics Aggregator container" \
|
7
|
+
maintainer="DataEdge@splunk.com" \
|
8
|
+
vendor="Splunk Inc." \
|
9
|
+
version=${VERSION} \
|
10
|
+
release=${VERSION} \
|
11
|
+
summary="Splunk Connect for Kubernetes Metrics Aggregator container" \
|
12
|
+
description="Splunk Connect for Kubernetes Metrics Aggregator container"
|
13
|
+
|
7
14
|
ENV VERSION=${VERSION}
|
15
|
+
ENV FLUENT_USER fluent
|
8
16
|
|
9
|
-
|
10
|
-
|
17
|
+
USER root
|
18
|
+
COPY licenses /licenses
|
11
19
|
|
12
20
|
COPY *.gem /tmp/
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
&& echo 'gem: --no-document' >> /etc/gemrc \
|
31
|
-
&& gem install -N \
|
32
|
-
fluentd:1.4.0 \
|
33
|
-
fluent-plugin-record-modifier:2.0.1 \
|
34
|
-
fluent-plugin-splunk-hec:${VERSION} \
|
35
|
-
oj:3.7.9 \
|
36
|
-
multi_json:1.13.1 \
|
37
|
-
bigdecimal:1.4.3 \
|
38
|
-
kubeclient:4.3.0 \
|
39
|
-
&& gem install -N /tmp/*.gem \
|
40
|
-
&& apk del .build-deps \
|
41
|
-
&& rm -rf /var/cache/apk/* \
|
42
|
-
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem
|
43
|
-
|
44
|
-
ENV LD_PRELOAD="" \
|
45
|
-
FLUENTD_CONF="fluent.conf" \
|
46
|
-
FLUENTD_OPT="" \
|
47
|
-
DUMB_INIT_SETSID=0
|
48
|
-
|
49
|
-
COPY entrypoint.sh /bin/entrypoint.sh
|
50
|
-
ENTRYPOINT ["/bin/entrypoint.sh"]
|
51
|
-
|
52
|
-
CMD exec fluentd -c /fluentd/etc/${FLUENTD_CONF} -p /fluentd/plugins $FLUENTD_OPT
|
22
|
+
COPY Gemfile* ./
|
23
|
+
RUN yum update -y \
|
24
|
+
&& npm install -g n \
|
25
|
+
&& yum remove -y nodejs \
|
26
|
+
&& n ${NODEJS_VERSION} \
|
27
|
+
&& gem install bundler \
|
28
|
+
&& gem unpack /tmp/*.gem --target gem \
|
29
|
+
&& bundle install
|
30
|
+
|
31
|
+
RUN groupadd -r $FLUENT_USER && \
|
32
|
+
useradd -r -g $FLUENT_USER $FLUENT_USER && \
|
33
|
+
mkdir -p /fluentd/log /fluentd/etc /fluentd/plugins &&\
|
34
|
+
chown -R $FLUENT_USER /fluentd && chgrp -R $FLUENT_USER /fluentd
|
35
|
+
|
36
|
+
USER $FLUENT_USER
|
37
|
+
CMD bundle exec fluentd -c /fluentd/etc/fluent.conf
|
data/docker/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# This is separate gemfile for building docker image that has all plugins
|
4
|
+
# for kubernetes log collection agent
|
5
|
+
# List all required gems here and install via bundler to resolve dependencies
|
6
|
+
gem "fluentd", "=1.11.5"
|
7
|
+
gem "fluent-plugin-prometheus", "=1.8.5"
|
8
|
+
gem "fluent-plugin-record-modifier", "=2.1.0"
|
9
|
+
gem "fluent-plugin-kubernetes_metadata_filter", "=2.5.3"
|
10
|
+
gem "kubeclient", "=4.6.0"
|
11
|
+
gem "oj", "=3.10.2"
|
12
|
+
gem 'multi_json', '=1.14.1'
|
13
|
+
gem 'http_parser.rb', '=0.5.3'
|
14
|
+
gem 'bigdecimal', '=3.0.0'
|
15
|
+
|
16
|
+
gem "fluent-plugin-splunk-hec", ">= 1.2.5"
|
17
|
+
|
18
|
+
gem 'fluent-plugin-k8s-metrics-agg', path: 'gem/'
|
data/docker/Gemfile.lock
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
PATH
|
2
|
+
remote: gem
|
3
|
+
specs:
|
4
|
+
fluent-plugin-k8s-metrics-agg (1.1.5)
|
5
|
+
fluentd (>= 1.9.1)
|
6
|
+
kubeclient (~> 4.6.0)
|
7
|
+
multi_json (~> 1.14.1)
|
8
|
+
oj (~> 3.10.2)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
activemodel (6.1.3.1)
|
14
|
+
activesupport (= 6.1.3.1)
|
15
|
+
activesupport (6.1.3.1)
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
+
i18n (>= 1.6, < 2)
|
18
|
+
minitest (>= 5.1)
|
19
|
+
tzinfo (~> 2.0)
|
20
|
+
zeitwerk (~> 2.3)
|
21
|
+
addressable (2.7.0)
|
22
|
+
public_suffix (>= 2.0.2, < 5.0)
|
23
|
+
aes_key_wrap (1.1.0)
|
24
|
+
attr_required (1.0.1)
|
25
|
+
bigdecimal (3.0.0)
|
26
|
+
bindata (2.4.8)
|
27
|
+
concurrent-ruby (1.1.8)
|
28
|
+
connection_pool (2.2.3)
|
29
|
+
cool.io (1.7.1)
|
30
|
+
domain_name (0.5.20190701)
|
31
|
+
unf (>= 0.0.5, < 1.0.0)
|
32
|
+
ffi (1.15.0)
|
33
|
+
ffi-compiler (1.0.1)
|
34
|
+
ffi (>= 1.0.0)
|
35
|
+
rake
|
36
|
+
fluent-plugin-kubernetes_metadata_filter (2.5.3)
|
37
|
+
fluentd (>= 0.14.0, < 1.12)
|
38
|
+
kubeclient (< 5)
|
39
|
+
lru_redux
|
40
|
+
fluent-plugin-prometheus (1.8.5)
|
41
|
+
fluentd (>= 1.9.1, < 2)
|
42
|
+
prometheus-client (< 0.10)
|
43
|
+
fluent-plugin-record-modifier (2.1.0)
|
44
|
+
fluentd (>= 1.0, < 2)
|
45
|
+
fluent-plugin-splunk-hec (1.2.5)
|
46
|
+
fluentd (>= 1.4)
|
47
|
+
multi_json (~> 1.13)
|
48
|
+
net-http-persistent (~> 3.1)
|
49
|
+
openid_connect (~> 1.1.8)
|
50
|
+
prometheus-client (< 0.10.0)
|
51
|
+
fluentd (1.11.5)
|
52
|
+
cool.io (>= 1.4.5, < 2.0.0)
|
53
|
+
http_parser.rb (>= 0.5.1, < 0.7.0)
|
54
|
+
msgpack (>= 1.3.1, < 2.0.0)
|
55
|
+
serverengine (>= 2.2.2, < 3.0.0)
|
56
|
+
sigdump (~> 0.2.2)
|
57
|
+
strptime (>= 0.2.2, < 1.0.0)
|
58
|
+
tzinfo (>= 1.0, < 3.0)
|
59
|
+
tzinfo-data (~> 1.0)
|
60
|
+
yajl-ruby (~> 1.0)
|
61
|
+
http (4.4.1)
|
62
|
+
addressable (~> 2.3)
|
63
|
+
http-cookie (~> 1.0)
|
64
|
+
http-form_data (~> 2.2)
|
65
|
+
http-parser (~> 1.2.0)
|
66
|
+
http-accept (1.7.0)
|
67
|
+
http-cookie (1.0.3)
|
68
|
+
domain_name (~> 0.5)
|
69
|
+
http-form_data (2.3.0)
|
70
|
+
http-parser (1.2.3)
|
71
|
+
ffi-compiler (>= 1.0, < 2.0)
|
72
|
+
http_parser.rb (0.5.3)
|
73
|
+
httpclient (2.8.3)
|
74
|
+
i18n (1.8.9)
|
75
|
+
concurrent-ruby (~> 1.0)
|
76
|
+
json-jwt (1.13.0)
|
77
|
+
activesupport (>= 4.2)
|
78
|
+
aes_key_wrap
|
79
|
+
bindata
|
80
|
+
kubeclient (4.6.0)
|
81
|
+
http (>= 3.0, < 5.0)
|
82
|
+
recursive-open-struct (~> 1.0, >= 1.0.4)
|
83
|
+
rest-client (~> 2.0)
|
84
|
+
lru_redux (1.1.0)
|
85
|
+
mail (2.7.1)
|
86
|
+
mini_mime (>= 0.1.1)
|
87
|
+
mime-types (3.3.1)
|
88
|
+
mime-types-data (~> 3.2015)
|
89
|
+
mime-types-data (3.2021.0225)
|
90
|
+
mini_mime (1.0.3)
|
91
|
+
minitest (5.14.4)
|
92
|
+
msgpack (1.4.2)
|
93
|
+
multi_json (1.14.1)
|
94
|
+
net-http-persistent (3.1.0)
|
95
|
+
connection_pool (~> 2.2)
|
96
|
+
netrc (0.11.0)
|
97
|
+
oj (3.10.2)
|
98
|
+
openid_connect (1.1.8)
|
99
|
+
activemodel
|
100
|
+
attr_required (>= 1.0.0)
|
101
|
+
json-jwt (>= 1.5.0)
|
102
|
+
rack-oauth2 (>= 1.6.1)
|
103
|
+
swd (>= 1.0.0)
|
104
|
+
tzinfo
|
105
|
+
validate_email
|
106
|
+
validate_url
|
107
|
+
webfinger (>= 1.0.1)
|
108
|
+
prometheus-client (0.9.0)
|
109
|
+
quantile (~> 0.2.1)
|
110
|
+
public_suffix (4.0.6)
|
111
|
+
quantile (0.2.1)
|
112
|
+
rack (2.2.3)
|
113
|
+
rack-oauth2 (1.16.0)
|
114
|
+
activesupport
|
115
|
+
attr_required
|
116
|
+
httpclient
|
117
|
+
json-jwt (>= 1.11.0)
|
118
|
+
rack (>= 2.1.0)
|
119
|
+
rake (13.0.3)
|
120
|
+
recursive-open-struct (1.1.3)
|
121
|
+
rest-client (2.1.0)
|
122
|
+
http-accept (>= 1.7.0, < 2.0)
|
123
|
+
http-cookie (>= 1.0.2, < 2.0)
|
124
|
+
mime-types (>= 1.16, < 4.0)
|
125
|
+
netrc (~> 0.8)
|
126
|
+
serverengine (2.2.3)
|
127
|
+
sigdump (~> 0.2.2)
|
128
|
+
sigdump (0.2.4)
|
129
|
+
strptime (0.2.5)
|
130
|
+
swd (1.2.0)
|
131
|
+
activesupport (>= 3)
|
132
|
+
attr_required (>= 0.0.5)
|
133
|
+
httpclient (>= 2.4)
|
134
|
+
tzinfo (2.0.4)
|
135
|
+
concurrent-ruby (~> 1.0)
|
136
|
+
tzinfo-data (1.2021.1)
|
137
|
+
tzinfo (>= 1.0.0)
|
138
|
+
unf (0.1.4)
|
139
|
+
unf_ext
|
140
|
+
unf_ext (0.0.7.7)
|
141
|
+
validate_email (0.1.6)
|
142
|
+
activemodel (>= 3.0)
|
143
|
+
mail (>= 2.2.5)
|
144
|
+
validate_url (1.0.13)
|
145
|
+
activemodel (>= 3.0.0)
|
146
|
+
public_suffix
|
147
|
+
webfinger (1.1.0)
|
148
|
+
activesupport
|
149
|
+
httpclient (>= 2.4)
|
150
|
+
yajl-ruby (1.4.1)
|
151
|
+
zeitwerk (2.4.2)
|
152
|
+
|
153
|
+
PLATFORMS
|
154
|
+
ruby
|
155
|
+
|
156
|
+
DEPENDENCIES
|
157
|
+
bigdecimal (= 3.0.0)
|
158
|
+
fluent-plugin-k8s-metrics-agg!
|
159
|
+
fluent-plugin-kubernetes_metadata_filter (= 2.5.3)
|
160
|
+
fluent-plugin-prometheus (= 1.8.5)
|
161
|
+
fluent-plugin-record-modifier (= 2.1.0)
|
162
|
+
fluent-plugin-splunk-hec (>= 1.2.5)
|
163
|
+
fluentd (= 1.11.5)
|
164
|
+
http_parser.rb (= 0.5.3)
|
165
|
+
kubeclient (= 4.6.0)
|
166
|
+
multi_json (= 1.14.1)
|
167
|
+
oj (= 3.10.2)
|
168
|
+
|
169
|
+
BUNDLED WITH
|
170
|
+
2.1.4
|
data/docker/build.sh
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
set -e
|
3
|
+
TAG=$1
|
4
|
+
NODEJS_VERSION=14.15.1
|
5
|
+
|
6
|
+
# Install dependecies
|
7
|
+
gem install bundler
|
8
|
+
bundle update --bundler
|
9
|
+
bundle install
|
10
|
+
|
11
|
+
# Build Gem
|
12
|
+
bundle exec rake build -t -v
|
13
|
+
cp pkg/fluent-plugin-*.gem docker
|
14
|
+
|
15
|
+
# Build Docker Image
|
16
|
+
VERSION=`cat VERSION`
|
17
|
+
echo "Copying licenses to be included in the docker image..."
|
18
|
+
mkdir -p docker/licenses
|
19
|
+
cp -rp LICENSE docker/licenses/
|
20
|
+
docker build --no-cache --pull --build-arg VERSION=$VERSION --build-arg NODEJS_VERSION=$NODEJS_VERSION --no-cache -t splunk/k8s-metrics-aggr:$TAG ./docker
|
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path(
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
@@ -20,14 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.test_files = test_files
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_development_dependency 'bundler', '~> 2.0
|
24
|
-
spec.add_development_dependency 'rake', '~>
|
23
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
24
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
25
25
|
spec.add_development_dependency 'test-unit', "~> 3.3.0"
|
26
26
|
spec.add_development_dependency "simplecov", '~> 0.16.1'
|
27
27
|
spec.add_development_dependency 'webmock', '~> 3.5.1'
|
28
|
-
spec.add_runtime_dependency 'fluentd', '
|
29
|
-
spec.add_runtime_dependency 'kubeclient', '~> 4.
|
30
|
-
spec.add_runtime_dependency 'multi_json', '~> 1.
|
31
|
-
spec.add_runtime_dependency 'oj', '~> 3.
|
28
|
+
spec.add_runtime_dependency 'fluentd', '>= 1.9.1'
|
29
|
+
spec.add_runtime_dependency 'kubeclient', '~> 4.6.0'
|
30
|
+
spec.add_runtime_dependency 'multi_json', '~> 1.14.1'
|
31
|
+
spec.add_runtime_dependency 'oj', '~> 3.10.2'
|
32
32
|
|
33
33
|
end
|
@@ -355,7 +355,7 @@ module Fluent
|
|
355
355
|
begin
|
356
356
|
@client.discover unless @client.discovered
|
357
357
|
@client.rest_client['/pods'].tap do |endpoint|
|
358
|
-
log.
|
358
|
+
log.debug("Use URL #{endpoint.url} for scraping limits requests metrics")
|
359
359
|
end
|
360
360
|
end
|
361
361
|
end
|
@@ -363,6 +363,9 @@ module Fluent
|
|
363
363
|
def scrape_limits_requests_metrics
|
364
364
|
response = limits_requests_api.get(@client.headers)
|
365
365
|
handle_limits_requests_res(response)
|
366
|
+
rescue StandardError => e
|
367
|
+
log.error "Failed to get limit metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
368
|
+
log.error_backtrace
|
366
369
|
end
|
367
370
|
|
368
371
|
# This method is used to handle responses from the kube apiserver api
|
@@ -375,7 +378,7 @@ module Fluent
|
|
375
378
|
log.error "ExMultiJson.load(response.body) expected 2xx from summary API, but got #{response.code}. Response body = #{response.body}"
|
376
379
|
end
|
377
380
|
rescue StandardError => e
|
378
|
-
log.error "Failed to scrape metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
381
|
+
log.error "Failed to scrape limit metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
379
382
|
log.error_backtrace
|
380
383
|
end
|
381
384
|
|
@@ -420,7 +423,7 @@ module Fluent
|
|
420
423
|
pod_usage_metrics.add_usage_metrics(cpu_limit, cpu_request, memory_limit, memory_request)
|
421
424
|
end
|
422
425
|
|
423
|
-
pod_labels = { 'name' => pod_json['metadata']['name'], 'namespace' => pod_json['metadata']['
|
426
|
+
pod_labels = { 'name' => pod_json['metadata']['name'], 'namespace' => pod_json['metadata']['namespace'], 'node' => pod_json['spec']['nodeName'] }
|
424
427
|
emit_limits_requests_metrics(generate_tag('pod'), @scraped_at, pod_labels, pod_usage_metrics)
|
425
428
|
@@namespace_usage_metrics_map[pod_namespace].add_usage_metrics(pod_usage_metrics.instance_variable_get(:@cpu_limit).to_s + ('m'), pod_usage_metrics.instance_variable_get(:@cpu_request).to_s + ('m'),
|
426
429
|
pod_usage_metrics.instance_variable_get(:@memory_limit).to_s + ('Mi'), pod_usage_metrics.instance_variable_get(:@memory_request).to_s + ('Mi'))
|
@@ -454,7 +457,7 @@ module Fluent
|
|
454
457
|
begin
|
455
458
|
@client.discover unless @client.discovered
|
456
459
|
@client.rest_client['/nodes'].tap do |endpoint|
|
457
|
-
log.
|
460
|
+
log.debug("Use URL #{endpoint.url} for scraping node metrics")
|
458
461
|
end
|
459
462
|
end
|
460
463
|
end
|
@@ -462,6 +465,9 @@ module Fluent
|
|
462
465
|
def scrape_node_metrics
|
463
466
|
response = node_api.get(@client.headers)
|
464
467
|
handle_node_response(response)
|
468
|
+
rescue StandardError => e
|
469
|
+
log.error "Failed to get node metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
470
|
+
log.error_backtrace
|
465
471
|
end
|
466
472
|
|
467
473
|
# This method is used to handle responses from the kubeapiserver api
|
@@ -474,7 +480,7 @@ module Fluent
|
|
474
480
|
log.error "ExMultiJson.load(response.body) expected 2xx from summary API, but got #{response.code}. Response body = #{response.body}"
|
475
481
|
end
|
476
482
|
rescue StandardError => e
|
477
|
-
log.error "Failed to scrape metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
483
|
+
log.error "Failed to scrape node metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
478
484
|
log.error_backtrace
|
479
485
|
end
|
480
486
|
|
@@ -527,7 +533,7 @@ module Fluent
|
|
527
533
|
begin
|
528
534
|
@client.discover unless @client.discovered
|
529
535
|
@client.rest_client['/nodes'].tap do |endpoint|
|
530
|
-
log.
|
536
|
+
log.debug("Use URL #{endpoint.url} for scraping node metrics")
|
531
537
|
end
|
532
538
|
end
|
533
539
|
end
|
@@ -535,6 +541,9 @@ module Fluent
|
|
535
541
|
def scrape_resource_usage_metrics
|
536
542
|
response = resource_usage_api.get(@client.headers)
|
537
543
|
handle_resource_usage_response(response)
|
544
|
+
rescue StandardError => e
|
545
|
+
log.error "Failed to get resource usage metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
546
|
+
log.error_backtrace
|
538
547
|
end
|
539
548
|
|
540
549
|
# This method is used to handle responses from the kubelet summary api
|
@@ -547,7 +556,7 @@ module Fluent
|
|
547
556
|
log.error "ExMultiJson.load(response.body) expected 2xx from summary API, but got #{response.code}. Response body = #{response.body}"
|
548
557
|
end
|
549
558
|
rescue StandardError => e
|
550
|
-
log.error "Failed to scrape metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
559
|
+
log.error "Failed to scrape resource usage metrics, error=#{$ERROR_INFO}, #{e.inspect}"
|
551
560
|
log.error_backtrace
|
552
561
|
end
|
553
562
|
|
@@ -560,29 +569,31 @@ module Fluent
|
|
560
569
|
begin
|
561
570
|
@client.discover unless @client.discovered
|
562
571
|
@client.rest_client["/nodes/#{node_name}:#{@kubelet_port}/proxy/stats/summary"].tap do |endpoint|
|
563
|
-
log.
|
572
|
+
log.debug("Use URL #{endpoint.url} for scraping resource usage metrics")
|
564
573
|
end
|
565
574
|
end
|
566
575
|
|
567
576
|
node_response = JSON.parse(node_rest_client.get(@client.headers))
|
568
577
|
Array(node_response['pods']).each do |pod_json|
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
578
|
+
unless pod_json['cpu'].nil? || pod_json['memory'].nil?
|
579
|
+
pod_cpu_usage = pod_json['cpu'].fetch('usageNanoCores', 0)/ 1_000_000
|
580
|
+
pod_memory_usage = pod_json['memory'].fetch('usageBytes', 0)
|
581
|
+
pod_namespace = pod_json['podRef']['namespace']
|
582
|
+
pod_usage = ResourceUsageMetricsUnit.new
|
583
|
+
pod_usage.add_resource_usage_metrics(pod_cpu_usage, pod_memory_usage)
|
584
|
+
if @@namespace_resource_usage_metrics_map[pod_namespace].nil?
|
585
|
+
namespace_usage_metrics = ResourceUsageMetricsUnit.new
|
586
|
+
@@namespace_resource_usage_metrics_map[pod_namespace] = pod_usage
|
587
|
+
else
|
588
|
+
@@namespace_resource_usage_metrics_map[pod_namespace].add_resource_usage_metrics(pod_cpu_usage, pod_memory_usage)
|
589
|
+
end
|
590
|
+
if @@node_resource_usage_metrics_map[node_name].nil?
|
591
|
+
node_name_usage_metrics = ResourceUsageMetricsUnit.new
|
592
|
+
@@node_resource_usage_metrics_map[node_name] = node_name_usage_metrics
|
593
|
+
end
|
594
|
+
@@node_resource_usage_metrics_map[node_name].add_resource_usage_metrics(pod_cpu_usage, pod_memory_usage)
|
595
|
+
pod_usage = nil
|
583
596
|
end
|
584
|
-
@@node_resource_usage_metrics_map[node_name].add_resource_usage_metrics(pod_cpu_usage, pod_memory_usage)
|
585
|
-
pod_usage = nil
|
586
597
|
end
|
587
598
|
end
|
588
599
|
end
|