fluent-plugin-k8s-metrics-agg 1.1.0 → 1.1.1
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/build_and_push.sh +2 -1
- data/.circleci/build_and_push_to_dockerhub.sh +2 -1
- data/.circleci/check_version_trigger_release.sh +26 -0
- data/.circleci/config.yml +32 -4
- data/.circleci/gem_credentials +2 -0
- data/.circleci/push_gem.sh +1 -0
- data/.circleci/push_gem_to_rubygems.sh +7 -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/CLA.md +18 -0
- data/Gemfile.lock +14 -12
- data/VERSION +1 -1
- data/docker/FLUENTD_HEC_GEM_VERSION +1 -0
- data/lib/fluent/plugin/in_kubernetes_metrics_aggregator.rb +18 -9
- data/test/helper.rb +55 -70
- data/test/plugin/test_in_kubernetes_metrics_aggregator.rb +137 -104
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dafdc24e3159101b532162d528800ee781dc5a10c62824a97cc3b5506c977ae0
|
4
|
+
data.tar.gz: d40d159adcac648fee03f13fe88697c5491208ef0557adc4074726be50d88eaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ace62d329f0b1f316563d758e9a7ca045914d37811606ce6e07f9fb807c2b3cf907d3dd025983356097c813308b191b77677ddbfbbba56d50fe9aa5c7744786
|
7
|
+
data.tar.gz: 456d5c39db1fc1dc0d159c920dd612dc39f474b6d873b3963ee42dbbc7ade903079b113b844c3ef16e2830b545f583f3383caafccec42943f3d96ed0f6d72c4e
|
data/.circleci/build_and_push.sh
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
set -e
|
3
|
+
FLUENTD_HEC_GEM_VERSION=`cat docker/FLUENTD_HEC_GEM_VERSION`
|
3
4
|
aws ecr get-login --region $AWS_REGION --no-include-email | bash
|
4
5
|
echo "Building docker image..."
|
5
6
|
cp /tmp/pkg/fluent-plugin-k8s-metrics-agg-*.gem docker
|
6
|
-
docker build --build-arg VERSION=$
|
7
|
+
docker build --build-arg VERSION=$FLUENTD_HEC_GEM_VERSION --no-cache -t splunk/fluent-plugin-k8s-metrics-agg:metrics-aggregator ./docker
|
7
8
|
docker tag splunk/fluent-plugin-k8s-metrics-agg:metrics-aggregator $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/k8s-ci-metrics-agg:latest
|
8
9
|
echo "Push docker image to ecr..."
|
9
10
|
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/k8s-ci-metrics-agg:latest | awk 'END{print}'
|
@@ -1,9 +1,10 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
set -e
|
3
|
+
FLUENTD_HEC_GEM_VERSION=`cat docker/FLUENTD_HEC_GEM_VERSION`
|
3
4
|
echo "Building docker image..."
|
4
5
|
cp /tmp/pkg/fluent-plugin-k8s-metrics-agg-*.gem docker
|
5
6
|
VERSION=`cat VERSION`
|
6
|
-
docker build --build-arg VERSION=$
|
7
|
+
docker build --build-arg VERSION=$FLUENTD_HEC_GEM_VERSION --no-cache -t splunk/fluent-plugin-k8s-metrics-agg:metrics-aggregator ./docker
|
7
8
|
docker tag splunk/fluent-plugin-k8s-metrics-agg:metrics-aggregator splunk/${DOCKERHUB_REPO_NAME}:${VERSION}
|
8
9
|
echo "Push docker image to splunk dockerhub..."
|
9
10
|
docker login --username=$DOCKERHUB_ACCOUNT_ID --password=$DOCKERHUB_ACCOUNT_PASS
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
set -e
|
3
|
+
|
4
|
+
#!/usr/bin/env bash
|
5
|
+
LATEST_COMMIT=$(git rev-parse HEAD)
|
6
|
+
VERSION_COMMIT=$(git log -1 --format=format:%H VERSION)
|
7
|
+
if [ $VERSION_COMMIT = $LATEST_COMMIT ];
|
8
|
+
then
|
9
|
+
if [ -s VERSION ] # Check if content is empty
|
10
|
+
then
|
11
|
+
VERSION=`cat VERSION`
|
12
|
+
echo "VERSION is changed to $VERSION"
|
13
|
+
else
|
14
|
+
echo "[ERROR] VERSION file is empty."
|
15
|
+
exit 1
|
16
|
+
fi
|
17
|
+
git config user.email "splunk-oss-admin@splunk.com"
|
18
|
+
git config user.name "splunk-oss-admin"
|
19
|
+
git checkout develop
|
20
|
+
git pull origin develop
|
21
|
+
git checkout -b release/$VERSION origin/develop
|
22
|
+
git push https://$RELEASE_GITHUB_USER:$RELEASE_GITHUB_PASS@github.com/splunk/fluent-plugin-k8s-metrics-agg.git release/$VERSION
|
23
|
+
git checkout master
|
24
|
+
git merge --no-edit release/$VERSION
|
25
|
+
git push https://$RELEASE_GITHUB_USER:$RELEASE_GITHUB_PASS@github.com/splunk/fluent-plugin-k8s-metrics-agg.git master
|
26
|
+
fi
|
data/.circleci/config.yml
CHANGED
@@ -82,12 +82,34 @@ jobs:
|
|
82
82
|
name: Upload gem to Github
|
83
83
|
command: |
|
84
84
|
.circleci/build_and_push_to_github_release.sh
|
85
|
+
- run:
|
86
|
+
name: Upload gem to Ruby Gem
|
87
|
+
command: |
|
88
|
+
.circleci/push_gems_to_rubygems.sh
|
89
|
+
|
90
|
+
check_version:
|
91
|
+
docker:
|
92
|
+
- image: circleci/ruby:2.6.1-node-browsers
|
93
|
+
working_directory: ~/repo
|
94
|
+
steps:
|
95
|
+
- attach_workspace:
|
96
|
+
at: /tmp
|
97
|
+
- checkout
|
98
|
+
- setup_remote_docker:
|
99
|
+
reusable: true
|
100
|
+
- run:
|
101
|
+
name: Check VERSION file for change
|
102
|
+
command: |
|
103
|
+
.circleci/check_version_trigger_release.sh
|
85
104
|
|
86
105
|
workflows:
|
87
106
|
version: 2
|
88
107
|
build_test_push:
|
89
108
|
jobs:
|
90
|
-
- build
|
109
|
+
- build:
|
110
|
+
filters:
|
111
|
+
branches:
|
112
|
+
ignore: /^release\/.*/
|
91
113
|
- test:
|
92
114
|
requires:
|
93
115
|
- build
|
@@ -97,9 +119,15 @@ workflows:
|
|
97
119
|
filters:
|
98
120
|
branches:
|
99
121
|
only: develop
|
100
|
-
-
|
122
|
+
- check_version:
|
101
123
|
requires:
|
102
|
-
|
124
|
+
- push
|
125
|
+
release:
|
126
|
+
jobs:
|
127
|
+
- build:
|
103
128
|
filters:
|
104
129
|
branches:
|
105
|
-
only: master
|
130
|
+
only: master
|
131
|
+
- release:
|
132
|
+
requires:
|
133
|
+
- build
|
data/.circleci/push_gem.sh
CHANGED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
set -e
|
3
|
+
echo "Pushing metrics aggr gem to rubygems.org..."
|
4
|
+
echo "gem `gem --version`"
|
5
|
+
cat .circleci/gem_credentials | sed -e "s/__RUBYGEMS_API_KEY__/${RUBYGEMS_API_KEY}/" > ~/.gem/credentials
|
6
|
+
chmod 0600 ~/.gem/credentials
|
7
|
+
gem push /tmp/pkg/fluent-plugin-k8s-metrics-agg-*.gem
|
@@ -0,0 +1,29 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Report a bug encountered while operating fluent-plugin-k8s-metrics-agg
|
4
|
+
title: ''
|
5
|
+
labels: ''
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!
|
11
|
+
|
12
|
+
Please do not report security vulnerabilities with public GitHub issue reports. Please report security issues here: https://www.splunk.com/goto/report_vulnerabilities_prodsec
|
13
|
+
-->
|
14
|
+
|
15
|
+
|
16
|
+
**What happened**:
|
17
|
+
|
18
|
+
**What you expected to happen**:
|
19
|
+
|
20
|
+
**How to reproduce it (as minimally and precisely as possible)**:
|
21
|
+
|
22
|
+
**Anything else we need to know?**:
|
23
|
+
|
24
|
+
**Environment**:
|
25
|
+
- Kubernetes version (use `kubectl version`):
|
26
|
+
- Ruby version (use `ruby --version`):
|
27
|
+
- OS (e.g: `cat /etc/os-release`):
|
28
|
+
- Splunk version:
|
29
|
+
- Others:
|
@@ -0,0 +1,14 @@
|
|
1
|
+
---
|
2
|
+
name: Enhancement Request
|
3
|
+
about: Suggest an enhancement to the fluent-plugin-k8s-metrics-agg project
|
4
|
+
title: ''
|
5
|
+
labels: ''
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
<<!-- Please only use this template for submitting enhancement requests -->
|
11
|
+
|
12
|
+
**What would you like to be added**:
|
13
|
+
|
14
|
+
**Why is this needed**:
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
name: Failing Test
|
3
|
+
about: Report test failures in fluent-plugin-k8s-metrics-agg
|
4
|
+
title: ''
|
5
|
+
labels: ''
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
<!-- Please only use this template for submitting reports about failing tests -->
|
11
|
+
|
12
|
+
**Which test(s) are failing**:
|
13
|
+
|
14
|
+
**Since when has it been failing**:
|
15
|
+
|
16
|
+
**Reason for failure**:
|
17
|
+
|
18
|
+
**Anything else we need to know**:
|
@@ -0,0 +1,23 @@
|
|
1
|
+
## Proposed changes
|
2
|
+
|
3
|
+
Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue.
|
4
|
+
|
5
|
+
## Types of changes
|
6
|
+
|
7
|
+
What types of changes does your code introduce?
|
8
|
+
_Put an `x` in the boxes that apply_
|
9
|
+
|
10
|
+
- [ ] Bugfix (non-breaking change which fixes an issue)
|
11
|
+
- [ ] New feature (non-breaking change which adds functionality)
|
12
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
13
|
+
|
14
|
+
## Checklist
|
15
|
+
|
16
|
+
_Put an `x` in the boxes that apply._
|
17
|
+
|
18
|
+
- [ ] I have read the [CONTRIBUTING](https://github.com/splunk/fluent-plugin-k8s-metrics-agg/blob/develop/CONTRIBUTING.md) doc
|
19
|
+
- [ ] I have read the [CLA](https://github.com/splunk/fluent-plugin-k8s-metrics-agg/blob/develop/CLA.md)
|
20
|
+
- [ ] I have added tests that prove my fix is effective or that my feature works
|
21
|
+
- [ ] I have added necessary documentation (if appropriate)
|
22
|
+
- [ ] Any dependent changes have been merged and published in downstream modules
|
23
|
+
|
data/CLA.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
By submitting a Contribution to this Work, You agree that Your Contribution is made subject to the primary LICENSE
|
2
|
+
file applicable to this Work. In addition, You represent that: (i) You are the copyright owner of the Contribution
|
3
|
+
or (ii) You have the requisite rights to make the Contribution.
|
4
|
+
|
5
|
+
Definitions:
|
6
|
+
|
7
|
+
“You” shall mean: (i) yourself if you are making a Contribution on your own behalf; or (ii) your company,
|
8
|
+
if you are making a Contribution on behalf of your company. If you are making a Contribution on behalf of your
|
9
|
+
company, you represent that you have the requisite authority to do so.
|
10
|
+
|
11
|
+
"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing
|
12
|
+
work, that is intentionally submitted by You for inclusion in, or documentation of, this project/repository. For the
|
13
|
+
purposes of this definition, "submitted" means any form of electronic, verbal, or written communication submitted for
|
14
|
+
inclusion in this project/repository, including but not limited to communication on electronic mailing lists, source
|
15
|
+
code control systems, and issue tracking systems that are managed by, or on behalf of, the maintainers of
|
16
|
+
the project/repository.
|
17
|
+
|
18
|
+
“Work” shall mean the collective software, content, and documentation in this project/repository.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-k8s-metrics-agg (1.1.
|
4
|
+
fluent-plugin-k8s-metrics-agg (1.1.1)
|
5
5
|
fluentd (~> 1.3.3)
|
6
6
|
kubeclient (~> 4.2.2)
|
7
7
|
multi_json (~> 1.13.1)
|
@@ -12,12 +12,12 @@ GEM
|
|
12
12
|
specs:
|
13
13
|
addressable (2.6.0)
|
14
14
|
public_suffix (>= 2.0.2, < 4.0)
|
15
|
-
cool.io (1.5.
|
15
|
+
cool.io (1.5.4)
|
16
16
|
crack (0.4.3)
|
17
17
|
safe_yaml (~> 1.0.0)
|
18
18
|
dig_rb (1.0.1)
|
19
19
|
docile (1.3.1)
|
20
|
-
domain_name (0.5.
|
20
|
+
domain_name (0.5.20190701)
|
21
21
|
unf (>= 0.0.5, < 1.0.0)
|
22
22
|
fluentd (1.3.3)
|
23
23
|
cool.io (>= 1.4.5, < 2.0.0)
|
@@ -36,6 +36,7 @@ GEM
|
|
36
36
|
http-cookie (~> 1.0)
|
37
37
|
http-form_data (~> 2.0)
|
38
38
|
http_parser.rb (~> 0.6.0)
|
39
|
+
http-accept (1.7.0)
|
39
40
|
http-cookie (1.0.3)
|
40
41
|
domain_name (~> 0.5)
|
41
42
|
http-form_data (2.1.1)
|
@@ -45,23 +46,24 @@ GEM
|
|
45
46
|
http (~> 3.0)
|
46
47
|
recursive-open-struct (~> 1.0, >= 1.0.4)
|
47
48
|
rest-client (~> 2.0)
|
48
|
-
mime-types (3.
|
49
|
+
mime-types (3.3)
|
49
50
|
mime-types-data (~> 3.2015)
|
50
|
-
mime-types-data (3.
|
51
|
-
msgpack (1.
|
51
|
+
mime-types-data (3.2019.1009)
|
52
|
+
msgpack (1.3.1)
|
52
53
|
multi_json (1.13.1)
|
53
54
|
netrc (0.11.0)
|
54
|
-
oj (3.7.
|
55
|
+
oj (3.7.12)
|
55
56
|
power_assert (1.1.3)
|
56
57
|
public_suffix (3.0.3)
|
57
58
|
rake (12.3.2)
|
58
59
|
recursive-open-struct (1.1.0)
|
59
|
-
rest-client (2.0
|
60
|
+
rest-client (2.1.0)
|
61
|
+
http-accept (>= 1.7.0, < 2.0)
|
60
62
|
http-cookie (>= 1.0.2, < 2.0)
|
61
63
|
mime-types (>= 1.16, < 4.0)
|
62
64
|
netrc (~> 0.8)
|
63
65
|
safe_yaml (1.0.4)
|
64
|
-
serverengine (2.1.
|
66
|
+
serverengine (2.1.1)
|
65
67
|
sigdump (~> 0.2.2)
|
66
68
|
sigdump (0.2.4)
|
67
69
|
simplecov (0.16.1)
|
@@ -75,11 +77,11 @@ GEM
|
|
75
77
|
thread_safe (0.3.6)
|
76
78
|
tzinfo (1.2.5)
|
77
79
|
thread_safe (~> 0.1)
|
78
|
-
tzinfo-data (1.
|
80
|
+
tzinfo-data (1.2019.3)
|
79
81
|
tzinfo (>= 1.0.0)
|
80
82
|
unf (0.1.4)
|
81
83
|
unf_ext
|
82
|
-
unf_ext (0.0.7.
|
84
|
+
unf_ext (0.0.7.6)
|
83
85
|
webmock (3.5.1)
|
84
86
|
addressable (>= 2.3.6)
|
85
87
|
crack (>= 0.3.2)
|
@@ -98,4 +100,4 @@ DEPENDENCIES
|
|
98
100
|
webmock (~> 3.5.1)
|
99
101
|
|
100
102
|
BUNDLED WITH
|
101
|
-
2.0.
|
103
|
+
2.0.2
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
@@ -0,0 +1 @@
|
|
1
|
+
1.1.2
|
@@ -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,13 +569,13 @@ 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
|
-
pod_cpu_usage = pod_json['cpu']['usageNanoCores']
|
578
|
+
pod_cpu_usage = pod_json['cpu']['usageNanoCores']/ 1_000_000
|
570
579
|
pod_memory_usage = pod_json['memory']['usageBytes']
|
571
580
|
pod_namespace = pod_json['podRef']['namespace']
|
572
581
|
pod_usage = ResourceUsageMetricsUnit.new
|
data/test/helper.rb
CHANGED
@@ -37,33 +37,16 @@ module PluginTestHelper
|
|
37
37
|
k8s_url + '/v1/nodes/generics-aws-node-three:10255/proxy/stats/summary'
|
38
38
|
end
|
39
39
|
|
40
|
-
def stub_api_port_10250
|
41
|
-
WebMock.stub_request(:get, 'https://node.fakedestination.com:10250/api')
|
42
|
-
.with(
|
43
|
-
headers: {
|
44
|
-
'Accept' => '*/*',
|
45
|
-
'Accept-Encoding' => 'gzip, deflate',
|
46
|
-
'Host' => 'node.fakedestination.com:10250'
|
47
|
-
}
|
48
|
-
)
|
49
|
-
.to_return(status: 200,
|
50
|
-
body: File.open(File.expand_path('../v1.json', __FILE__)),
|
51
|
-
headers: {})
|
52
|
-
end
|
53
|
-
|
54
40
|
def stub_api_port_10255
|
55
41
|
WebMock.stub_request(:get,
|
56
42
|
'https://node.fakedestination.com:10255/api')
|
57
43
|
.with(
|
58
44
|
headers: {
|
59
|
-
'Accept' => '*/*',
|
60
|
-
'Accept-Encoding' => 'gzip, deflate',
|
61
45
|
'Host' => 'node.fakedestination.com:10255'
|
62
46
|
}
|
63
47
|
)
|
64
48
|
.to_return(status: 200,
|
65
|
-
body: File.open(File.expand_path('../v1.json', __FILE__))
|
66
|
-
headers: {})
|
49
|
+
body: File.open(File.expand_path('../v1.json', __FILE__)))
|
67
50
|
end
|
68
51
|
|
69
52
|
def stub_api_v1
|
@@ -71,29 +54,27 @@ module PluginTestHelper
|
|
71
54
|
'https://node.fakedestination.com:10255/api/v1')
|
72
55
|
.with(
|
73
56
|
headers: {
|
74
|
-
'Accept' => '*/*',
|
75
|
-
'Accept-Encoding' => 'gzip, deflate',
|
76
57
|
'Host' => 'node.fakedestination.com:10255'
|
77
58
|
}
|
78
59
|
)
|
79
60
|
.to_return(status: 200,
|
80
|
-
body: File.open(File.expand_path('../v1.json', __FILE__))
|
81
|
-
|
82
|
-
|
61
|
+
body: File.open(File.expand_path('../v1.json', __FILE__)))
|
62
|
+
end
|
63
|
+
|
64
|
+
def stub_api_pods(timeout=false)
|
65
|
+
get_pods = WebMock.stub_request(:get,
|
66
|
+
'https://node.fakedestination.com:10255/api/v1/pods')
|
67
|
+
.with(
|
68
|
+
headers: {
|
69
|
+
'Host' => 'node.fakedestination.com:10255'
|
70
|
+
}
|
71
|
+
)
|
72
|
+
if timeout
|
73
|
+
get_pods = get_pods.to_timeout.then
|
74
|
+
end
|
83
75
|
|
84
|
-
|
85
|
-
|
86
|
-
'https://node.fakedestination.com:10255/api/v1/pods')
|
87
|
-
.with(
|
88
|
-
headers: {
|
89
|
-
'Accept' => '*/*',
|
90
|
-
'Accept-Encoding' => 'gzip, deflate',
|
91
|
-
'Host' => 'node.fakedestination.com:10255'
|
92
|
-
}
|
93
|
-
)
|
94
|
-
.to_return(status: 200,
|
95
|
-
body: File.open(File.expand_path('../pods.json', __FILE__)),
|
96
|
-
headers: {})
|
76
|
+
get_pods.to_return(status: 200,
|
77
|
+
body: File.open(File.expand_path('../pods.json', __FILE__)))
|
97
78
|
end
|
98
79
|
|
99
80
|
def stub_api_node_1
|
@@ -101,29 +82,28 @@ module PluginTestHelper
|
|
101
82
|
'https://node.fakedestination.com:10255/api/v1/nodes/generics-aws-node-one:10255/proxy/stats/summary')
|
102
83
|
.with(
|
103
84
|
headers: {
|
104
|
-
'Accept' => '*/*',
|
105
|
-
'Accept-Encoding' => 'gzip, deflate',
|
106
85
|
'Host' => 'node.fakedestination.com:10255'
|
107
86
|
}
|
108
87
|
)
|
109
88
|
.to_return(status: 200,
|
110
|
-
body: File.open(File.expand_path('../node1.json', __FILE__))
|
111
|
-
headers: {})
|
89
|
+
body: File.open(File.expand_path('../node1.json', __FILE__)))
|
112
90
|
end
|
113
91
|
|
114
|
-
def stub_api_node_2
|
115
|
-
WebMock.stub_request(:get,
|
116
|
-
|
92
|
+
def stub_api_node_2(timeout=false)
|
93
|
+
get_node_summary = WebMock.stub_request(:get,
|
94
|
+
'https://node.fakedestination.com:10255/api/v1/nodes/generics-aws-node-two:10255/proxy/stats/summary')
|
117
95
|
.with(
|
118
96
|
headers: {
|
119
|
-
'Accept' => '*/*',
|
120
|
-
'Accept-Encoding' => 'gzip, deflate',
|
121
97
|
'Host' => 'node.fakedestination.com:10255'
|
122
98
|
}
|
123
99
|
)
|
124
|
-
|
125
|
-
|
126
|
-
|
100
|
+
|
101
|
+
if timeout
|
102
|
+
get_node_summary = get_node_summary.to_timeout
|
103
|
+
end
|
104
|
+
|
105
|
+
get_node_summary.to_return(status: 200,
|
106
|
+
body: File.open(File.expand_path('../node2.json', __FILE__)))
|
127
107
|
end
|
128
108
|
|
129
109
|
def stub_api_node_3
|
@@ -131,40 +111,45 @@ module PluginTestHelper
|
|
131
111
|
'https://node.fakedestination.com:10255/api/v1/nodes/generics-aws-node-three:10255/proxy/stats/summary')
|
132
112
|
.with(
|
133
113
|
headers: {
|
134
|
-
'Accept' => '*/*',
|
135
|
-
'Accept-Encoding' => 'gzip, deflate',
|
136
114
|
'Host' => 'node.fakedestination.com:10255'
|
137
115
|
}
|
138
116
|
)
|
139
117
|
.to_return(status: 200,
|
140
|
-
body: File.open(File.expand_path('../node3.json', __FILE__))
|
141
|
-
headers: {})
|
118
|
+
body: File.open(File.expand_path('../node3.json', __FILE__)))
|
142
119
|
end
|
143
120
|
|
144
|
-
def stub_api_nodes
|
145
|
-
WebMock.stub_request(:get,
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
121
|
+
def stub_api_nodes(timeout=false)
|
122
|
+
get_nodes = WebMock.stub_request(:get, 'https://node.fakedestination.com:10255/api/v1/nodes')
|
123
|
+
.with(
|
124
|
+
headers: {
|
125
|
+
'Host' => 'node.fakedestination.com:10255'
|
126
|
+
}
|
127
|
+
)
|
128
|
+
|
129
|
+
if timeout
|
130
|
+
get_nodes = get_nodes.to_timeout.times(2) # Nodes endpoint is called from two timers so must fail in both cases
|
131
|
+
end
|
132
|
+
|
133
|
+
get_nodes.to_return(status: 200,
|
134
|
+
body: File.open(File.expand_path('../nodes.json', __FILE__)))
|
157
135
|
end
|
158
136
|
|
159
|
-
def
|
160
|
-
|
137
|
+
def stub_k8s_init_requests
|
138
|
+
WebMock.reset!
|
139
|
+
|
140
|
+
stub_api_port_10255
|
141
|
+
end
|
142
|
+
|
143
|
+
def stub_k8s_requests(nodes_timeout: false, node_summary_timeout: false, pods_timeout: false)
|
144
|
+
WebMock.reset!
|
145
|
+
|
161
146
|
stub_api_port_10255
|
162
147
|
stub_api_v1
|
163
|
-
stub_api_pods
|
164
|
-
stub_api_nodes
|
148
|
+
stub_api_pods(pods_timeout)
|
149
|
+
stub_api_nodes(nodes_timeout)
|
165
150
|
stub_api_node_1
|
151
|
+
stub_api_node_2(node_summary_timeout)
|
166
152
|
stub_api_node_3
|
167
|
-
stub_api_node_2
|
168
153
|
end
|
169
154
|
|
170
155
|
def get_parsed_file(file_name)
|
@@ -5,10 +5,6 @@ class KubernetesMetricsAggInputTest < Test::Unit::TestCase
|
|
5
5
|
include Fluent::Test::Helpers
|
6
6
|
include PluginTestHelper
|
7
7
|
|
8
|
-
@driver = nil
|
9
|
-
@driver_test = nil
|
10
|
-
@@hash_map_test = {}
|
11
|
-
|
12
8
|
ZERO_CONFIG = %([
|
13
9
|
]).freeze
|
14
10
|
|
@@ -34,20 +30,22 @@ class KubernetesMetricsAggInputTest < Test::Unit::TestCase
|
|
34
30
|
METRIC_TEST_CONFIG = %([
|
35
31
|
kubernetes_url https://node.fakedestination.com
|
36
32
|
kubelet_port 10255
|
33
|
+
interval 5s
|
34
|
+
tag kube.*
|
35
|
+
]).freeze
|
36
|
+
|
37
|
+
TIMEOUT_TEST_CONFIG = %([
|
38
|
+
kubernetes_url https://node.fakedestination.com
|
39
|
+
kubelet_port 10255
|
40
|
+
interval 5s
|
37
41
|
tag kube.*
|
38
42
|
]).freeze
|
39
43
|
|
40
44
|
setup do
|
41
45
|
Fluent::Test.setup
|
46
|
+
|
42
47
|
ENV['KUBERNETES_SERVICE_HOST'] = "node.fakedestination.com"
|
43
48
|
ENV['KUBERNETES_SERVICE_PORT'] = "10255"
|
44
|
-
stub_k8s_requests
|
45
|
-
@driver = create_driver(METRIC_TEST_CONFIG)
|
46
|
-
@driver.run timeout: 20, expect_emits: 200, shutdown: false
|
47
|
-
|
48
|
-
@driver.events.each do |tag, time, record|
|
49
|
-
@@hash_map_test[tag] = tag, time, record
|
50
|
-
end
|
51
49
|
end
|
52
50
|
|
53
51
|
def create_driver(conf = BASIC_CONFIG)
|
@@ -60,6 +58,8 @@ class KubernetesMetricsAggInputTest < Test::Unit::TestCase
|
|
60
58
|
|
61
59
|
sub_test_case 'default parameter configuration' do
|
62
60
|
test 'test default params' do
|
61
|
+
stub_k8s_init_requests
|
62
|
+
|
63
63
|
d = create_driver(ZERO_CONFIG)
|
64
64
|
assert_equal 10_250, d.instance.kubelet_port
|
65
65
|
assert_equal 'kubernetes.metrics.*', d.instance.tag
|
@@ -78,141 +78,174 @@ class KubernetesMetricsAggInputTest < Test::Unit::TestCase
|
|
78
78
|
|
79
79
|
sub_test_case 'modify parameter changes' do
|
80
80
|
test 'test kubelet_port and supplied kubernetes URL parameters' do
|
81
|
+
stub_k8s_init_requests
|
82
|
+
|
81
83
|
d = create_driver(ADVANCED_CONFIG_NO_CERTS)
|
82
84
|
assert_equal 'https://node.fakedestination.com', d.instance.kubernetes_url
|
83
85
|
assert_equal 10_255, d.instance.kubelet_port
|
84
86
|
end
|
85
87
|
|
86
88
|
test 'test tag and interval parameters' do
|
89
|
+
stub_k8s_init_requests
|
90
|
+
|
87
91
|
d = create_driver(ADVANCED_CONFIG_NO_CERTS)
|
88
92
|
assert_equal 'test.tag.check', d.instance.tag
|
89
93
|
assert_equal 120, d.instance.interval
|
90
94
|
end
|
91
95
|
|
92
96
|
test 'test insecure_ssl and cluster_name parameters ' do
|
97
|
+
stub_k8s_init_requests
|
98
|
+
|
93
99
|
d = create_driver(ADVANCED_CONFIG_NO_CERTS)
|
94
100
|
assert_true d.instance.insecure_ssl
|
95
101
|
assert_equal 'awesome_cluster', d.instance.cluster_name
|
96
102
|
end
|
97
103
|
end
|
98
104
|
|
99
|
-
sub_test_case 'Test metrics exist
|
100
|
-
test 'Testing
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
assert_true
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
assert_true
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
assert_true
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
assert_true
|
105
|
+
sub_test_case 'Test metrics exist' do
|
106
|
+
test 'Testing all expected metrics are emitted' do
|
107
|
+
stub_k8s_requests
|
108
|
+
|
109
|
+
hash_map_test = {}
|
110
|
+
|
111
|
+
d = create_driver(METRIC_TEST_CONFIG)
|
112
|
+
d.run timeout: 12, expect_emits: 200, shutdown: false
|
113
|
+
|
114
|
+
d.events.each do |tag, time, record|
|
115
|
+
hash_map_test[tag] = tag, time, record
|
116
|
+
end
|
117
|
+
|
118
|
+
# Test metrics exist, limits_request_scraper - limits
|
119
|
+
assert_true hash_map_test.key?('kube.namespace.cpu.limit')
|
120
|
+
assert_true hash_map_test.key?('kube.namespace.memory.limit')
|
121
|
+
assert_true hash_map_test.key?('kube.container.cpu.limit')
|
122
|
+
assert_true hash_map_test.key?('kube.pod.cpu.limit')
|
123
|
+
assert_true hash_map_test.key?('kube.cluster.memory.limit')
|
124
|
+
assert_true hash_map_test.key?('kube.pod.memory.limit')
|
125
|
+
assert_true hash_map_test.key?('kube.cluster.cpu.limit')
|
126
|
+
|
127
|
+
# Test metrics exist, limits_request_scraper - request
|
128
|
+
assert_true hash_map_test.key?('kube.cluster.memory.request')
|
129
|
+
assert_true hash_map_test.key?('kube.container.memory.request')
|
130
|
+
assert_true hash_map_test.key?('kube.pod.memory.request')
|
131
|
+
assert_true hash_map_test.key?('kube.namespace.memory.request')
|
132
|
+
assert_true hash_map_test.key?('kube.container.cpu.request')
|
133
|
+
assert_true hash_map_test.key?('kube.namespace.cpu.request')
|
134
|
+
assert_true hash_map_test.key?('kube.pod.cpu.request')
|
135
|
+
assert_true hash_map_test.key?('kube.cluster.cpu.request')
|
136
|
+
|
137
|
+
# Test metrics exist, node_scraper/resource_usage_scraper 1
|
138
|
+
assert_true hash_map_test.key?('kube.node.cpu.capacity')
|
139
|
+
assert_true hash_map_test.key?('kube.node.memory.capacity')
|
140
|
+
assert_true hash_map_test.key?('kube.node.memory.allocatable')
|
141
|
+
assert_true hash_map_test.key?('kube.node.cpu.utilization')
|
142
|
+
assert_true hash_map_test.key?('kube.node.memory.reservation')
|
143
|
+
assert_true hash_map_test.key?('kube.node.memory.utilization')
|
144
|
+
|
145
|
+
# Test metrics exist, node_scraper/resource_usage_scraper 2
|
146
|
+
assert_true hash_map_test.key?('kube.namespace.memory.usage')
|
147
|
+
assert_true hash_map_test.key?('kube.cluster.memory.usage')
|
148
|
+
assert_true hash_map_test.key?('kube.namespace.cpu.usage')
|
149
|
+
assert_true hash_map_test.key?('kube.node.cpu.allocatable')
|
150
|
+
assert_true hash_map_test.key?('kube.node.cpu.reservation')
|
151
|
+
assert_true hash_map_test.key?('kube.cluster.cpu.usage')
|
152
|
+
|
153
|
+
d.instance_shutdown
|
130
154
|
end
|
131
155
|
end
|
132
156
|
|
133
|
-
sub_test_case 'Test
|
134
|
-
test 'Testing kube.cluster.memory.request ' do
|
135
|
-
assert_true @@hash_map_test.key?('kube.cluster.memory.request')
|
136
|
-
end
|
157
|
+
sub_test_case 'Test handles request timeouts' do
|
137
158
|
|
138
|
-
test 'Testing
|
139
|
-
|
140
|
-
end
|
159
|
+
test 'Testing event count with nodes call timeout' do
|
160
|
+
stub_k8s_requests(nodes_timeout: true)
|
141
161
|
|
142
|
-
|
143
|
-
|
144
|
-
|
162
|
+
namespace_event_count = 0
|
163
|
+
pod_event_count = 0
|
164
|
+
node_event_count = 0
|
145
165
|
|
146
|
-
|
147
|
-
|
148
|
-
|
166
|
+
d = create_driver(TIMEOUT_TEST_CONFIG)
|
167
|
+
# Should run for two intervals, the first call to node 1 which has the only 'default' namespace pod should timeout the first time
|
168
|
+
d.run timeout: 12, expect_emits: 500, shutdown: false
|
149
169
|
|
150
|
-
|
151
|
-
|
152
|
-
|
170
|
+
d.events.each do |tag, _time, record|
|
171
|
+
# Limit to one events that should be emitted once per interval
|
172
|
+
if tag == 'kube.pod.cpu.limit' && record['name'] == 'new-metrics-test-final-splunk-kubernetes-metrics-fgszl'
|
173
|
+
pod_event_count += 1
|
174
|
+
end
|
175
|
+
if tag == 'kube.namespace.cpu.usage' && record['name'] == 'kube-system'
|
176
|
+
namespace_event_count += 1
|
177
|
+
end
|
178
|
+
if tag == 'kube.node.cpu.capacity' && record['node'] == 'generics-aws-node-one'
|
179
|
+
node_event_count += 1
|
180
|
+
end
|
181
|
+
end
|
153
182
|
|
154
|
-
|
155
|
-
|
156
|
-
|
183
|
+
# 2 intervals - first call times out but timer continues emitting successfully next interval
|
184
|
+
assert_equal 1, node_event_count, 'Number of node events emitted was wrong'
|
185
|
+
# 2 intervals - first call times out but timer continues emitting successfully next interval
|
186
|
+
assert_equal 1, namespace_event_count, 'Number of namespace events emitted was wrong'
|
187
|
+
# 2 intervals - not timeouts
|
188
|
+
assert_equal 2, pod_event_count, 'Number of pod events emitted was wrong'
|
157
189
|
|
158
|
-
|
159
|
-
assert_true @@hash_map_test.key?('kube.pod.cpu.request')
|
190
|
+
d.instance_shutdown
|
160
191
|
end
|
161
192
|
|
162
|
-
test 'Testing
|
163
|
-
|
164
|
-
end
|
165
|
-
end
|
193
|
+
test 'Testing event count with pods call timeout' do
|
194
|
+
stub_k8s_requests(pods_timeout: true)
|
166
195
|
|
167
|
-
|
168
|
-
|
169
|
-
assert_true @@hash_map_test.key?('kube.node.cpu.capacity')
|
170
|
-
end
|
196
|
+
pod_event_count = 0
|
197
|
+
node_event_count = 0
|
171
198
|
|
172
|
-
|
173
|
-
|
174
|
-
|
199
|
+
d = create_driver(TIMEOUT_TEST_CONFIG)
|
200
|
+
# Should run for two intervals, the first call to node 1 which has the only 'default' namespace pod should timeout the first time
|
201
|
+
d.run timeout: 12, expect_emits: 500, shutdown: false
|
175
202
|
|
176
|
-
|
177
|
-
|
178
|
-
|
203
|
+
d.events.each do |tag, _time, record|
|
204
|
+
# Limit to one events that should be emitted once per interval
|
205
|
+
if tag == 'kube.pod.cpu.limit' && record['name'] == 'new-metrics-test-final-splunk-kubernetes-metrics-fgszl'
|
206
|
+
pod_event_count += 1
|
207
|
+
end
|
179
208
|
|
180
|
-
|
181
|
-
|
182
|
-
|
209
|
+
if tag == 'kube.node.cpu.utilization' && record['node'] == 'generics-aws-node-one'
|
210
|
+
node_event_count += 1
|
211
|
+
end
|
212
|
+
end
|
183
213
|
|
184
|
-
|
185
|
-
|
186
|
-
|
214
|
+
# 2 intervals - first call times out but timer continues emitting successfully next interval
|
215
|
+
assert_equal 1, pod_event_count, 'Number of pod events emitted was wrong'
|
216
|
+
# 2 intervals - not timeouts
|
217
|
+
assert_equal 2, node_event_count, 'Number of namespace events emitted was wrong'
|
187
218
|
|
188
|
-
|
189
|
-
assert_true @@hash_map_test.key?('kube.node.memory.utilization')
|
219
|
+
d.instance_shutdown
|
190
220
|
end
|
191
|
-
end
|
192
221
|
|
193
|
-
|
194
|
-
|
195
|
-
assert_true @@hash_map_test.key?('kube.namespace.memory.usage')
|
196
|
-
end
|
222
|
+
test 'Testing event count with node summary call timeout' do
|
223
|
+
stub_k8s_requests(node_summary_timeout: true)
|
197
224
|
|
198
|
-
|
199
|
-
|
200
|
-
end
|
225
|
+
namespace_event_count = 0
|
226
|
+
pod_event_count = 0
|
201
227
|
|
202
|
-
|
203
|
-
|
204
|
-
|
228
|
+
d = create_driver(TIMEOUT_TEST_CONFIG)
|
229
|
+
# Should run for two intervals, the first call to node 1 which has the only 'default' namespace pod should timeout the first time
|
230
|
+
d.run timeout: 12, expect_emits: 500, shutdown: false
|
205
231
|
|
206
|
-
|
207
|
-
|
208
|
-
|
232
|
+
d.events.each do |tag, _time, record|
|
233
|
+
# Limit to one events that should be emitted once per interval
|
234
|
+
if tag == 'kube.namespace.cpu.usage' && record['name'] == 'kube-system'
|
235
|
+
namespace_event_count += 1
|
236
|
+
end
|
237
|
+
if tag == 'kube.pod.cpu.limit' && record['name'] == 'new-metrics-test-final-splunk-kubernetes-metrics-fgszl'
|
238
|
+
pod_event_count += 1
|
239
|
+
end
|
240
|
+
end
|
209
241
|
|
210
|
-
|
211
|
-
|
212
|
-
|
242
|
+
# 2 intervals - first call times out but timer continues emitting successfully next interval
|
243
|
+
assert_equal 1, namespace_event_count, 'Number of namespace events emitted was wrong'
|
244
|
+
# 2 intervals - not timeouts
|
245
|
+
assert_equal 2, pod_event_count, 'Number of pod events emitted was wrong'
|
213
246
|
|
214
|
-
|
215
|
-
assert_true @@hash_map_test.key?('kube.cluster.cpu.usage')
|
247
|
+
d.instance_shutdown
|
216
248
|
end
|
249
|
+
|
217
250
|
end
|
218
251
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-k8s-metrics-agg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Splunk Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -147,10 +147,18 @@ files:
|
|
147
147
|
- ".circleci/build_and_push.sh"
|
148
148
|
- ".circleci/build_and_push_to_dockerhub.sh"
|
149
149
|
- ".circleci/build_and_push_to_github_release.sh"
|
150
|
+
- ".circleci/check_version_trigger_release.sh"
|
150
151
|
- ".circleci/config.yml"
|
152
|
+
- ".circleci/gem_credentials"
|
151
153
|
- ".circleci/install_dep.sh"
|
152
154
|
- ".circleci/push_gem.sh"
|
155
|
+
- ".circleci/push_gem_to_rubygems.sh"
|
156
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
157
|
+
- ".github/ISSUE_TEMPLATE/enhancement_request.md"
|
158
|
+
- ".github/ISSUE_TEMPLATE/failing_test.md"
|
159
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
153
160
|
- ".gitignore"
|
161
|
+
- CLA.md
|
154
162
|
- CONTRIBUTING.md
|
155
163
|
- CONTRIBUTORS.md
|
156
164
|
- Gemfile
|
@@ -161,6 +169,7 @@ files:
|
|
161
169
|
- VERSION
|
162
170
|
- docker/CONTRIBUTING.md
|
163
171
|
- docker/Dockerfile
|
172
|
+
- docker/FLUENTD_HEC_GEM_VERSION
|
164
173
|
- docker/LICENSE
|
165
174
|
- docker/README.md
|
166
175
|
- docker/entrypoint.sh
|
@@ -194,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
203
|
- !ruby/object:Gem::Version
|
195
204
|
version: '0'
|
196
205
|
requirements: []
|
197
|
-
rubygems_version: 3.0.
|
206
|
+
rubygems_version: 3.0.3
|
198
207
|
signing_key:
|
199
208
|
specification_version: 4
|
200
209
|
summary: A fluentd input plugin that collects kubernetes cluster metrics.
|