diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a41ac990750..a0456e3a99e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -43,7 +43,7 @@ CHANGELOG* /filebeat/module/mysql @elastic/security-external-integrations /filebeat/module/nats @elastic/integrations /filebeat/module/nginx @elastic/obs-infraobs-integrations -/filebeat/module/osquery @elastic/security-asset-management +/filebeat/module/osquery @elastic/security-external-integrations /filebeat/module/pensando @elastic/security-external-integrations /filebeat/module/postgresql @elastic/obs-infraobs-integrations /filebeat/module/redis @elastic/obs-infraobs-integrations @@ -55,6 +55,7 @@ CHANGELOG* /libbeat/ @elastic/elastic-agent-data-plane /libbeat/docs/processors-list.asciidoc @elastic/ingest-docs /libbeat/management @elastic/elastic-agent-control-plane +/libbeat/processors/cache/ @elastic/security-external-integrations /libbeat/processors/community_id/ @elastic/security-external-integrations /libbeat/processors/decode_xml/ @elastic/security-external-integrations /libbeat/processors/decode_xml_wineventlog/ @elastic/security-external-integrations @@ -195,7 +196,7 @@ CHANGELOG* /x-pack/metricbeat/module/statsd @elastic/obs-infraobs-integrations /x-pack/metricbeat/module/stan/ @elastic/obs-cloudnative-monitoring /x-pack/metricbeat/module/tomcat @elastic/obs-infraobs-integrations -/x-pack/osquerybeat/ @elastic/security-asset-management +/x-pack/osquerybeat/ @elastic/security-external-integrations /x-pack/packetbeat/ @elastic/security-external-integrations /x-pack/winlogbeat/ @elastic/security-external-integrations /x-pack/libbeat/reader/parquet/ @elastic/security-external-integrations diff --git a/.mergify.yml b/.mergify.yml index 34d48d228d1..91a9b940704 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -276,3 +276,16 @@ pull_request_rules: labels: - "backport" title: "[{{ destination_branch }}](backport #{{ number }}) {{ title }}" + - name: backport patches to 8.11 branch + conditions: + - merged + - label=backport-v8.11.0 + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "8.11" + labels: + - "backport" + title: "[{{ destination_branch }}](backport #{{ number }}) {{ title }}" diff --git a/CHANGELOG-developer.next.asciidoc b/CHANGELOG-developer.next.asciidoc index 2d5ad19bc85..c3414579d70 100644 --- a/CHANGELOG-developer.next.asciidoc +++ b/CHANGELOG-developer.next.asciidoc @@ -69,6 +69,7 @@ The list below covers the major changes between 7.0.0-rc2 and main only. ==== Bugfixes +- Fix how Prometheus histograms are calculated when percentiles are provide.{pull}36537[36537] - Stop using `mage:import` in community beats. This was ignoring the vendorized beats directory for some mage targets, using the code available in GOPATH, this causes inconsistencies and compilation problems if the version of the code in the GOPATH is different to the vendored one. Use of `mage:import` will continue to be unsupported in custom beats till beats is migrated to go modules, or mage supports vendored dependencies. {issue}13998[13998] {pull}14162[14162] - Metricbeat module builders call host parser only once when instantiating light modules. {pull}20149[20149] - Fix export dashboard command when running against Elastic Cloud hosted Kibana. {pull}22746[22746] @@ -87,9 +88,12 @@ The list below covers the major changes between 7.0.0-rc2 and main only. - Renamed an httpjson input metric to follow naming conventions. `httpjson_interval_pages_total` was renamed to `httpjson_interval_pages` because the `_total` suffix is reserved for counters. {issue}35933[35933] {pull}36169[36169] - Fixed some race conditions in tests {pull}36185[36185] - Re-enable HTTPJSON fixed flakey test. {issue}34929[34929] {pull}36525[36525] +- Make winlogbeat/sys/wineventlog follow the unsafe.Pointer rules. {pull}36650[36650] +- Cleaned up documentation errors & fixed a minor bug in Filebeat Azure blob storage input. {pull}36714[36714] ==== Added +- Add new metricset in Kubernetes module, `state_namespace`. {pull}36406[36406] - Add configuration for APM instrumentation and expose the tracer trough the Beat object. {pull}17938[17938] - Make the behavior of clientWorker and netClientWorker consistent when error is returned from publisher pipeline - Metricset generator generates beta modules by default now. {pull}10657[10657] @@ -170,6 +174,8 @@ The list below covers the major changes between 7.0.0-rc2 and main only. - Skip dependabot updates for github.com/elastic/mito. {pull}36158[36158] - Add device handling to Okta API package for entity analytics. {pull}35980[35980] - Make Filebeat HTTPJSON input process responses sequentially. {pull}36493[36493] +- Add initial infrastructure for a caching enrichment processor. {pull}36619[36619] +- Add file-backed cache for cache enrichment processor. {pull}36686[36686] {pull}36696[36696] ==== Deprecated diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 43cef19f10e..1b530819506 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -3,6 +3,31 @@ :issue: https://github.com/elastic/beats/issues/ :pull: https://github.com/elastic/beats/pull/ +[[release-notes-8.10.3]] +=== Beats version 8.10.3 +https://github.com/elastic/beats/compare/v8.10.2\...v8.10.3[View commits] + +==== Bugfixes + +*Affecting all Beats* +- syslog processor - Fix the ability to use `when` conditions on the processor. {issue}36762[36762] + +*Packetbeat* + +- Fix default cache size calculation. {pull}36723[36723] + +==== Added + +*Filebeat* + +- Update mito CEL extension library to v1.6.0. {pull}36651[36651] +- Re-use buffers to optimise memory allocation in fingerprint mode of filestream {pull}36736[36736] + +*Packetbeat* + +- Improve efficiency of sniffers by deduplicating interface configurations. {issue}36574[36574] {pull}36576[36576] + + [[release-notes-8.10.2]] === Beats version 8.10.2 https://github.com/elastic/beats/compare/v8.10.1\...v8.10.2[View commits] diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 450941eac8d..7c161b640bc 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -9,18 +9,24 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] ==== Breaking changes *Affecting all Beats* +- The Elasticsearch output now enables compression by default. This decreases network data usage by an average of 70-80%, in exchange for 20-25% increased CPU use and ~10% increased ingestion time. The previous default can be restored by setting the flag `compression_level: 0` under `output.elasticsearch`. {pull}36681[36681] + *Auditbeat* *Filebeat* +- Switch types of `log.file.device`, `log.file.inode`, `log.file.idxhi`, `log.file.idxlo` and `log.file.vol` fields to strings to better align with ECS and integrations. {pull}36697[36697] *Heartbeat* *Metricbeat* + - System module now collects the number of threads per process. +The elastic-agent-system-metrics was updated to v0.7.0 as the number of threads +is collected by it. *Osquerybeat* @@ -59,6 +65,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - Support build of projects outside of beats directory {pull}36126[36126] - Add default cgroup regex for add_process_metadata processor {pull}36484[36484] {issue}32961[32961] - Fix environment capture by `add_process_metadata` processor. {issue}36469[36469] {pull}36471[36471] +- syslog processor - Fix the ability to use `when` conditions on the processor. {issue}36762[36762] *Auditbeat* @@ -215,7 +222,19 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - For request tracer logging in CEL and httpjson the request and response body are no longer included in `event.original`. The body is still present in `http.{request,response}.body.content`. {pull}36531[36531] - Added support for Okta OAuth2 provider in the CEL input. {issue}36336[36336] {pull}36521[36521] - Improve error logging in HTTPJSON input. {pull}36529[36529] +- Disable warning message about ingest pipeline loading when running under Elastic Agent. {pull}36659[36659] - Add input metrics to http_endpoint input. {issue}36402[36402] {pull}36427[36427] +- Remove Event Normalization from GCP PubSub Input. {pull}36716[36716] +- Update mito CEL extension library to v1.6.0. {pull}36651[36651] +- Added support for new features & removed partial save mechanism in the Azure Blob Storage input. {issue}35126[35126] {pull}36690[36690] +- Improve template evaluation logging for HTTPJSON input. {pull}36668[36668] +- Add CEL partial value debug function. {pull}36652[36652] +- Added support for new features and removed partial save mechanism in the GCS input. {issue}35847[35847] {pull}36713[36713] +- Re-use buffers to optimise memory allocation in fingerprint mode of filestream {pull}36736[36736] +- Allow http_endpoint input to receive PUT and PATCH requests. {pull}36734[36734] +- Add cache processor. {pull}36786[36786] +- Avoid unwanted publication of Azure entity records. {pull}36753[36753] +- Avoid unwanted publication of Okta entity records. {pull}36770[36770] *Auditbeat* @@ -223,6 +242,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] *Heartbeat* - Added status to monitor run log report. +- Capture and log the individual connection metrics for all the lightweight monitors *Metricbeat* @@ -239,10 +259,11 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] *Packetbeat* +- Improve efficiency of sniffers by deduplicating interface configurations. {issue}36574[36574] {pull}36576[36576] +- Bump Windows Npcap version to v1.76. {issue}36539[36539] {pull}36549[36549] *Packetbeat* -- Improve efficiency of sniffers by deduplicating interface configurations. {issue}36574[36574] {pull}36576[36576] *Winlogbeat* @@ -306,4 +327,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] + + + diff --git a/NOTICE.txt b/NOTICE.txt index 77541649c2d..03627af32a3 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -13026,11 +13026,11 @@ these terms. -------------------------------------------------------------------------------- Dependency : github.com/elastic/elastic-agent-system-metrics -Version: v0.6.1 +Version: v0.7.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-system-metrics@v0.6.1/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-system-metrics@v0.7.0/LICENSE.txt: Apache License Version 2.0, January 2004 @@ -15600,11 +15600,11 @@ limitations under the License. -------------------------------------------------------------------------------- Dependency : github.com/elastic/mito -Version: v1.5.0 +Version: v1.6.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/mito@v1.5.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/mito@v1.6.0/LICENSE: Apache License @@ -21167,11 +21167,11 @@ THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/osquery/osquery-go -Version: v0.0.0-20220706183148-4e1f83012b42 +Version: v0.0.0-20230707154813-2e4891a0f444 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/osquery/osquery-go@v0.0.0-20220706183148-4e1f83012b42/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/osquery/osquery-go@v0.0.0-20230707154813-2e4891a0f444/LICENSE: MIT License @@ -24929,11 +24929,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/sys -Version: v0.11.0 +Version: v0.12.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.11.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.12.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -31151,11 +31151,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/apache/thrift -Version: v0.18.1 +Version: v0.19.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/apache/thrift@v0.18.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/apache/thrift@v0.19.0/LICENSE: Apache License @@ -34256,11 +34256,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/cyphar/filepath-securejoin -Version: v0.2.3 +Version: v0.2.4 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/cyphar/filepath-securejoin@v0.2.3/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cyphar/filepath-securejoin@v0.2.4/LICENSE: Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved. Copyright (C) 2017 SUSE LLC. All rights reserved. @@ -36259,11 +36259,11 @@ SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/go-logr/logr -Version: v1.2.3 +Version: v1.2.4 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.3/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LICENSE: Apache License Version 2.0, January 2004 @@ -36469,201 +36469,12 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.3/LIC -------------------------------------------------------------------------------- -Dependency : github.com/go-martini/martini -Version: v0.0.0-20170121215854-22fa46961aab -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-martini/martini@v0.0.0-20170121215854-22fa46961aab/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2015 Jeremy Saenz - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-ole/go-ole -Version: v1.2.6 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.6/LICENSE: - -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-sourcemap/sourcemap -Version: v2.1.2+incompatible -Licence type (autodetected): BSD-2-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-sourcemap/sourcemap@v2.1.2+incompatible/LICENSE: - -Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-stack/stack -Version: v1.8.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-stack/stack@v1.8.0/LICENSE.md: - -The MIT License (MIT) - -Copyright (c) 2014 Chris Hines - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/gobuffalo/here -Version: v0.6.7 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/gobuffalo/here@v0.6.7/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/goccy/go-json -Version: v0.10.2 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/goccy/go-json@v0.10.2/LICENSE: - -MIT License - -Copyright (c) 2020 Masaaki Goshima - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/godror/knownpb -Version: v0.1.0 +Dependency : github.com/go-logr/stdr +Version: v1.2.2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/godror/knownpb@v0.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-logr/stdr@v1.2.2/LICENSE: Apache License Version 2.0, January 2004 @@ -36869,31 +36680,431 @@ Contents of probable licence file $GOMODCACHE/github.com/godror/knownpb@v0.1.0/L -------------------------------------------------------------------------------- -Dependency : github.com/golang-jwt/jwt/v4 -Version: v4.5.0 +Dependency : github.com/go-martini/martini +Version: v0.0.0-20170121215854-22fa46961aab Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/golang-jwt/jwt/v4@v4.5.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-martini/martini@v0.0.0-20170121215854-22fa46961aab/LICENSE: -Copyright (c) 2012 Dave Grijalva -Copyright (c) 2021 golang-jwt maintainers +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2015 Jeremy Saenz -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/golang-sql/civil -Version: v0.0.0-20190719163853-cb61b32ac6fe -Licence type (autodetected): Apache-2.0 +Dependency : github.com/go-ole/go-ole +Version: v1.2.6 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/golang-sql/civil@v0.0.0-20190719163853-cb61b32ac6fe/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.6/LICENSE: + +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-sourcemap/sourcemap +Version: v2.1.2+incompatible +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-sourcemap/sourcemap@v2.1.2+incompatible/LICENSE: + +Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-stack/stack +Version: v1.8.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-stack/stack@v1.8.0/LICENSE.md: + +The MIT License (MIT) + +Copyright (c) 2014 Chris Hines + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/gobuffalo/here +Version: v0.6.7 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/gobuffalo/here@v0.6.7/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2019 Mark Bates + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/goccy/go-json +Version: v0.10.2 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/goccy/go-json@v0.10.2/LICENSE: + +MIT License + +Copyright (c) 2020 Masaaki Goshima + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/godror/knownpb +Version: v0.1.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/godror/knownpb@v0.1.0/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/golang-jwt/jwt/v4 +Version: v4.5.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/golang-jwt/jwt/v4@v4.5.0/LICENSE: + +Copyright (c) 2012 Dave Grijalva +Copyright (c) 2021 golang-jwt maintainers + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/golang-sql/civil +Version: v0.0.0-20190719163853-cb61b32ac6fe +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/golang-sql/civil@v0.0.0-20190719163853-cb61b32ac6fe/LICENSE: Apache License @@ -48277,41 +48488,630 @@ Contents of probable licence file $GOMODCACHE/github.com/urso/diag@v0.0.0-202002 incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/vishvananda/netlink +Version: v1.1.1-0.20201029203352-d40f9887b852 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netlink@v1.1.1-0.20201029203352-d40f9887b852/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Vishvananda Ishaya. + Copyright 2014 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/vishvananda/netns +Version: v0.0.0-20210104183010-2eb08e3e575f +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netns@v0.0.0-20210104183010-2eb08e3e575f/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Vishvananda Ishaya. + Copyright 2014 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/xdg-go/pbkdf2 +Version: v1.0.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/xdg-go/pbkdf2@v1.0.0/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + -------------------------------------------------------------------------------- -Dependency : github.com/vishvananda/netlink -Version: v1.1.1-0.20201029203352-d40f9887b852 +Dependency : github.com/xdg-go/scram +Version: v1.0.2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netlink@v1.1.1-0.20201029203352-d40f9887b852/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/xdg-go/scram@v1.0.2/LICENSE: Apache License @@ -48489,31 +49289,14 @@ Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netlink@v1. incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - - Copyright 2014 Vishvananda Ishaya. - Copyright 2014 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -------------------------------------------------------------------------------- -Dependency : github.com/vishvananda/netns -Version: v0.0.0-20210104183010-2eb08e3e575f +Dependency : github.com/xdg-go/stringprep +Version: v1.0.2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netns@v0.0.0-20210104183010-2eb08e3e575f/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/xdg-go/stringprep@v1.0.2/LICENSE: Apache License @@ -48691,31 +49474,14 @@ Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netns@v0.0. incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - - Copyright 2014 Vishvananda Ishaya. - Copyright 2014 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -------------------------------------------------------------------------------- -Dependency : github.com/xdg-go/pbkdf2 -Version: v1.0.0 +Dependency : github.com/xdg/stringprep +Version: v1.0.3 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/xdg-go/pbkdf2@v1.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/xdg/stringprep@v1.0.3/LICENSE: Apache License @@ -48895,12 +49661,302 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg-go/pbkdf2@v1.0.0/LI -------------------------------------------------------------------------------- -Dependency : github.com/xdg-go/scram +Dependency : github.com/youmark/pkcs8 +Version: v0.0.0-20201027041543-1326539a0a0a +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/youmark/pkcs8@v0.0.0-20201027041543-1326539a0a0a/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2014 youmark + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- +Dependency : github.com/yuin/gopher-lua +Version: v0.0.0-20170403160031-b402f3114ec7 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/yuin/gopher-lua@v0.0.0-20170403160031-b402f3114ec7/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015 Yusuke Inuzuka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/yusufpapurcu/wmi +Version: v1.2.2 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/yusufpapurcu/wmi@v1.2.2/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2013 Stack Exchange + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/zeebo/assert +Version: v1.3.0 +Licence type (autodetected): CC0-1.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/zeebo/assert@v1.3.0/LICENSE: + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + + +-------------------------------------------------------------------------------- +Dependency : github.com/zeebo/xxh3 Version: v1.0.2 +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/zeebo/xxh3@v1.0.2/LICENSE: + +xxHash Library +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2019, Jeff Wendling +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : go.elastic.co/fastjson +Version: v1.1.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/go.elastic.co/fastjson@v1.1.0/LICENSE: + +Copyright 2018 Elasticsearch BV + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--- + +Copyright (c) 2016 Mail.Ru Group + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : go.opencensus.io +Version: v0.24.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/xdg-go/scram@v1.0.2/LICENSE: +Contents of probable licence file $GOMODCACHE/go.opencensus.io@v0.24.0/LICENSE: Apache License @@ -49078,15 +50134,40 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg-go/scram@v1.0.2/LIC incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -------------------------------------------------------------------------------- -Dependency : github.com/xdg-go/stringprep -Version: v1.0.2 +Dependency : go.opentelemetry.io/otel +Version: v1.19.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/xdg-go/stringprep@v1.0.2/LICENSE: - +Contents of probable licence file $GOMODCACHE/go.opentelemetry.io/otel@v1.19.0/LICENSE: Apache License Version 2.0, January 2004 @@ -49263,15 +50344,41 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg-go/stringprep@v1.0. incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + -------------------------------------------------------------------------------- -Dependency : github.com/xdg/stringprep -Version: v1.0.3 +Dependency : go.opentelemetry.io/otel/metric +Version: v1.19.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/xdg/stringprep@v1.0.3/LICENSE: - +Contents of probable licence file $GOMODCACHE/go.opentelemetry.io/otel/metric@v1.19.0/LICENSE: Apache License Version 2.0, January 2004 @@ -49448,305 +50555,41 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg/stringprep@v1.0.3/L incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS --------------------------------------------------------------------------------- -Dependency : github.com/youmark/pkcs8 -Version: v0.0.0-20201027041543-1326539a0a0a -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/youmark/pkcs8@v0.0.0-20201027041543-1326539a0a0a/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 youmark - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- -Dependency : github.com/yuin/gopher-lua -Version: v0.0.0-20170403160031-b402f3114ec7 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/yuin/gopher-lua@v0.0.0-20170403160031-b402f3114ec7/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2015 Yusuke Inuzuka - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/yusufpapurcu/wmi -Version: v1.2.2 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/yusufpapurcu/wmi@v1.2.2/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2013 Stack Exchange - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/zeebo/assert -Version: v1.3.0 -Licence type (autodetected): CC0-1.0 --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/zeebo/assert@v1.3.0/LICENSE: - -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. - - --------------------------------------------------------------------------------- -Dependency : github.com/zeebo/xxh3 -Version: v1.0.2 -Licence type (autodetected): BSD-2-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/zeebo/xxh3@v1.0.2/LICENSE: - -xxHash Library -Copyright (c) 2012-2014, Yann Collet -Copyright (c) 2019, Jeff Wendling -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : go.elastic.co/fastjson -Version: v1.1.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/go.elastic.co/fastjson@v1.1.0/LICENSE: - -Copyright 2018 Elasticsearch BV - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + APPENDIX: How to apply the Apache License to your work. ---- + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2016 Mail.Ru Group + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -------------------------------------------------------------------------------- -Dependency : go.opencensus.io -Version: v0.24.0 +Dependency : go.opentelemetry.io/otel/trace +Version: v1.19.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/go.opencensus.io@v0.24.0/LICENSE: - +Contents of probable licence file $GOMODCACHE/go.opentelemetry.io/otel/trace@v1.19.0/LICENSE: Apache License Version 2.0, January 2004 @@ -49950,6 +50793,7 @@ Contents of probable licence file $GOMODCACHE/go.opencensus.io@v0.24.0/LICENSE: See the License for the specific language governing permissions and limitations under the License. + -------------------------------------------------------------------------------- Dependency : go.uber.org/goleak Version: v1.2.0 diff --git a/auditbeat/auditbeat.reference.yml b/auditbeat/auditbeat.reference.yml index 892d4e1b2d0..32fbef2da04 100644 --- a/auditbeat/auditbeat.reference.yml +++ b/auditbeat/auditbeat.reference.yml @@ -450,8 +450,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1337,6 +1338,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is auditbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "auditbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/auditbeat/docs/getting-started.asciidoc b/auditbeat/docs/getting-started.asciidoc index ad05a31e97f..0e7cb1d38da 100644 --- a/auditbeat/docs/getting-started.asciidoc +++ b/auditbeat/docs/getting-started.asciidoc @@ -35,6 +35,10 @@ system: include::{libbeat-dir}/tab-widgets/install-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[other-installation-options]] ==== Other installation options diff --git a/auditbeat/docs/index.asciidoc b/auditbeat/docs/index.asciidoc index 6afd1de2b6a..bf2db3607ce 100644 --- a/auditbeat/docs/index.asciidoc +++ b/auditbeat/docs/index.asciidoc @@ -20,6 +20,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :docker_platform: :win_os: :linux_os: +:no_cache_processor: :no_decode_cef_processor: :no_decode_csv_fields_processor: :no_parse_aws_vpc_flow_log_processor: diff --git a/dev-tools/packaging/templates/ironbank/auditbeat/Dockerfile b/dev-tools/packaging/templates/ironbank/auditbeat/Dockerfile index 85285953870..71c9a84a12a 100644 --- a/dev-tools/packaging/templates/ironbank/auditbeat/Dockerfile +++ b/dev-tools/packaging/templates/ironbank/auditbeat/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dsop.io ARG BASE_IMAGE=ironbank/redhat/ubi/ubi8 -ARG BASE_TAG=8.7 +ARG BASE_TAG=9.2 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as builder diff --git a/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml index 57606723656..fae46ecb0a7 100644 --- a/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml @@ -14,7 +14,7 @@ tags: # Build args passed to Dockerfile ARGs args: BASE_IMAGE: "redhat/ubi/ubi8" - BASE_TAG: "8.7" + BASE_TAG: "9.2" ELASTIC_STACK: "{{ beat_version }}" ELASTIC_PRODUCT: "auditbeat" diff --git a/dev-tools/packaging/templates/ironbank/filebeat/Dockerfile b/dev-tools/packaging/templates/ironbank/filebeat/Dockerfile index 9b34c1f459e..99eeed7d53c 100644 --- a/dev-tools/packaging/templates/ironbank/filebeat/Dockerfile +++ b/dev-tools/packaging/templates/ironbank/filebeat/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dsop.io ARG BASE_IMAGE=ironbank/redhat/ubi/ubi8 -ARG BASE_TAG=8.7 +ARG BASE_TAG=9.2 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as builder diff --git a/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml index 7da333f844f..259cd70620d 100644 --- a/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml @@ -14,7 +14,7 @@ tags: # Build args passed to Dockerfile ARGs args: BASE_IMAGE: "redhat/ubi/ubi8" - BASE_TAG: "8.7" + BASE_TAG: "9.2" ELASTIC_STACK: "{{ beat_version }}" ELASTIC_PRODUCT: "filebeat" diff --git a/dev-tools/packaging/templates/ironbank/heartbeat/Dockerfile b/dev-tools/packaging/templates/ironbank/heartbeat/Dockerfile index 209756ca1d4..3fdbb2bddc9 100644 --- a/dev-tools/packaging/templates/ironbank/heartbeat/Dockerfile +++ b/dev-tools/packaging/templates/ironbank/heartbeat/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dsop.io ARG BASE_IMAGE=ironbank/redhat/ubi/ubi8 -ARG BASE_TAG=8.7 +ARG BASE_TAG=9.2 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as prep_files diff --git a/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml index 6476f9298ce..4b5a10ea38d 100644 --- a/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml @@ -14,7 +14,7 @@ tags: # Build args passed to Dockerfile ARGs args: BASE_IMAGE: "redhat/ubi/ubi8" - BASE_TAG: "8.7" + BASE_TAG: "9.2" ELASTIC_STACK: "{{ beat_version }}" ELASTIC_PRODUCT: "heartbeat" diff --git a/dev-tools/packaging/templates/ironbank/metricbeat/Dockerfile b/dev-tools/packaging/templates/ironbank/metricbeat/Dockerfile index ee78b132a75..da982cffa9b 100644 --- a/dev-tools/packaging/templates/ironbank/metricbeat/Dockerfile +++ b/dev-tools/packaging/templates/ironbank/metricbeat/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dsop.io ARG BASE_IMAGE=ironbank/redhat/ubi/ubi8 -ARG BASE_TAG=8.7 +ARG BASE_TAG=9.2 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as builder diff --git a/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml index e66005ebf2a..fcae778cba2 100644 --- a/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml @@ -14,7 +14,7 @@ tags: # Build args passed to Dockerfile ARGs args: BASE_IMAGE: "redhat/ubi/ubi8" - BASE_TAG: "8.7" + BASE_TAG: "9.2" ELASTIC_STACK: "{{ beat_version }}" ELASTIC_PRODUCT: "metricbeat" diff --git a/dev-tools/packaging/templates/ironbank/packetbeat/Dockerfile b/dev-tools/packaging/templates/ironbank/packetbeat/Dockerfile index 9a53d776459..17a7e8c86ac 100644 --- a/dev-tools/packaging/templates/ironbank/packetbeat/Dockerfile +++ b/dev-tools/packaging/templates/ironbank/packetbeat/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dsop.io ARG BASE_IMAGE=ironbank/redhat/ubi/ubi8 -ARG BASE_TAG=8.7 +ARG BASE_TAG=9.2 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as builder diff --git a/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml index d0f09a8496a..0ba0436d33c 100644 --- a/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml @@ -14,7 +14,7 @@ tags: # Build args passed to Dockerfile ARGs args: BASE_IMAGE: "redhat/ubi/ubi8" - BASE_TAG: "8.7" + BASE_TAG: "9.2" ELASTIC_STACK: "{{ beat_version }}" ELASTIC_PRODUCT: "packetbeat" diff --git a/filebeat/beater/filebeat.go b/filebeat/beater/filebeat.go index 78084c0fc29..b1d88fe9f74 100644 --- a/filebeat/beater/filebeat.go +++ b/filebeat/beater/filebeat.go @@ -189,7 +189,7 @@ func newBeater(b *beat.Beat, plugins PluginFactory, rawConfig *conf.C) (beat.Bea // setupPipelineLoaderCallback sets the callback function for loading pipelines during setup. func (fb *Filebeat) setupPipelineLoaderCallback(b *beat.Beat) error { - if b.Config.Output.Name() != "elasticsearch" { + if b.Config.Output.Name() != "elasticsearch" && !b.Manager.Enabled() { logp.Warn(pipelinesWarning) return nil } diff --git a/filebeat/cmd/root.go b/filebeat/cmd/root.go index 2831a10bd64..20e76e748f5 100644 --- a/filebeat/cmd/root.go +++ b/filebeat/cmd/root.go @@ -28,6 +28,7 @@ import ( "github.com/elastic/beats/v7/libbeat/cmd/instance" // Import processors. + _ "github.com/elastic/beats/v7/libbeat/processors/cache" _ "github.com/elastic/beats/v7/libbeat/processors/timestamp" ) diff --git a/filebeat/docs/getting-started.asciidoc b/filebeat/docs/getting-started.asciidoc index 60c8cd9b54e..71a0b22647e 100644 --- a/filebeat/docs/getting-started.asciidoc +++ b/filebeat/docs/getting-started.asciidoc @@ -41,6 +41,10 @@ system: include::{libbeat-dir}/tab-widgets/install-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[other-installation-options]] ==== Other installation options diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index 2de0bc61f56..7f86b5aa9d2 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -1546,8 +1546,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -2433,6 +2434,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is filebeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "filebeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go index 8986794340d..a32b4409ef2 100644 --- a/filebeat/input/filestream/fswatch.go +++ b/filebeat/input/filestream/fswatch.go @@ -18,10 +18,10 @@ package filestream import ( - "bufio" "crypto/sha256" "encoding/hex" "fmt" + "hash" "io" "os" "path/filepath" @@ -282,16 +282,19 @@ func defaultFileScannerConfig() fileScannerConfig { // fileScanner looks for files which match the patterns in paths. // It is able to exclude files and symlinks. type fileScanner struct { - paths []string - cfg fileScannerConfig - log *logp.Logger + paths []string + cfg fileScannerConfig + log *logp.Logger + hasher hash.Hash + readBuffer []byte } -func newFileScanner(paths []string, config fileScannerConfig) (loginp.FSScanner, error) { +func newFileScanner(paths []string, config fileScannerConfig) (*fileScanner, error) { s := fileScanner{ - paths: paths, - cfg: config, - log: logp.NewLogger(scannerDebugKey), + paths: paths, + cfg: config, + log: logp.NewLogger(scannerDebugKey), + hasher: sha256.New(), } if s.cfg.Fingerprint.Enabled { @@ -300,6 +303,7 @@ func newFileScanner(paths []string, config fileScannerConfig) (loginp.FSScanner, return nil, fmt.Errorf("error while reading configuration of fingerprint: %w", err) } s.log.Debugf("fingerprint mode enabled: offset %d, length %d", s.cfg.Fingerprint.Offset, s.cfg.Fingerprint.Length) + s.readBuffer = make([]byte, s.cfg.Fingerprint.Length) } err := s.resolveRecursiveGlobs(config) @@ -463,6 +467,7 @@ func (s *fileScanner) toFileDescriptor(it *ingestTarget) (fd loginp.FileDescript if s.cfg.Fingerprint.Enabled { fileSize := it.info.Size() + // we should not open the file if we know it's too small minSize := s.cfg.Fingerprint.Offset + s.cfg.Fingerprint.Length if fileSize < minSize { return fd, fmt.Errorf("filesize of %q is %d bytes, expected at least %d bytes for fingerprinting", fd.Filename, fileSize, minSize) @@ -481,10 +486,9 @@ func (s *fileScanner) toFileDescriptor(it *ingestTarget) (fd loginp.FileDescript } } - bfile := bufio.NewReaderSize(file, int(s.cfg.Fingerprint.Length)) - r := io.LimitReader(bfile, s.cfg.Fingerprint.Length) - h := sha256.New() - written, err := io.Copy(h, r) + s.hasher.Reset() + lr := io.LimitReader(file, s.cfg.Fingerprint.Length) + written, err := io.CopyBuffer(s.hasher, lr, s.readBuffer) if err != nil { return fd, fmt.Errorf("failed to compute hash for first %d bytes of %q: %w", s.cfg.Fingerprint.Length, fd.Filename, err) } @@ -492,7 +496,7 @@ func (s *fileScanner) toFileDescriptor(it *ingestTarget) (fd loginp.FileDescript return fd, fmt.Errorf("failed to read %d bytes from %q to compute fingerprint, read only %d", written, fd.Filename, s.cfg.Fingerprint.Length) } - fd.Fingerprint = hex.EncodeToString(h.Sum(nil)) + fd.Fingerprint = hex.EncodeToString(s.hasher.Sum(nil)) } return fd, nil diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index ded2459628b..ffa9b9c510e 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -831,15 +831,14 @@ func BenchmarkGetFiles(b *testing.B) { err := os.WriteFile(filename, []byte(strings.Repeat(content, 1024)), 0777) require.NoError(b, err) } - - s := fileScanner{ - paths: []string{filepath.Join(dir, "*.log")}, - cfg: fileScannerConfig{ - Fingerprint: fingerprintConfig{ - Enabled: false, - }, + paths := []string{filepath.Join(dir, "*.log")} + cfg := fileScannerConfig{ + Fingerprint: fingerprintConfig{ + Enabled: false, }, } + s, err := newFileScanner(paths, cfg) + require.NoError(b, err) for i := 0; i < b.N; i++ { files := s.GetFiles() @@ -857,17 +856,16 @@ func BenchmarkGetFilesWithFingerprint(b *testing.B) { err := os.WriteFile(filename, []byte(strings.Repeat(content, 1024)), 0777) require.NoError(b, err) } - - s := fileScanner{ - paths: []string{filepath.Join(dir, "*.log")}, - cfg: fileScannerConfig{ - Fingerprint: fingerprintConfig{ - Enabled: true, - Offset: 0, - Length: 1024, - }, + paths := []string{filepath.Join(dir, "*.log")} + cfg := fileScannerConfig{ + Fingerprint: fingerprintConfig{ + Enabled: true, + Offset: 0, + Length: 1024, }, } + s, err := newFileScanner(paths, cfg) + require.NoError(b, err) for i := 0; i < b.N; i++ { files := s.GetFiles() @@ -947,16 +945,16 @@ func BenchmarkToFileDescriptor(b *testing.B) { err := os.WriteFile(filename, []byte(strings.Repeat("a", 1024)), 0777) require.NoError(b, err) - s := fileScanner{ - paths: []string{filename}, - cfg: fileScannerConfig{ - Fingerprint: fingerprintConfig{ - Enabled: true, - Offset: 0, - Length: 1024, - }, + paths := []string{filename} + cfg := fileScannerConfig{ + Fingerprint: fingerprintConfig{ + Enabled: true, + Offset: 0, + Length: 1024, }, } + s, err := newFileScanner(paths, cfg) + require.NoError(b, err) it, err := s.getIngestTarget(filename) require.NoError(b, err) diff --git a/go.mod b/go.mod index 0aa925dcc15..5deb71586d1 100644 --- a/go.mod +++ b/go.mod @@ -125,7 +125,7 @@ require ( github.com/mitchellh/hashstructure v1.1.0 github.com/mitchellh/mapstructure v1.5.0 github.com/olekukonko/tablewriter v0.0.5 - github.com/osquery/osquery-go v0.0.0-20220706183148-4e1f83012b42 + github.com/osquery/osquery-go v0.0.0-20230707154813-2e4891a0f444 github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0 github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 @@ -158,7 +158,7 @@ require ( golang.org/x/net v0.10.0 golang.org/x/oauth2 v0.7.0 golang.org/x/sync v0.1.0 - golang.org/x/sys v0.11.0 + golang.org/x/sys v0.12.0 golang.org/x/text v0.12.0 golang.org/x/time v0.3.0 golang.org/x/tools v0.6.0 @@ -204,9 +204,9 @@ require ( github.com/elastic/elastic-agent-autodiscover v0.6.2 github.com/elastic/elastic-agent-libs v0.3.15-0.20230913212237-dbdaf18c898b github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3 - github.com/elastic/elastic-agent-system-metrics v0.6.1 + github.com/elastic/elastic-agent-system-metrics v0.7.0 github.com/elastic/go-elasticsearch/v8 v8.10.0 - github.com/elastic/mito v1.5.0 + github.com/elastic/mito v1.6.0 github.com/elastic/toutoumomoma v0.0.0-20221026030040-594ef30cb640 github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15 github.com/google/cel-go v0.15.3 @@ -245,7 +245,7 @@ require ( github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect - github.com/apache/thrift v0.18.1 // indirect + github.com/apache/thrift v0.19.0 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/aws/aws-sdk-go v1.38.60 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8 // indirect @@ -261,7 +261,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.3 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect @@ -276,7 +276,8 @@ require ( github.com/felixge/httpsnoop v1.0.1 // indirect github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gobuffalo/here v0.6.7 // indirect @@ -357,6 +358,9 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect go.elastic.co/fastjson v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e // indirect golang.org/x/term v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect diff --git a/go.sum b/go.sum index 2375c473a8d..d96c6592261 100644 --- a/go.sum +++ b/go.sum @@ -254,8 +254,8 @@ github.com/apache/arrow/go/v12 v12.0.1-0.20230605094802-c153c6d36ccf/go.mod h1:w github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.18.1 h1:lNhK/1nqjbwbiOPDBPFJVKxgDEGSepKuTh6OLiXW8kg= -github.com/apache/thrift v0.18.1/go.mod h1:rdQn/dCcDKEWjjylUeueum4vQEjG2v8v2PqriUnbr+I= +github.com/apache/thrift v0.19.0 h1:sOqkWPzMj7w6XaYbJQG7m4sGqVolaW/0D28Ln7yPzMk= +github.com/apache/thrift v0.19.0/go.mod h1:SUALL216IiaOw2Oy+5Vs9lboJ/t9g40C+G07Dc0QC1I= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -550,8 +550,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= @@ -657,8 +657,8 @@ github.com/elastic/elastic-agent-libs v0.3.15-0.20230913212237-dbdaf18c898b h1:a github.com/elastic/elastic-agent-libs v0.3.15-0.20230913212237-dbdaf18c898b/go.mod h1:mpSfrigixx8x+uMxWKl4LtdlrKIhZbA4yT2eIeIazUQ= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3 h1:sb+25XJn/JcC9/VL8HX4r4QXSUq4uTNzGS2kxOE7u1U= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3/go.mod h1:rWarFM7qYxJKsi9WcV6ONcFjH/NA3niDNpTxO+8/GVI= -github.com/elastic/elastic-agent-system-metrics v0.6.1 h1:LCN1lvQTkdUuU/rKlpKyVMDU/G/I8/iZWCaW6K+mo4o= -github.com/elastic/elastic-agent-system-metrics v0.6.1/go.mod h1:Bj8XM/uNKm553blQHkGNEICRLGnVEtw8yttmV5vBngA= +github.com/elastic/elastic-agent-system-metrics v0.7.0 h1:qDLY30UDforSd/TfHfqUDiiHSL6Nu6qLXHsKSxz4OuQ= +github.com/elastic/elastic-agent-system-metrics v0.7.0/go.mod h1:9C1UEfj0P687HAzZepHszN6zXA+2tN2Lx3Osvq1zby8= github.com/elastic/elastic-transport-go/v8 v8.0.0-20230329154755-1a3c63de0db6/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= github.com/elastic/elastic-transport-go/v8 v8.3.0 h1:DJGxovyQLXGr62e9nDMPSxRyWION0Bh6d9eCFBriiHo= github.com/elastic/elastic-transport-go/v8 v8.3.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= @@ -695,8 +695,8 @@ github.com/elastic/gopacket v1.1.20-0.20211202005954-d412fca7f83a h1:8WfL/X6fK11 github.com/elastic/gopacket v1.1.20-0.20211202005954-d412fca7f83a/go.mod h1:riddUzxTSBpJXk3qBHtYr4qOhFhT6k/1c0E3qkQjQpA= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/mito v1.5.0 h1:637UzhwJH8XfHgusGrpL9b7sTkDE+gJ4unf1tDPDtUE= -github.com/elastic/mito v1.5.0/go.mod h1:J0LW+SbpiAoiBUBEBrbH8epwNDFhWWgEWyR/9DpY04c= +github.com/elastic/mito v1.6.0 h1:0Gf0qovzgBCKfGoPKdqdGKBjS9L3mRREWNqb7zG2WYg= +github.com/elastic/mito v1.6.0/go.mod h1:J0LW+SbpiAoiBUBEBrbH8epwNDFhWWgEWyR/9DpY04c= github.com/elastic/ristretto v0.1.1-0.20220602190459-83b0895ca5b3 h1:ChPwRVv1RR4a0cxoGjKcyWjTEpxYfm5gydMIzo32cAw= github.com/elastic/ristretto v0.1.1-0.20220602190459-83b0895ca5b3/go.mod h1:RAy2GVV4sTWVlNMavv3xhLsk18rxhfhDnombTe6EF5c= github.com/elastic/sarama v1.19.1-0.20220310193331-ebc2b0d8eef3 h1:FzA0/n4iMt8ojGDGRoiFPSHFvvdVIvxOxyLtiFnrLBM= @@ -782,8 +782,12 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -1555,8 +1559,8 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/osquery/osquery-go v0.0.0-20220706183148-4e1f83012b42 h1:Epwxipb+y/e8ss/SJ7947F8J6dwjv3RHRCz2g0OkCII= -github.com/osquery/osquery-go v0.0.0-20220706183148-4e1f83012b42/go.mod h1:0KzmMhe0PL19cdYq6nd1cT9/5bMMJBTssAfuEgM2i34= +github.com/osquery/osquery-go v0.0.0-20230707154813-2e4891a0f444 h1:UO3MEdZ4hkmAfhf7kXfuKR+e44gsHlEEsdWGOwZNLyQ= +github.com/osquery/osquery-go v0.0.0-20230707154813-2e4891a0f444/go.mod h1:mLJRc1Go8uP32LRALGvWj2lVJ+hDYyIfxDzVa+C5Yo8= github.com/otiai10/copy v1.12.0 h1:cLMgSQnXBs1eehF0Wy/FAGsgDTDmAqFR7rQylBb1nDY= github.com/otiai10/copy v1.12.0/go.mod h1:rSaLseMUsZFFbsFGc7wCJnnkTAvdc5L6VWxPE4308Ww= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= @@ -1938,6 +1942,12 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2321,8 +2331,8 @@ golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/heartbeat/docs/getting-started.asciidoc b/heartbeat/docs/getting-started.asciidoc index 83c3174cf90..be285333113 100644 --- a/heartbeat/docs/getting-started.asciidoc +++ b/heartbeat/docs/getting-started.asciidoc @@ -38,6 +38,10 @@ system: include::{libbeat-dir}/tab-widgets/install-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[other-installation-options]] ==== Other installation options diff --git a/heartbeat/docs/index.asciidoc b/heartbeat/docs/index.asciidoc index d323e65baf2..1912e1efb1a 100644 --- a/heartbeat/docs/index.asciidoc +++ b/heartbeat/docs/index.asciidoc @@ -21,6 +21,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :linux_os: :docker_platform: :win_os: +:no_cache_processor: :no_dashboards: :no_decode_cef_processor: :no_decode_csv_fields_processor: diff --git a/heartbeat/heartbeat.reference.yml b/heartbeat/heartbeat.reference.yml index b8281727026..89fc08ef8e6 100644 --- a/heartbeat/heartbeat.reference.yml +++ b/heartbeat/heartbeat.reference.yml @@ -542,8 +542,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1429,6 +1430,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is heartbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "heartbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/heartbeat/monitors/logger/logger.go b/heartbeat/monitors/logger/logger.go index 734cae862a9..826490ae084 100644 --- a/heartbeat/monitors/logger/logger.go +++ b/heartbeat/monitors/logger/logger.go @@ -39,13 +39,16 @@ type DurationLoggable struct { Mills int64 `json:"ms"` } +type NetworkInfo map[string]interface{} + type MonitorRunInfo struct { - MonitorID string `json:"id"` - Type string `json:"type"` - Duration int64 `json:"-"` - Steps *int `json:"steps,omitempty"` - Status string `json:"status"` - Attempt int `json:"attempt"` + MonitorID string `json:"id"` + Type string `json:"type"` + Duration int64 `json:"-"` + Steps *int `json:"steps,omitempty"` + Status string `json:"status"` + Attempt int `json:"attempt"` + NetworkInfo NetworkInfo `json:"network_info,omitempty"` } func (m *MonitorRunInfo) MarshalJSON() ([]byte, error) { @@ -113,12 +116,14 @@ func extractRunInfo(event *beat.Event) (*MonitorRunInfo, error) { return nil, fmt.Errorf("logErrors: %+v", errors) } + networkInfo := extractNetworkInfo(event, monType.(string)) monitor := MonitorRunInfo{ - MonitorID: monitorID.(string), - Type: monType.(string), - Duration: durationUs.(int64), - Status: status.(string), - Attempt: attempt, + MonitorID: monitorID.(string), + Type: monType.(string), + Duration: durationUs.(int64), + Status: status.(string), + Attempt: attempt, + NetworkInfo: networkInfo, } sc, _ := event.Meta.GetValue(META_STEP_COUNT) @@ -130,6 +135,29 @@ func extractRunInfo(event *beat.Event) (*MonitorRunInfo, error) { return &monitor, nil } +func extractNetworkInfo(event *beat.Event, monitorType string) NetworkInfo { + // Only relevant for lightweight monitors + if monitorType == "browser" { + return nil + } + + fields := []string{ + "resolve.ip", "resolve.rtt.us", "tls.rtt.handshake.us", "icmp.rtt.us", + "tcp.rtt.connect.us", "tcp.rtt.validate.us", "http.rtt.content.us", "http.rtt.validate.us", + "http.rtt.validate_body.us", "http.rtt.write_request.us", "http.rtt.response_header.us", + "http.rtt.total.us", "socks5.rtt.connect.us", + } + networkInfo := make(NetworkInfo) + for _, field := range fields { + value, err := event.GetValue(field) + if err == nil && value != nil { + networkInfo[field] = value + } + } + + return networkInfo +} + func LogRun(event *beat.Event) { monitor, err := extractRunInfo(event) if err != nil { diff --git a/heartbeat/monitors/logger/logger_test.go b/heartbeat/monitors/logger/logger_test.go index 183d19447fc..18952f2652d 100644 --- a/heartbeat/monitors/logger/logger_test.go +++ b/heartbeat/monitors/logger/logger_test.go @@ -34,43 +34,111 @@ import ( "github.com/elastic/elastic-agent-libs/mapstr" ) -func TestLogRun(t *testing.T) { - core, observed := observer.New(zapcore.InfoLevel) - SetLogger(logp.NewLogger("t", zap.WrapCore(func(in zapcore.Core) zapcore.Core { - return zapcore.NewTee(in, core) - }))) - - durationUs := int64(5000 * time.Microsecond) - steps := 1337 - - fields := mapstr.M{ - "monitor.id": "b0", - "monitor.duration.us": durationUs, - "monitor.type": "browser", - "monitor.status": "down", - "summary": jobsummary.NewJobSummary(1, 1, "abc"), +func generateFakeNetworkInfo() NetworkInfo { + networkInfo := NetworkInfo{ + // All network info available in HB documentation + "resolve.ip": "192.168.1.254", + "resolve.rtt.us": 123, + "tls.rtt.handshake.us": 456, + "icmp.rtt.us": 111, + "tcp.rtt.connect.us": 789, + "tcp.rtt.validate.us": 1234, + "http.rtt.content.us": 4567, + "http.rtt.validate.us": 7890, + "http.rtt.validate_body.us": 12345, + "http.rtt.write_request.us": 45678, + "http.rtt.response_header.us": 78901, + "http.rtt.total.us": 123456, + "socks5.rtt.connect.us": 789012, } - event := beat.Event{Fields: fields} - eventext.SetMeta(&event, META_STEP_COUNT, steps) + return networkInfo +} - LogRun(&event) +func TestLogRun(t *testing.T) { + t.Run("should log the monitor completion", func(t *testing.T) { + core, observed := observer.New(zapcore.InfoLevel) + SetLogger(logp.NewLogger("t", zap.WrapCore(func(in zapcore.Core) zapcore.Core { + return zapcore.NewTee(in, core) + }))) - observedEntries := observed.All() - require.Len(t, observedEntries, 1) - assert.Equal(t, "Monitor finished", observedEntries[0].Message) + durationUs := int64(5000 * time.Microsecond) + steps := 1337 + fields := mapstr.M{ + "monitor.id": "b0", + "monitor.duration.us": durationUs, + "monitor.type": "browser", + "monitor.status": "down", + "summary": jobsummary.NewJobSummary(1, 1, "abc"), + } - expectedMonitor := MonitorRunInfo{ - MonitorID: "b0", - Type: "browser", - Duration: durationUs, - Status: "down", - Steps: &steps, - Attempt: 1, - } + event := beat.Event{Fields: fields} + eventext.SetMeta(&event, META_STEP_COUNT, steps) + + LogRun(&event) + + observedEntries := observed.All() + require.Len(t, observedEntries, 1) + assert.Equal(t, "Monitor finished", observedEntries[0].Message) + + expectedMonitor := MonitorRunInfo{ + MonitorID: "b0", + Type: "browser", + Duration: durationUs, + Status: "down", + Steps: &steps, + Attempt: 1, + } + + assert.ElementsMatch(t, []zap.Field{ + logp.Any("event", map[string]string{"action": ActionMonitorRun}), + logp.Any("monitor", &expectedMonitor), + }, observedEntries[0].Context) + }) + + t.Run("should log network information if available", func(t *testing.T) { + core, observed := observer.New(zapcore.InfoLevel) + SetLogger(logp.NewLogger("t", zap.WrapCore(func(in zapcore.Core) zapcore.Core { + return zapcore.NewTee(in, core) + }))) + + durationUs := int64(5000 * time.Microsecond) + steps := 1337 + fields := mapstr.M{ + "monitor.id": "b0", + "monitor.duration.us": durationUs, + "monitor.type": "http", + "monitor.status": "down", + "summary": jobsummary.NewJobSummary(1, 1, "abc"), + } + networkInfo := generateFakeNetworkInfo() + // Add network info to the event + for key, value := range networkInfo { + fields[key] = value + } + + event := beat.Event{Fields: fields} + eventext.SetMeta(&event, META_STEP_COUNT, steps) + + LogRun(&event) + + observedEntries := observed.All() + require.Len(t, observedEntries, 1) + assert.Equal(t, "Monitor finished", observedEntries[0].Message) + + expectedMonitor := MonitorRunInfo{ + MonitorID: "b0", + Type: "http", + Duration: durationUs, + Status: "down", + Steps: &steps, + Attempt: 1, + NetworkInfo: networkInfo, + } - assert.ElementsMatch(t, []zap.Field{ - logp.Any("event", map[string]string{"action": ActionMonitorRun}), - logp.Any("monitor", &expectedMonitor), - }, observedEntries[0].Context) + assert.ElementsMatch(t, []zap.Field{ + logp.Any("event", map[string]string{"action": ActionMonitorRun}), + logp.Any("monitor", &expectedMonitor), + }, observedEntries[0].Context) + }) } diff --git a/heartbeat/monitors/wrappers/summarizer/plugstatestat.go b/heartbeat/monitors/wrappers/summarizer/plugstatestat.go index f38c22d32ab..9567a666ad6 100644 --- a/heartbeat/monitors/wrappers/summarizer/plugstatestat.go +++ b/heartbeat/monitors/wrappers/summarizer/plugstatestat.go @@ -63,13 +63,15 @@ func (ssp *BrowserStateStatusPlugin) BeforeSummary(event *beat.Event) BeforeSumm } res := ssp.cssp.BeforeSummary(event) - + // Browsers don't set this prior, so we set this here, as opposed to lightweight monitors _, _ = event.PutValue("monitor.status", string(ssp.cssp.js.Status)) + + _, _ = event.PutValue("synthetics", mapstr.M{"type": "heartbeat/summary"}) return res } func (ssp *BrowserStateStatusPlugin) BeforeRetry() { - // noop + ssp.cssp.BeforeRetry() } // LightweightStateStatusPlugin encapsulates the writing of the primary fields used by the summary, @@ -108,7 +110,7 @@ func (ssp *LightweightStateStatusPlugin) BeforeSummary(event *beat.Event) Before } func (ssp *LightweightStateStatusPlugin) BeforeRetry() { - // noop + ssp.cssp.BeforeRetry() } type commonSSP struct { @@ -147,8 +149,15 @@ func (ssp *commonSSP) BeforeSummary(event *beat.Event) BeforeSummaryActions { // determine if a retry is needed lastStatus := ssp.stateTracker.GetCurrentStatus(ssp.sf) - // FinalAttempt is true if no retries will occur - retry := ssp.js.Status == monitorstate.StatusDown && ssp.js.Attempt < ssp.js.MaxAttempts + curCheckDown := ssp.js.Status == monitorstate.StatusDown + lastStateUp := ssp.stateTracker.GetCurrentStatus(ssp.sf) == monitorstate.StatusUp + hasAttemptsRemaining := ssp.js.Attempt < ssp.js.MaxAttempts + + // retry if... + retry := curCheckDown && // the current check is down + lastStateUp && // we were previously up, if we were previously down we just check once + hasAttemptsRemaining // and we are configured to actually make multiple attempts + // if we aren't retrying this is the final attempt ssp.js.FinalAttempt = !retry ms := ssp.stateTracker.RecordStatus(ssp.sf, ssp.js.Status, ssp.js.FinalAttempt) @@ -162,17 +171,10 @@ func (ssp *commonSSP) BeforeSummary(event *beat.Event) BeforeSummaryActions { "summary": &jsCopy, "state": ms, } - if ssp.sf.Type == "browser" { - fields["synthetics"] = mapstr.M{"type": "heartbeat/summary"} - } - eventext.MergeEventFields(event, fields) - if retry { - // mutate the js into the state for the next attempt - ssp.js.BumpAttempt() - } + eventext.MergeEventFields(event, fields) - logp.L().Debugf("attempt info: %v == %v && %d < %d", ssp.js.Status, lastStatus, ssp.js.Attempt, ssp.js.MaxAttempts) + logp.L().Debugf("attempt info: current(%v) == lastStatus(%v) && attempts(%d < %d)", ssp.js.Status, lastStatus, ssp.js.Attempt, ssp.js.MaxAttempts) if retry { return RetryBeforeSummary @@ -180,3 +182,8 @@ func (ssp *commonSSP) BeforeSummary(event *beat.Event) BeforeSummaryActions { return 0 } + +func (ssp *commonSSP) BeforeRetry() { + // mutate the js into the state for the next attempt + ssp.js.BumpAttempt() +} diff --git a/heartbeat/monitors/wrappers/summarizer/summarizer_test.go b/heartbeat/monitors/wrappers/summarizer/summarizer_test.go index 64472eb1c9a..63de2da71a8 100644 --- a/heartbeat/monitors/wrappers/summarizer/summarizer_test.go +++ b/heartbeat/monitors/wrappers/summarizer/summarizer_test.go @@ -62,7 +62,7 @@ func TestSummarizer(t *testing.T) { 2, "du", "du", - "12", + "11", 2, testURL, }, @@ -80,7 +80,7 @@ func TestSummarizer(t *testing.T) { 2, "dddddddd", "dddddddd", - "12121212", + "11111111", 8, testURL, }, @@ -89,7 +89,7 @@ func TestSummarizer(t *testing.T) { 2, "udddduuu", "uuddduuu", - "11212111", + "11211111", 8, testURL, }, diff --git a/heartbeat/monitors/wrappers/wrappers_test.go b/heartbeat/monitors/wrappers/wrappers_test.go index ffdb161e62f..26a54f9fc36 100644 --- a/heartbeat/monitors/wrappers/wrappers_test.go +++ b/heartbeat/monitors/wrappers/wrappers_test.go @@ -140,11 +140,12 @@ func TestSimpleJob(t *testing.T) { require.NoError(t, err) expectedMonitor := logger.MonitorRunInfo{ - MonitorID: testMonFields.ID, - Type: testMonFields.Type, - Duration: durationUs.(int64), - Status: "up", - Attempt: 1, + MonitorID: testMonFields.ID, + Type: testMonFields.Type, + Duration: durationUs.(int64), + Status: "up", + Attempt: 1, + NetworkInfo: logger.NetworkInfo{}, } require.ElementsMatch(t, []zap.Field{ logp.Any("event", map[string]string{"action": logger.ActionMonitorRun}), @@ -351,6 +352,10 @@ func TestMultiJobConts(t *testing.T) { }) } +// TestRetryMultiCont is of somewhat dubious utility at the moment, +// it mostly tests that we __don't__ retry on an initial down. +// retry logic is better and more completely tested in the summarizer +// and scenario tests. func TestRetryMultiCont(t *testing.T) { uniqScope := isdef.ScopedIsUnique() @@ -466,12 +471,6 @@ func TestRetryMultiCont(t *testing.T) { summarizertesthelper.SummaryValidator(expected.js.Up, expected.js.Down), hbtestllext.MaybeHasDuration, ), - contJobValidator("http://foo.com", "1st"), - lookslike.Compose( - contJobValidator("http://foo.com", "2nd"), - summarizertesthelper.SummaryValidator(expected.js.Up, expected.js.Down), - hbtestllext.MaybeHasDuration, - ), }, nil, nil, diff --git a/libbeat/_meta/config/default.reference.yml.tmpl b/libbeat/_meta/config/default.reference.yml.tmpl index 073340343d8..0b22112ed37 100644 --- a/libbeat/_meta/config/default.reference.yml.tmpl +++ b/libbeat/_meta/config/default.reference.yml.tmpl @@ -14,6 +14,7 @@ {{template "setup.dashboards.reference.yml.tmpl" .}} {{template "setup.template.reference.yml.tmpl" .}} {{template "setup.ilm.reference.yml.tmpl" .}} +{{template "setup.dsl.reference.yml.tmpl" .}} {{template "setup.kibana.reference.yml.tmpl" .}} {{template "logging.reference.yml.tmpl" .}} {{template "monitoring.reference.yml.tmpl" .}} diff --git a/libbeat/_meta/config/output-elasticsearch.reference.yml.tmpl b/libbeat/_meta/config/output-elasticsearch.reference.yml.tmpl index edc40e632d7..48f1ba2c007 100644 --- a/libbeat/_meta/config/output-elasticsearch.reference.yml.tmpl +++ b/libbeat/_meta/config/output-elasticsearch.reference.yml.tmpl @@ -9,8 +9,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false diff --git a/libbeat/_meta/config/setup.dsl.reference.yml.tmpl b/libbeat/_meta/config/setup.dsl.reference.yml.tmpl new file mode 100644 index 00000000000..9b718645ff3 --- /dev/null +++ b/libbeat/_meta/config/setup.dsl.reference.yml.tmpl @@ -0,0 +1,26 @@ +{{header "Data Stream Lifecycle (DSL)"}} + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is {{.BeatName}}-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "{{.BeatName}}-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false diff --git a/libbeat/cmd/export/ilm_policy.go b/libbeat/cmd/export/ilm_policy.go index b2a8b845514..60c97920fd7 100644 --- a/libbeat/cmd/export/ilm_policy.go +++ b/libbeat/cmd/export/ilm_policy.go @@ -22,7 +22,7 @@ import ( "github.com/elastic/beats/v7/libbeat/cmd/instance" "github.com/elastic/beats/v7/libbeat/idxmgmt" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" ) // GenGetILMPolicyCmd is the command used to export the ilm policy. @@ -35,14 +35,20 @@ func GenGetILMPolicyCmd(settings instance.Settings) *cobra.Command { dir, _ := cmd.Flags().GetString("dir") if settings.ILM == nil { - settings.ILM = ilm.StdSupport + settings.ILM = lifecycle.StdSupport } b, err := instance.NewInitializedBeat(settings) if err != nil { fatalfInitCmd(err) } - clientHandler := idxmgmt.NewFileClientHandler(newIdxmgmtClient(dir, version)) + // the way this works, we decide to export ILM or DSL based on the user's config. + // This means that if a user has no index management config, we'll default to ILM, regardless of what the user + // is connected to. Might not be a problem since a user who doesn't have any custom lifecycle config has nothing to export? + clientHandler, err := idxmgmt.NewFileClientHandler(newIdxmgmtClient(dir, version), b.Info, b.Config.LifecycleConfig) + if err != nil { + fatalf("error creating file handler: %s", err) + } idxManager := b.IdxSupporter.Manager(clientHandler, idxmgmt.BeatsAssets(b.Fields)) if err := idxManager.Setup(idxmgmt.LoadModeDisabled, idxmgmt.LoadModeForce); err != nil { fatalf("Error exporting ilm-policy: %+v.", err) diff --git a/libbeat/cmd/export/template.go b/libbeat/cmd/export/template.go index 23d572fad2a..ffd957961ef 100644 --- a/libbeat/cmd/export/template.go +++ b/libbeat/cmd/export/template.go @@ -22,7 +22,7 @@ import ( "github.com/elastic/beats/v7/libbeat/cmd/instance" "github.com/elastic/beats/v7/libbeat/idxmgmt" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" ) // GenTemplateConfigCmd is the command used to export the elasticsearch template. @@ -36,10 +36,10 @@ func GenTemplateConfigCmd(settings instance.Settings) *cobra.Command { noILM, _ := cmd.Flags().GetBool("noilm") if noILM { - settings.ILM = ilm.NoopSupport + settings.ILM = lifecycle.NoopSupport } if settings.ILM == nil { - settings.ILM = ilm.StdSupport + settings.ILM = lifecycle.StdSupport } b, err := instance.NewInitializedBeat(settings) @@ -47,7 +47,10 @@ func GenTemplateConfigCmd(settings instance.Settings) *cobra.Command { fatalfInitCmd(err) } - clientHandler := idxmgmt.NewFileClientHandler(newIdxmgmtClient(dir, version)) + clientHandler, err := idxmgmt.NewFileClientHandler(newIdxmgmtClient(dir, version), b.Info, b.Config.LifecycleConfig) + if err != nil { + fatalf("error creating file handler: %s", err) + } idxManager := b.IdxSupporter.Manager(clientHandler, idxmgmt.BeatsAssets(b.Fields)) if err := idxManager.Setup(idxmgmt.LoadModeForce, idxmgmt.LoadModeDisabled); err != nil { fatalf("Error exporting template: %+v.", err) diff --git a/libbeat/cmd/instance/beat.go b/libbeat/cmd/instance/beat.go index 8bd493e1777..4e72996c966 100644 --- a/libbeat/cmd/instance/beat.go +++ b/libbeat/cmd/instance/beat.go @@ -54,6 +54,7 @@ import ( "github.com/elastic/beats/v7/libbeat/esleg/eslegclient" "github.com/elastic/beats/v7/libbeat/features" "github.com/elastic/beats/v7/libbeat/idxmgmt" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/instrumentation" "github.com/elastic/beats/v7/libbeat/kibana" "github.com/elastic/beats/v7/libbeat/management" @@ -133,6 +134,9 @@ type beatConfig struct { // monitoring settings MonitoringBeatConfig monitoring.BeatConfig `config:",inline"` + // ILM settings + LifecycleConfig lifecycle.RawConfig `config:",inline"` + // central management settings Management *config.C `config:"management"` @@ -671,7 +675,13 @@ func (b *Beat) Setup(settings Settings, bt beat.Creator, setup SetupSettings) er if setup.IndexManagement || setup.ILMPolicy { loadILM = idxmgmt.LoadModeEnabled } - m := b.IdxSupporter.Manager(idxmgmt.NewESClientHandler(esClient), idxmgmt.BeatsAssets(b.Fields)) + + mgmtHandler, err := idxmgmt.NewESClientHandler(esClient, b.Info, b.Config.LifecycleConfig) + if err != nil { + return fmt.Errorf("error creating index management handler: %w", err) + } + + m := b.IdxSupporter.Manager(mgmtHandler, idxmgmt.BeatsAssets(b.Fields)) if ok, warn := m.VerifySetup(loadTemplate, loadILM); !ok { fmt.Println(warn) } @@ -1065,7 +1075,11 @@ func (b *Beat) registerESIndexManagement() error { func (b *Beat) indexSetupCallback() elasticsearch.ConnectCallback { return func(esClient *eslegclient.Connection) error { - m := b.IdxSupporter.Manager(idxmgmt.NewESClientHandler(esClient), idxmgmt.BeatsAssets(b.Fields)) + mgmtHandler, err := idxmgmt.NewESClientHandler(esClient, b.Info, b.Config.LifecycleConfig) + if err != nil { + return fmt.Errorf("error creating index management handler: %w", err) + } + m := b.IdxSupporter.Manager(mgmtHandler, idxmgmt.BeatsAssets(b.Fields)) return m.Setup(idxmgmt.LoadModeEnabled, idxmgmt.LoadModeEnabled) } } diff --git a/libbeat/cmd/instance/settings.go b/libbeat/cmd/instance/settings.go index b46f248917c..5cf6b4eca19 100644 --- a/libbeat/cmd/instance/settings.go +++ b/libbeat/cmd/instance/settings.go @@ -22,7 +22,7 @@ import ( "github.com/elastic/beats/v7/libbeat/cfgfile" "github.com/elastic/beats/v7/libbeat/idxmgmt" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/monitoring/report" "github.com/elastic/beats/v7/libbeat/publisher/processing" ) @@ -42,7 +42,7 @@ type Settings struct { // load custom index manager. The config object will be the Beats root configuration. IndexManagement idxmgmt.SupportFactory - ILM ilm.SupportFactory + ILM lifecycle.SupportFactory Processing processing.SupportFactory diff --git a/libbeat/common/fmtstr/formatevents.go b/libbeat/common/fmtstr/formatevents.go index 68477073da2..52ae7b65057 100644 --- a/libbeat/common/fmtstr/formatevents.go +++ b/libbeat/common/fmtstr/formatevents.go @@ -84,7 +84,6 @@ type eventEvalContext struct { } var ( - errMissingKeys = errors.New("missing keys") errConvertString = errors.New("can not convert to string") ) @@ -157,12 +156,12 @@ func CompileEvent(in string) (*EventFormatString, error) { func (fs *EventFormatString) Unpack(v interface{}) error { s, err := tryConvString(v) if err != nil { - return err + return fmt.Errorf("error converting type %T to event formatter: %w", v, err) } tmp, err := CompileEvent(s) if err != nil { - return err + return fmt.Errorf("error compiling event formatter: %w", err) } // init fs from tmp @@ -170,6 +169,11 @@ func (fs *EventFormatString) Unpack(v interface{}) error { return nil } +// IsInitialized returns true if the underlying event formatter is prepared to format an event +func (fs *EventFormatString) IsInitialized() bool { + return fs.formatter != nil +} + // NumFields returns number of unique event fields used by the format string. func (fs *EventFormatString) NumFields() int { return len(fs.fields) @@ -190,6 +194,9 @@ func (fs *EventFormatString) Fields() []string { // Run executes the format string returning a new expanded string or an error // if execution or event field expansion fails. func (fs *EventFormatString) Run(event *beat.Event) (string, error) { + if !fs.IsInitialized() { + return "", fmt.Errorf("event formatter is nil") + } ctx := newEventCtx(len(fs.fields)) defer releaseCtx(ctx) @@ -296,7 +303,7 @@ func (e *eventFieldCompiler) compileEventField( ops []VariableOp, ) (FormatEvaler, error) { if len(ops) > 1 { - return nil, errors.New("Too many format modifiers given") + return nil, errors.New("too many format modifiers given") } defaultValue := "" @@ -340,12 +347,12 @@ func (e *eventFieldCompiler) compileTimestamp( ops []VariableOp, ) (FormatEvaler, error) { if expression[0] != '+' { - return nil, errors.New("No timestamp expression") + return nil, errors.New("no timestamp expression") } formatter, err := dtfmt.NewFormatter(expression[1:]) if err != nil { - return nil, fmt.Errorf("%v in timestamp expression", err) + return nil, fmt.Errorf("%w in timestamp expression", err) } e.timestamp = true @@ -353,10 +360,6 @@ func (e *eventFieldCompiler) compileTimestamp( } func (e *eventFieldEvaler) Eval(c interface{}, out *bytes.Buffer) error { - type stringer interface { - String() string - } - ctx := c.(*eventEvalContext) s := ctx.keys[e.index] _, err := out.WriteString(s) @@ -364,10 +367,6 @@ func (e *eventFieldEvaler) Eval(c interface{}, out *bytes.Buffer) error { } func (e *defaultEventFieldEvaler) Eval(c interface{}, out *bytes.Buffer) error { - type stringer interface { - String() string - } - ctx := c.(*eventEvalContext) s := ctx.keys[e.index] if s == "" { @@ -385,7 +384,7 @@ func (e *eventTimestampEvaler) Eval(c interface{}, out *bytes.Buffer) error { func parseEventPath(field string) (string, error) { field = strings.Trim(field, " \n\r\t") - var fields []string + fields := []string{} for len(field) > 0 { if field[0] != '[' { diff --git a/libbeat/dashboards/kibana_loader.go b/libbeat/dashboards/kibana_loader.go index 5e67c7576bd..55d195c4f8e 100644 --- a/libbeat/dashboards/kibana_loader.go +++ b/libbeat/dashboards/kibana_loader.go @@ -61,7 +61,7 @@ type KibanaLoader struct { // NewKibanaLoader creates a new loader to load Kibana files func NewKibanaLoader(ctx context.Context, cfg *config.C, dashboardsConfig *Config, hostname string, msgOutputter MessageOutputter, beatname string) (*KibanaLoader, error) { if cfg == nil || !cfg.Enabled() { - return nil, fmt.Errorf("Kibana is not configured or enabled") + return nil, fmt.Errorf("kibana is not configured or enabled") } client, err := getKibanaClient(ctx, cfg, dashboardsConfig.Retry, 0, beatname) @@ -127,7 +127,7 @@ func (loader KibanaLoader) ImportIndexFile(file string) error { // ImportIndex imports the passed index pattern to Kibana func (loader KibanaLoader) ImportIndex(pattern mapstr.M) error { if loader.version.LessThan(minimumRequiredVersionSavedObjects) { - return fmt.Errorf("Kibana version must be at least " + minimumRequiredVersionSavedObjects.String()) + return fmt.Errorf("kibana version must be at least " + minimumRequiredVersionSavedObjects.String()) } var errs multierror.Errors diff --git a/libbeat/docs/processors-list.asciidoc b/libbeat/docs/processors-list.asciidoc index 50315c748c3..b95f163cefc 100644 --- a/libbeat/docs/processors-list.asciidoc +++ b/libbeat/docs/processors-list.asciidoc @@ -186,6 +186,9 @@ endif::[] ifndef::no_append_processor[] include::{libbeat-processors-dir}/actions/docs/append.asciidoc[] endif::[] +ifndef::no_cache_processor[] +include::{libbeat-processors-dir}/cache/docs/cache.asciidoc[] +endif::[] ifndef::no_community_id_processor[] include::{libbeat-processors-dir}/communityid/docs/communityid.asciidoc[] endif::[] diff --git a/libbeat/docs/release.asciidoc b/libbeat/docs/release.asciidoc index 0163c1f1c14..63169edc010 100644 --- a/libbeat/docs/release.asciidoc +++ b/libbeat/docs/release.asciidoc @@ -8,6 +8,7 @@ This section summarizes the changes in each release. Also read <> for more detail about changes that affect upgrade. +* <> * <> * <> * <> diff --git a/libbeat/esleg/eslegclient/connection.go b/libbeat/esleg/eslegclient/connection.go index 9736af191fd..322d0f08dbf 100644 --- a/libbeat/esleg/eslegclient/connection.go +++ b/libbeat/esleg/eslegclient/connection.go @@ -423,6 +423,7 @@ func (conn *Connection) getVersion() error { } if versionData.Version.BuildFlavor == "serverless" { + conn.log.Info("build flavor of es is severless, marking connection as serverless") conn.isServerless = true } else if versionData.Version.BuildFlavor == "default" { conn.isServerless = false diff --git a/libbeat/generator/fields/module_fields_collector.go b/libbeat/generator/fields/module_fields_collector.go index 5c55dea5829..85f917cacf6 100644 --- a/libbeat/generator/fields/module_fields_collector.go +++ b/libbeat/generator/fields/module_fields_collector.go @@ -19,6 +19,7 @@ package fields import ( "io/ioutil" + "os" "path/filepath" ) @@ -30,9 +31,9 @@ var indentByModule = map[string]int{ "protos": 8, } -// GetModules returns a the list of modules for the given modules directory +// GetModules returns a list of modules for the given modules directory func GetModules(modulesDir string) ([]string, error) { - moduleInfos, err := ioutil.ReadDir(modulesDir) + moduleInfos, err := os.ReadDir(modulesDir) if err != nil { return nil, err } diff --git a/libbeat/idxmgmt/client_handler.go b/libbeat/idxmgmt/client_handler.go index 9347cdb27cd..ae92f75a36c 100644 --- a/libbeat/idxmgmt/client_handler.go +++ b/libbeat/idxmgmt/client_handler.go @@ -18,19 +18,22 @@ package idxmgmt import ( - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "fmt" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/template" "github.com/elastic/elastic-agent-libs/version" ) // ClientHandler defines the interface between a remote service and the Manager for ILM and templates. type ClientHandler interface { - ilm.ClientHandler + lifecycle.ClientHandler template.Loader } type clientHandler struct { - ilm.ClientHandler + lifecycle.ClientHandler template.Loader } @@ -50,18 +53,30 @@ type FileClient interface { } // NewClientHandler initializes and returns a new instance of ClientHandler -func NewClientHandler(ilm ilm.ClientHandler, template template.Loader) ClientHandler { +func NewClientHandler(ilm lifecycle.ClientHandler, template template.Loader) ClientHandler { return &clientHandler{ilm, template} } // NewESClientHandler returns a new ESLoader instance, // initialized with an ilm and template client handler based on the passed in client. -func NewESClientHandler(c ESClient) ClientHandler { - return NewClientHandler(ilm.NewESClientHandler(c), template.NewESLoader(c)) +func NewESClientHandler(client ESClient, info beat.Info, cfg lifecycle.RawConfig) (ClientHandler, error) { + esHandler, err := lifecycle.NewESClientHandler(client, info, cfg) + if err != nil { + return nil, fmt.Errorf("error creating ES handler: %w", err) + } + loader, err := template.NewESLoader(client, esHandler) + if err != nil { + return nil, fmt.Errorf("error creating ES loader: %w", err) + } + return NewClientHandler(esHandler, loader), nil } // NewFileClientHandler returns a new ESLoader instance, // initialized with an ilm and template client handler based on the passed in client. -func NewFileClientHandler(c FileClient) ClientHandler { - return NewClientHandler(ilm.NewFileClientHandler(c), template.NewFileLoader(c)) +func NewFileClientHandler(client FileClient, info beat.Info, cfg lifecycle.RawConfig) (ClientHandler, error) { + mgmt, err := lifecycle.NewFileClientHandler(client, info, cfg) + if err != nil { + return nil, fmt.Errorf("error creating client handler: %w", err) + } + return NewClientHandler(mgmt, template.NewFileLoader(client, mgmt.Mode() == lifecycle.DSL)), nil } diff --git a/libbeat/idxmgmt/idxmgmt.go b/libbeat/idxmgmt/idxmgmt.go index 42972a7bc88..4cd3fbe93e3 100644 --- a/libbeat/idxmgmt/idxmgmt.go +++ b/libbeat/idxmgmt/idxmgmt.go @@ -22,7 +22,7 @@ import ( "fmt" "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/outputs" "github.com/elastic/beats/v7/libbeat/template" "github.com/elastic/elastic-agent-libs/config" @@ -99,37 +99,47 @@ func DefaultSupport(log *logp.Logger, info beat.Info, configRoot *config.C) (Sup // MakeDefaultSupport creates some default index management support, with a // custom ILM support implementation. -func MakeDefaultSupport(ilmSupport ilm.SupportFactory) SupportFactory { +func MakeDefaultSupport(ilmSupport lifecycle.SupportFactory) SupportFactory { if ilmSupport == nil { - ilmSupport = ilm.DefaultSupport + ilmSupport = lifecycle.DefaultSupport } return func(log *logp.Logger, info beat.Info, configRoot *config.C) (Supporter, error) { const logName = "index-management" + if log == nil { + log = logp.NewLogger(logName) + } else { + log = log.Named(logName) + } + // now that we have the "correct" default, unpack the rest of the config cfg := struct { - ILM *config.C `config:"setup.ilm"` - Template *config.C `config:"setup.template"` - Output config.Namespace `config:"output"` - Migration *config.C `config:"migration.6_to_7"` + Lifecycle lifecycle.RawConfig `config:",inline"` + Template *config.C `config:"setup.template"` + Output config.Namespace `config:"output"` + Migration *config.C `config:"migration.6_to_7"` }{} if configRoot != nil { if err := configRoot.Unpack(&cfg); err != nil { - return nil, err + return nil, fmt.Errorf("error unpacking cfg settings while setting up index support: %w", err) } } - if log == nil { - log = logp.NewLogger(logName) - } else { - log = log.Named(logName) + // consider lifecycles enabled if the user has explicitly enabled them, + // or if no `enabled` setting has been set by the user, thus reverting to a default of enabled. + enabled := false + if cfg.Lifecycle.DSL.Enabled() || cfg.Lifecycle.ILM.Enabled() { + enabled = true + } + if (cfg.Lifecycle.DSL == nil || !cfg.Lifecycle.DSL.HasField("enabled")) && (cfg.Lifecycle.ILM == nil || !cfg.Lifecycle.ILM.HasField("enabled")) { + enabled = true } if err := checkTemplateESSettings(cfg.Template, cfg.Output); err != nil { return nil, err } - return newIndexSupport(log, info, ilmSupport, cfg.Template, cfg.ILM, cfg.Migration.Enabled()) + return newIndexSupport(log, info, ilmSupport, cfg.Template, enabled, cfg.Migration.Enabled()) } } @@ -156,7 +166,7 @@ func checkTemplateESSettings(tmpl *config.C, out config.Namespace) error { var tmplCfg template.TemplateConfig if tmpl != nil { if err := tmpl.Unpack(&tmplCfg); err != nil { - return fmt.Errorf("unpacking template config fails: %v", err) + return fmt.Errorf("unpacking template config fails: %w", err) } } diff --git a/libbeat/idxmgmt/ilm/client_handler.go b/libbeat/idxmgmt/ilm/client_handler.go deleted file mode 100644 index 1f7d6f278e3..00000000000 --- a/libbeat/idxmgmt/ilm/client_handler.go +++ /dev/null @@ -1,146 +0,0 @@ -// Licensed to Elasticsearch B.V. under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. Elasticsearch B.V. licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package ilm - -import ( - "fmt" - "path" - - "github.com/elastic/elastic-agent-libs/version" -) - -// ClientHandler defines the interface between a remote service and the Manager. -type ClientHandler interface { - CheckILMEnabled(bool) (bool, error) - HasILMPolicy(name string) (bool, error) - CreateILMPolicy(policy Policy) error -} - -// ESClientHandler implements the Loader interface for talking to ES. -type ESClientHandler struct { - client ESClient -} - -type VersionCheckerClient interface { - GetVersion() version.V -} - -// ESClient defines the minimal interface required for the Loader to -// prepare a policy. -type ESClient interface { - VersionCheckerClient - IsServerless() bool - Request( - method, path string, - pipeline string, - params map[string]string, - body interface{}, - ) (int, []byte, error) -} - -// FileClientHandler implements the Loader interface for writing to a file. -type FileClientHandler struct { - client FileClient -} - -// FileClient defines the minimal interface required for the Loader to -// prepare a policy. -type FileClient interface { - GetVersion() version.V - Write(component string, name string, body string) error -} - -const ( - esILMPath = "/_ilm/policy" -) - -var ( - esMinDefaultILMVersion = version.MustNew("7.0.0") -) - -// NewESClientHandler initializes and returns an ESClientHandler, -func NewESClientHandler(c ESClient) *ESClientHandler { - return &ESClientHandler{client: c} -} - -// NewFileClientHandler initializes and returns a new FileClientHandler instance. -func NewFileClientHandler(c FileClient) *FileClientHandler { - return &FileClientHandler{client: c} -} - -// CheckILMEnabled indicates whether or not ILM is supported for the configured mode and ES instance. -func (h *ESClientHandler) CheckILMEnabled(enabled bool) (bool, error) { - return checkILMEnabled(enabled, h.client) -} - -// CreateILMPolicy loads the given policy to Elasticsearch. -func (h *ESClientHandler) CreateILMPolicy(policy Policy) error { - path := path.Join(esILMPath, policy.Name) - _, _, err := h.client.Request("PUT", path, "", nil, policy.Body) - return err -} - -// HasILMPolicy queries Elasticsearch to see if policy with given name exists. -func (h *ESClientHandler) HasILMPolicy(name string) (bool, error) { - // XXX: HEAD method does currently not work for checking if a policy exists - path := path.Join(esILMPath, name) - status, b, err := h.client.Request("GET", path, "", nil, nil) - if err != nil && status != 404 { - return false, wrapErrf(err, ErrRequestFailed, - "failed to check for policy name '%v': (status=%v) %s", name, status, b) - } - return status == 200, nil -} - -// CheckILMEnabled indicates whether or not ILM is supported for the configured mode and client version. -// If the connected ES instance is serverless, this will return false -func (h *FileClientHandler) CheckILMEnabled(enabled bool) (bool, error) { - return checkILMEnabled(enabled, h.client) -} - -func checkILMEnabled(enabled bool, c VersionCheckerClient) (bool, error) { - if !enabled { - return false, nil - } - - if esClient, ok := c.(ESClient); ok { - if esClient.IsServerless() { - return false, nil - } - } - - ver := c.GetVersion() - if ver.LessThan(esMinDefaultILMVersion) { - return false, errf(ErrESVersionNotSupported, "Elasticsearch %v does not support ILM", ver.String()) - } - return true, nil -} - -// CreateILMPolicy writes given policy to the configured file. -func (h *FileClientHandler) CreateILMPolicy(policy Policy) error { - str := fmt.Sprintf("%s\n", policy.Body.StringToPrint()) - if err := h.client.Write("policy", policy.Name, str); err != nil { - return fmt.Errorf("error printing policy : %w", err) - } - return nil -} - -// HasILMPolicy always returns false. -func (h *FileClientHandler) HasILMPolicy(name string) (bool, error) { - return false, nil -} diff --git a/libbeat/idxmgmt/ilm/config.go b/libbeat/idxmgmt/ilm/config.go deleted file mode 100644 index c076c0565e9..00000000000 --- a/libbeat/idxmgmt/ilm/config.go +++ /dev/null @@ -1,74 +0,0 @@ -// Licensed to Elasticsearch B.V. under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. Elasticsearch B.V. licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package ilm - -import ( - "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/beats/v7/libbeat/common/fmtstr" - "github.com/elastic/elastic-agent-libs/mapstr" -) - -// Config is used for unpacking a config.C. -type Config struct { - Enabled bool `config:"enabled"` - PolicyName fmtstr.EventFormatString `config:"policy_name"` - PolicyFile string `config:"policy_file"` - - // CheckExists can disable the check for an existing policy. Check required - // read_ilm privileges. If check is disabled the policy will only be - // installed if Overwrite is enabled. - CheckExists bool `config:"check_exists"` - - // Enable always overwrite policy mode. This required manage_ilm privileges. - Overwrite bool `config:"overwrite"` -} - -// DefaultPolicy defines the default policy to be used if no custom policy is -// configured. -// By default the policy contains not warm, cold, or delete phase. -// The index is configured to rollover every 50GB or after 30d. -var DefaultPolicy = mapstr.M{ - "policy": mapstr.M{ - "phases": mapstr.M{ - "hot": mapstr.M{ - "actions": mapstr.M{ - "rollover": mapstr.M{ - "max_primary_shard_size": "50gb", - "max_age": "30d", - }, - }, - }, - }, - }, -} - -// Validate verifies that expected config options are given and valid -func (cfg *Config) Validate() error { - return nil -} - -func defaultConfig(info beat.Info) Config { - policyFmt := fmtstr.MustCompileEvent(info.Beat) - - return Config{ - Enabled: true, - PolicyName: *policyFmt, - PolicyFile: "", - CheckExists: true, - } -} diff --git a/libbeat/idxmgmt/ilm/error.go b/libbeat/idxmgmt/ilm/error.go deleted file mode 100644 index b2e9830afd7..00000000000 --- a/libbeat/idxmgmt/ilm/error.go +++ /dev/null @@ -1,92 +0,0 @@ -// Licensed to Elasticsearch B.V. under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. Elasticsearch B.V. licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package ilm - -import ( - "errors" - "fmt" -) - -// Error indicates an error + reason describing the last error. -// The Reason() method returns a sentinal error value for comparison. -type Error struct { - reason error - cause error - message string -} - -var ( - ErrESVersionNotSupported = errors.New("ILM is not supported by the Elasticsearch version in use") - ErrILMCheckRequestFailed = errors.New("request checking for ILM availability failed") - ErrInvalidResponse = errors.New("invalid response received") - ErrESILMDisabled = errors.New("ILM is disabled in Elasticsearch") - ErrRequestFailed = errors.New("request failed") - ErrOpNotAvailable = errors.New("operation not available") -) - -func errOf(reason error) error { - return &Error{reason: reason} -} - -func errf(reason error, msg string, vs ...interface{}) error { - return wrapErrf(nil, reason, msg, vs...) -} - -func wrapErr(cause, reason error) error { - return wrapErrf(cause, reason, "") -} - -func wrapErrf(cause, reason error, msg string, vs ...interface{}) error { - return &Error{ - cause: cause, - reason: reason, - message: fmt.Sprintf(msg, vs...), - } -} - -// ErrReason calls Reason() if the error implements this method. Otherwise return nil. -func ErrReason(err error) error { - if err == nil { - return nil - } - - ifc, ok := err.(interface{ Reason() error }) - if !ok { - return nil - } - return ifc.Reason() -} - -// Cause returns the errors cause, if present. -func (e *Error) Cause() error { return e.cause } - -// Reason returns a sentinal error value define within the ilm package. -func (e *Error) Reason() error { return e.reason } - -// Error returns the formatted error string. -func (e *Error) Error() string { - msg := e.message - if e.message == "" { - msg = e.reason.Error() - } - - if e.cause != nil { - return fmt.Sprintf("%v: %+v", msg, e.cause) - } - return msg -} diff --git a/libbeat/idxmgmt/ilm/ilm_test.go b/libbeat/idxmgmt/ilm/ilm_test.go deleted file mode 100644 index bb689cab943..00000000000 --- a/libbeat/idxmgmt/ilm/ilm_test.go +++ /dev/null @@ -1,233 +0,0 @@ -// Licensed to Elasticsearch B.V. under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. Elasticsearch B.V. licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package ilm - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/elastic-agent-libs/config" - "github.com/elastic/elastic-agent-libs/mapstr" -) - -func TestDefaultSupport_Init(t *testing.T) { - info := beat.Info{Beat: "test", Version: "9.9.9"} - - t.Run("with custom config", func(t *testing.T) { - tmp, err := DefaultSupport(nil, info, config.MustNewConfigFrom( - map[string]interface{}{ - "enabled": true, - "name": "test-%{[agent.version]}", - "check_exists": false, - "overwrite": true, - }, - )) - require.NoError(t, err) - - s := tmp.(*stdSupport) - assert := assert.New(t) - assert.Equal(true, s.overwrite) - assert.Equal(false, s.checkExists) - assert.Equal(true, s.Enabled()) - assert.Equal(DefaultPolicy, mapstr.M(s.Policy().Body)) - }) - - t.Run("with custom alias config with fieldref", func(t *testing.T) { - tmp, err := DefaultSupport(nil, info, config.MustNewConfigFrom( - map[string]interface{}{ - "enabled": true, - "check_exists": false, - "overwrite": true, - }, - )) - require.NoError(t, err) - - s := tmp.(*stdSupport) - assert := assert.New(t) - assert.Equal(true, s.overwrite) - assert.Equal(false, s.checkExists) - assert.Equal(true, s.Enabled()) - assert.Equal(DefaultPolicy, mapstr.M(s.Policy().Body)) - }) - - t.Run("with default alias", func(t *testing.T) { - tmp, err := DefaultSupport(nil, info, config.MustNewConfigFrom( - map[string]interface{}{ - "enabled": true, - "pattern": "01", - "check_exists": false, - "overwrite": true, - }, - )) - require.NoError(t, err) - - s := tmp.(*stdSupport) - assert := assert.New(t) - assert.Equal(true, s.overwrite) - assert.Equal(false, s.checkExists) - assert.Equal(true, s.Enabled()) - assert.Equal(DefaultPolicy, mapstr.M(s.Policy().Body)) - }) - - t.Run("load external policy", func(t *testing.T) { - s, err := DefaultSupport(nil, info, config.MustNewConfigFrom( - mapstr.M{"policy_file": "testfiles/custom.json"}, - )) - require.NoError(t, err) - assert.Equal(t, mapstr.M{"hello": "world"}, s.Policy().Body) - }) -} - -func TestDefaultSupport_Manager_Enabled(t *testing.T) { - cases := map[string]struct { - calls []onCall - cfg map[string]interface{} - enabled bool - fail error - err bool - }{ - "disabled via config": { - cfg: map[string]interface{}{"enabled": false}, - }, - "disabled via handler": { - calls: []onCall{ - onCheckILMEnabled(true).Return(false, ErrESILMDisabled), - }, - err: true, - }, - "enabled via handler": { - calls: []onCall{ - onCheckILMEnabled(true).Return(true, nil), - }, - enabled: true, - }, - "handler confirms enabled flag": { - calls: []onCall{ - onCheckILMEnabled(true).Return(true, nil), - }, - cfg: map[string]interface{}{"enabled": true}, - enabled: true, - }, - "io error": { - calls: []onCall{ - onCheckILMEnabled(true).Return(false, errors.New("ups")), - }, - cfg: map[string]interface{}{}, - err: true, - }, - } - - for name, test := range cases { - t.Run(name, func(t *testing.T) { - cfg := test.cfg - if cfg == nil { - cfg = map[string]interface{}{} - } - - h := newMockHandler(test.calls...) - m := createManager(t, h, test.cfg) - enabled, err := m.CheckEnabled() - - if test.fail == nil && !test.err { - require.NoError(t, err) - } - if test.err || test.fail != nil { - require.Error(t, err) - } - if test.fail != nil { - assert.Equal(t, test.fail, ErrReason(err)) - } - - assert.Equal(t, test.enabled, enabled) - h.AssertExpectations(t) - }) - } -} - -func TestDefaultSupport_Manager_EnsurePolicy(t *testing.T) { - testPolicy := Policy{ - Name: "test", - Body: DefaultPolicy, - } - - cases := map[string]struct { - calls []onCall - overwrite bool - cfg map[string]interface{} - create bool - fail error - }{ - "create new policy": { - create: true, - calls: []onCall{ - onHasILMPolicy(testPolicy.Name).Return(false, nil), - onCreateILMPolicy(testPolicy).Return(nil), - }, - }, - "policy already exists": { - create: false, - calls: []onCall{ - onHasILMPolicy(testPolicy.Name).Return(true, nil), - }, - }, - "overwrite": { - overwrite: true, - create: true, - calls: []onCall{ - onCreateILMPolicy(testPolicy).Return(nil), - }, - }, - "fail": { - calls: []onCall{ - onHasILMPolicy(testPolicy.Name).Return(false, nil), - onCreateILMPolicy(testPolicy).Return(errOf(ErrRequestFailed)), - }, - fail: ErrRequestFailed, - }, - } - - for name, test := range cases { - test := test - t.Run(name, func(t *testing.T) { - h := newMockHandler(test.calls...) - m := createManager(t, h, test.cfg) - created, err := m.EnsurePolicy(test.overwrite) - - if test.fail == nil { - assert.Equal(t, test.create, created) - require.NoError(t, err) - } else { - require.Error(t, err) - assert.Equal(t, test.fail, ErrReason(err)) - } - - h.AssertExpectations(t) - }) - } -} - -func createManager(t *testing.T, h ClientHandler, cfg map[string]interface{}) Manager { - info := beat.Info{Beat: "test", Version: "9.9.9"} - s, err := DefaultSupport(nil, info, config.MustNewConfigFrom(cfg)) - require.NoError(t, err) - return s.Manager(h) -} diff --git a/libbeat/idxmgmt/std.go b/libbeat/idxmgmt/index_support.go similarity index 78% rename from libbeat/idxmgmt/std.go rename to libbeat/idxmgmt/index_support.go index f8169dcdf89..94fd3b07db0 100644 --- a/libbeat/idxmgmt/std.go +++ b/libbeat/idxmgmt/index_support.go @@ -25,7 +25,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/beat/events" "github.com/elastic/beats/v7/libbeat/common/atomic" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/outputs" "github.com/elastic/beats/v7/libbeat/outputs/outil" "github.com/elastic/beats/v7/libbeat/template" @@ -35,7 +35,7 @@ import ( type indexSupport struct { log *logp.Logger - ilm ilm.Supporter + ilm lifecycle.Supporter info beat.Info migration bool templateCfg template.TemplateConfig @@ -50,7 +50,7 @@ type indexState struct { type indexManager struct { support *indexSupport - ilm ilm.Manager + ilm lifecycle.Manager clientHandler ClientHandler assets Asseter @@ -95,23 +95,23 @@ func newFeature(c componentType, enabled, overwrite bool, mode LoadMode) feature func newIndexSupport( log *logp.Logger, info beat.Info, - ilmFactory ilm.SupportFactory, + ilmFactory lifecycle.SupportFactory, tmplConfig *config.C, - ilmConfig *config.C, + lifecyclesEnabled bool, migration bool, ) (*indexSupport, error) { if ilmFactory == nil { - ilmFactory = ilm.DefaultSupport + ilmFactory = lifecycle.DefaultSupport } - ilmSupporter, err := ilmFactory(log, info, ilmConfig) + ilmSupporter, err := ilmFactory(log, info, lifecyclesEnabled) if err != nil { - return nil, err + return nil, fmt.Errorf("error creating lifecycle supporter: %w", err) } tmplCfg, err := unpackTemplateConfig(info, tmplConfig) if err != nil { - return nil, err + return nil, fmt.Errorf("error unpacking template config: %w", err) } return &indexSupport{ @@ -207,14 +207,14 @@ func (s *indexSupport) BuildSelector(cfg *config.C) (outputs.IndexSelector, erro } // VerifySetup verifies the given feature setup, will return an error string if it detects something suspect -func (m *indexManager) VerifySetup(loadTemplate, loadILM LoadMode) (bool, string) { - ilmComponent := newFeature(componentILM, m.support.enabled(componentILM), m.support.ilm.Overwrite(), loadILM) +func (m *indexManager) VerifySetup(loadTemplate, loadLifecycle LoadMode) (bool, string) { + ilmComponent := newFeature(componentILM, m.support.enabled(componentILM), m.clientHandler.Overwrite(), loadLifecycle) templateComponent := newFeature(componentTemplate, m.support.enabled(componentTemplate), m.support.templateCfg.Overwrite, loadTemplate) if ilmComponent.load && !templateComponent.load { - return false, "Loading ILM policy without loading template is not recommended. Check your configuration." + return false, "Loading lifecycle policy without loading template is not recommended. Check your configuration." } if templateComponent.load && !ilmComponent.load && ilmComponent.enabled { @@ -225,13 +225,15 @@ func (m *indexManager) VerifySetup(loadTemplate, loadILM LoadMode) (bool, string var warn string if !ilmComponent.load { - warn += "ILM policy loading not enabled.\n" + warn += "lifecycle policy loading not enabled.\n" } else if !ilmComponent.overwrite { - warn += "Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.\n" + warn += "Overwriting lifecycle policy is disabled. Set `setup.ilm.overwrite: true` or `setup.dsl.overwrite: true` to overwrite.\n" } if !templateComponent.load { warn += "Template loading not enabled.\n" } + // remove last newline so we don't get weird formatting when this is printed to the console + warn = strings.TrimSuffix(warn, "\n") return warn == "", warn } @@ -244,15 +246,23 @@ func (m *indexManager) Setup(loadTemplate, loadILM LoadMode) error { return err } if withILM { - log.Info("Auto ILM enable success.") + log.Info("Auto lifecycle enable success.") } // create feature objects for ILM and template setup - ilmComponent := newFeature(componentILM, withILM, m.support.ilm.Overwrite(), loadILM) + ilmComponent := newFeature(componentILM, withILM, m.clientHandler.Overwrite(), loadILM) templateComponent := newFeature(componentTemplate, m.support.enabled(componentTemplate), m.support.templateCfg.Overwrite, loadTemplate) - if ilmComponent.load { + if m.clientHandler.Mode() == lifecycle.DSL { + log.Info("setting up DSL") + } + + // on DSL, the template load will create the lifecycle policy + // this is because the DSL API directly references the datastream, + // so the datastream must be created first under DSL + // If we're writing to a file, it doesn't matter + if ilmComponent.load && (m.clientHandler.Mode() == lifecycle.ILM || !m.clientHandler.IsElasticsearch()) { // install ilm policy policyCreated, err := m.ilm.EnsurePolicy(ilmComponent.overwrite) if err != nil { @@ -270,7 +280,7 @@ func (m *indexManager) Setup(loadTemplate, loadILM LoadMode) error { tmplCfg.Overwrite, tmplCfg.Enabled = templateComponent.overwrite, templateComponent.enabled if ilmComponent.enabled { - tmplCfg, err = applyILMSettingsToTemplate(log, tmplCfg, m.support.ilm.Policy()) + tmplCfg, err = applyLifecycleSettingsToTemplate(log, tmplCfg, m.clientHandler) if err != nil { return fmt.Errorf("error applying ILM settings: %w", err) } @@ -342,17 +352,17 @@ func unpackTemplateConfig(info beat.Info, cfg *config.C) (config template.Templa } // applies the specified ILM policy to the provided template, returns a struct of the template config -func applyILMSettingsToTemplate( +func applyLifecycleSettingsToTemplate( log *logp.Logger, tmpl template.TemplateConfig, - policy ilm.Policy, + policymgr lifecycle.ClientHandler, ) (template.TemplateConfig, error) { if !tmpl.Enabled { return tmpl, nil } - if policy.Name == "" { - return tmpl, errors.New("no ilm policy name configured") + if policymgr.PolicyName() == "" { + return tmpl, errors.New("no policy name configured") } // init/copy index settings @@ -368,23 +378,28 @@ func applyILMSettingsToTemplate( } tmpl.Settings.Index = idxSettings - // init/copy index.lifecycle settings - var lifecycle map[string]interface{} - if ifcLifecycle := idxSettings["lifecycle"]; ifcLifecycle == nil { - lifecycle = map[string]interface{}{} - } else if tmp, ok := ifcLifecycle.(map[string]interface{}); ok { - lifecycle = make(map[string]interface{}, len(tmp)) - for k, v := range tmp { - lifecycle[k] = v + if policymgr.Mode() == lifecycle.ILM { + // init/copy index.lifecycle settings + var lifecycle map[string]interface{} + if ifcLifecycle := idxSettings["lifecycle"]; ifcLifecycle == nil { + lifecycle = map[string]interface{}{} + } else if tmp, ok := ifcLifecycle.(map[string]interface{}); ok { + lifecycle = make(map[string]interface{}, len(tmp)) + for k, v := range tmp { + lifecycle[k] = v + } + } else { + return tmpl, errors.New("settings.index.lifecycle must be an object") } - } else { - return tmpl, errors.New("settings.index.lifecycle must be an object") - } - idxSettings["lifecycle"] = lifecycle + idxSettings["lifecycle"] = lifecycle - if _, exists := lifecycle["name"]; !exists { - log.Infof("Set settings.index.lifecycle.name in template to %s as ILM is enabled.", policy) - lifecycle["name"] = policy.Name + if _, exists := lifecycle["name"]; !exists { + log.Infof("Set settings.index.lifecycle.name in template to %s as ILM is enabled.", policymgr.PolicyName()) + lifecycle["name"] = policymgr.PolicyName() + } + } else { + // when we're in DSL mode, this is what actually creates the policy + tmpl.Settings.Lifecycle = policymgr.Policy().Body } return tmpl, nil diff --git a/libbeat/idxmgmt/lifecycle/client_handler.go b/libbeat/idxmgmt/lifecycle/client_handler.go new file mode 100644 index 00000000000..12d860cef8b --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/client_handler.go @@ -0,0 +1,114 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "encoding/json" + "errors" + "fmt" + "os" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/mapstr" + "github.com/elastic/elastic-agent-libs/version" +) + +// ClientHandler defines the interface between a remote service and the index Manager. +type ClientHandler interface { + CheckEnabled() (bool, error) + HasPolicy() (bool, error) + CreatePolicyFromConfig() error + PolicyName() string + Overwrite() bool + CheckExists() bool + Policy() Policy + Mode() Mode + IsElasticsearch() bool +} + +type VersionCheckerClient interface { + GetVersion() version.V +} + +// ESClient defines the minimal interface required for the Loader to +// prepare a policy. +type ESClient interface { + VersionCheckerClient + IsServerless() bool + Request( + method, path string, + pipeline string, + params map[string]string, + body interface{}, + ) (int, []byte, error) +} + +// FileClient defines the minimal interface required for the Loader to +// prepare a policy. +type FileClient interface { + GetVersion() version.V + Write(component string, name string, body string) error +} + +const ( + esILMPath = "/_ilm/policy" +) + +var ( + esMinDefaultILMVersion = version.MustNew("7.0.0") +) + +/// ============ generic helpers + +func checkILMEnabled(enabled bool, c VersionCheckerClient) (bool, error) { + if !enabled { + return false, nil + } + + ver := c.GetVersion() + if ver.LessThan(esMinDefaultILMVersion) { + return false, fmt.Errorf("%w: Elasticsearch %v does not support ILM", ErrESVersionNotSupported, ver.String()) + } + return true, nil +} + +func createPolicy(cfg Config, info beat.Info, defaultPolicy mapstr.M) (Policy, error) { + name, err := ApplyStaticFmtstr(info, cfg.PolicyName) + if err != nil { + return Policy{}, errors.New("failed to read ilm policy name") + } + + policy := Policy{ + Name: name, + Body: defaultPolicy, + } + if path := cfg.PolicyFile; path != "" { + contents, err := os.ReadFile(path) + if err != nil { + return Policy{}, fmt.Errorf("failed to read policy file '%s': %w", path, err) + } + + var body map[string]interface{} + if err := json.Unmarshal(contents, &body); err != nil { + return Policy{}, fmt.Errorf("failed to decode policy file '%s': %w", path, err) + } + + policy.Body = body + } + return policy, nil +} diff --git a/libbeat/idxmgmt/ilm/client_handler_integration_test.go b/libbeat/idxmgmt/lifecycle/client_handler_integration_test.go similarity index 62% rename from libbeat/idxmgmt/ilm/client_handler_integration_test.go rename to libbeat/idxmgmt/lifecycle/client_handler_integration_test.go index 3701b715692..2df919d55d5 100644 --- a/libbeat/idxmgmt/ilm/client_handler_integration_test.go +++ b/libbeat/idxmgmt/lifecycle/client_handler_integration_test.go @@ -17,10 +17,9 @@ //go:build integration -package ilm_test +package lifecycle import ( - "encoding/json" "fmt" "os" "testing" @@ -30,9 +29,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/esleg/eslegclient" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" "github.com/elastic/beats/v7/libbeat/version" + "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/transport/httpcommon" libversion "github.com/elastic/elastic-agent-libs/version" @@ -40,76 +40,94 @@ import ( const ( // ElasticsearchDefaultHost is the default host for elasticsearch. - ElasticsearchDefaultHost = "localhost" + ElasticsearchDefaultHost = "http://localhost" // ElasticsearchDefaultPort is the default port for elasticsearch. ElasticsearchDefaultPort = "9200" ) func TestESClientHandler_CheckILMEnabled(t *testing.T) { t.Run("no ilm if disabled", func(t *testing.T) { - h := newESClientHandler(t) - b, err := h.CheckILMEnabled(false) + cfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": false, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + h, err := newESClientHandler(t, cfg) + require.NoError(t, err) + b, err := h.CheckEnabled() assert.NoError(t, err) assert.False(t, b) }) t.Run("with ilm if enabled", func(t *testing.T) { - h := newESClientHandler(t) - b, err := h.CheckILMEnabled(true) + cfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + h, err := newESClientHandler(t, cfg) + require.NoError(t, err) + b, err := h.CheckEnabled() assert.NoError(t, err) assert.True(t, b) }) } func TestESClientHandler_ILMPolicy(t *testing.T) { - t.Run("does not exist", func(t *testing.T) { - name := makeName("esch-policy-no") - h := newESClientHandler(t) - b, err := h.HasILMPolicy(name) - assert.NoError(t, err) - assert.False(t, b) - }) t.Run("create new", func(t *testing.T) { - policy := ilm.Policy{ + policy := Policy{ Name: makeName("esch-policy-create"), - Body: ilm.DefaultPolicy, + Body: DefaultILMPolicy, } - h := newESClientHandler(t) - err := h.CreateILMPolicy(policy) + cfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + rawClient := newRawESClient(t) + h, err := NewESClientHandler(rawClient, beat.Info{Beat: "testbeat"}, cfg) + require.NoError(t, err) + h.cfg.policyRaw = &policy + + err = h.CreatePolicyFromConfig() require.NoError(t, err) - b, err := h.HasILMPolicy(policy.Name) + b, err := h.HasPolicy() assert.NoError(t, err) assert.True(t, b) }) t.Run("overwrite", func(t *testing.T) { - policy := ilm.Policy{ + policy := Policy{ Name: makeName("esch-policy-overwrite"), - Body: ilm.DefaultPolicy, + Body: DefaultILMPolicy, + } + cfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), } - h := newESClientHandler(t) + rawClient := newRawESClient(t) + h, err := NewESClientHandler(rawClient, beat.Info{Beat: "testbeat"}, cfg) + require.NoError(t, err) + h.cfg.policyRaw = &policy - err := h.CreateILMPolicy(policy) + err = h.CreatePolicyFromConfig() require.NoError(t, err) // check second 'create' does not throw (assuming race with other beat) - err = h.CreateILMPolicy(policy) + err = h.CreatePolicyFromConfig() require.NoError(t, err) - b, err := h.HasILMPolicy(policy.Name) + b, err := h.HasPolicy() assert.NoError(t, err) assert.True(t, b) }) } -func newESClientHandler(t *testing.T) ilm.ClientHandler { +func newESClientHandler(t *testing.T, cfg RawConfig) (ClientHandler, error) { client := newRawESClient(t) - return ilm.NewESClientHandler(client) + return NewESClientHandler(client, beat.Info{Beat: "testbeat"}, cfg) } -func newRawESClient(t *testing.T) ilm.ESClient { +func newRawESClient(t *testing.T) ESClient { transport := httpcommon.DefaultHTTPTransportSettings() transport.Timeout = 60 * time.Second client, err := eslegclient.NewConnection(eslegclient.ConnectionSettings{ @@ -166,29 +184,32 @@ func getEnv(name, def string) string { } func TestFileClientHandler_CheckILMEnabled(t *testing.T) { + defaultCfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } for name, test := range map[string]struct { - enabled bool version string ilmEnabled bool err bool + cfg RawConfig }{ "ilm enabled": { - enabled: true, + cfg: defaultCfg, + ilmEnabled: true, }, - "ilm disabled": { - enabled: false, - ilmEnabled: false, - }, + "ilm enabled, version too old": { - enabled: true, version: "5.0.0", err: true, + cfg: defaultCfg, }, } { t.Run(name, func(t *testing.T) { - h := ilm.NewFileClientHandler(newMockClient(test.version)) - b, err := h.CheckILMEnabled(test.enabled) + h, err := NewFileClientHandler(newMockClient(test.version), beat.Info{Beat: "test"}, test.cfg) + require.NoError(t, err) + b, err := h.CheckEnabled() assert.Equal(t, test.ilmEnabled, b) if test.err { assert.Error(t, err) @@ -199,20 +220,6 @@ func TestFileClientHandler_CheckILMEnabled(t *testing.T) { } } -func TestFileClientHandler_CreateILMPolicy(t *testing.T) { - c := newMockClient("") - h := ilm.NewFileClientHandler(c) - name := "test-policy" - body := mapstr.M{"foo": "bar"} - h.CreateILMPolicy(ilm.Policy{Name: name, Body: body}) - - assert.Equal(t, name, c.name) - assert.Equal(t, "policy", c.component) - var out mapstr.M - json.Unmarshal([]byte(c.body), &out) - assert.Equal(t, body, out) -} - type mockClient struct { v libversion.V component, name, body string diff --git a/libbeat/idxmgmt/lifecycle/config.go b/libbeat/idxmgmt/lifecycle/config.go new file mode 100644 index 00000000000..b25d5ecff6d --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/config.go @@ -0,0 +1,132 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common/fmtstr" + "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +// Config is used for unpacking a config.C. +type Config struct { + Enabled bool `config:"enabled"` + // PolicyName, used by ILM + PolicyName fmtstr.EventFormatString `config:"policy_name"` + PolicyFile string `config:"policy_file"` + // used only for testing + policyRaw *Policy + + // CheckExists can disable the check for an existing policy. Check required + // read_ilm privileges. If check is disabled the policy will only be + // installed if Overwrite is enabled. + CheckExists bool `config:"check_exists"` + + // Enable always overwrite policy mode. This required manage_ilm privileges. + Overwrite bool `config:"overwrite"` +} + +// DSLNameConfig just stores the datastream name for the DSL policy +// as this is the only config value that differs between ILM and DSL +type DSLNameConfig struct { + DataStreamPattern fmtstr.EventFormatString `config:"data_stream_pattern"` +} + +func DefaultDSLName() DSLNameConfig { + return DSLNameConfig{ + DataStreamPattern: *fmtstr.MustCompileEvent("%{[beat.name]}-%{[beat.version]}"), + } +} + +// LifecycleConfig maps all possible ILM/DSL config values present in a config +type LifecycleConfig struct { + ILM Config `config:"setup.ilm"` + DSL Config `config:"setup.dsl"` +} + +// RawConfig half-unpacks the policy config, allowing us to tell if a user has explicitly +// enabled a given config value +type RawConfig struct { + ILM *config.C `config:"setup.ilm"` + DSL *config.C `config:"setup.dsl"` + TemplateName string `config:"setup.template.name"` +} + +// DefaultILMPolicy defines the default policy to be used if no custom policy is +// configured. +// By default the policy contains not warm, cold, or delete phase. +// The index is configured to rollover every 50GB or after 30d. +var DefaultILMPolicy = mapstr.M{ + "policy": mapstr.M{ + "phases": mapstr.M{ + "hot": mapstr.M{ + "actions": mapstr.M{ + "rollover": mapstr.M{ + "max_primary_shard_size": "50gb", + "max_age": "30d", + }, + }, + }, + }, + }, +} + +// DefaultDSLPolicy defines the default policy to be used for DSL if +// no custom policy is configured +var DefaultDSLPolicy = mapstr.M{ + "data_retention": "7d", +} + +// Validate verifies that expected config options are given and valid +func (cfg *Config) Validate() error { + return nil +} + +func DefaultILMConfig(info beat.Info) LifecycleConfig { + return LifecycleConfig{ + ILM: Config{ + Enabled: true, + PolicyName: *fmtstr.MustCompileEvent(info.Beat), + PolicyFile: "", + CheckExists: true, + }, + DSL: Config{ + Enabled: false, + PolicyName: *fmtstr.MustCompileEvent("%{[beat.name]}-%{[beat.version]}"), + CheckExists: true, + }, + } +} + +func DefaultDSLConfig(info beat.Info) LifecycleConfig { + return LifecycleConfig{ + ILM: Config{ + Enabled: false, + PolicyName: *fmtstr.MustCompileEvent(info.Beat), + PolicyFile: "", + CheckExists: true, + }, + DSL: Config{ + Enabled: true, + PolicyName: *fmtstr.MustCompileEvent("%{[beat.name]}-%{[beat.version]}"), + PolicyFile: "", + CheckExists: true, + }, + } +} diff --git a/libbeat/idxmgmt/lifecycle/error.go b/libbeat/idxmgmt/lifecycle/error.go new file mode 100644 index 00000000000..6568b909bbb --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/error.go @@ -0,0 +1,31 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "errors" +) + +var ( + ErrESVersionNotSupported = errors.New("ILM is not supported by the Elasticsearch version in use") + ErrILMCheckRequestFailed = errors.New("request checking for ILM availability failed") + ErrInvalidResponse = errors.New("invalid response received") + ErrESILMDisabled = errors.New("ILM is disabled in Elasticsearch") + ErrRequestFailed = errors.New("request failed") + ErrOpNotAvailable = errors.New("operation not available, no lifecycle manager is enabled") +) diff --git a/libbeat/idxmgmt/lifecycle/es_client_handler.go b/libbeat/idxmgmt/lifecycle/es_client_handler.go new file mode 100644 index 00000000000..c9077547a5b --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/es_client_handler.go @@ -0,0 +1,214 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "errors" + "fmt" + "net/http" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +// ESClientHandler implements the Loader interface for talking to ES. +type ESClientHandler struct { + client ESClient + info beat.Info + cfg Config + defaultPolicy mapstr.M + putPath string + name string + policy Policy + mode Mode +} + +// NewESClientHandler initializes and returns an ESClientHandler +func NewESClientHandler(c ESClient, info beat.Info, cfg RawConfig) (*ESClientHandler, error) { + if !cfg.DSL.Enabled() && cfg.ILM.Enabled() && c.IsServerless() { + return nil, fmt.Errorf("ILM is enabled/configured but %s is connected to a serverless instance; ILM isn't supported on Serverless Elasticsearch. Configure DSL or set setup.ilm.enabled to false", info.Beat) + } + + if !cfg.ILM.Enabled() && cfg.DSL.Enabled() && !c.IsServerless() { + return nil, fmt.Errorf("DSL is enabled/configured but %s is connected to a stateful instance; DSL is only supported on Serverless Elasticsearch. Configure ILM or set setup.dsl.enabled to false", info.Beat) + } + + if cfg.ILM.Enabled() && cfg.DSL.Enabled() { + return nil, fmt.Errorf("only one lifecycle management type can be used, but both ILM and DSL are enabled") + } + + // set default based on ES connection, then unpack user config, if set + lifecycleCfg := Config{} + var err error + if c.IsServerless() { + lifecycleCfg = DefaultDSLConfig(info).DSL + if cfg.DSL != nil { + err = cfg.DSL.Unpack(&lifecycleCfg) + } + + // unpack name value separately + dsName := DefaultDSLName() + err := cfg.DSL.Unpack(&dsName) + if err != nil { + return nil, fmt.Errorf("error unpacking DSL data stream name: %w", err) + } + lifecycleCfg.PolicyName = dsName.DataStreamPattern + + } else { + lifecycleCfg = DefaultILMConfig(info).ILM + if cfg.ILM != nil { + err = cfg.ILM.Unpack(&lifecycleCfg) + } + } + if err != nil { + return nil, fmt.Errorf("error unpacking lifecycle config: %w", err) + } + + // create name and policy + name, err := ApplyStaticFmtstr(info, lifecycleCfg.PolicyName) + if err != nil { + return nil, fmt.Errorf("error applying format string to policy name: %w", err) + } + if name == "" && lifecycleCfg.Enabled { + return nil, errors.New("could not generate usable policy name from config. Check setup.*.policy_name fields") + } + // deal with conflicts between policy name and template name + // under serverless, it doesn't make sense to have a policy name that differs from the template name + // if the user has set both to different values, throw a warning, as overwrite operations will probably fail + if c.IsServerless() { + if cfg.TemplateName != "" && cfg.TemplateName != name { + logp.L().Warnf("policy name is %s but template name is %s; under serverless, non-default template and policy names should be the same. Updates & overwrites may not work.") + } + } + + // set defaults + defaultPolicy := DefaultILMPolicy + mode := ILM + path := fmt.Sprintf("%s/%s", esILMPath, name) + + if c.IsServerless() { + defaultPolicy = DefaultDSLPolicy + mode = DSL + path = fmt.Sprintf("/_data_stream/%s/_lifecycle", name) + } + + var policy Policy + if lifecycleCfg.Enabled { // these are-enabled checks should happen elsewhere, but check again here just in case + policy, err = createPolicy(lifecycleCfg, info, defaultPolicy) + if err != nil { + return nil, fmt.Errorf("error creating a lifecycle policy: %w", err) + } + } + + return &ESClientHandler{client: c, + info: info, cfg: lifecycleCfg, + defaultPolicy: defaultPolicy, name: name, putPath: path, policy: policy, mode: mode}, nil +} + +// CheckExists returns the value of the check_exists config flag +func (h *ESClientHandler) CheckExists() bool { + return h.cfg.CheckExists +} + +// Overwrite returns the value of the overwrite config flag +func (h *ESClientHandler) Overwrite() bool { + return h.cfg.Overwrite +} + +// CheckEnabled indicates whether or not ILM is supported for the configured mode and ES instance. +func (h *ESClientHandler) CheckEnabled() (bool, error) { + return checkILMEnabled(h.cfg.Enabled, h.client) +} + +func (h *ESClientHandler) IsElasticsearch() bool { + return true +} + +// HasPolicy queries Elasticsearch to see if policy with given name exists. +func (h *ESClientHandler) HasPolicy() (bool, error) { + status, b, err := h.client.Request("GET", h.putPath, "", nil, nil) + if err != nil && status != http.StatusNotFound { + return false, fmt.Errorf("%w: failed to check for policy name '%v': (status=%v) (err=%w) %s", + ErrRequestFailed, h.name, status, err, b) + } + return status == http.StatusOK, nil +} + +// CreatePolicyFromConfig creates a DSL policy from a raw setup config for the beat +func (h *ESClientHandler) CreatePolicyFromConfig() error { + // check overwrite before we do this + // normally other upstream components do this check, + // but might as well do it here + if !h.cfg.Overwrite { + found, err := h.HasPolicy() + if err != nil { + return fmt.Errorf("error looking for existing policy: %w", err) + } + // maintain old behavior, don't return an error + if found { + return nil + } + } + // only applicable to testing + if h.cfg.policyRaw != nil { + return h.putPolicyToES(h.putPath, *h.cfg.policyRaw) + } + + err := h.createAndPutPolicy(h.cfg, h.info) + if err != nil { + return fmt.Errorf("error creating policy from config: %w", err) + } + return nil +} + +// PolicyName returns the policy name +func (h *ESClientHandler) PolicyName() string { + return h.name +} + +// Policy returns the full policy +func (h *ESClientHandler) Policy() Policy { + return h.policy +} + +// Mode returns the connected instance mode +func (h *ESClientHandler) Mode() Mode { + return h.mode +} + +// creates a policy from config, then performs the PUT request to ES +func (h *ESClientHandler) createAndPutPolicy(cfg Config, info beat.Info) error { + err := h.putPolicyToES(h.putPath, h.policy) + if err != nil { + return fmt.Errorf("error submitting policy: %w", err) + } + return nil +} + +// performs the PUT operation to create a policy +func (h *ESClientHandler) putPolicyToES(path string, policy Policy) error { + retCode, resp, err := h.client.Request("PUT", path, "", nil, policy.Body) + if retCode >= http.StatusMultipleChoices { + return fmt.Errorf("error creating lifecycle policy: got %d from elasticsearch: %s", retCode, resp) + } + if err != nil { + return fmt.Errorf("error in lifecycle PUT request: %w", err) + } + return nil +} diff --git a/libbeat/idxmgmt/lifecycle/es_client_test.go b/libbeat/idxmgmt/lifecycle/es_client_test.go new file mode 100644 index 00000000000..aa6c55f274f --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/es_client_test.go @@ -0,0 +1,201 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/mapstr" + "github.com/elastic/elastic-agent-libs/version" +) + +type mockESClient struct { + serverless bool + hasPolicy bool + foundPolicy interface{} +} + +func (client *mockESClient) GetVersion() version.V { + return *version.MustNew("8.10.1") +} + +func (client *mockESClient) IsServerless() bool { + return client.serverless +} + +func (client *mockESClient) Request(method, path string, pipeline string, params map[string]string, body interface{}) (int, []byte, error) { + if method == "PUT" { + client.foundPolicy = body + } + + if method == "GET" { + if client.hasPolicy || client.foundPolicy != nil { + return http.StatusOK, []byte{}, nil + } else { + return http.StatusNotFound, []byte{}, nil + } + } + + return http.StatusCreated, []byte{}, nil +} + +func TestESSetup(t *testing.T) { + info := beat.Info{Beat: "test", Version: "9.9.9"} + + defaultILMCfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + + defaultDSLCfg := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": false, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": true, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + + bothDisabledConfig := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": false, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": false, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + + bothEnabledConfig := RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, "policy_name": "test", "check_exists": true}), + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": true, "data_stream_pattern": "%{[beat.name]}-%{[beat.version]}", "check_exists": true}), + } + + cases := map[string]struct { + serverless bool + serverHasPolicy bool + cfg RawConfig + err bool + expectedPUTPath string + expectedName string + expectedPolicy interface{} + existingPolicy interface{} + }{ + "serverless-with-correct-defaults": { + serverless: true, + cfg: defaultDSLCfg, + err: false, + expectedPUTPath: "/_data_stream/test-9.9.9/_lifecycle", + expectedName: "test-9.9.9", + expectedPolicy: DefaultDSLPolicy, + }, + "stateful-with-correct-default": { + serverless: false, + cfg: defaultILMCfg, + err: false, + expectedPUTPath: "/_ilm/policy/test", + expectedName: "test", + expectedPolicy: DefaultILMPolicy, + }, + "serverless-with-wrong-defaults": { + serverless: true, + cfg: defaultILMCfg, + err: true, + }, + "stateful-with-wrong-defaults": { + serverless: false, + cfg: defaultDSLCfg, + err: true, + }, + "serverless-with-both-enabled": { + serverless: true, + cfg: bothEnabledConfig, + err: true, + }, + "stateful-with-both-enabled": { + serverless: false, + cfg: bothEnabledConfig, + err: true, + }, + "custom-policy-name": { + serverless: false, + cfg: RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": false, "policy_name": "test-%{[beat.version]}", "check_exists": true}), + }, + err: false, + expectedName: "test-9.9.9", + }, + "custom-policy-file": { + serverless: false, + cfg: RawConfig{ + ILM: config.MustNewConfigFrom(mapstr.M{"enabled": true, + "policy_name": "test", + "policy_file": "./testfiles/custom.json", + "check_exists": true}), + }, + expectedPolicy: mapstr.M{"hello": "world"}, + err: false, + }, + "do-not-overwrite": { + serverless: true, + cfg: defaultDSLCfg, + err: false, + existingPolicy: mapstr.M{"existing": "policy"}, + expectedPolicy: mapstr.M{"existing": "policy"}, + }, + "do-overwrite": { + serverless: true, + cfg: RawConfig{ + DSL: config.MustNewConfigFrom(mapstr.M{"enabled": true, "overwrite": true, + "check_exists": true, "data_stream_pattern": "test"}), + }, + err: false, + existingPolicy: mapstr.M{"existing": "policy"}, + expectedPolicy: DefaultDSLPolicy, + }, + "all-disabled-no-fail": { + serverless: false, + cfg: bothDisabledConfig, + err: false, + }, + "all-disabled-no-fail-serverless": { + serverless: true, + cfg: bothDisabledConfig, + err: false, + }, + } + + for name, test := range cases { + t.Run(name, func(t *testing.T) { + client := &mockESClient{serverless: test.serverless, foundPolicy: test.existingPolicy} + gotClient, err := NewESClientHandler(client, info, test.cfg) + if test.err { + require.Error(t, err, "expected an error") + } else { + require.NoError(t, err, "no error expected") + } + if test.expectedPUTPath != "" { + require.Equal(t, test.expectedPUTPath, gotClient.putPath, "URLs are not the same") + } + if test.expectedName != "" { + require.Equal(t, test.expectedName, gotClient.name, "policy names are not equal") + } + if test.expectedPolicy != nil { + err := gotClient.CreatePolicyFromConfig() + require.NoError(t, err) + require.Equal(t, test.expectedPolicy, client.foundPolicy, "found policies are not equal") + } + }) + } +} diff --git a/libbeat/idxmgmt/lifecycle/file_client_handler.go b/libbeat/idxmgmt/lifecycle/file_client_handler.go new file mode 100644 index 00000000000..53e4030944c --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/file_client_handler.go @@ -0,0 +1,158 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "fmt" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +// FileClientHandler implements the Loader interface for writing to a file. +type FileClientHandler struct { + client FileClient + info beat.Info + cfg Config + defaultPolicy mapstr.M + name string + mode Mode + policy Policy +} + +// NewFileClientHandler initializes and returns a new FileClientHandler instance. +func NewFileClientHandler(c FileClient, info beat.Info, cfg RawConfig) (*FileClientHandler, error) { + // half-unpack to distinguish between a config section that's been explicitly enabled, + // that way we can set a proper default + + if cfg.DSL.Enabled() && cfg.ILM.Enabled() { + return nil, fmt.Errorf("only one lifecycle management type can be used, but both ILM and DSL are enabled") + } + + // default to ILM if no configs are set + lifecycleCfg := DefaultILMConfig(info).ILM + var err error + if cfg.DSL.Enabled() { + lifecycleCfg = DefaultDSLConfig(info).DSL + err = cfg.DSL.Unpack(&lifecycleCfg) + + // unpack name value separately + dsName := DefaultDSLName() + err := cfg.DSL.Unpack(&dsName) + if err != nil { + return nil, fmt.Errorf("error unpacking DSL data stream name: %w", err) + } + lifecycleCfg.PolicyName = dsName.DataStreamPattern + } else if cfg.ILM.Enabled() { + lifecycleCfg = DefaultILMConfig(info).ILM + err = cfg.ILM.Unpack(&lifecycleCfg) + } else { + logp.L().Infof("No lifecycle config has been explicitly enabled, defauling to ILM") + } + + if err != nil { + return nil, fmt.Errorf("error unpacking config: %w", err) + } + + name, err := ApplyStaticFmtstr(info, lifecycleCfg.PolicyName) + if err != nil { + return nil, fmt.Errorf("error creating policy name: %w", err) + } + + // set defaults + defaultPolicy := DefaultILMPolicy + mode := ILM + + if cfg.DSL.Enabled() { + defaultPolicy = DefaultDSLPolicy + mode = DSL + } + + policy, err := createPolicy(lifecycleCfg, info, defaultPolicy) + if err != nil { + return nil, fmt.Errorf("error creating policy: %w", err) + } + + return &FileClientHandler{client: c, info: info, cfg: lifecycleCfg, + defaultPolicy: defaultPolicy, name: name, policy: policy, mode: mode}, nil + +} + +// CheckExists returns the state of the check_exists config flag +func (h *FileClientHandler) CheckExists() bool { + return h.cfg.CheckExists +} + +// Overwrite returns the state of the overwrite config flag +func (h *FileClientHandler) Overwrite() bool { + return h.cfg.Enabled +} + +// CheckEnabled indicates whether or not lifecycle management is supported for the configured mode and client version. +func (h *FileClientHandler) CheckEnabled() (bool, error) { + return checkILMEnabled(h.cfg.Enabled, h.client) +} + +// CreatePolicy writes given policy to the configured file. +func (h *FileClientHandler) CreatePolicy(policy Policy) error { + str := fmt.Sprintf("%s\n", policy.Body.StringToPrint()) + if err := h.client.Write("policy", policy.Name, str); err != nil { + return fmt.Errorf("error printing policy : %w", err) + } + return nil +} + +// Policy returns the complete policy +func (h *FileClientHandler) Policy() Policy { + return h.policy +} + +// Mode returns the configured instance mode +func (h *FileClientHandler) Mode() Mode { + return h.mode +} + +// IsElasticsearch returns false +func (h *FileClientHandler) IsElasticsearch() bool { + return false +} + +// CreatePolicyFromConfig creates a lifecycle policy from its config and posts it to elasticsearch +func (h *FileClientHandler) CreatePolicyFromConfig() error { + // only applicable to testing + if h.cfg.policyRaw != nil { + return h.CreatePolicy(*h.cfg.policyRaw) + } + + err := h.CreatePolicy(h.policy) + if err != nil { + return fmt.Errorf("error writing policy: %w", err) + } + return nil +} + +// PolicyName returns the generated policy name. +func (h *FileClientHandler) PolicyName() string { + return h.name +} + +// HasPolicy always returns false. +func (h *FileClientHandler) HasPolicy() (bool, error) { + return false, nil +} diff --git a/libbeat/idxmgmt/ilm/ilm.go b/libbeat/idxmgmt/lifecycle/ilm.go similarity index 62% rename from libbeat/idxmgmt/ilm/ilm.go rename to libbeat/idxmgmt/lifecycle/ilm.go index bd67c186f21..a231db2a6f3 100644 --- a/libbeat/idxmgmt/ilm/ilm.go +++ b/libbeat/idxmgmt/lifecycle/ilm.go @@ -15,38 +15,37 @@ // specific language governing permissions and limitations // under the License. -package ilm +package lifecycle import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" "time" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common/fmtstr" - "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) // SupportFactory is used to define a policy type to be used. -type SupportFactory func(*logp.Logger, beat.Info, *config.C) (Supporter, error) +type SupportFactory func(*logp.Logger, beat.Info, bool) (Supporter, error) // Supporter implements ILM support. For loading the policies // a manager instance must be generated. type Supporter interface { // Query settings Enabled() bool - Policy() Policy - Overwrite() bool - // Manager creates a new Manager instance for checking and installing // resources. Manager(h ClientHandler) Manager } +type Mode int + +const ( + ILM Mode = iota + DSL +) + // Manager uses a ClientHandler to install a policy. type Manager interface { CheckEnabled() (bool, error) @@ -66,69 +65,33 @@ type Policy struct { } // DefaultSupport configures a new default ILM support implementation. -func DefaultSupport(log *logp.Logger, info beat.Info, c *config.C) (Supporter, error) { - cfg := defaultConfig(info) - if c != nil { - if err := c.Unpack(&cfg); err != nil { - return nil, err - } +func DefaultSupport(log *logp.Logger, info beat.Info, lifecycleEnabled bool) (Supporter, error) { + if !lifecycleEnabled { + return NewNoopSupport(info, lifecycleEnabled) } - if !cfg.Enabled { - return NewNoopSupport(info, c) - } - - return StdSupport(log, info, c) + return StdSupport(log, info, lifecycleEnabled) } // StdSupport configures a new std ILM support implementation. -func StdSupport(log *logp.Logger, info beat.Info, c *config.C) (Supporter, error) { +func StdSupport(log *logp.Logger, info beat.Info, lifecycleEnabled bool) (Supporter, error) { if log == nil { log = logp.NewLogger("ilm") } else { log = log.Named("ilm") } - cfg := defaultConfig(info) - if c != nil { - if err := c.Unpack(&cfg); err != nil { - return nil, err - } - } - - name, err := applyStaticFmtstr(info, &cfg.PolicyName) - if err != nil { - return nil, errors.New("failed to read ilm policy name") - } - - policy := Policy{ - Name: name, - Body: DefaultPolicy, - } - if path := cfg.PolicyFile; path != "" { - contents, err := ioutil.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("failed to read policy file '%v': %w", path, err) - } - - var body map[string]interface{} - if err := json.Unmarshal(contents, &body); err != nil { - return nil, fmt.Errorf("failed to decode policy file '%v': %w", path, err) - } - - policy.Body = body - } - - return NewStdSupport(log, cfg.Enabled, policy, cfg.Overwrite, cfg.CheckExists), nil + return NewStdSupport(log, lifecycleEnabled), nil } // NoopSupport configures a new noop ILM support implementation, // should be used when ILM is disabled -func NoopSupport(_ *logp.Logger, info beat.Info, c *config.C) (Supporter, error) { +func NoopSupport(_ *logp.Logger, info beat.Info, c bool) (Supporter, error) { return NewNoopSupport(info, c) } -func applyStaticFmtstr(info beat.Info, fmt *fmtstr.EventFormatString) (string, error) { +// ApplyStaticFmtstr applies the beat info to the given format string +func ApplyStaticFmtstr(info beat.Info, fmt fmtstr.EventFormatString) (string, error) { return fmt.Run( &beat.Event{ Fields: fmtstr.FieldsForBeat(info.Beat, info.Version), diff --git a/libbeat/idxmgmt/lifecycle/ilm_test.go b/libbeat/idxmgmt/lifecycle/ilm_test.go new file mode 100644 index 00000000000..24df5ae7bbe --- /dev/null +++ b/libbeat/idxmgmt/lifecycle/ilm_test.go @@ -0,0 +1,220 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package lifecycle + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/beat" +) + +func TestDefaultSupport_Init(t *testing.T) { + info := beat.Info{Beat: "test", Version: "9.9.9"} + + t.Run("with custom config", func(t *testing.T) { + tmp, err := DefaultSupport(nil, info, true) + require.NoError(t, err) + + s := tmp.(*stdSupport) + assert := assert.New(t) + assert.True(s.Enabled()) + }) + +} + +func TestDefaultSupport_Manager_Enabled_Serverless(t *testing.T) { + cfg := DefaultDSLConfig(beat.Info{Name: "test"}) + runEnabledTests(t, cfg) +} + +func TestDefaultSupport_Manager_Enabled(t *testing.T) { + cfg := DefaultILMConfig(beat.Info{Name: "test"}) + runEnabledTests(t, cfg) +} + +func runEnabledTests(t *testing.T, cfg LifecycleConfig) { + cases := map[string]struct { + calls []onCall + cfg LifecycleConfig + expectEnabled bool + isEnabled bool + fail error + err bool + }{ + "disabled via config": { + cfg: LifecycleConfig{ILM: Config{Enabled: false}, DSL: Config{Enabled: false}}, + expectEnabled: false, + isEnabled: false, + }, + "disabled via handler": { + calls: []onCall{ + onCheckEnabled().Return(false, ErrESILMDisabled), + }, + expectEnabled: false, + isEnabled: true, + cfg: cfg, + err: true, + }, + "enabled via handler": { + calls: []onCall{ + onCheckEnabled().Return(true, nil), + }, + expectEnabled: true, + isEnabled: true, + cfg: cfg, + }, + "handler confirms enabled flag": { + calls: []onCall{ + onCheckEnabled().Return(true, nil), + }, + cfg: cfg, + expectEnabled: true, + isEnabled: true, + }, + "io error": { + calls: []onCall{ + onCheckEnabled().Return(false, errors.New("ups")), + }, + cfg: cfg, + expectEnabled: false, + isEnabled: true, + err: true, + }, + } + + for name, test := range cases { + t.Run(name, func(t *testing.T) { + + testHandler := newMockHandler(test.cfg, Policy{}, test.calls...) + testManager := createManager(t, testHandler, test.isEnabled) + enabled, err := testManager.CheckEnabled() + + if test.fail == nil && !test.err { + assert.NoError(t, err) + } + if test.err || test.fail != nil { + assert.Error(t, err) + } + if test.fail != nil { + assert.Equal(t, test.fail, err) + } + + assert.Equal(t, test.expectEnabled, enabled) + testHandler.AssertExpectations(t) + }) + } +} + +func TestDefaultSupport_Manager_EnsurePolicy_Serverless(t *testing.T) { + testPolicy := Policy{ + Name: "test", + Body: DefaultDSLPolicy, + } + cfg := DefaultDSLConfig(beat.Info{Name: "test"}) + runEnsurePolicyTest(t, testPolicy, cfg) +} + +func TestDefaultSupport_Manager_EnsurePolicy(t *testing.T) { + testPolicy := Policy{ + Name: "test", + Body: DefaultILMPolicy, + } + cfg := DefaultILMConfig(beat.Info{Name: "test"}) + runEnsurePolicyTest(t, testPolicy, cfg) +} + +func runEnsurePolicyTest(t *testing.T, testPolicy Policy, cfg LifecycleConfig) { + cases := map[string]struct { + calls []onCall + overwrite bool + cfg LifecycleConfig + enabled bool + create bool + fail error + }{ + "create new policy": { + create: true, + calls: []onCall{ + onCheckExists().Return(true), + onHasPolicy().Return(false, nil), + onCreatePolicyFromConfig().Return(nil), + }, + cfg: cfg, + enabled: true, + }, + "policy already exists": { + create: false, + calls: []onCall{ + onCheckExists().Return(true), + onHasPolicy().Return(true, nil), + }, + cfg: cfg, + enabled: true, + }, + "overwrite": { + overwrite: true, + create: true, + enabled: true, + cfg: cfg, + calls: []onCall{ + onCheckExists().Return(true), + onCreatePolicyFromConfig().Return(nil), + }, + }, + "fail": { + calls: []onCall{ + onCheckExists().Return(true), + onHasPolicy().Return(false, nil), + onCreatePolicyFromConfig().Return(ErrRequestFailed), + }, + fail: ErrRequestFailed, + cfg: cfg, + enabled: true, + }, + } + + for name, test := range cases { + test := test + t.Run(name, func(t *testing.T) { + h := newMockHandler(test.cfg, testPolicy, test.calls...) + m := createManager(t, h, test.enabled) + created, err := m.EnsurePolicy(test.overwrite) + + if test.fail == nil { + assert.Equal(t, test.create, created) + require.NoError(t, err) + } else { + require.Error(t, err) + assert.Equal(t, test.fail, err) + } + + h.AssertExpectations(t) + }) + } +} + +func createManager(t *testing.T, h ClientHandler, enabled bool) Manager { + info := beat.Info{Beat: "test", Version: "9.9.9"} + s, err := DefaultSupport(nil, info, enabled) + require.NoError(t, err) + return s.Manager(h) +} diff --git a/libbeat/idxmgmt/ilm/mockapihandler_test.go b/libbeat/idxmgmt/lifecycle/mock_client_handler.go similarity index 54% rename from libbeat/idxmgmt/ilm/mockapihandler_test.go rename to libbeat/idxmgmt/lifecycle/mock_client_handler.go index b527ad118d7..c9309a6db92 100644 --- a/libbeat/idxmgmt/ilm/mockapihandler_test.go +++ b/libbeat/idxmgmt/lifecycle/mock_client_handler.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package ilm +package lifecycle import ( "github.com/stretchr/testify/mock" @@ -23,6 +23,9 @@ import ( type mockHandler struct { mock.Mock + cfg LifecycleConfig + testPolicy Policy + mode Mode } type onCall struct { @@ -36,30 +39,57 @@ func (c onCall) Return(values ...interface{}) onCall { return c } -func newMockHandler(calls ...onCall) *mockHandler { - m := &mockHandler{} +func newMockHandler(cfg LifecycleConfig, testPolicy Policy, calls ...onCall) *mockHandler { + m := &mockHandler{cfg: cfg} for _, c := range calls { m.On(c.name, c.args...).Return(c.returns...) } return m } -func onCheckILMEnabled(enabled bool) onCall { return makeOnCall("CheckILMEnabled", enabled) } -func (h *mockHandler) CheckILMEnabled(enabled bool) (bool, error) { - args := h.Called(enabled) +func onCheckEnabled() onCall { return makeOnCall("CheckEnabled") } +func (h *mockHandler) CheckEnabled() (bool, error) { + args := h.Called() return args.Bool(0), args.Error(1) } -func onHasILMPolicy(name string) onCall { return makeOnCall("HasILMPolicy", name) } -func (h *mockHandler) HasILMPolicy(name string) (bool, error) { - args := h.Called(name) +func onHasPolicy() onCall { return makeOnCall("HasPolicy") } +func (h *mockHandler) HasPolicy() (bool, error) { + args := h.Called() return args.Bool(0), args.Error(1) } -func onCreateILMPolicy(policy Policy) onCall { return makeOnCall("CreateILMPolicy", policy) } -func (h *mockHandler) CreateILMPolicy(policy Policy) error { - args := h.Called(policy) +func onCreatePolicyFromConfig() onCall { return makeOnCall("CreatePolicyFromConfig") } +func (h *mockHandler) CreatePolicyFromConfig() error { + args := h.Called() return args.Error(0) + +} + +func (h *mockHandler) Overwrite() bool { + return h.cfg.ILM.Overwrite || h.cfg.DSL.Overwrite +} + +func (h *mockHandler) PolicyName() string { + return h.testPolicy.Name +} + +func (h *mockHandler) Policy() Policy { + return h.testPolicy +} + +func (h *mockHandler) Mode() Mode { + return h.mode +} + +func (h *mockHandler) IsElasticsearch() bool { + return false +} + +func onCheckExists() onCall { return makeOnCall("CheckExists") } +func (h *mockHandler) CheckExists() bool { + args := h.Called() + return args.Bool(0) } func makeOnCall(name string, args ...interface{}) onCall { diff --git a/libbeat/idxmgmt/ilm/noop.go b/libbeat/idxmgmt/lifecycle/noop_manager.go similarity index 69% rename from libbeat/idxmgmt/ilm/noop.go rename to libbeat/idxmgmt/lifecycle/noop_manager.go index 66731f257b7..6311d0dd2bb 100644 --- a/libbeat/idxmgmt/ilm/noop.go +++ b/libbeat/idxmgmt/lifecycle/noop_manager.go @@ -15,11 +15,10 @@ // specific language governing permissions and limitations // under the License. -package ilm +package lifecycle import ( "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/elastic-agent-libs/config" ) type noopSupport struct{} @@ -27,14 +26,27 @@ type noopManager struct{} // NewNoopSupport creates a noop ILM implementation with ILM support being always // disabled. Attempts to install a policy will fail. -func NewNoopSupport(info beat.Info, config *config.C) (Supporter, error) { +func NewNoopSupport(info beat.Info, c bool) (Supporter, error) { return (*noopSupport)(nil), nil } -func (*noopSupport) Enabled() bool { return false } -func (*noopSupport) Policy() Policy { return Policy{} } -func (*noopSupport) Overwrite() bool { return false } +// Enabled no-op +func (*noopSupport) Enabled() bool { return false } + +// Policy no-op +func (*noopSupport) Policy() Policy { return Policy{} } + +// Overwrite no-op +func (*noopSupport) Overwrite() bool { return false } + +// Manager no-op func (*noopSupport) Manager(_ ClientHandler) Manager { return (*noopManager)(nil) } -func (*noopManager) CheckEnabled() (bool, error) { return false, nil } -func (*noopManager) EnsurePolicy(_ bool) (bool, error) { return false, errOf(ErrOpNotAvailable) } +// CheckEnabled no-op +func (*noopManager) CheckEnabled() (bool, error) { return false, nil } + +// EnsurePolicy no-op +func (*noopManager) EnsurePolicy(_ bool) (bool, error) { return false, ErrOpNotAvailable } + +// Policyname no-op +func (*noopManager) PolicyName() string { return "" } diff --git a/libbeat/idxmgmt/ilm/std.go b/libbeat/idxmgmt/lifecycle/standard_manager.go similarity index 53% rename from libbeat/idxmgmt/ilm/std.go rename to libbeat/idxmgmt/lifecycle/standard_manager.go index 77a7825ae79..db3d5595afd 100644 --- a/libbeat/idxmgmt/ilm/std.go +++ b/libbeat/idxmgmt/lifecycle/standard_manager.go @@ -15,32 +15,29 @@ // specific language governing permissions and limitations // under the License. -package ilm +package lifecycle import ( + "fmt" "time" "github.com/elastic/elastic-agent-libs/logp" ) +// stdSupport is a config wrapper that carries lifecycle info. type stdSupport struct { - log *logp.Logger - - enabled bool - overwrite bool - checkExists bool - - policy Policy + log *logp.Logger + lifecycleEnabled bool } +// stdManager creates, checks, and updates lifecycle policies. type stdManager struct { *stdSupport client ClientHandler - - // cached info - cache infoCache + cache infoCache } +// infoCache stores config relating to caching lifecycle config type infoCache struct { LastUpdate time.Time Enabled bool @@ -49,25 +46,23 @@ type infoCache struct { var defaultCacheDuration = 5 * time.Minute // NewStdSupport creates an instance of default ILM support implementation. +// This contains only the config, and a manager must be created to write and check +// lifecycle policies. I suspect that with enough time/work, you could merge the stdSupport and stdManager objects func NewStdSupport( log *logp.Logger, - enabled bool, - policy Policy, - overwrite, checkExists bool, + lifecycleEnabled bool, ) Supporter { return &stdSupport{ - log: log, - enabled: enabled, - overwrite: overwrite, - checkExists: checkExists, - policy: policy, + log: log, + lifecycleEnabled: lifecycleEnabled, } } -func (s *stdSupport) Enabled() bool { return s.enabled } -func (s *stdSupport) Policy() Policy { return s.policy } -func (s *stdSupport) Overwrite() bool { return s.overwrite } +// Enabled returns true if either ILM or DSL are enabled +func (s *stdSupport) Enabled() bool { return s.lifecycleEnabled } +// Manager returns a standard support manager. unlike the stdSupport object, +// the manager is capable of writing and checking lifecycle policies. func (s *stdSupport) Manager(h ClientHandler) Manager { return &stdManager{ client: h, @@ -75,65 +70,64 @@ func (s *stdSupport) Manager(h ClientHandler) Manager { } } +// CheckEnabled checks to see if lifecycle management is enabled. func (m *stdManager) CheckEnabled() (bool, error) { - if !m.enabled { - return false, nil + ilmEnabled, err := m.client.CheckEnabled() + if err != nil { + return ilmEnabled, err } if m.cache.Valid() { return m.cache.Enabled, nil } - ilmEnabled, err := m.client.CheckILMEnabled(m.enabled) - if err != nil { - return ilmEnabled, err - } - m.cache.Enabled = ilmEnabled m.cache.LastUpdate = time.Now() return ilmEnabled, nil } +// EnsurePolicy creates the upstream lifecycle policy, depending on if it exists, and if overwrite is set. +// returns true if the policy has been created func (m *stdManager) EnsurePolicy(overwrite bool) (bool, error) { log := m.log - if !m.checkExists { - log.Infof("ILM policy is not checked as setup.ilm.check_exists is disabled") + if !m.client.CheckExists() { + log.Infof("lifecycle policy is not checked as check_exists is disabled") return false, nil } - - overwrite = overwrite || m.Overwrite() - name := m.policy.Name + overwrite = overwrite || m.client.Overwrite() + name := m.client.PolicyName() var exists bool if !overwrite { var err error - exists, err = m.client.HasILMPolicy(name) + exists, err = m.client.HasPolicy() if err != nil { - return false, err + return false, fmt.Errorf("error checking if policy %s exists: %w", name, err) } } switch { case exists && !overwrite: - log.Infof("ILM policy %v exists already.", name) + log.Infof("lifecycle policy %v exists already.", name) return false, nil case !exists || overwrite: - err := m.client.CreateILMPolicy(m.policy) + err := m.client.CreatePolicyFromConfig() if err != nil { - log.Errorf("ILM policy %v creation failed: %v", name, err) + log.Errorf("lifecycle policy %v creation failed: %v", name, err) return false, err } - log.Infof("ILM policy %v successfully created.", name) + log.Infof("lifecycle policy %v successfully created.", name) return true, err default: - log.Infof("ILM policy not created: exists=%v, overwrite=%v.", exists, overwrite) + log.Infof("lifecycle policy not created: exists=%v, overwrite=%v.", exists, overwrite) return false, nil } } +// Valid returns true if the cache is valid func (c *infoCache) Valid() bool { return !c.LastUpdate.IsZero() && time.Since(c.LastUpdate) < defaultCacheDuration } diff --git a/libbeat/idxmgmt/ilm/testfiles/custom.json b/libbeat/idxmgmt/lifecycle/testfiles/custom.json similarity index 100% rename from libbeat/idxmgmt/ilm/testfiles/custom.json rename to libbeat/idxmgmt/lifecycle/testfiles/custom.json diff --git a/libbeat/idxmgmt/mockilm_test.go b/libbeat/idxmgmt/mock_manager_test.go similarity index 68% rename from libbeat/idxmgmt/mockilm_test.go rename to libbeat/idxmgmt/mock_manager_test.go index 3997fd0f216..34fc29d13af 100644 --- a/libbeat/idxmgmt/mockilm_test.go +++ b/libbeat/idxmgmt/mock_manager_test.go @@ -21,8 +21,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" - "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/elastic-agent-libs/logp" ) @@ -36,8 +35,8 @@ type onCall struct { returns []interface{} } -func makeMockILMSupport(calls ...onCall) ilm.SupportFactory { - return func(_ *logp.Logger, _ beat.Info, _ *config.C) (ilm.Supporter, error) { +func makeMockILMSupport(calls ...onCall) lifecycle.SupportFactory { + return func(_ *logp.Logger, _ beat.Info, _ bool) (lifecycle.Supporter, error) { m := &mockILMSupport{} for _, c := range calls { m.On(c.name, c.args...).Return(c.returns...) @@ -58,32 +57,44 @@ func (m *mockILMSupport) Enabled() bool { } func onPolicy() onCall { return makeOnCall("Policy") } -func (m *mockILMSupport) Policy() ilm.Policy { +func (m *mockILMSupport) Policy() lifecycle.Policy { args := m.Called() - return args.Get(0).(ilm.Policy) + return args.Get(0).(lifecycle.Policy) } -func onOverwrite() onCall { return makeOnCall("Overwrite") } +// func onMode() onCall { return makeOnCall("Mode") } +func (m *mockILMSupport) Mode() lifecycle.Mode { + args := m.Called() + return args.Get(0).(lifecycle.Mode) +} + +// func onOverwrite() onCall { return makeOnCall("Overwrite") } func (m *mockILMSupport) Overwrite() bool { return m.Called().Bool(0) } -func (m *mockILMSupport) Manager(_ ilm.ClientHandler) ilm.Manager { +func (m *mockILMSupport) Manager(_ lifecycle.ClientHandler) lifecycle.Manager { return m } -func onCheckEnabled() onCall { return makeOnCall("CheckEnabled") } +// func onCheckEnabled() onCall { return makeOnCall("CheckEnabled") } func (m *mockILMSupport) CheckEnabled() (bool, error) { args := m.Called() return args.Bool(0), args.Error(1) } -func onEnsurePolicy() onCall { return makeOnCall("EnsurePolicy") } +// func onEnsurePolicy() onCall { return makeOnCall("EnsurePolicy") } func (m *mockILMSupport) EnsurePolicy(overwrite bool) (bool, error) { args := m.Called() return args.Bool(0), args.Error(1) } +// func onPolicyName() onCall { return makeOnCall("PolicyName") } +func (m *mockILMSupport) PolicyName() string { + args := m.Called() + return args.String(0) +} + func makeOnCall(name string, args ...interface{}) onCall { return onCall{name: name, args: args} } diff --git a/libbeat/idxmgmt/std_test.go b/libbeat/idxmgmt/std_test.go index 6beb62fa64b..4a5dd0f7d33 100644 --- a/libbeat/idxmgmt/std_test.go +++ b/libbeat/idxmgmt/std_test.go @@ -18,6 +18,8 @@ package idxmgmt import ( + "errors" + "fmt" "testing" "time" @@ -25,23 +27,14 @@ import ( "github.com/stretchr/testify/require" "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" + "github.com/elastic/beats/v7/libbeat/common/fmtstr" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/mapping" "github.com/elastic/beats/v7/libbeat/template" "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/mapstr" ) -type mockClientHandler struct { - policy string - expectsPolicy bool - - tmplCfg *template.TemplateConfig - tmplForce bool - - operations []mockCreateOp -} - type mockCreateOp uint8 const ( @@ -101,7 +94,7 @@ func TestDefaultSupport_BuildSelector(t *testing.T) { ilmTemplateSettings := func(policy string) []onCall { return []onCall{ onEnabled().Return(true), - onPolicy().Return(ilm.Policy{Name: policy}), + onPolicy().Return(lifecycle.Policy{Name: policy}), } } @@ -211,45 +204,55 @@ func TestDefaultSupport_BuildSelector(t *testing.T) { } func TestIndexManager_VerifySetup(t *testing.T) { + info := beat.Info{Beat: "test", Version: "9.9.9"} for name, setup := range map[string]struct { tmplEnabled, ilmEnabled, ilmOverwrite bool loadTmpl, loadILM LoadMode + lifecycle lifecycle.LifecycleConfig ok bool warn string }{ "load template with ilm without loading ilm": { ilmEnabled: true, tmplEnabled: true, loadILM: LoadModeDisabled, - warn: "whithout loading ILM policy", + warn: "whithout loading ILM policy", + lifecycle: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: true, PolicyName: *fmtstr.MustCompileEvent("test")}}, }, "load ilm without template": { ilmEnabled: true, loadILM: LoadModeUnset, - warn: "without loading template is not recommended", + warn: "without loading template is not recommended", + lifecycle: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: true, PolicyName: *fmtstr.MustCompileEvent("test")}}, }, "template disabled but loading enabled": { - loadTmpl: LoadModeEnabled, - warn: "loading not enabled", + loadTmpl: LoadModeEnabled, + warn: "loading not enabled", + lifecycle: lifecycle.DefaultILMConfig(info), }, "ilm disabled but loading enabled": { loadILM: LoadModeEnabled, tmplEnabled: true, - warn: "loading not enabled", + warn: "loading not enabled", + lifecycle: lifecycle.DefaultILMConfig(info), }, "ilm enabled but loading disabled": { ilmEnabled: true, loadILM: LoadModeDisabled, - warn: "loading not enabled", + warn: "loading not enabled", + lifecycle: lifecycle.DefaultILMConfig(info), }, "template enabled but loading disabled": { tmplEnabled: true, loadTmpl: LoadModeDisabled, - warn: "loading not enabled", + warn: "loading not enabled", + lifecycle: lifecycle.DefaultILMConfig(info), }, "ilm enabled but overwrite disabled": { tmplEnabled: true, ilmEnabled: true, ilmOverwrite: false, loadILM: LoadModeEnabled, - warn: "Overwriting ILM policy is disabled", + warn: "Overwriting lifecycle policy is disabled", + lifecycle: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: true, Overwrite: false, PolicyName: *fmtstr.MustCompileEvent("test")}}, }, "everything enabled": { tmplEnabled: true, ilmEnabled: true, ilmOverwrite: true, - ok: true, + lifecycle: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: true, Overwrite: true, PolicyName: *fmtstr.MustCompileEvent("test")}}, + ok: true, }, } { t.Run(name, func(t *testing.T) { @@ -259,9 +262,10 @@ func TestIndexManager_VerifySetup(t *testing.T) { "setup.template.enabled": setup.tmplEnabled, }) require.NoError(t, err) - support, err := MakeDefaultSupport(ilm.StdSupport)(nil, beat.Info{}, cfg) + support, err := MakeDefaultSupport(lifecycle.StdSupport)(nil, beat.Info{}, cfg) + require.NoError(t, err) + clientHandler, err := newMockClientHandler(setup.lifecycle, info) require.NoError(t, err) - clientHandler := newMockClientHandler() manager := support.Manager(clientHandler, nil) ok, warn := manager.VerifySetup(setup.loadTmpl, setup.loadILM) assert.Equal(t, setup.ok, ok) @@ -307,14 +311,15 @@ func TestIndexManager_Setup(t *testing.T) { } info := beat.Info{Beat: "test", Version: "9.9.9"} defaultCfg := template.DefaultConfig(info) - + defaultLifecycleConfig := lifecycle.DefaultILMConfig(info) + dslLifecycleConfig := lifecycle.DefaultDSLConfig(info) cases := map[string]struct { cfg mapstr.M loadTemplate, loadILM LoadMode - - err bool - tmplCfg *template.TemplateConfig - policy string + ilmCfg lifecycle.LifecycleConfig + err bool + tmplCfg *template.TemplateConfig + policy string }{ "template default ilm default": { tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ @@ -324,11 +329,23 @@ func TestIndexManager_Setup(t *testing.T) { "settings.index.lifecycle.name": "test", }), policy: "test", + ilmCfg: defaultLifecycleConfig, + }, + "template-default-dsl-config": { + tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ + "overwrite": "true", + "name": "test-9.9.9", + "pattern": "test-9.9.9", + "settings.index.lifecycle.name": "test-9.9.9", + }), + policy: "test-9.9.9", + ilmCfg: dslLifecycleConfig, }, "template default ilm default with policy changed": { cfg: mapstr.M{ "setup.ilm.policy_name": "policy-keep", }, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: true, CheckExists: true, PolicyName: *fmtstr.MustCompileEvent("policy-keep")}}, tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ "overwrite": "true", "name": "test-9.9.9", @@ -342,6 +359,7 @@ func TestIndexManager_Setup(t *testing.T) { "setup.ilm.enabled": false, }, loadTemplate: LoadModeEnabled, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, tmplCfg: &defaultCfg, }, "template default loadMode Overwrite ilm disabled": { @@ -349,6 +367,7 @@ func TestIndexManager_Setup(t *testing.T) { "setup.ilm.enabled": false, }, loadTemplate: LoadModeOverwrite, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ "overwrite": "true", "name": "test-9.9.9", @@ -362,6 +381,7 @@ func TestIndexManager_Setup(t *testing.T) { "pattern": "test-9.9.9", }, loadTemplate: LoadModeForce, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ "overwrite": "true", }), @@ -370,12 +390,14 @@ func TestIndexManager_Setup(t *testing.T) { cfg: mapstr.M{ "setup.ilm.enabled": false, }, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, loadTemplate: LoadModeDisabled, }, "template disabled ilm default": { cfg: mapstr.M{ "setup.template.enabled": false, }, + ilmCfg: defaultLifecycleConfig, policy: "test", }, "template disabled ilm disabled, loadMode Overwrite": { @@ -383,6 +405,7 @@ func TestIndexManager_Setup(t *testing.T) { "setup.template.enabled": false, "setup.ilm.enabled": false, }, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, loadILM: LoadModeOverwrite, }, "template disabled ilm disabled loadMode Force": { @@ -390,16 +413,19 @@ func TestIndexManager_Setup(t *testing.T) { "setup.template.enabled": false, "setup.ilm.enabled": false, }, + ilmCfg: lifecycle.LifecycleConfig{ILM: lifecycle.Config{Enabled: false}}, loadILM: LoadModeForce, - policy: "test", }, "template loadmode disabled ilm loadMode enabled": { loadTemplate: LoadModeDisabled, loadILM: LoadModeEnabled, + ilmCfg: defaultLifecycleConfig, policy: "test", }, "template default ilm loadMode disabled": { loadILM: LoadModeDisabled, + ilmCfg: defaultLifecycleConfig, + policy: "test", tmplCfg: cfgWith(template.DefaultConfig(info), map[string]interface{}{ "name": "test-9.9.9", "pattern": "test-9.9.9", @@ -408,16 +434,19 @@ func TestIndexManager_Setup(t *testing.T) { }, "template loadmode disabled ilm loadmode disabled": { loadTemplate: LoadModeDisabled, + ilmCfg: defaultLifecycleConfig, loadILM: LoadModeDisabled, + policy: "test", }, } for name, test := range cases { t.Run(name, func(t *testing.T) { - factory := MakeDefaultSupport(ilm.StdSupport) + factory := MakeDefaultSupport(lifecycle.StdSupport) im, err := factory(nil, info, config.MustNewConfigFrom(test.cfg)) require.NoError(t, err) - clientHandler := newMockClientHandler() + clientHandler, err := newMockClientHandler(test.ilmCfg, info) + require.NoError(t, err) manager := im.Manager(clientHandler, BeatsAssets([]byte("testbeat fields"))) err = manager.Setup(test.loadTemplate, test.loadILM) clientHandler.assertInvariants(t) @@ -431,7 +460,7 @@ func TestIndexManager_Setup(t *testing.T) { } else { assert.Equal(t, test.tmplCfg, clientHandler.tmplCfg) } - assert.Equal(t, test.policy, clientHandler.policy) + assert.Equal(t, test.policy, clientHandler.policyName) } }) } @@ -445,8 +474,38 @@ func (op mockCreateOp) String() string { return names[op] } -func newMockClientHandler() *mockClientHandler { - return &mockClientHandler{} +type mockClientHandler struct { + policyName string + installedPolicy bool + + tmplCfg *template.TemplateConfig + tmplForce bool + lifecycle lifecycle.LifecycleConfig + selectedCfg lifecycle.Config + operations []mockCreateOp + mode lifecycle.Mode +} + +func newMockClientHandler(cfg lifecycle.LifecycleConfig, info beat.Info) (*mockClientHandler, error) { + if cfg.ILM.Enabled && cfg.DSL.Enabled { + return nil, errors.New("both ILM and DSL enabled") + } + + selectedCfg := cfg.ILM + if cfg.DSL.Enabled { + selectedCfg = cfg.DSL + } + + var name string + var err error + if selectedCfg.Enabled { + name, err = lifecycle.ApplyStaticFmtstr(info, selectedCfg.PolicyName) + if err != nil { + return nil, fmt.Errorf("error applying formatting string for template name: %w", err) + } + } + + return &mockClientHandler{selectedCfg: selectedCfg, policyName: name}, nil } func (h *mockClientHandler) Load(config template.TemplateConfig, _ beat.Info, fields []byte, migration bool) error { @@ -456,20 +515,53 @@ func (h *mockClientHandler) Load(config template.TemplateConfig, _ beat.Info, fi return nil } -func (h *mockClientHandler) CheckILMEnabled(enabled bool) (bool, error) { - return enabled, nil +func (h *mockClientHandler) CheckEnabled() (bool, error) { + return h.selectedCfg.Enabled, nil +} + +func (h *mockClientHandler) CheckExists() bool { + return h.selectedCfg.CheckExists +} + +func (h *mockClientHandler) Overwrite() bool { + return h.selectedCfg.Overwrite +} + +func (h *mockClientHandler) HasPolicy() (bool, error) { + return h.installedPolicy, nil +} + +func (h *mockClientHandler) PolicyName() string { + return h.policyName } -func (h *mockClientHandler) HasILMPolicy(name string) (bool, error) { - return h.policy == name, nil +func (h *mockClientHandler) Policy() lifecycle.Policy { + return lifecycle.Policy{} } -func (h *mockClientHandler) CreateILMPolicy(policy ilm.Policy) error { +func (h *mockClientHandler) Mode() lifecycle.Mode { + return h.mode +} + +func (h *mockClientHandler) IsElasticsearch() bool { + return true +} + +func (h *mockClientHandler) createILMPolicy(policy lifecycle.Policy) error { h.recordOp(mockCreatePolicy) - h.policy = policy.Name + h.policyName = policy.Name return nil } +func (h *mockClientHandler) CreatePolicyFromConfig() error { + h.installedPolicy = true + h.recordOp(mockCreatePolicy) + if h.lifecycle.DSL.Enabled { + return h.createILMPolicy(lifecycle.Policy{Name: h.policyName, Body: lifecycle.DefaultILMPolicy}) + } + return h.createILMPolicy(lifecycle.Policy{Name: h.policyName, Body: lifecycle.DefaultDSLPolicy}) +} + func (h *mockClientHandler) recordOp(op mockCreateOp) { h.operations = append(h.operations, op) } diff --git a/libbeat/outputs/elasticsearch/config.go b/libbeat/outputs/elasticsearch/config.go index 7134e9333cb..ca77a44b833 100644 --- a/libbeat/outputs/elasticsearch/config.go +++ b/libbeat/outputs/elasticsearch/config.go @@ -65,7 +65,7 @@ var ( Password: "", APIKey: "", MaxRetries: 3, - CompressionLevel: 0, + CompressionLevel: 1, EscapeHTML: false, Kerberos: nil, LoadBalance: true, diff --git a/libbeat/outputs/elasticsearch/config_test.go b/libbeat/outputs/elasticsearch/config_test.go index 22fe4bb4c82..32cb90c904c 100644 --- a/libbeat/outputs/elasticsearch/config_test.go +++ b/libbeat/outputs/elasticsearch/config_test.go @@ -97,6 +97,28 @@ non_indexable_policy.dead_letter_index: } } +func TestCompressionIsOnByDefault(t *testing.T) { + config := "" + c := conf.MustNewConfigFrom(config) + elasticsearchOutputConfig, err := readConfig(c) + if err != nil { + t.Fatalf("Can't create test configuration from valid input") + } + assert.Equal(t, 1, elasticsearchOutputConfig.CompressionLevel, "Default compression level should be 1") +} + +func TestExplicitCompressionLevelOverridesDefault(t *testing.T) { + config := ` +compression_level: 0 +` + c := conf.MustNewConfigFrom(config) + elasticsearchOutputConfig, err := readConfig(c) + if err != nil { + t.Fatalf("Can't create test configuration from valid input") + } + assert.Equal(t, 0, elasticsearchOutputConfig.CompressionLevel, "Explicit compression level should override defaults") +} + func readConfig(cfg *conf.C) (*elasticsearchConfig, error) { c := defaultConfig if err := cfg.Unpack(&c); err != nil { diff --git a/libbeat/outputs/elasticsearch/docs/elasticsearch.asciidoc b/libbeat/outputs/elasticsearch/docs/elasticsearch.asciidoc index cbe74279dcb..5ea65c16dc4 100644 --- a/libbeat/outputs/elasticsearch/docs/elasticsearch.asciidoc +++ b/libbeat/outputs/elasticsearch/docs/elasticsearch.asciidoc @@ -105,7 +105,7 @@ The compression level must be in the range of `1` (best speed) to `9` (best comp Increasing the compression level will reduce the network usage but will increase the cpu usage. -The default value is `0`. +The default value is `1`. ===== `escape_html` diff --git a/libbeat/processors/cache/cache.go b/libbeat/processors/cache/cache.go new file mode 100644 index 00000000000..a7ce4876f50 --- /dev/null +++ b/libbeat/processors/cache/cache.go @@ -0,0 +1,289 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "context" + "errors" + "fmt" + "os" + "time" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common/atomic" + "github.com/elastic/beats/v7/libbeat/processors" + conf "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/mapstr" + "github.com/elastic/elastic-agent-libs/paths" +) + +const name = "cache" + +func init() { + // We cannot use this as a JS plugin as it is stateful and includes a Close method. + processors.RegisterPlugin(name, New) +} + +var ( + // ErrNoMatch is returned when the event doesn't contain the field + // specified in key_field. + ErrNoMatch = errors.New("field in key_field not found in the event") + + // ErrNoData is returned when metadata for an event can't be collected. + ErrNoData = errors.New("metadata not found") + + instanceID atomic.Uint32 +) + +// cache is a caching enrichment processor. +type cache struct { + config config + store Store + cancel context.CancelFunc + log *logp.Logger +} + +// Resulting processor implements `Close()` to release the cache resources. +func New(cfg *conf.C) (beat.Processor, error) { + config := defaultConfig() + err := cfg.Unpack(&config) + if err != nil { + return nil, fmt.Errorf("failed to unpack the %s configuration: %w", name, err) + } + // Logging (each processor instance has a unique ID). + id := int(instanceID.Inc()) + log := logp.NewLogger(name).With("instance_id", id) + + src, cancel, err := getStoreFor(config, log) + if err != nil { + return nil, fmt.Errorf("failed to get the store for %s: %w", name, err) + } + + p := &cache{ + config: config, + store: src, + cancel: cancel, + log: log, + } + p.log.Infow("initialized cache processor", "details", p) + return p, nil +} + +// getStoreFor returns a backing store for the provided configuration, +// and a context cancellation that releases the cache resource when it +// is no longer required. The cancellation should be called when the +// processor is closed. +func getStoreFor(cfg config, log *logp.Logger) (Store, context.CancelFunc, error) { + switch { + case cfg.Store.Memory != nil: + s, cancel := memStores.get(cfg.Store.Memory.ID, cfg) + return s, cancel, nil + + case cfg.Store.File != nil: + err := os.MkdirAll(paths.Resolve(paths.Data, "cache_processor"), 0o700) + if err != nil { + return nil, noop, fmt.Errorf("cache processor could not create store directory: %w", err) + } + s, cancel := fileStores.get(cfg.Store.File.ID, cfg, log) + return s, cancel, nil + + default: + // This should have been caught by config validation. + return nil, noop, errors.New("no configured store") + } +} + +// noop is a no-op context.CancelFunc. +func noop() {} + +// Store is the interface implemented by metadata providers. +type Store interface { + Put(key string, val any) error + Get(key string) (any, error) + Delete(key string) error + + // The string returned from the String method should + // be the backing store ID. Either "file:" or + // "memory:". + fmt.Stringer +} + +type CacheEntry struct { + Key string `json:"key"` + Value any `json:"val"` + Expires time.Time `json:"expires"` + index int +} + +// Run enriches the given event with the host metadata. +func (p *cache) Run(event *beat.Event) (*beat.Event, error) { + switch { + case p.config.Put != nil: + p.log.Debugw("put", "backend_id", p.store, "config", p.config.Put) + err := p.putFrom(event) + if err != nil { + switch { + case errors.Is(err, mapstr.ErrKeyNotFound): + if p.config.IgnoreMissing { + return event, nil + } + return event, err + } + return event, fmt.Errorf("error applying %s put processor: %w", name, err) + } + return event, nil + + case p.config.Get != nil: + p.log.Debugw("get", "backend_id", p.store, "config", p.config.Get) + result, err := p.getFor(event) + if err != nil { + switch { + case errors.Is(err, mapstr.ErrKeyNotFound): + if p.config.IgnoreMissing { + return event, nil + } + case errors.Is(err, ErrNoData): + return event, err + } + return event, fmt.Errorf("error applying %s get processor: %w", name, err) + } + if result != nil { + return result, nil + } + return event, ErrNoMatch + + case p.config.Delete != nil: + p.log.Debugw("delete", "backend_id", p.store, "config", p.config.Delete) + err := p.deleteFor(event) + if err != nil { + return event, fmt.Errorf("error applying %s delete processor: %w", name, err) + } + return event, nil + + default: + // This should never happen, but we don't need to flag it. + return event, nil + } +} + +// putFrom takes the configured value from the event and stores it in the cache +// if it exists. +func (p *cache) putFrom(event *beat.Event) error { + k, err := event.GetValue(p.config.Put.Key) + if err != nil { + return err + } + key, ok := k.(string) + if !ok { + return fmt.Errorf("key field '%s' not a string: %T", p.config.Put.Key, k) + } + p.log.Debugw("put", "backend_id", p.store, "key", key) + + val, err := event.GetValue(p.config.Put.Value) + if err != nil { + return err + } + + err = p.store.Put(key, val) + if err != nil { + return fmt.Errorf("failed to put '%s' into '%s': %w", key, p.config.Put.Value, err) + } + return nil +} + +// getFor gets the configured value from the cache for the event and inserts +// it into the configured field if it exists. +func (p *cache) getFor(event *beat.Event) (result *beat.Event, err error) { + // Check for clobbering. + dst := p.config.Get.Target + if !p.config.OverwriteKeys { + if _, err := event.GetValue(dst); err == nil { + return nil, fmt.Errorf("target field '%s' already exists and overwrite_keys is false", dst) + } + } + + // Get key into store for metadata. + key := p.config.Get.Key + v, err := event.GetValue(key) + if err != nil { + return nil, err + } + k, ok := v.(string) + if !ok { + return nil, fmt.Errorf("key field '%s' not a string: %T", key, v) + } + p.log.Debugw("get", "backend_id", p.store, "key", k) + + // Get metadata... + meta, err := p.store.Get(k) + if err != nil { + return nil, fmt.Errorf("%w for '%s': %w", ErrNoData, k, err) + } + if meta == nil { + return nil, fmt.Errorf("%w for '%s'", ErrNoData, k) + } + if m, ok := meta.(map[string]interface{}); ok { + meta = mapstr.M(m) + } + // ... and write it into the event. + // The implementation of PutValue currently leaves event + // essentially unchanged in the case of an error (in the + // case of an @metadata field there may be a mutation, + // but at most this will be the addition of a Meta field + // value to event). None of this is documented. + if _, err = event.PutValue(dst, meta); err != nil { + return nil, err + } + return event, nil +} + +// deleteFor deletes the configured value from the cache based on the value of +// the configured key. +func (p *cache) deleteFor(event *beat.Event) error { + v, err := event.GetValue(p.config.Delete.Key) + if err != nil { + return err + } + k, ok := v.(string) + if !ok { + return fmt.Errorf("key field '%s' not a string: %T", p.config.Delete.Key, v) + } + return p.store.Delete(k) +} + +func (p *cache) Close() error { + p.cancel() + return nil +} + +// String returns the processor representation formatted as a string +func (p *cache) String() string { + switch { + case p.config.Put != nil: + return fmt.Sprintf("%s=[operation=put, store_id=%s, key_field=%s, value_field=%s, ttl=%v, ignore_missing=%t, overwrite_fields=%t]", + name, p.store, p.config.Put.Key, p.config.Put.Value, p.config.Put.TTL, p.config.IgnoreMissing, p.config.OverwriteKeys) + case p.config.Get != nil: + return fmt.Sprintf("%s=[operation=get, store_id=%s, key_field=%s, target_field=%s, ignore_missing=%t, overwrite_fields=%t]", + name, p.store, p.config.Get.Key, p.config.Get.Target, p.config.IgnoreMissing, p.config.OverwriteKeys) + case p.config.Delete != nil: + return fmt.Sprintf("%s=[operation=delete, store_id=%s, key_field=%s]", name, p.store, p.config.Delete.Key) + default: + return fmt.Sprintf("%s=[operation=invalid]", name) + } +} diff --git a/libbeat/processors/cache/cache_test.go b/libbeat/processors/cache/cache_test.go new file mode 100644 index 00000000000..8acd22d74d7 --- /dev/null +++ b/libbeat/processors/cache/cache_test.go @@ -0,0 +1,625 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "errors" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + + "github.com/elastic/beats/v7/libbeat/beat" + conf "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +type cacheTestStep struct { + event mapstr.M + want mapstr.M + wantCacheVal map[string]*CacheEntry + wantErr error +} + +var cacheTests = []struct { + name string + configs []testConfig + wantInitErr error + steps []cacheTestStep +}{ + { + name: "invalid_no_backend", + configs: []testConfig{ + { + cfg: mapstr.M{ + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "ttl": "168h", + "value_field": "crowdstrike.metadata", + }, + }, + }, + }, + wantInitErr: errors.New("failed to unpack the cache configuration: missing required field accessing 'backend'"), + }, + { + name: "invalid_no_key_field", + configs: []testConfig{ + { + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + }, + wantInitErr: errors.New("failed to unpack the cache configuration: string value is not set accessing 'put.key_field'"), + }, + { + name: "invalid_no_value_field", + configs: []testConfig{ + { + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "ttl": "168h", + }, + }, + }, + }, + wantInitErr: errors.New("failed to unpack the cache configuration: string value is not set accessing 'put.value_field'"), + }, + { + name: "put_value", + configs: []testConfig{ + { + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + }, + }, + { + name: "put_and_get_value", + configs: []testConfig{ + { + when: func(e mapstr.M) bool { + return e["put"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + { + when: func(e mapstr.M) bool { + return e["get"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "get": mapstr.M{ + "key_field": "crowdstrike.aid", + "target_field": "crowdstrike.metadata_new", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + { + event: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + }, + }, + want: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + }, + }, + { + name: "put_and_get_value_reverse_config", + configs: []testConfig{ + { + when: func(e mapstr.M) bool { + return e["get"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "get": mapstr.M{ + "key_field": "crowdstrike.aid", + "target_field": "crowdstrike.metadata_new", + }, + }, + }, + { + when: func(e mapstr.M) bool { + return e["put"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + { + event: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + }, + }, + want: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + }, + }, + { + name: "put_and_get_value_with_get_error_no_overwrite", + configs: []testConfig{ + { + when: func(e mapstr.M) bool { + return e["put"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + { + when: func(e mapstr.M) bool { + return e["get"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "get": mapstr.M{ + "key_field": "crowdstrike.aid", + "target_field": "crowdstrike.metadata_new", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + { + event: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": mapstr.M{ + "someone_is_already_here": mapstr.M{ + "another_key": "value", + }, + }, + }, + }, + want: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": mapstr.M{ + "someone_is_already_here": mapstr.M{ + "another_key": "value", + }, + }, + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: errors.New("error applying cache get processor: target field 'crowdstrike.metadata_new' already exists and overwrite_keys is false"), + }, + }, + }, + { + name: "put_and_get_value_allow_overwrite", + configs: []testConfig{ + { + when: func(e mapstr.M) bool { + return e["put"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + { + when: func(e mapstr.M) bool { + return e["get"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "overwrite_keys": true, + "get": mapstr.M{ + "key_field": "crowdstrike.aid", + "target_field": "crowdstrike.metadata_new", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + { + event: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": mapstr.M{ + "someone_is_already_here": mapstr.M{ + "another_key": "value", + }, + }, + }, + }, + want: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + }, + }, + { + name: "put_and_get_value_allow_overwrite_but_get_error", + configs: []testConfig{ + { + when: func(e mapstr.M) bool { + return e["put"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "put": mapstr.M{ + "key_field": "crowdstrike.aid", + "value_field": "crowdstrike.metadata", + "ttl": "168h", + }, + }, + }, + { + when: func(e mapstr.M) bool { + return e["get"] == true + }, + cfg: mapstr.M{ + "backend": mapstr.M{ + "memory": mapstr.M{ + "id": "aidmaster", + }, + }, + "overwrite_keys": true, + "get": mapstr.M{ + "key_field": "crowdstrike.aid", + "target_field": "crowdstrike.metadata_new.child", + }, + }, + }, + }, + wantInitErr: nil, + steps: []cacheTestStep{ + { + event: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + want: mapstr.M{ + "put": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata": "metadata_value", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: nil, + }, + { + event: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": "someone_is_already_here", + }, + }, + want: mapstr.M{ + "get": true, + "crowdstrike": mapstr.M{ + "aid": "one", + "metadata_new": "someone_is_already_here", + }, + }, + wantCacheVal: map[string]*CacheEntry{ + "one": {Key: "one", Value: "metadata_value"}, + }, + wantErr: errors.New("error applying cache get processor: expected map but type is string"), + }, + }, + }, +} + +type testConfig struct { + when func(e mapstr.M) bool + cfg mapstr.M +} + +func TestCache(t *testing.T) { + logp.TestingSetup(logp.WithSelectors(name)) + for _, test := range cacheTests { + t.Run(test.name, func(t *testing.T) { + var processors []beat.Processor + for i, cfg := range test.configs { + config, err := conf.NewConfigFrom(cfg.cfg) + if err != nil { + t.Fatal(err) + } + + p, err := New(config) + if !sameError(err, test.wantInitErr) { + t.Errorf("unexpected error from New: got:%v want:%v", err, test.wantInitErr) + } + if err != nil { + return + } + + t.Log(p) + c, ok := p.(*cache) + if !ok { + t.Fatalf("processor %d is not an *cache", i) + } + + defer func() { + err := c.Close() + if err != nil { + t.Errorf("unexpected error from c.Close(): %v", err) + } + }() + + processors = append(processors, p) + } + + for i, step := range test.steps { + for j, p := range processors { + if test.configs[j].when != nil && !test.configs[j].when(step.event) { + continue + } + got, err := p.Run(&beat.Event{ + Fields: step.event, + }) + if !sameError(err, step.wantErr) { + t.Errorf("unexpected error from Run: got:%v want:%v", err, step.wantErr) + return + } + if !cmp.Equal(step.want, got.Fields) { + t.Errorf("unexpected result %d\n--- want\n+++ got\n%s", i, cmp.Diff(step.want, got.Fields)) + } + switch got := p.(*cache).store.(type) { + case *memStore: + allow := cmp.AllowUnexported(CacheEntry{}) + ignore := cmpopts.IgnoreFields(CacheEntry{}, "Expires", "index") + if !cmp.Equal(step.wantCacheVal, got.cache, allow, ignore) { + t.Errorf("unexpected cache state result %d:\n--- want\n+++ got\n%s", i, cmp.Diff(step.wantCacheVal, got.cache, allow, ignore)) + } + } + } + } + }) + } +} diff --git a/libbeat/processors/cache/config.go b/libbeat/processors/cache/config.go new file mode 100644 index 00000000000..03e64ac19c5 --- /dev/null +++ b/libbeat/processors/cache/config.go @@ -0,0 +1,120 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "errors" + "time" +) + +type config struct { + Get *getConfig `config:"get"` + Put *putConfig `config:"put"` + Delete *delConfig `config:"delete"` + + Store *storeConfig `config:"backend" validate:"required"` + + // IgnoreMissing: Ignore errors if event has no matching field. + IgnoreMissing bool `config:"ignore_missing"` + + // OverwriteKeys allow target_fields to overwrite existing fields. + OverwriteKeys bool `config:"overwrite_keys"` +} + +func (cfg *config) Validate() error { + var ops int + if cfg.Put != nil { + ops++ + } + if cfg.Get != nil { + ops++ + } + if cfg.Delete != nil { + ops++ + } + switch ops { + case 0: + return errors.New("no operation specified for cache processor") + case 1: + return nil + default: + return errors.New("cannot specify multiple operations together in a cache processor") + } +} + +type getConfig struct { + // Key is the field containing the key to lookup for matching. + Key string `config:"key_field" validate:"required"` + + // Target is the destination field where fields will be added. + Target string `config:"target_field" validate:"required"` +} + +type putConfig struct { + // Key is the field containing the key to lookup for matching. + Key string `config:"key_field" validate:"required"` + + // Target is the destination field where fields will be added. + Value string `config:"value_field" validate:"required"` + + TTL *time.Duration `config:"ttl" validate:"required"` +} + +type delConfig struct { + // Key is the field containing the key to lookup for deletion. + Key string `config:"key_field" validate:"required"` +} + +func defaultConfig() config { + return config{ + IgnoreMissing: true, + OverwriteKeys: false, + } +} + +type storeConfig struct { + Memory *memConfig `config:"memory"` + File *fileConfig `config:"file"` + + // Capacity is the number of elements that may be stored. + Capacity int `config:"capacity"` + + // Effort is currently experimental and + // not in public-facing documentation. + Effort int `config:"eviction_effort"` +} + +type memConfig struct { + ID string `config:"id" validate:"required"` +} + +type fileConfig struct { + ID string `config:"id" validate:"required"` + WriteOutEvery time.Duration `config:"write_interval"` +} + +func (cfg *storeConfig) Validate() error { + switch { + case cfg.Memory != nil && cfg.File != nil: + return errors.New("must specify only one of backend.memory.id or backend.file.id") + case cfg.Memory != nil, cfg.File != nil: + default: + return errors.New("must specify one of backend.memory.id or backend.file.id") + } + return nil +} diff --git a/libbeat/processors/cache/config_test.go b/libbeat/processors/cache/config_test.go new file mode 100644 index 00000000000..4a956caef02 --- /dev/null +++ b/libbeat/processors/cache/config_test.go @@ -0,0 +1,218 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "errors" + "testing" + + "github.com/elastic/go-ucfg/yaml" +) + +var validateTests = []struct { + name string + cfg string + want error +}{ + { + name: "put_file", + cfg: ` +backend: + file: + id: aidmaster +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: nil, + }, + { + name: "put_file_with_periodic_write_out", + cfg: ` +backend: + file: + id: aidmaster + write_interval: 15m +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: nil, + }, + { + name: "put_memory", + cfg: ` +backend: + memory: + id: aidmaster +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: nil, + }, + { + name: "get", + cfg: ` +backend: + file: + id: aidmaster +get: + key_field: crowdstrike.aid + target_field: crowdstrike.metadata +`, + want: nil, + }, + { + name: "delete", + cfg: ` +backend: + file: + id: aidmaster +delete: + key_field: crowdstrike.aid +`, + want: nil, + }, + { + name: "memory_no_id", + cfg: ` +backend: + memory: + id: '' +delete: + key_field: crowdstrike.aid +`, + want: errors.New("string value is not set accessing 'backend.memory.id'"), + }, + { + name: "file_no_id", + cfg: ` +backend: + file: + id: '' +delete: + key_field: crowdstrike.aid +`, + want: errors.New("string value is not set accessing 'backend.file.id'"), + }, + { + name: "no_op", + cfg: ` +backend: + file: + id: aidmaster +`, + want: errors.New("no operation specified for cache processor accessing config"), + }, + { + + name: "too_many_ops", + cfg: ` +backend: + file: + id: aidmaster +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +get: + key_field: crowdstrike.aid + target_field: crowdstrike.metadata +`, + want: errors.New("cannot specify multiple operations together in a cache processor accessing config"), + }, + { + + name: "no_backend", + cfg: ` +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: errors.New("missing required field accessing 'backend'"), + }, + { + + name: "incomplete_backend", + cfg: ` +backend: + file: ~ +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: errors.New("must specify one of backend.memory.id or backend.file.id accessing 'backend'"), + }, + { + + name: "too_many_backends", + cfg: ` +backend: + file: + id: aidmaster_f + memory: + id: aidmaster_m +put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata +`, + want: errors.New("must specify only one of backend.memory.id or backend.file.id accessing 'backend'"), + }, +} + +func TestValidate(t *testing.T) { + for _, test := range validateTests { + t.Run(test.name, func(t *testing.T) { + got := ucfgRigmarole(test.cfg) + if !sameError(got, test.want) { + t.Errorf("unexpected error: got:%v want:%v", got, test.want) + } + }) + } +} + +func ucfgRigmarole(text string) error { + c, err := yaml.NewConfig([]byte(text)) + if err != nil { + return err + } + cfg := defaultConfig() + err = c.Unpack(&cfg) + if err != nil { + return err + } + return cfg.Validate() +} + +func sameError(a, b error) bool { + switch { + case a == nil && b == nil: + return true + case a == nil, b == nil: + return false + default: + return a.Error() == b.Error() + } +} diff --git a/libbeat/processors/cache/docs/cache.asciidoc b/libbeat/processors/cache/docs/cache.asciidoc new file mode 100644 index 00000000000..6c5ccf2d197 --- /dev/null +++ b/libbeat/processors/cache/docs/cache.asciidoc @@ -0,0 +1,111 @@ +[[add-cached-metadata]] +=== Add cached metadata + +++++ +cache +++++ + +experimental[] + +The `cache` processor enriches events with information from a previously +cached events. + +[source,yaml] +------------------------------------------------------------------------------- +processors: + - cache: + backend: + memory: + id: cache_id + put: + key_field: join_key_field + value_field: source_field +------------------------------------------------------------------------------- + +[source,yaml] +------------------------------------------------------------------------------- +processors: + - cache: + backend: + memory: + id: cache_id + get: + key_field: join_key_field + target_field: destination_field +------------------------------------------------------------------------------- + +[source,yaml] +------------------------------------------------------------------------------- +processors: + - cache: + backend: + memory: + id: cache_id + delete: + key_field: join_key_field +------------------------------------------------------------------------------- + +The fields added to the target field will depend on the provider. + +It has the following settings: + +One of `backend.memory.id` or `backend.file.id` must be provided. + +`backend.capacity`:: The number of elements that can be stored in the cache. `put` operations that would cause the capacity to be exceeded will result in evictions of the oldest elements. Values at or below zero indicate no limit. The capacity should not be lower than the number of elements that are expected to be referenced when processing the input as evicted elements are lost. The default is `0`, no limit. +`backend.memory.id`:: The ID of a memory-based cache. Use the same ID across instance to reference the same cache. +`backend.file.id`:: The ID of a file-based cache. Use the same ID across instance to reference the same cache. +`backend.file.write_period`:: The interval between periodic cache writes to the backing file. Valid time units are h, m, s, ms, us/µs and ns. Periodic writes are only made if `backend.file.write_period` is greater than zero. The contents are always written out to the backing file when the processor is closed. Default is zero, no periodic writes. + +One of `put`, `get` or `delete` must be provided. + +`put.key_field`:: Name of the field containing the key to put into the cache. Required if `put` is present. +`put.value_field`:: Name of the field containing the value to put into the cache. Required if `put` is present. +`put.ttl`:: The TTL to associate with the cached key/value. Valid time units are h, m, s, ms, us/µs and ns. Required if `put` is present. + +`get.key_field`:: Name of the field containing the key to get. Required if `get` is present. +`get.target_field`:: Name of the field to which the cached value will be written. Required if `get` is present. + +`delete.key_field`:: Name of the field containing the key to delete. Required if `delete` is present. + +`ignore_missing`:: (Optional) When set to `false`, events that don't contain any +of the fields in `match_keys` will be discarded and an error will be generated. By +default, this condition is ignored. + +`overwrite_keys`:: (Optional) By default, if a target field already exists, it +will not be overwritten and an error will be logged. If `overwrite_keys` is +set to `true`, this condition will be ignored. + +The `cache` processor can be used to perform joins within the Beat between +documents within an event stream. + +[source,yaml] +------------------------------------------------------------------------------- +processors: + - if: + contains: + log.file.path: fdrv2/aidmaster + then: + - cache: + backend: + memory: + id: aidmaster + capacity: 10000 + put: + ttl: 168h + key_field: crowdstrike.aid + value_field: crowdstrike.metadata + else: + - cache: + backend: + memory: + id: aidmaster + get: + key_field: crowdstrike.aid + target_field: crowdstrike.metadata +------------------------------------------------------------------------------- + +This would enrich an event events with `log.file.path` not equal to +"fdrv2/aidmaster" with the `crowdstrike.metadata` fields from events with + `log.file.path` equal to that value where the `crowdstrike.aid` field + matches between the source and destination documents. The capacity allows up + to 10,000 metadata object to be cached between `put` and `get` operations. diff --git a/libbeat/processors/cache/file_store.go b/libbeat/processors/cache/file_store.go new file mode 100644 index 00000000000..1ab4ab21ae4 --- /dev/null +++ b/libbeat/processors/cache/file_store.go @@ -0,0 +1,300 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "container/heap" + "context" + "encoding/json" + "errors" + "io" + "io/fs" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/paths" +) + +var fileStores = fileStoreSet{stores: map[string]*fileStore{}} + +// fileStoreSet is a collection of shared fileStore caches. +type fileStoreSet struct { + mu sync.Mutex + stores map[string]*fileStore +} + +// get returns a fileStore cache with the provided ID based on the config. +// If a fileStore with the ID already exist, its configuration is adjusted +// and its reference count is increased. The returned context.CancelFunc +// reduces the reference count and deletes the fileStore from the set if the +// count reaches zero. +func (s *fileStoreSet) get(id string, cfg config, log *logp.Logger) (*fileStore, context.CancelFunc) { + s.mu.Lock() + defer s.mu.Unlock() + store, ok := s.stores[id] + if !ok { + store = newFileStore(cfg, id, pathFromConfig(cfg, log), log) + s.stores[store.id] = store + } + store.add(cfg) + + return store, func() { + store.dropFrom(s) + } +} + +// pathFromConfig returns the mapping form a config to a file-system path. +func pathFromConfig(cfg config, log *logp.Logger) string { + path := filepath.Join(paths.Resolve(paths.Data, "cache_processor"), cleanFilename(cfg.Store.File.ID)) + log.Infow("mapping file-backed cache processor config to file path", "id", cfg.Store.File.ID, "path", path) + return path +} + +// cleanFilename replaces illegal printable characters (and space or dot) in +// filenames, with underscore. +func cleanFilename(s string) string { + return pathCleaner.Replace(s) +} + +var pathCleaner = strings.NewReplacer( + "/", "_", + "<", "_", + ">", "_", + ":", "_", + `"`, "_", + "/", "_", + `\`, "_", + "|", "_", + "?", "_", + "*", "_", + ".", "_", + " ", "_", +) + +// free removes the fileStore with the given ID from the set. free is safe +// for concurrent use. +func (s *fileStoreSet) free(id string) { + s.mu.Lock() + delete(s.stores, id) + s.mu.Unlock() +} + +// fileStore is a file-backed cache store. +type fileStore struct { + memStore + + path string + // cancel stops periodic write out operations. + // Write out operations are protected by the + // memStore's mutex. + cancel context.CancelFunc + + log *logp.Logger +} + +// newFileStore returns a new fileStore configured to apply the give TTL duration. +// The fileStore is guaranteed not to grow larger than cap elements. id is the +// look-up into the global cache store the fileStore is held in. +func newFileStore(cfg config, id, path string, log *logp.Logger) *fileStore { + s := fileStore{ + path: path, + log: log, + memStore: memStore{ + id: id, + cache: make(map[string]*CacheEntry), + + // Mark the ttl as invalid until we have had a put + // operation configured. While the shared backing + // data store is incomplete, and has no put operation + // defined, the TTL will be invalid, but will never + // be accessed since all time operations outside put + // refer to absolute times, held by the CacheEntry. + ttl: -1, + cap: -1, + effort: -1, + }, + } + s.cancel = noop + if cfg.Store.File.WriteOutEvery > 0 { + var ctx context.Context + ctx, s.cancel = context.WithCancel(context.Background()) + go s.periodicWriteOut(ctx, cfg.Store.File.WriteOutEvery) + } + s.readState() + return &s +} + +func (c *fileStore) String() string { return "file:" + c.id } + +// dropFrom decreases the reference count for the fileStore and removes it from +// the stores map if the count is zero. dropFrom is safe for concurrent use. +func (c *fileStore) dropFrom(stores *fileStoreSet) { + c.mu.Lock() + c.refs-- + if c.refs < 0 { + panic("invalid reference count") + } + if c.refs == 0 { + // Stop periodic writes + c.cancel() + // and do a final write out. + c.writeState(true) + + stores.free(c.id) + // GC assists. + c.cache = nil + c.expiries = nil + } + c.mu.Unlock() +} + +func (c *fileStore) readState() { + f, err := os.Open(c.path) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + c.log.Debugw("no state on file system", "error", err) + } else { + c.log.Errorw("failed to open file to read state", "error", err) + } + return + } + defer f.Close() + + // It would be nice to be able at this stage to determine + // whether the file is stale past the TTL of the cache, but + // we do not have this information yet. So we must read + // through all the elements. If any survive the filter, we + // were alive, otherwise delete the file. + + dec := json.NewDecoder(f) + for { + var e CacheEntry + err = dec.Decode(&e) + if err != nil { + if err != io.EOF { + switch err := err.(type) { + case *json.SyntaxError: + c.log.Errorw("failed to read state element", "error", err, "path", c.path, "offset", err.Offset) + default: + c.log.Errorw("failed to read state element", "error", err, "path", c.path) + } + } + break + } + if e.Expires.Before(time.Now()) { + // Don't retain expired elements. + c.dirty = true // The cache now does not reflect the file. + continue + } + c.cache[e.Key] = &e + heap.Push(&c.expiries, &e) + } + + if len(c.cache) != 0 { + return + } + // We had no live entries, so delete the file. + err = os.Remove(c.path) + if err != nil { + c.log.Errorw("failed to delete stale cache file", "error", err) + } +} + +// periodicWriteOut writes the cache contents to the backing file at the +// specified interval until the context is cancelled. periodicWriteOut is +// safe for concurrent use. +func (c *fileStore) periodicWriteOut(ctx context.Context, every time.Duration) { + tick := time.NewTicker(every) + defer tick.Stop() + for { + select { + case <-tick.C: + c.mu.Lock() + c.writeState(false) + c.mu.Unlock() + case <-ctx.Done(): + return + } + } +} + +// writeState writes the current cache state to the backing file. +// If final is true and the cache is empty, the file will be deleted. +func (c *fileStore) writeState(final bool) { + if !c.dirty { + return + } + if len(c.cache) == 0 && final { + err := os.Remove(c.path) + if err != nil { + c.log.Errorw("failed to delete write state when empty", "error", err) + } + return + } + f, err := os.CreateTemp(filepath.Dir(c.path), filepath.Base(c.path)+"-*.tmp") + if err != nil { + c.log.Errorw("failed to open file to write state", "error", err) + return + } + // Try to make sure we are private. + err = os.Chmod(f.Name(), 0o600) + if err != nil { + c.log.Errorw("failed to set state file mode", "error", err) + return + } + tmp := f.Name() + defer func() { + err = f.Sync() + if err != nil { + c.log.Errorw("failed to sync file after writing state", "error", err) + return + } + err = f.Close() + if err != nil { + c.log.Errorw("failed to close file after writing state", "error", err) + return + } + // Try to be atomic. + err = os.Rename(tmp, c.path) + if err != nil { + c.log.Errorw("failed to finalize writing state", "error", err) + } + }() + + enc := json.NewEncoder(f) + enc.SetEscapeHTML(false) + now := time.Now() + for c.expiries.Len() != 0 { + e := c.expiries.pop() + if e.Expires.Before(now) { + // Don't write expired elements. + continue + } + err = enc.Encode(e) + if err != nil { + c.log.Errorw("failed to write state element", "error", err) + return + } + } + // Only mark as not dirty if we succeeded in the write. + c.dirty = false +} diff --git a/libbeat/processors/cache/file_store_test.go b/libbeat/processors/cache/file_store_test.go new file mode 100644 index 00000000000..22d43083e04 --- /dev/null +++ b/libbeat/processors/cache/file_store_test.go @@ -0,0 +1,462 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/fs" + "os" + "path/filepath" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + + "github.com/elastic/elastic-agent-libs/logp" +) + +var keep = flag.Bool("keep", false, "keep testdata after test complete") + +type fileStoreTestSteps struct { + doTo func(*fileStore) error + want *fileStore +} + +//nolint:errcheck // Paul Hogan was right. +var fileStoreTests = []struct { + name string + cfg config + want *fileStore + steps []fileStoreTestSteps + wantPersisted []*CacheEntry +}{ + { + name: "new_put", + cfg: config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + }, + want: &fileStore{path: "testdata/new_put", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + { + name: "new_get", + cfg: config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &fileStore{path: "testdata/new_get", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }}, + }, + { + name: "new_delete", + cfg: config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Delete: &delConfig{}, + }, + want: &fileStore{path: "testdata/new_delete", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }}, + }, + { + name: "new_get_add_put", + cfg: config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &fileStore{path: "testdata/new_get_add_put", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + // TTL, capacity and effort are set only by put. + refs: 1, + ttl: -1, + cap: -1, + effort: -1, + }}, + steps: []fileStoreTestSteps{ + 0: { + doTo: func(s *fileStore) error { + putCfg := config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + } + s.add(putCfg) + return nil + }, + want: &fileStore{path: "testdata/new_get_add_put", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 2, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + }, + }, + { + name: "ensemble", + cfg: config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }}, + steps: []fileStoreTestSteps{ + 0: { + doTo: func(s *fileStore) error { + putCfg := config{ + Store: &storeConfig{ + File: &fileConfig{ID: "test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + } + s.add(putCfg) + return nil + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 2, + dirty: false, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 1: { + doTo: func(s *fileStore) error { + s.Put("one", 1) + s.Put("two", 2) + s.Put("three", 3) + return nil + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "two": {Key: "two", Value: int(2), index: 1}, + "three": {Key: "three", Value: int(3), index: 2}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "two", Value: int(2), index: 1}, + {Key: "three", Value: int(3), index: 2}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 2: { + doTo: func(s *fileStore) error { + got, err := s.Get("two") + if got != 2 { + return fmt.Errorf(`unexpected result from Get("two"): got:%v want:2`, got) + } + return err + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "two": {Key: "two", Value: int(2), index: 1}, + "three": {Key: "three", Value: int(3), index: 2}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "two", Value: int(2), index: 1}, + {Key: "three", Value: int(3), index: 2}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 3: { + doTo: func(s *fileStore) error { + return s.Delete("two") + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 4: { + doTo: func(s *fileStore) error { + got, _ := s.Get("two") + if got != nil { + return fmt.Errorf(`unexpected result from Get("two") after deletion: got:%v want:nil`, got) + } + return nil + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 5: { + doTo: func(s *fileStore) error { + s.dropFrom(&fileStores) + if !fileStores.has(s.id) { + return fmt.Errorf("%q fileStore not found after single close", s.id) + } + return nil + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 1, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + 6: { + doTo: func(s *fileStore) error { + s.dropFrom(&fileStores) + if fileStores.has(s.id) { + return fmt.Errorf("%q fileStore still found after double close", s.id) + } + return nil + }, + want: &fileStore{path: "testdata/ensemble", memStore: memStore{ + id: "test", + cache: nil, // assistively nil-ed. + expiries: nil, // assistively nil-ed. + refs: 0, + dirty: false, + ttl: time.Second, + cap: 1000, + effort: 10, + }}, + }, + }, + wantPersisted: []*CacheEntry{ + // Numeric values are float due to JSON round-trip. + {Key: "one", Value: 1.0}, + {Key: "three", Value: 3.0}, + }, + }, +} + +func TestFileStore(t *testing.T) { + err := os.RemoveAll("testdata") + if err != nil && !errors.Is(err, fs.ErrNotExist) { + t.Fatalf("failed to clear testdata directory: %v", err) + } + err = os.Mkdir("testdata", 0o755) + if err != nil && !errors.Is(err, fs.ErrExist) { + t.Fatalf("failed to create testdata directory: %v", err) + } + if !*keep { + t.Cleanup(func() { os.RemoveAll("testdata") }) + } + + allow := cmp.AllowUnexported(fileStore{}, memStore{}, CacheEntry{}) + ignoreInFileStore := cmpopts.IgnoreFields(fileStore{}, "cancel", "log") + ignoreInMemStore := cmpopts.IgnoreFields(memStore{}, "mu") + ignoreInCacheEntry := cmpopts.IgnoreFields(CacheEntry{}, "Expires") + + for _, test := range fileStoreTests { + t.Run(test.name, func(t *testing.T) { + // Construct the store and put in into the stores map as + // we would if we were calling Run. + path := filepath.Join("testdata", test.name) + store := newFileStore(test.cfg, test.cfg.Store.File.ID, path, logp.L()) + store.add(test.cfg) + fileStores.add(store) + + if !cmp.Equal(test.want, store, allow, ignoreInFileStore, ignoreInMemStore) { + t.Errorf("unexpected new fileStore result:\n--- want\n+++ got\n%s", + cmp.Diff(test.want, store, allow, ignoreInFileStore, ignoreInMemStore)) + } + for i, step := range test.steps { + err := step.doTo(store) + if err != nil { + t.Errorf("unexpected error at step %d: %v", i, err) + } + if !cmp.Equal(step.want, store, allow, ignoreInFileStore, ignoreInMemStore, ignoreInCacheEntry) { + t.Errorf("unexpected fileStore step %d result:\n--- want\n+++ got\n%s", + i, cmp.Diff(step.want, store, allow, ignoreInFileStore, ignoreInMemStore, ignoreInCacheEntry)) + } + } + if test.wantPersisted == nil { + return + } + + f, err := os.Open(path) + if err != nil { + t.Fatalf("failed to open persisted data: %v", err) + } + defer f.Close() + dec := json.NewDecoder(f) + var got []*CacheEntry + for { + var e CacheEntry + err = dec.Decode(&e) + if err != nil { + if err != io.EOF { + t.Fatalf("unexpected error reading persisted cache data: %v", err) + } + break + } + got = append(got, &e) + } + if !cmp.Equal(test.wantPersisted, got, allow, ignoreInCacheEntry) { + t.Errorf("unexpected persisted state:\n--- want\n+++ got\n%s", + cmp.Diff(test.wantPersisted, got, allow, ignoreInCacheEntry)) + } + wantCache := make(map[string]*CacheEntry) + for _, e := range got { + wantCache[e.Key] = e + } + store = newFileStore(test.cfg, test.cfg.Store.File.ID, path, logp.L()) + // Specialise the in cache entry ignore list to include index. + ignoreMoreInCacheEntry := cmpopts.IgnoreFields(CacheEntry{}, "Expires", "index") + if !cmp.Equal(wantCache, store.cache, allow, ignoreMoreInCacheEntry) { + t.Errorf("unexpected restored state:\n--- want\n+++ got\n%s", + cmp.Diff(wantCache, store.cache, allow, ignoreMoreInCacheEntry)) + } + for k, e := range store.cache { + if e.index < 0 || len(store.expiries) <= e.index { + t.Errorf("cache entry %s index out of bounds: got:%d [0,%d)", k, e.index, len(store.expiries)) + continue + } + if !cmp.Equal(e, store.expiries[e.index], allow, ignoreInCacheEntry) { + t.Errorf("unexpected mismatched cache/expiry state %s:\n--- want\n+++ got\n%s", + k, cmp.Diff(e, store.expiries[e.index], allow, ignoreInCacheEntry)) + } + } + }) + } +} + +// add adds the store to the set. It is used only for testing. +func (s *fileStoreSet) add(store *fileStore) { + s.mu.Lock() + s.stores[store.id] = store + s.mu.Unlock() +} + +// has returns whether the store exists in the set. It is used only for testing. +func (s *fileStoreSet) has(id string) bool { + s.mu.Lock() + _, ok := s.stores[id] + s.mu.Unlock() + return ok +} diff --git a/libbeat/processors/cache/mem_store.go b/libbeat/processors/cache/mem_store.go new file mode 100644 index 00000000000..a2fec841d27 --- /dev/null +++ b/libbeat/processors/cache/mem_store.go @@ -0,0 +1,258 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "container/heap" + "context" + "sync" + "time" +) + +var memStores = memStoreSet{stores: map[string]*memStore{}} + +// memStoreSet is a collection of shared memStore caches. +type memStoreSet struct { + mu sync.Mutex + stores map[string]*memStore +} + +// get returns a memStore cache with the provided ID based on the config. +// If a memStore with the ID already exist, its configuration is adjusted +// and its reference count is increased. The returned context.CancelFunc +// reduces the reference count and deletes the memStore from the set if the +// count reaches zero. +func (s *memStoreSet) get(id string, cfg config) (*memStore, context.CancelFunc) { + s.mu.Lock() + defer s.mu.Unlock() + store, ok := s.stores[id] + if !ok { + store = newMemStore(cfg, id) + s.stores[store.id] = store + } + store.add(cfg) + + return store, func() { + store.dropFrom(s) + } +} + +// free removes the memStore with the given ID from the set. free is safe +// for concurrent use. +func (s *memStoreSet) free(id string) { + s.mu.Lock() + delete(s.stores, id) + s.mu.Unlock() +} + +// memStore is a memory-backed cache store. +type memStore struct { + mu sync.Mutex + cache map[string]*CacheEntry + expiries expiryHeap + ttl time.Duration // ttl is the time entries are valid for in the cache. + refs int // refs is the number of processors referring to this store. + // dirty marks the cache as changed from the + // state in a backing file if it exists. + dirty bool + + // id is the index into global cache store for the cache. + id string + + // cap is the maximum number of elements the cache + // will hold. If not positive, no limit. + cap int + // effort is the number of entries to examine during + // expired element eviction. If not positive, full effort. + effort int +} + +// newMemStore returns a new memStore configured to apply the give TTL duration. +// The memStore is guaranteed not to grow larger than cap elements. id is the +// look-up into the global cache store the memStore is held in. +func newMemStore(cfg config, id string) *memStore { + return &memStore{ + id: id, + cache: make(map[string]*CacheEntry), + + // Mark the ttl as invalid until we have had a put + // operation configured. While the shared backing + // data store is incomplete, and has no put operation + // defined, the TTL will be invalid, but will never + // be accessed since all time operations outside put + // refer to absolute times, held by the CacheEntry. + ttl: -1, + cap: -1, + effort: -1, + } +} + +func (c *memStore) String() string { return "memory:" + c.id } + +// add updates the receiver for a new operation. It increases the reference +// count for the receiver, and if the config is a put operation and has no +// previous put operation defined, the TTL, cap and effort will be set from +// cfg. add is safe for concurrent use. +func (c *memStore) add(cfg config) { + c.mu.Lock() + defer c.mu.Unlock() + c.refs++ + + // We may have already constructed the store with + // a get or a delete config, so set the TTL, cap + // and effort if we have a put config. If another + // put config has already been included, we ignore + // the put options now. + if cfg.Put == nil { + return + } + if c.ttl == -1 { + // putConfig.TTL is a required field, so we don't + // need to check for nil-ness. + c.ttl = *cfg.Put.TTL + c.cap = cfg.Store.Capacity + c.effort = cfg.Store.Effort + } +} + +// dropFrom decreases the reference count for the memStore and removes it from +// the stores map if the count is zero. dropFrom is safe for concurrent use. +func (c *memStore) dropFrom(stores *memStoreSet) { + c.mu.Lock() + c.refs-- + if c.refs < 0 { + panic("invalid reference count") + } + if c.refs == 0 { + stores.free(c.id) + // GC assists. + c.cache = nil + c.expiries = nil + } + c.mu.Unlock() +} + +// Get returns the cached value associated with the provided key. If there is +// no value for the key, or the value has expired Get returns ErrNoData. Get +// is safe for concurrent use. +func (c *memStore) Get(key string) (any, error) { + c.mu.Lock() + defer c.mu.Unlock() + v, ok := c.cache[key] + if !ok { + return nil, ErrNoData + } + if time.Now().After(v.Expires) { + delete(c.cache, key) + return nil, ErrNoData + } + return v.Value, nil +} + +// Put stores the provided value in the cache associated with the given key. +// The value is given an expiry time based on the configured TTL of the cache. +// Put is safe for concurrent use. +func (c *memStore) Put(key string, val any) error { + c.mu.Lock() + defer c.mu.Unlock() + now := time.Now() + c.evictExpired(now) + e := &CacheEntry{ + Key: key, + Value: val, + Expires: now.Add(c.ttl), + } + c.cache[key] = e + heap.Push(&c.expiries, e) + c.dirty = true + return nil +} + +// evictExpired removes up to effort elements from the cache when the cache +// is below capacity, retaining all elements that have not expired. If the +// cache is at or above capacity, the oldest elements are removed to bring +// it under the capacity limit. +func (c *memStore) evictExpired(now time.Time) { + for n := 0; (c.effort <= 0 || n < c.effort) && len(c.cache) != 0; n++ { + if c.expiries[0].Expires.After(now) { + break + } + e := c.expiries.pop() + delete(c.cache, e.Key) + } + if c.cap <= 0 { + // No cap, so depend on effort. + return + } + for len(c.cache) >= c.cap { + e := c.expiries.pop() + delete(c.cache, e.Key) + } +} + +// Delete removes the value associated with the provided key from the cache. +// Delete is safe for concurrent use. +func (c *memStore) Delete(key string) error { + c.mu.Lock() + defer c.mu.Unlock() + v, ok := c.cache[key] + if !ok { + return nil + } + heap.Remove(&c.expiries, v.index) + delete(c.cache, key) + c.dirty = true + return nil +} + +var _ heap.Interface = (*expiryHeap)(nil) + +// expiryHeap is a min-date heap. +// +// TODO: This could be a queue instead, though deletion becomes more +// complicated in that case. +type expiryHeap []*CacheEntry + +func (h *expiryHeap) pop() *CacheEntry { + e := heap.Pop(h).(*CacheEntry) + e.index = -1 + return e +} + +func (h expiryHeap) Len() int { + return len(h) +} +func (h expiryHeap) Less(i, j int) bool { + return h[i].Expires.Before(h[j].Expires) +} +func (h expiryHeap) Swap(i, j int) { + h[i], h[j] = h[j], h[i] + h[i].index = i + h[j].index = j +} +func (h *expiryHeap) Push(v any) { + e := v.(*CacheEntry) + e.index = len(*h) + *h = append(*h, e) +} +func (h *expiryHeap) Pop() any { + v := (*h)[len(*h)-1] + (*h)[len(*h)-1] = nil // Help GC. + *h = (*h)[:len(*h)-1] + return v +} diff --git a/libbeat/processors/cache/mem_store_test.go b/libbeat/processors/cache/mem_store_test.go new file mode 100644 index 00000000000..4a6cf500e05 --- /dev/null +++ b/libbeat/processors/cache/mem_store_test.go @@ -0,0 +1,386 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cache + +import ( + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" +) + +type memStoreTestSteps struct { + doTo func(*memStore) error + want *memStore +} + +//nolint:errcheck // Paul Hogan was right. +var memStoreTests = []struct { + name string + cfg config + want *memStore + steps []memStoreTestSteps +}{ + { + name: "new_put", + cfg: config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + { + name: "new_get", + cfg: config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }, + }, + { + name: "new_delete", + cfg: config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Delete: &delConfig{}, + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }, + }, + { + name: "new_get_add_put", + cfg: config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + // TTL, capacity and effort are set only by put. + refs: 1, + ttl: -1, + cap: -1, + effort: -1, + }, + steps: []memStoreTestSteps{ + 0: { + doTo: func(s *memStore) error { + putCfg := config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + } + s.add(putCfg) + return nil + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 2, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + }, + }, + { + name: "ensemble", + cfg: config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Get: &getConfig{}, + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 1, + // TTL, capacity and effort are set only by put. + ttl: -1, + cap: -1, + effort: -1, + }, + steps: []memStoreTestSteps{ + 0: { + doTo: func(s *memStore) error { + putCfg := config{ + Store: &storeConfig{ + Memory: &memConfig{"test"}, + Capacity: 1000, + Effort: 10, + }, + Put: &putConfig{ + TTL: ptrTo(time.Second), + }, + } + s.add(putCfg) + return nil + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{}, + refs: 2, + dirty: false, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 1: { + doTo: func(s *memStore) error { + s.Put("one", 1) + s.Put("two", 2) + s.Put("three", 3) + return nil + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "two": {Key: "two", Value: int(2), index: 1}, + "three": {Key: "three", Value: int(3), index: 2}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "two", Value: int(2), index: 1}, + {Key: "three", Value: int(3), index: 2}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 2: { + doTo: func(s *memStore) error { + got, err := s.Get("two") + if got != 2 { + return fmt.Errorf(`unexpected result from Get("two"): got:%v want:2`, got) + } + return err + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "two": {Key: "two", Value: int(2), index: 1}, + "three": {Key: "three", Value: int(3), index: 2}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "two", Value: int(2), index: 1}, + {Key: "three", Value: int(3), index: 2}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 3: { + doTo: func(s *memStore) error { + return s.Delete("two") + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 4: { + doTo: func(s *memStore) error { + got, _ := s.Get("two") + if got != nil { + return fmt.Errorf(`unexpected result from Get("two") after deletion: got:%v want:nil`, got) + } + return nil + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 2, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 5: { + doTo: func(s *memStore) error { + s.dropFrom(&memStores) + if !memStores.has(s.id) { + return fmt.Errorf("%q memStore not found after single close", s.id) + } + return nil + }, + want: &memStore{ + id: "test", + cache: map[string]*CacheEntry{ + "one": {Key: "one", Value: int(1), index: 0}, + "three": {Key: "three", Value: int(3), index: 1}, + }, + expiries: expiryHeap{ + {Key: "one", Value: int(1), index: 0}, + {Key: "three", Value: int(3), index: 1}, + }, + refs: 1, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + 6: { + doTo: func(s *memStore) error { + s.dropFrom(&memStores) + if memStores.has(s.id) { + return fmt.Errorf("%q memStore still found after double close", s.id) + } + return nil + }, + want: &memStore{ + id: "test", + cache: nil, // assistively nil-ed. + expiries: nil, // assistively nil-ed. + refs: 0, + dirty: true, + ttl: time.Second, + cap: 1000, + effort: 10, + }, + }, + }, + }, +} + +func TestMemStore(t *testing.T) { + allow := cmp.AllowUnexported(memStore{}, CacheEntry{}) + ignoreInMemStore := cmpopts.IgnoreFields(memStore{}, "mu") + ignoreInCacheEntry := cmpopts.IgnoreFields(CacheEntry{}, "Expires") + + for _, test := range memStoreTests { + t.Run(test.name, func(t *testing.T) { + // Construct the store and put in into the stores map as + // we would if we were calling Run. + store := newMemStore(test.cfg, test.cfg.Store.Memory.ID) + store.add(test.cfg) + memStores.add(store) + + if !cmp.Equal(test.want, store, allow, ignoreInMemStore) { + t.Errorf("unexpected new memStore result:\n--- want\n+++ got\n%s", + cmp.Diff(test.want, store, allow, ignoreInMemStore)) + } + for i, step := range test.steps { + err := step.doTo(store) + if err != nil { + t.Errorf("unexpected error at step %d: %v", i, err) + } + if !cmp.Equal(step.want, store, allow, ignoreInMemStore, ignoreInCacheEntry) { + t.Errorf("unexpected memStore step %d result:\n--- want\n+++ got\n%s", + i, cmp.Diff(step.want, store, allow, ignoreInMemStore, ignoreInCacheEntry)) + } + } + }) + } +} + +// add adds the store to the set. It is used only for testing. +func (s *memStoreSet) add(store *memStore) { + s.mu.Lock() + s.stores[store.id] = store + s.mu.Unlock() +} + +// has returns whether the store exists in the set. It is used only for testing. +func (s *memStoreSet) has(id string) bool { + s.mu.Lock() + _, ok := s.stores[id] + s.mu.Unlock() + return ok +} + +func ptrTo[T any](v T) *T { return &v } diff --git a/libbeat/processors/ratelimit/docs/rate_limit.asciidoc b/libbeat/processors/ratelimit/docs/rate_limit.asciidoc index 9a7a2f32322..aa847ea4292 100644 --- a/libbeat/processors/ratelimit/docs/rate_limit.asciidoc +++ b/libbeat/processors/ratelimit/docs/rate_limit.asciidoc @@ -1,6 +1,5 @@ [[rate-limit]] === Rate limit the flow of events -beta[] ++++ rate_limit diff --git a/libbeat/processors/syslog/syslog.go b/libbeat/processors/syslog/syslog.go index 834af6953f7..96c21d3d773 100644 --- a/libbeat/processors/syslog/syslog.go +++ b/libbeat/processors/syslog/syslog.go @@ -89,6 +89,7 @@ func init() { "ignore_missing", "ignore_failure", "tag", + "when", ), ), ) diff --git a/libbeat/reader/readfile/fs_metafields_other.go b/libbeat/reader/readfile/fs_metafields_other.go index 425b7435fe8..cc764c4bbcc 100644 --- a/libbeat/reader/readfile/fs_metafields_other.go +++ b/libbeat/reader/readfile/fs_metafields_other.go @@ -22,6 +22,7 @@ package readfile import ( "fmt" "os" + "strconv" "github.com/elastic/beats/v7/libbeat/common/file" "github.com/elastic/elastic-agent-libs/mapstr" @@ -34,11 +35,11 @@ const ( func setFileSystemMetadata(fi os.FileInfo, fields mapstr.M) error { osstate := file.GetOSState(fi) - _, err := fields.Put(deviceIDKey, osstate.Device) + _, err := fields.Put(deviceIDKey, strconv.FormatUint(osstate.Device, 10)) if err != nil { return fmt.Errorf("failed to set %q: %w", deviceIDKey, err) } - _, err = fields.Put(inodeKey, osstate.Inode) + _, err = fields.Put(inodeKey, osstate.InodeString()) if err != nil { return fmt.Errorf("failed to set %q: %w", inodeKey, err) } diff --git a/libbeat/reader/readfile/fs_metafields_windows.go b/libbeat/reader/readfile/fs_metafields_windows.go index 113a74cf829..97bfd5c72de 100644 --- a/libbeat/reader/readfile/fs_metafields_windows.go +++ b/libbeat/reader/readfile/fs_metafields_windows.go @@ -20,6 +20,7 @@ package readfile import ( "fmt" "os" + "strconv" "github.com/elastic/beats/v7/libbeat/common/file" "github.com/elastic/elastic-agent-libs/mapstr" @@ -33,15 +34,15 @@ const ( func setFileSystemMetadata(fi os.FileInfo, fields mapstr.M) error { osstate := file.GetOSState(fi) - _, err := fields.Put(idxhiKey, osstate.IdxHi) + _, err := fields.Put(idxhiKey, strconv.FormatUint(osstate.IdxHi, 10)) if err != nil { return fmt.Errorf("failed to set %q: %w", idxhiKey, err) } - _, err = fields.Put(idxloKey, osstate.IdxLo) + _, err = fields.Put(idxloKey, strconv.FormatUint(osstate.IdxLo, 10)) if err != nil { return fmt.Errorf("failed to set %q: %w", idxloKey, err) } - _, err = fields.Put(volKey, osstate.Vol) + _, err = fields.Put(volKey, strconv.FormatUint(osstate.Vol, 10)) if err != nil { return fmt.Errorf("failed to set %q: %w", volKey, err) } diff --git a/libbeat/reader/readfile/metafields_other_test.go b/libbeat/reader/readfile/metafields_other_test.go index 7874d24d4ae..b9d25b85420 100644 --- a/libbeat/reader/readfile/metafields_other_test.go +++ b/libbeat/reader/readfile/metafields_other_test.go @@ -44,13 +44,13 @@ func checkFields(t *testing.T, expected, actual mapstr.M) { dev, err := actual.GetValue(deviceIDKey) require.NoError(t, err) - require.Equal(t, uint64(17), dev) + require.Equal(t, "17", dev) err = actual.Delete(deviceIDKey) require.NoError(t, err) inode, err := actual.GetValue(inodeKey) require.NoError(t, err) - require.Equal(t, uint64(999), inode) + require.Equal(t, "999", inode) err = actual.Delete(inodeKey) require.NoError(t, err) diff --git a/libbeat/reader/readfile/metafields_windows_test.go b/libbeat/reader/readfile/metafields_windows_test.go index 37ff5cb4bda..dce0b8d2161 100644 --- a/libbeat/reader/readfile/metafields_windows_test.go +++ b/libbeat/reader/readfile/metafields_windows_test.go @@ -52,19 +52,19 @@ func checkFields(t *testing.T, expected, actual mapstr.M) { idxhi, err := actual.GetValue(idxhiKey) require.NoError(t, err) - require.Equal(t, uint64(100), idxhi) + require.Equal(t, "100", idxhi) err = actual.Delete(idxhiKey) require.NoError(t, err) idxlo, err := actual.GetValue(idxloKey) require.NoError(t, err) - require.Equal(t, uint64(200), idxlo) + require.Equal(t, "200", idxlo) err = actual.Delete(idxloKey) require.NoError(t, err) vol, err := actual.GetValue(volKey) require.NoError(t, err) - require.Equal(t, uint64(300), vol) + require.Equal(t, "300", vol) err = actual.Delete(volKey) require.NoError(t, err) diff --git a/libbeat/template/config.go b/libbeat/template/config.go index 9e8a2c24632..db2c688d1c1 100644 --- a/libbeat/template/config.go +++ b/libbeat/template/config.go @@ -42,8 +42,9 @@ type TemplateConfig struct { // TemplateSettings are part of the Elasticsearch template and hold index and source specific information. type TemplateSettings struct { - Index map[string]interface{} `config:"index"` - Source map[string]interface{} `config:"_source"` + Index map[string]interface{} `config:"index"` + Source map[string]interface{} `config:"_source"` + Lifecycle map[string]interface{} `config:"lifecycle"` } // DefaultConfig for index template diff --git a/libbeat/template/load.go b/libbeat/template/load.go index 70afe7df09c..c2c1375664d 100644 --- a/libbeat/template/load.go +++ b/libbeat/template/load.go @@ -26,6 +26,7 @@ import ( "os" "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/paths" @@ -39,9 +40,10 @@ type Loader interface { // ESLoader implements Loader interface for loading templates to Elasticsearch. type ESLoader struct { - client ESClient - builder *templateBuilder - log *logp.Logger + client ESClient + lifecycleClient lifecycle.ClientHandler + builder *templateBuilder + log *logp.Logger } // ESClient is a subset of the Elasticsearch client API capable of @@ -49,6 +51,7 @@ type ESLoader struct { type ESClient interface { Request(method, path string, pipeline string, params map[string]string, body interface{}) (int, []byte, error) GetVersion() version.V + IsServerless() bool } // FileLoader implements Loader interface for loading templates to a File. @@ -69,30 +72,34 @@ type StatusError struct { } type templateBuilder struct { - log *logp.Logger + log *logp.Logger + isServerless bool } // NewESLoader creates a new template loader for ES -func NewESLoader(client ESClient) *ESLoader { - return &ESLoader{client: client, builder: newTemplateBuilder(), log: logp.NewLogger("template_loader")} +func NewESLoader(client ESClient, lifecycleClient lifecycle.ClientHandler) (*ESLoader, error) { + if client == nil { + return nil, errors.New("can not load template without active Elasticsearch client") + } + return &ESLoader{client: client, lifecycleClient: lifecycleClient, + builder: newTemplateBuilder(client.IsServerless()), log: logp.NewLogger("template_loader")}, nil } // NewFileLoader creates a new template loader for the given file. -func NewFileLoader(c FileClient) *FileLoader { - return &FileLoader{client: c, builder: newTemplateBuilder(), log: logp.NewLogger("file_template_loader")} +func NewFileLoader(c FileClient, isServerless bool) *FileLoader { + // other components of the file loader will fail if both ILM and DSL are set, + // so at this point it's fairly safe to just pass cfg.DSL.Enabled + return &FileLoader{client: c, builder: newTemplateBuilder(isServerless), log: logp.NewLogger("file_template_loader")} } -func newTemplateBuilder() *templateBuilder { - return &templateBuilder{log: logp.NewLogger("template")} +func newTemplateBuilder(serverlessMode bool) *templateBuilder { + return &templateBuilder{log: logp.NewLogger("template"), isServerless: serverlessMode} } // Load checks if the index mapping template should be loaded. // In case the template is not already loaded or overwriting is enabled, the // template is built and written to index. func (l *ESLoader) Load(config TemplateConfig, info beat.Info, fields []byte, migration bool) error { - if l.client == nil { - return errors.New("can not load template without active Elasticsearch client") - } // build template from config tmpl, err := l.builder.template(config, info, l.client.GetVersion(), migration) @@ -141,6 +148,17 @@ func (l *ESLoader) Load(config TemplateConfig, info beat.Info, fields []byte, mi } if dataStreamExist { l.log.Infof("Data stream with name %q already exists.", templateName) + // for serverless, we can update the lifecycle policy safely + // Note that updating the lifecycle will delete older documents + // if the policy requires it; i.e, changing the data_retention from 10d to 7d + // will delete the documents older than 7 days. + if l.client.IsServerless() { + l.log.Infof("overwriting lifecycle policy") + err = l.lifecycleClient.CreatePolicyFromConfig() + if err != nil { + return fmt.Errorf("error updating lifecycle policy: %w", err) + } + } return nil } @@ -233,7 +251,7 @@ func (b *templateBuilder) template(config TemplateConfig, info beat.Info, esVers b.log.Info("template config not enabled") return nil, nil } - tmpl, err := New(info.Version, info.IndexPrefix, info.ElasticLicensed, esVersion, config, migration) + tmpl, err := New(b.isServerless, info.Version, info.IndexPrefix, info.ElasticLicensed, esVersion, config, migration) if err != nil { return nil, fmt.Errorf("error creating template instance: %w", err) } diff --git a/libbeat/template/load_integration_test.go b/libbeat/template/load_integration_test.go index 278c5def725..cce304798d9 100644 --- a/libbeat/template/load_integration_test.go +++ b/libbeat/template/load_integration_test.go @@ -38,6 +38,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/esleg/eslegclient" "github.com/elastic/beats/v7/libbeat/esleg/eslegtest" + "github.com/elastic/beats/v7/libbeat/idxmgmt/lifecycle" "github.com/elastic/beats/v7/libbeat/version" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/transport/httpcommon" @@ -68,10 +69,14 @@ func newTestSetup(t *testing.T, cfg TemplateConfig) *testSetup { if err := client.Connect(); err != nil { t.Fatal(err) } - s := testSetup{t: t, client: client, loader: NewESLoader(client), config: cfg} - client.Request("DELETE", "/_data_stream/"+cfg.Name, "", nil, nil) + handler := &mockClientHandler{severless: false, mode: lifecycle.ILM} + loader, err := NewESLoader(client, handler) + require.NoError(t, err) + s := testSetup{t: t, client: client, loader: loader, config: cfg} + // don't care if the cleanup fails, since they might just return a 404 + _, _, _ = client.Request("DELETE", "/_data_stream/"+cfg.Name, "", nil, nil) s.requireDataStreamDoesNotExist("") - client.Request("DELETE", "/_index_template/"+cfg.Name, "", nil, nil) + _, _, _ = client.Request("DELETE", "/_index_template/"+cfg.Name, "", nil, nil) s.requireTemplateDoesNotExist("") return &s } @@ -81,14 +86,10 @@ func newTestSetupWithESClient(t *testing.T, client ESClient, cfg TemplateConfig) if cfg.Name == "" { cfg.Name = fmt.Sprintf("load-test-%+v", rand.Int()) } - return &testSetup{t: t, client: client, loader: NewESLoader(client), config: cfg} -} - -func (ts *testSetup) mustLoadTemplate(body map[string]interface{}) { - ts.t.Helper() - err := ts.loader.loadTemplate(ts.config.Name, body) - require.NoError(ts.t, err) - ts.requireTemplateExists("") + handler := &mockClientHandler{severless: false, mode: lifecycle.ILM} + loader, err := NewESLoader(client, handler) + require.NoError(t, err) + return &testSetup{t: t, client: client, loader: loader, config: cfg} } func (ts *testSetup) loadFromFile(fileElems []string) error { @@ -122,12 +123,14 @@ func (ts *testSetup) requireTemplateExists(name string) { } func (ts *testSetup) cleanupDataStream(name string) { - ts.client.Request("DELETE", "/_data_stream/"+name, "", nil, nil) + _, _, err := ts.client.Request("DELETE", "/_data_stream/"+name, "", nil, nil) + require.NoError(ts.t, err) ts.requireDataStreamDoesNotExist(name) } func (ts *testSetup) cleanupTemplate(name string) { - ts.client.Request("DELETE", "/_index_template/"+name, "", nil, nil) + _, _, err := ts.client.Request("DELETE", "/_index_template/"+name, "", nil, nil) + require.NoError(ts.t, err) ts.requireTemplateDoesNotExist(name) } @@ -172,6 +175,7 @@ func (ts *testSetup) requireTestEventPresent() string { var resp eslegclient.SearchResults err = json.Unmarshal(b, &resp) + require.NoError(ts.t, err) require.Equal(ts.t, 1, resp.Hits.Total.Value, "the test event must be returned") idx := struct { @@ -187,7 +191,8 @@ func TestESLoader_Load(t *testing.T) { t.Run("loading disabled", func(t *testing.T) { setup := newTestSetup(t, TemplateConfig{Enabled: false}) - setup.load(nil) + err := setup.load(nil) + require.NoError(t, err) setup.requireTemplateDoesNotExist("") }) @@ -200,15 +205,6 @@ func TestESLoader_Load(t *testing.T) { require.Contains(t, err.Error(), "version is not semver") }) - t.Run("no Elasticsearch client", func(t *testing.T) { - setup := newTestSetupWithESClient(t, nil, TemplateConfig{Enabled: true}) - - beatInfo := beat.Info{Version: "9.9.9"} - err := setup.loader.Load(setup.config, beatInfo, nil, false) - require.Error(t, err) - require.Contains(t, err.Error(), "can not load template without active Elasticsearch client") - }) - t.Run("cannot check template", func(t *testing.T) { m := getMockElasticsearchClient(t, "HEAD", "/_index_template/", 500, []byte("cannot check template")) setup := newTestSetupWithESClient(t, m, TemplateConfig{Enabled: true}) @@ -259,14 +255,16 @@ func TestESLoader_Load(t *testing.T) { setup.config.Settings = TemplateSettings{Source: map[string]interface{}{"enabled": false}} t.Run("disabled", func(t *testing.T) { - setup.load(nil) + err := setup.load(nil) + require.NoError(t, err) tmpl := getTemplate(t, setup.client, setup.config.Name) assert.Equal(t, true, tmpl.SourceEnabled()) }) t.Run("enabled", func(t *testing.T) { setup.config.Overwrite = true - setup.load(nil) + err := setup.load(nil) + require.NoError(t, err) tmpl := getTemplate(t, setup.client, setup.config.Name) assert.Equal(t, false, tmpl.SourceEnabled()) }) @@ -278,6 +276,7 @@ func TestESLoader_Load(t *testing.T) { setup.mustLoad(fields) exists, err := setup.loader.checkExistsDatastream(setup.config.Name) + require.NoError(t, err) require.True(t, exists, "data stream must exits") // send test event before reloading the template @@ -304,7 +303,8 @@ func TestESLoader_Load(t *testing.T) { Name string `config:"name"` IsDataStream bool `config:"data_stream"` }{Enabled: true, Path: path(t, []string{"testdata", "fields.json"}), Name: nameJSON, IsDataStream: false} - setup.load(nil) + err := setup.load(nil) + require.NoError(t, err) setup.requireTemplateExists(nameJSON) setup.cleanupTemplate(nameJSON) }) @@ -508,7 +508,7 @@ func getTemplate(t *testing.T, client ESClient, templateName string) testTemplat } func (tt *testTemplate) SourceEnabled() bool { - key := fmt.Sprintf("template.mappings._source.enabled") + key := "template.mappings._source.enabled" // _source.enabled is true if it's missing (default) b, _ := tt.HasKey(key) @@ -519,7 +519,7 @@ func (tt *testTemplate) SourceEnabled() bool { val, err := tt.GetValue(key) if !assert.NoError(tt.t, err) { doc, _ := json.MarshalIndent(tt.M, "", " ") - tt.t.Fatal(fmt.Sprintf("failed to read '%v' in %s", key, doc)) + tt.t.Fatalf("failed to read '%v' in %s", key, doc) } return val.(bool) @@ -563,6 +563,22 @@ func getTestingElasticsearch(t eslegtest.TestLogger) *eslegclient.Connection { return conn } +type mockClientHandler struct { + severless bool + mode lifecycle.Mode +} + +func (cli *mockClientHandler) IsServerless() bool { return cli.severless } +func (cli *mockClientHandler) CheckEnabled() (bool, error) { return true, nil } +func (cli *mockClientHandler) Mode() lifecycle.Mode { return cli.mode } +func (cli *mockClientHandler) IsElasticsearch() bool { return true } +func (cli *mockClientHandler) CheckExists() bool { return true } +func (cli *mockClientHandler) PolicyName() string { return "test" } +func (cli *mockClientHandler) HasPolicy() (bool, error) { return false, nil } +func (cli *mockClientHandler) CreatePolicyFromConfig() error { return nil } +func (cli *mockClientHandler) Policy() lifecycle.Policy { return lifecycle.Policy{Name: "test"} } +func (cli *mockClientHandler) Overwrite() bool { return true } + func getMockElasticsearchClient(t *testing.T, method, endpoint string, code int, body []byte) *eslegclient.Connection { server := esMock(t, method, endpoint, code, body) conn, err := eslegclient.NewConnection(eslegclient.ConnectionSettings{ @@ -580,14 +596,16 @@ func esMock(t *testing.T, method, endpoint string, code int, body []byte) *httpt if r.URL.Path == "/" { w.WriteHeader(200) w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"version":{"number":"5.0.0"}}`)) + _, err := w.Write([]byte(`{"version":{"number":"5.0.0"}}`)) + require.NoError(t, err) return } if r.Method == method && strings.HasPrefix(r.URL.Path, endpoint) { w.WriteHeader(code) w.Header().Set("Content-Type", "application/json") - w.Write(body) + _, err := w.Write(body) + require.NoError(t, err) return } @@ -600,7 +618,8 @@ func esMock(t *testing.T, method, endpoint string, code int, body []byte) *httpt w.WriteHeader(c) if body != nil { w.Header().Set("Content-Type", "application/json") - w.Write(body) + _, err := w.Write(body) + require.NoError(t, err) } })) } diff --git a/libbeat/template/load_test.go b/libbeat/template/load_test.go index 59eca112251..8f6b1837d9a 100644 --- a/libbeat/template/load_test.go +++ b/libbeat/template/load_test.go @@ -37,13 +37,25 @@ func TestFileLoader_Load(t *testing.T) { tmplName := fmt.Sprintf("%s-%s", prefix, ver) for name, test := range map[string]struct { - settings TemplateSettings - body mapstr.M - fields []byte - want mapstr.M - wantErr error + settings TemplateSettings + isServerless bool + body mapstr.M + fields []byte + want mapstr.M + wantErr error }{ "load minimal config info": { + isServerless: false, + body: mapstr.M{ + "index_patterns": []string{"mock-7.0.0"}, + "data_stream": struct{}{}, + "priority": 150, + "template": mapstr.M{ + "settings": mapstr.M{"index": nil}}, + }, + }, + "load minimal config info serverless": { + isServerless: true, body: mapstr.M{ "index_patterns": []string{"mock-7.0.0"}, "data_stream": struct{}{}, @@ -53,7 +65,8 @@ func TestFileLoader_Load(t *testing.T) { }, }, "load minimal config with index settings": { - settings: TemplateSettings{Index: mapstr.M{"code": "best_compression"}}, + isServerless: false, + settings: TemplateSettings{Index: mapstr.M{"code": "best_compression"}}, body: mapstr.M{ "index_patterns": []string{"mock-7.0.0"}, "data_stream": struct{}{}, @@ -63,7 +76,8 @@ func TestFileLoader_Load(t *testing.T) { }, }, "load minimal config with source settings": { - settings: TemplateSettings{Source: mapstr.M{"enabled": false}}, + isServerless: false, + settings: TemplateSettings{Source: mapstr.M{"enabled": false}}, body: mapstr.M{ "index_patterns": []string{"mock-7.0.0"}, "data_stream": struct{}{}, @@ -80,6 +94,7 @@ func TestFileLoader_Load(t *testing.T) { }, }, "load config and in-line analyzer fields": { + isServerless: false, body: mapstr.M{ "index_patterns": []string{"mock-7.0.0"}, "data_stream": struct{}{}, @@ -178,6 +193,7 @@ func TestFileLoader_Load(t *testing.T) { }, }, "load config and in-line analyzer fields with name collision": { + isServerless: false, body: mapstr.M{ "index_patterns": []string{"mock-7.0.0"}, "settings": mapstr.M{"index": nil}, @@ -210,7 +226,7 @@ func TestFileLoader_Load(t *testing.T) { } { t.Run(name, func(t *testing.T) { fc := newFileClient(ver) - fl := NewFileLoader(fc) + fl := NewFileLoader(fc, test.isServerless) cfg := DefaultConfig(info) cfg.Settings = test.settings diff --git a/libbeat/template/template.go b/libbeat/template/template.go index 7c43efb8d7d..ae67e7ec542 100644 --- a/libbeat/template/template.go +++ b/libbeat/template/template.go @@ -22,6 +22,7 @@ import ( "sync" "time" + "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/version" "github.com/elastic/go-ucfg/yaml" @@ -35,7 +36,6 @@ var ( // Defaults used in the template defaultDateDetection = false defaultTotalFieldsLimit = 10000 - defaultNumberOfRoutingShards = 30 defaultMaxDocvalueFieldsSearch = 200 defaultFields []string @@ -52,12 +52,13 @@ type Template struct { esVersion version.V config TemplateConfig migration bool - order int priority int + isServerless bool } // New creates a new template instance func New( + isServerless bool, beatVersion string, beatName string, elasticLicensed bool, @@ -137,6 +138,7 @@ func New( config: config, migration: migration, priority: config.Priority, + isServerless: isServerless, }, nil } @@ -198,6 +200,10 @@ func (t *Template) LoadMinimal() mapstr.M { nil, nil, mapstr.M(t.config.Settings.Source)) } + // delete default settings not available on serverless + if _, ok := t.config.Settings.Index["number_of_shards"]; ok && t.isServerless { + delete(t.config.Settings.Index, "number_of_shards") + } templ["settings"] = mapstr.M{ "index": t.config.Settings.Index, } @@ -242,10 +248,14 @@ func (t *Template) generateComponent(properties, analyzers mapstr.M, dynamicTemp "index": buildIdxSettings( t.esVersion, t.config.Settings.Index, + t.isServerless, ), }, }, } + if len(t.config.Settings.Lifecycle) > 0 { + m.Put("template.lifecycle", t.config.Settings.Lifecycle) + } if len(analyzers) != 0 { m.Put("template.settings.analysis.analyzer", analyzers) } @@ -288,7 +298,7 @@ func buildDynTmpl(ver version.V) mapstr.M { } } -func buildIdxSettings(ver version.V, userSettings mapstr.M) mapstr.M { +func buildIdxSettings(ver version.V, userSettings mapstr.M, isServerless bool) mapstr.M { indexSettings := mapstr.M{ "refresh_interval": "5s", "mapping": mapstr.M{ @@ -305,7 +315,13 @@ func buildIdxSettings(ver version.V, userSettings mapstr.M) mapstr.M { indexSettings.Put("query.default_field", fields) - indexSettings.Put("max_docvalue_fields_search", defaultMaxDocvalueFieldsSearch) + // deal with settings that aren't available on serverless + if isServerless { + logp.L().Infof("remote instance is severless, number_of_shards and max_docvalue_fields_search will be skipped in index template") + userSettings.Delete("number_of_shards") + } else { + indexSettings.Put("max_docvalue_fields_search", defaultMaxDocvalueFieldsSearch) + } indexSettings.DeepUpdate(userSettings) return indexSettings diff --git a/libbeat/template/template_test.go b/libbeat/template/template_test.go index 5ef4371c7be..c1d24eab869 100644 --- a/libbeat/template/template_test.go +++ b/libbeat/template/template_test.go @@ -31,7 +31,7 @@ import ( libversion "github.com/elastic/elastic-agent-libs/version" ) -type testTemplate struct { +type unitTestTemplate struct { t *testing.T tmpl *Template data mapstr.M @@ -109,19 +109,19 @@ func TestTemplate(t *testing.T) { }) } -func createTestTemplate(t *testing.T, beatVersion, esVersion string, config TemplateConfig) *testTemplate { +func createTestTemplate(t *testing.T, beatVersion, esVersion string, config TemplateConfig) *unitTestTemplate { beatVersion = getVersion(beatVersion) esVersion = getVersion(esVersion) ver := libversion.MustNew(esVersion) - template, err := New(beatVersion, "testbeat", false, *ver, config, false) + template, err := New(false, beatVersion, "testbeat", false, *ver, config, false) if err != nil { t.Fatalf("Failed to create the template: %+v", err) } - return &testTemplate{t: t, tmpl: template, data: template.Generate(nil, nil, nil)} + return &unitTestTemplate{t: t, tmpl: template, data: template.Generate(nil, nil, nil)} } -func (t *testTemplate) Has(path string) bool { +func (t *unitTestTemplate) Has(path string) bool { t.t.Helper() has, err := t.data.HasKey(path) if err != nil && err != mapstr.ErrKeyNotFound { @@ -131,7 +131,7 @@ func (t *testTemplate) Has(path string) bool { return has } -func (t *testTemplate) Get(path string) interface{} { +func (t *unitTestTemplate) Get(path string) interface{} { t.t.Helper() val, err := t.data.GetValue(path) if err != nil { @@ -141,14 +141,14 @@ func (t *testTemplate) Get(path string) interface{} { return val } -func (t *testTemplate) AssertMissing(path string) { +func (t *unitTestTemplate) AssertMissing(path string) { t.t.Helper() if t.Has(path) { t.t.Fatalf("Expected '%v' to be missing", path) } } -func (t *testTemplate) Assert(path string, val interface{}) { +func (t *unitTestTemplate) Assert(path string, val interface{}) { t.t.Helper() assert.Equal(t.t, val, t.Get(path)) } diff --git a/libbeat/tests/system/beat/beat.py b/libbeat/tests/system/beat/beat.py index 004c5efbd38..8fe74193b91 100644 --- a/libbeat/tests/system/beat/beat.py +++ b/libbeat/tests/system/beat/beat.py @@ -717,6 +717,7 @@ def extract_fields(doc_list, name): if not os.path.isfile(path): path = os.path.abspath(os.path.dirname( __file__) + "../../../../_meta/fields.common.yml") + with open(path, encoding="utf-8") as f2: content = f2.read() @@ -788,7 +789,7 @@ def output_count(self, pred, output_file=None): def assert_fields_are_documented(self, evt): """ Assert that all keys present in evt are documented in fields.yml. - This reads from the global fields.yml, means `make collect` has to be run before the check. + This reads from the global fields.yml, means `mage fields` has to be run before the check. """ expected_fields, dict_fields, aliases = self.load_fields() flat = self.flatten_object(evt, dict_fields) diff --git a/libbeat/tests/system/template/template.go b/libbeat/tests/system/template/template.go index 12b7cff7eef..ea869f0f962 100644 --- a/libbeat/tests/system/template/template.go +++ b/libbeat/tests/system/template/template.go @@ -48,7 +48,7 @@ func testTemplateDefaultFieldLength(beatName string, elasticLicensed bool) func( } // Generate a template based on the embedded fields.yml data. - tmpl, err := template.New(version.GetDefaultVersion(), beatName, elasticLicensed, *esVersion, template.TemplateConfig{}, false) + tmpl, err := template.New(false, version.GetDefaultVersion(), beatName, elasticLicensed, *esVersion, template.TemplateConfig{}, false) if err != nil { t.Fatal(err) } diff --git a/libbeat/tests/system/test_ilm.py b/libbeat/tests/system/test_ilm.py index 1f2b89ac562..630ab551593 100644 --- a/libbeat/tests/system/test_ilm.py +++ b/libbeat/tests/system/test_ilm.py @@ -13,7 +13,7 @@ INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) -MSG_ILM_POLICY_LOADED = re.compile('ILM policy .* successfully created.') +MSG_ILM_POLICY_LOADED = re.compile('lifecycle policy .* successfully created.') class TestRunILM(BaseTest): diff --git a/libbeat/version/version.go b/libbeat/version/version.go index 960ed3c72e6..ef3de6455a0 100644 --- a/libbeat/version/version.go +++ b/libbeat/version/version.go @@ -18,4 +18,4 @@ // Code generated by dev-tools/set_version package version -const defaultBeatVersion = "8.11.0" +const defaultBeatVersion = "8.12.0" diff --git a/metricbeat/docker-compose.yml b/metricbeat/docker-compose.yml index a857636f46b..7f0200dfb09 100644 --- a/metricbeat/docker-compose.yml +++ b/metricbeat/docker-compose.yml @@ -17,11 +17,11 @@ services: # Used by base tests elasticsearch: - image: docker.elastic.co/integrations-ci/beats-elasticsearch:${ELASTICSEARCH_VERSION:-8.9.1}-1 + image: docker.elastic.co/integrations-ci/beats-elasticsearch:${ELASTICSEARCH_VERSION:-8.10.2}-1 build: context: ./module/elasticsearch/_meta args: - ELASTICSEARCH_VERSION: ${ELASTICSEARCH_VERSION:-8.9.1} + ELASTICSEARCH_VERSION: ${ELASTICSEARCH_VERSION:-8.10.2} environment: - "ES_JAVA_OPTS=-Xms256m -Xmx256m" - "transport.host=127.0.0.1" @@ -38,11 +38,11 @@ services: # Used by base tests kibana: - image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.9.1}-1 + image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.10.2}-1 build: context: ./module/kibana/_meta args: - KIBANA_VERSION: ${KIBANA_VERSION:-8.9.1} + KIBANA_VERSION: ${KIBANA_VERSION:-8.10.2} healthcheck: test: ["CMD-SHELL", "curl -u beats:testing -s http://localhost:5601/api/status?v8format=true | grep -q '\"overall\":{\"level\":\"available\"'"] retries: 600 @@ -53,11 +53,11 @@ services: # Used by base tests metricbeat: - image: docker.elastic.co/integrations-ci/beats-metricbeat:${BEAT_VERSION:-8.9.1}-1 + image: docker.elastic.co/integrations-ci/beats-metricbeat:${BEAT_VERSION:-8.10.2}-1 build: context: ./module/beat/_meta args: - BEAT_VERSION: ${BEAT_VERSION:-8.9.1} + BEAT_VERSION: ${BEAT_VERSION:-8.10.2} command: '-e' ports: - 5066:5066 diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 6e7e895a56d..b3f93a420a2 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -46035,6 +46035,42 @@ type: keyword -- +[float] +=== state_namespace + +Kubernetes namespace metrics. + + + +*`kubernetes.state_namespace.created.sec`*:: ++ +-- +Unix creation timestamp. + + +type: double + +-- + + +*`kubernetes.state_namespace.status.active`*:: ++ +-- +Whether the namespace is active (true or false). + +type: boolean + +-- + +*`kubernetes.state_namespace.status.terminating`*:: ++ +-- +Whether the namespace is terminating (true or false). + +type: boolean + +-- + [float] === node @@ -62020,6 +62056,16 @@ alias to: process.pgid -- +*`system.process.num_threads`*:: ++ +-- +Number of threads in the process + + +type: integer + +-- + *`system.process.cmdline`*:: + -- diff --git a/metricbeat/docs/getting-started.asciidoc b/metricbeat/docs/getting-started.asciidoc index 9cd837dfc42..8b9ce9e3329 100644 --- a/metricbeat/docs/getting-started.asciidoc +++ b/metricbeat/docs/getting-started.asciidoc @@ -46,6 +46,10 @@ system: include::{libbeat-dir}/tab-widgets/install-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[other-installation-options]] ==== Other installation options diff --git a/metricbeat/docs/index.asciidoc b/metricbeat/docs/index.asciidoc index 0b7937787f2..94c888e6b79 100644 --- a/metricbeat/docs/index.asciidoc +++ b/metricbeat/docs/index.asciidoc @@ -26,6 +26,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :linux_os: :docker_platform: :win_os: +:no_cache_processor: :no_decode_cef_processor: :no_decode_csv_fields_processor: :no_parse_aws_vpc_flow_log_processor: diff --git a/metricbeat/helper/kubernetes/state_metricset.go b/metricbeat/helper/kubernetes/state_metricset.go index 458ccc1d2ed..51929d73509 100644 --- a/metricbeat/helper/kubernetes/state_metricset.go +++ b/metricbeat/helper/kubernetes/state_metricset.go @@ -44,7 +44,9 @@ var lock sync.RWMutex // Init registers the MetricSet with the central registry. // The New method will be called after the setup of the module and before starting to fetch data func Init(name string, mapping *prometheus.MetricsMapping) { - name = prefix + name + if name != util.NamespaceResource { + name = prefix + name + } lock.Lock() mappings[name] = mapping lock.Unlock() @@ -77,11 +79,16 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { mapping := mappings[base.Name()] lock.Unlock() + resourceName := base.Name() + if resourceName != util.NamespaceResource { + resourceName = strings.ReplaceAll(resourceName, prefix, "") + } + return &MetricSet{ BaseMetricSet: base, prometheusClient: prometheusClient, prometheusMapping: mapping, - enricher: util.NewResourceMetadataEnricher(base, strings.ReplaceAll(base.Name(), prefix, ""), mod.GetMetricsRepo(), false), + enricher: util.NewResourceMetadataEnricher(base, resourceName, mod.GetMetricsRepo(), false), mod: mod, }, nil } @@ -90,6 +97,17 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // format. It publishes the event which is then forwarded to the output. In case // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(reporter mb.ReporterV2) { + // The name of the metric state can be obtained by using m.BaseMetricSet.Name(). However, names that start with state_* (e.g. state_cronjob) + // need to have that prefix removed. So, for example, strings.ReplaceAll("state_cronjob", "state_", "") would result in just cronjob. + // Exception is state_namespace, as field kubernetes.namespace already exists, and we need to create a new object + // for the state_namespace metricset. + resourceName := m.BaseMetricSet.Name() + if resourceName != util.NamespaceResource { + resourceName = strings.ReplaceAll(resourceName, prefix, "") + } else { + resourceName = "state_namespace" + } + m.enricher.Start() families, err := m.mod.GetStateMetricsFamilies(m.prometheusClient) @@ -107,9 +125,7 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) { m.enricher.Enrich(events) for _, event := range events { - // The name of the metric state can be obtained by using m.BaseMetricSet.Name(). However, names that start with state_* (e.g. state_cronjob) - // need to have that prefix removed. So, for example, strings.ReplaceAll("state_cronjob", "state_", "") would result in just cronjob. - e, err := util.CreateEvent(event, "kubernetes."+strings.ReplaceAll(m.BaseMetricSet.Name(), "state_", "")) + e, err := util.CreateEvent(event, "kubernetes."+resourceName) if err != nil { m.Logger().Error(err) } diff --git a/metricbeat/helper/openmetrics/openmetrics_test.go b/metricbeat/helper/openmetrics/openmetrics_test.go index 0cb5bec8bb0..4f704e70db5 100644 --- a/metricbeat/helper/openmetrics/openmetrics_test.go +++ b/metricbeat/helper/openmetrics/openmetrics_test.go @@ -97,8 +97,8 @@ metrics_one_count_total{name="john",surname="williams"} 2 metrics_one_count_total{name="jahn",surname="baldwin",age="30"} 3 ` - openMetricsCounterKeyLabelWithNaNInf = `# TYPE metrics_one_count_errors counter -metrics_one_count_errors{name="jane",surname="foster"} 1 + openMetricsCounterKeyLabelWithNaNInf = `# TYPE metrics_one_count_errors_total counter +metrics_one_count_errors_total{name="jane",surname="foster"} 1 # TYPE metrics_one_count_total counter metrics_one_count_total{name="jane",surname="foster"} NaN metrics_one_count_total{name="john",surname="williams"} +Inf @@ -537,14 +537,12 @@ func TestOpenMetrics(t *testing.T) { msg: "Info metric", mapping: &MetricsMapping{ Metrics: map[string]MetricMap{ - "target_info": Metric("target_info.metric"), + "target": Metric("target"), }, }, expected: []mapstr.M{ mapstr.M{ - "target_info": mapstr.M{ - "metric": int64(1), - }, + "target": int64(1), }, }, }, @@ -552,7 +550,7 @@ func TestOpenMetrics(t *testing.T) { msg: "Info metric with labels", mapping: &MetricsMapping{ Metrics: map[string]MetricMap{ - "target_with_labels_info": Metric("target_with_labels_info.metric"), + "target_with_labels": Metric("target_with_labels"), }, Labels: map[string]LabelMap{ "env": Label("labels.env"), @@ -561,9 +559,7 @@ func TestOpenMetrics(t *testing.T) { }, expected: []mapstr.M{ mapstr.M{ - "target_with_labels_info": mapstr.M{ - "metric": int64(1), - }, + "target_with_labels": int64(1), "labels": mapstr.M{ "env": "prod", "hostname": "myhost", @@ -747,8 +743,8 @@ func TestOpenMetricsKeyLabels(t *testing.T) { openmetricsResponse: openMetricsCounterKeyLabelWithNaNInf, mapping: &MetricsMapping{ Metrics: map[string]MetricMap{ - "metrics_one_count_errors": Metric("metrics.one.count"), - "metrics_one_count_total": Metric("metrics.one.count"), + "metrics_one_count_errors_total": Metric("metrics.one.count"), + "metrics_one_count_total": Metric("metrics.one.count"), }, Labels: map[string]LabelMap{ "name": KeyLabel("metrics.one.labels.name"), diff --git a/metricbeat/helper/prometheus/textparse.go b/metricbeat/helper/prometheus/textparse.go index de6cc075c4b..4ce573ca6ab 100644 --- a/metricbeat/helper/prometheus/textparse.go +++ b/metricbeat/helper/prometheus/textparse.go @@ -62,6 +62,7 @@ func (m *Info) GetValue() int64 { } return 0 } + func (m *Info) HasValidValue() bool { return m != nil && *m.Value == 1 } @@ -317,12 +318,14 @@ func (m *MetricFamily) GetMetric() []*OpenMetric { } const ( - suffixTotal = "_total" - suffixGCount = "_gcount" - suffixGSum = "_gsum" - suffixCount = "_count" - suffixSum = "_sum" - suffixBucket = "_bucket" + suffixTotal = "_total" + suffixGCount = "_gcount" + suffixGSum = "_gsum" + suffixCount = "_count" + suffixSum = "_sum" + suffixBucket = "_bucket" + suffixCreated = "_created" + suffixInfo = "_info" ) // Counters have _total suffix @@ -330,6 +333,10 @@ func isTotal(name string) bool { return strings.HasSuffix(name, suffixTotal) } +func isCreated(name string) bool { + return strings.HasSuffix(name, suffixCreated) +} + func isGCount(name string) bool { return strings.HasSuffix(name, suffixGCount) } @@ -350,7 +357,11 @@ func isBucket(name string) bool { return strings.HasSuffix(name, suffixBucket) } -func summaryMetricName(name string, s float64, qv string, lbls string, t *int64, summariesByName map[string]map[string]*OpenMetric) (string, *OpenMetric) { +func isInfo(name string) bool { + return strings.HasSuffix(name, suffixInfo) +} + +func summaryMetricName(name string, s float64, qv string, lbls string, summariesByName map[string]map[string]*OpenMetric) (string, *OpenMetric) { var summary = &Summary{} var quantile = []*Quantile{} var quant = &Quantile{} @@ -359,10 +370,10 @@ func summaryMetricName(name string, s float64, qv string, lbls string, t *int64, case isCount(name): u := uint64(s) summary.SampleCount = &u - name = name[:len(name)-6] + name = strings.TrimSuffix(name, suffixCount) case isSum(name): summary.SampleSum = &s - name = name[:len(name)-4] + name = strings.TrimSuffix(name, suffixSum) default: f, err := strconv.ParseFloat(qv, 64) if err != nil { @@ -372,8 +383,8 @@ func summaryMetricName(name string, s float64, qv string, lbls string, t *int64, quant.Value = &s } - _, k := summariesByName[name] - if !k { + _, ok := summariesByName[name] + if !ok { summariesByName[name] = make(map[string]*OpenMetric) } metric, ok := summariesByName[name][lbls] @@ -391,10 +402,17 @@ func summaryMetricName(name string, s float64, qv string, lbls string, t *int64, } else if quant.Quantile != nil { metric.Summary.Quantile = append(metric.Summary.Quantile, quant) } - return name, metric } +/* +histogramMetricName returns the metric name without the suffix and its histogram. +OpenMetric suffixes: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#suffixes. +Prometheus histogram suffixes: https://prometheus.io/docs/concepts/metric_types/#histogram. +OpenMetric includes the extra suffix _created, that falls under default in this function. +OpenMetric also includes _g* suffixes that are not present for Prometheus metrics and are taken care of separately in +this function. +*/ func histogramMetricName(name string, s float64, qv string, lbls string, t *int64, isGaugeHistogram bool, e *exemplar.Exemplar, histogramsByName map[string]map[string]*OpenMetric) (string, *OpenMetric) { var histogram = &Histogram{} var bucket = []*Bucket{} @@ -404,21 +422,18 @@ func histogramMetricName(name string, s float64, qv string, lbls string, t *int6 case isCount(name): u := uint64(s) histogram.SampleCount = &u - name = name[:len(name)-6] + name = strings.TrimSuffix(name, suffixCount) case isSum(name): histogram.SampleSum = &s - name = name[:len(name)-4] + name = strings.TrimSuffix(name, suffixSum) case isGaugeHistogram && isGCount(name): u := uint64(s) histogram.SampleCount = &u - name = name[:len(name)-7] + name = strings.TrimSuffix(name, suffixGCount) case isGaugeHistogram && isGSum(name): histogram.SampleSum = &s - name = name[:len(name)-5] - default: - if isBucket(name) { - name = name[:len(name)-7] - } + name = strings.TrimSuffix(name, suffixGSum) + case isBucket(name): f, err := strconv.ParseFloat(qv, 64) if err != nil { f = math.MaxUint64 @@ -433,6 +448,9 @@ func histogramMetricName(name string, s float64, qv string, lbls string, t *int6 } bkt.Exemplar = e } + name = strings.TrimSuffix(name, suffixBucket) + default: + return "", nil } _, k := histogramsByName[name] @@ -485,10 +503,12 @@ func ParseMetricFamilies(b []byte, contentType string, ts time.Time) ([]*MetricF case textparse.EntryType: buf, t := parser.Type() s := string(buf) - _, ok = metricFamiliesByName[s] + fam, ok = metricFamiliesByName[s] if !ok { fam = &MetricFamily{Name: &s, Type: t} metricFamiliesByName[s] = fam + } else { + fam.Type = t } mt = t continue @@ -498,10 +518,11 @@ func ParseMetricFamilies(b []byte, contentType string, ts time.Time) ([]*MetricF h := string(t) _, ok = metricFamiliesByName[s] if !ok { - fam = &MetricFamily{Name: &s, Help: &h, Type: textparse.MetricTypeUnknown} + fam = &MetricFamily{Name: &s, Help: &h} metricFamiliesByName[s] = fam + } else { + fam.Help = &h } - fam.Help = &h continue case textparse.EntryUnit: buf, t := parser.Unit() @@ -509,10 +530,11 @@ func ParseMetricFamilies(b []byte, contentType string, ts time.Time) ([]*MetricF u := string(t) _, ok = metricFamiliesByName[s] if !ok { - fam = &MetricFamily{Name: &s, Unit: &u, Type: textparse.MetricTypeUnknown} + fam = &MetricFamily{Name: &s, Unit: &u} metricFamiliesByName[string(buf)] = fam + } else { + fam.Unit = &u } - fam.Unit = &u continue case textparse.EntryComment: continue @@ -537,16 +559,21 @@ func ParseMetricFamilies(b []byte, contentType string, ts time.Time) ([]*MetricF var lbls strings.Builder lbls.Grow(len(mets)) var labelPairs = []*labels.Label{} + var qv string // value of le or quantile label for _, l := range lset.Copy() { if l.Name == labels.MetricName { continue } - if l.Name != model.QuantileLabel && l.Name != labels.BucketLabel { // quantile and le are special labels handled below - + if l.Name == model.QuantileLabel { + qv = lset.Get(model.QuantileLabel) + } else if l.Name == labels.BucketLabel { + qv = lset.Get(labels.BucketLabel) + } else { lbls.WriteString(l.Name) lbls.WriteString(l.Value) } + n := l.Name v := l.Value @@ -559,77 +586,104 @@ func ParseMetricFamilies(b []byte, contentType string, ts time.Time) ([]*MetricF var metric *OpenMetric metricName := lset.Get(labels.MetricName) - var lookupMetricName string + + // lookupMetricName will have the suffixes removed + lookupMetricName := metricName var exm *exemplar.Exemplar // Suffixes - https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#suffixes switch mt { case textparse.MetricTypeCounter: + if contentType == OpenMetricsType && !isTotal(metricName) && !isCreated(metricName) { + // Possible suffixes for counter in Open metrics are _created and _total. + // Otherwise, ignore. + // https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#counter-1 + continue + } + var counter = &Counter{Value: &v} mn := lset.Get(labels.MetricName) metric = &OpenMetric{Name: &mn, Counter: counter, Label: labelPairs} - if isTotal(metricName) && contentType == OpenMetricsType { // Remove suffix _total, get lookup metricname - lookupMetricName = metricName[:len(metricName)-6] + if contentType == OpenMetricsType { + // Remove the two possible suffixes, _created and _total + if isTotal(metricName) { + lookupMetricName = strings.TrimSuffix(metricName, suffixTotal) + } else { + lookupMetricName = strings.TrimSuffix(metricName, suffixCreated) + } } else { lookupMetricName = metricName } case textparse.MetricTypeGauge: var gauge = &Gauge{Value: &v} metric = &OpenMetric{Name: &metricName, Gauge: gauge, Label: labelPairs} - lookupMetricName = metricName + //lookupMetricName = metricName case textparse.MetricTypeInfo: + // Info only exists for Openmetrics. It must have the suffix _info + if !isInfo(metricName) { + continue + } + lookupMetricName = strings.TrimSuffix(metricName, suffixInfo) value := int64(v) var info = &Info{Value: &value} metric = &OpenMetric{Name: &metricName, Info: info, Label: labelPairs} - lookupMetricName = metricName case textparse.MetricTypeSummary: - lookupMetricName, metric = summaryMetricName(metricName, v, lset.Get(model.QuantileLabel), lbls.String(), &t, summariesByName) + lookupMetricName, metric = summaryMetricName(metricName, v, qv, lbls.String(), summariesByName) metric.Label = labelPairs if !isSum(metricName) { + // Avoid registering the metric multiple times. continue } - metricName = lookupMetricName case textparse.MetricTypeHistogram: if hasExemplar := parser.Exemplar(&e); hasExemplar { exm = &e } - lookupMetricName, metric = histogramMetricName(metricName, v, lset.Get(labels.BucketLabel), lbls.String(), &t, false, exm, histogramsByName) + lookupMetricName, metric = histogramMetricName(metricName, v, qv, lbls.String(), &t, false, exm, histogramsByName) + if metric == nil { + continue + } metric.Label = labelPairs if !isSum(metricName) { + // Avoid registering the metric multiple times. continue } - metricName = lookupMetricName case textparse.MetricTypeGaugeHistogram: if hasExemplar := parser.Exemplar(&e); hasExemplar { exm = &e } - lookupMetricName, metric = histogramMetricName(metricName, v, lset.Get(labels.BucketLabel), lbls.String(), &t, true, exm, histogramsByName) + lookupMetricName, metric = histogramMetricName(metricName, v, qv, lbls.String(), &t, true, exm, histogramsByName) + if metric == nil { // metric name does not have a suffix supported for the type gauge histogram + continue + } metric.Label = labelPairs metric.Histogram.IsGaugeHistogram = true if !isGSum(metricName) { + // Avoid registering the metric multiple times. continue } - metricName = lookupMetricName case textparse.MetricTypeStateset: value := int64(v) var stateset = &Stateset{Value: &value} metric = &OpenMetric{Name: &metricName, Stateset: stateset, Label: labelPairs} - lookupMetricName = metricName case textparse.MetricTypeUnknown: var unknown = &Unknown{Value: &v} metric = &OpenMetric{Name: &metricName, Unknown: unknown, Label: labelPairs} - lookupMetricName = metricName default: - lookupMetricName = metricName } fam, ok = metricFamiliesByName[lookupMetricName] if !ok { - fam = &MetricFamily{Type: mt} - metricFamiliesByName[lookupMetricName] = fam - } + // If the lookupMetricName is not in metricFamiliesByName, we check for metric name, in case + // the removed suffix is part of the name. + fam, ok = metricFamiliesByName[metricName] + if !ok { + // There is not any metadata for this metric. In this case, the name of the metric + // will remain metricName instead of the possible modified lookupMetricName + fam = &MetricFamily{Name: &metricName, Type: mt} + metricFamiliesByName[metricName] = fam - fam.Name = &metricName + } + } if hasExemplar := parser.Exemplar(&e); hasExemplar && mt != textparse.MetricTypeHistogram && metric != nil { if !e.HasTs { diff --git a/metricbeat/helper/prometheus/textparse_test.go b/metricbeat/helper/prometheus/textparse_test.go new file mode 100644 index 00000000000..59b6b8ce199 --- /dev/null +++ b/metricbeat/helper/prometheus/textparse_test.go @@ -0,0 +1,686 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package prometheus + +import ( + "testing" + "time" + + "github.com/prometheus/prometheus/pkg/labels" + "github.com/stretchr/testify/require" +) + +func stringp(x string) *string { + return &x +} + +func float64p(x float64) *float64 { + return &x +} + +func uint64p(x uint64) *uint64 { + return &x +} + +func int64p(x int64) *int64 { + return &x +} + +func TestCounterOpenMetrics(t *testing.T) { + input := ` +# TYPE process_cpu_total counter +# HELP process_cpu_total Some help. +process_cpu_total 4.20072246e+06 +# TYPE something counter +something_total 20 +# TYPE metric_without_suffix counter +metric_without_suffix 10 +# EOF +` + + expected := []*MetricFamily{ + { + Name: stringp("process_cpu_total"), + Help: stringp("Some help."), + Type: "counter", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("process_cpu_total"), + Counter: &Counter{ + Value: float64p(4.20072246e+06), + }, + }, + }, + }, + { + Name: stringp("something"), + Help: nil, + Type: "counter", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("something_total"), + Counter: &Counter{ + Value: float64p(20), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestCounterPrometheus(t *testing.T) { + input := ` +# TYPE process_cpu_total counter +# HELP process_cpu_total Some help. +process_cpu_total 4.20072246e+06 +# TYPE process_cpu counter +process_cpu 20 +` + + expected := []*MetricFamily{ + { + Name: stringp("process_cpu_total"), + Help: stringp("Some help."), + Type: "counter", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("process_cpu_total"), + Counter: &Counter{ + Value: float64p(4.20072246e+06), + }, + }, + }, + }, + { + Name: stringp("process_cpu"), + Help: nil, + Type: "counter", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("process_cpu"), + Counter: &Counter{ + Value: float64p(20), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input), ContentTypeTextFormat, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", ContentTypeTextFormat) + } + require.ElementsMatch(t, expected, result) +} + +func TestGaugeOpenMetrics(t *testing.T) { + input := ` +# TYPE first_metric gauge +first_metric{label1="value1"} 1 +# TYPE second_metric gauge +# HELP second_metric Help for gauge metric. +second_metric 0 +# EOF +` + expected := []*MetricFamily{ + { + Name: stringp("first_metric"), + Help: nil, + Type: "gauge", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "label1", + Value: "value1", + }, + }, + Name: stringp("first_metric"), + Gauge: &Gauge{ + Value: float64p(1), + }, + }, + }, + }, + { + Name: stringp("second_metric"), + Help: stringp("Help for gauge metric."), + Type: "gauge", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("second_metric"), + Gauge: &Gauge{ + Value: float64p(0), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestGaugePrometheus(t *testing.T) { + input := ` +# TYPE first_metric gauge +first_metric{label1="value1"} 1 +# TYPE second_metric gauge +# HELP second_metric Help for gauge metric. +second_metric 0 +` + expected := []*MetricFamily{ + { + Name: stringp("first_metric"), + Help: nil, + Type: "gauge", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "label1", + Value: "value1", + }, + }, + Name: stringp("first_metric"), + Gauge: &Gauge{ + Value: float64p(1), + }, + }, + }, + }, + { + Name: stringp("second_metric"), + Help: stringp("Help for gauge metric."), + Type: "gauge", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("second_metric"), + Gauge: &Gauge{ + Value: float64p(0), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), ContentTypeTextFormat, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", ContentTypeTextFormat) + } + require.ElementsMatch(t, expected, result) +} + +func TestInfoOpenMetrics(t *testing.T) { + input := ` +# TYPE target info +target_info 1 +# TYPE metric_info info +metric_info 2 +# TYPE metric_without_suffix info +metric_without_suffix 3 +# EOF +` + expected := []*MetricFamily{ + { + Name: stringp("target"), + Help: nil, + Type: "info", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("target_info"), + Info: &Info{ + Value: int64p(1), + }, + }, + }, + }, + { + Name: stringp("metric_info"), + Help: nil, + Type: "info", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("metric_info"), + Info: &Info{ + Value: int64p(2), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestStatesetOpenMetrics(t *testing.T) { + input := ` +# TYPE a stateset +# HELP a help +a{a="bar"} 0 +a{a="foo"} 1.0 +# EOF +` + expected := []*MetricFamily{ + { + Name: stringp("a"), + Help: stringp("help"), + Type: "stateset", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "a", + Value: "bar", + }, + }, + Name: stringp("a"), + Stateset: &Stateset{ + Value: int64p(0), + }, + }, + { + Label: []*labels.Label{ + { + Name: "a", + Value: "foo", + }, + }, + Name: stringp("a"), + Stateset: &Stateset{ + Value: int64p(1), + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestSummaryOpenMetrics(t *testing.T) { + input := ` +# TYPE summary_metric summary +summary_metric{quantile="0.5"} 29735 +summary_metric{quantile="0.9"} 47103 +summary_metric{quantile="0.99"} 50681 +summary_metric{noquantile="0.2"} 50681 +summary_metric_sum 234892394 +summary_metric_count 44000 +summary_metric_impossible 123 +# EOF +` + expected := []*MetricFamily{ + { + Name: stringp("summary_metric"), + Help: nil, + Type: "summary", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("summary_metric"), + Summary: &Summary{ + SampleCount: uint64p(44000), + SampleSum: float64p(234892394), + Quantile: []*Quantile{ + { + Quantile: float64p(0.5), + Value: float64p(29735), + }, + { + Quantile: float64p(0.9), + Value: float64p(47103), + }, + { + Quantile: float64p(0.99), + Value: float64p(50681), + }, + }, + }, + TimestampMs: nil, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestSummaryPrometheus(t *testing.T) { + input := ` +# TYPE summary_metric summary +summary_metric{quantile="0.5"} 29735 +summary_metric{quantile="0.9"} 47103 +summary_metric{quantile="0.99"} 50681 +summary_metric{noquantile="0.2"} 50681 +summary_metric_sum 234892394 +summary_metric_count 44000 +summary_metric_impossible 123 +` + expected := []*MetricFamily{ + { + Name: stringp("summary_metric"), + Help: nil, + Type: "summary", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("summary_metric"), + Summary: &Summary{ + SampleCount: uint64p(44000), + SampleSum: float64p(234892394), + Quantile: []*Quantile{ + { + Quantile: float64p(0.5), + Value: float64p(29735), + }, + { + Quantile: float64p(0.9), + Value: float64p(47103), + }, + { + Quantile: float64p(0.99), + Value: float64p(50681), + }, + }, + }, + TimestampMs: nil, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input), ContentTypeTextFormat, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", ContentTypeTextFormat) + } + require.ElementsMatch(t, expected, result) +} + +func TestHistogramOpenMetrics(t *testing.T) { + input := ` +# HELP http_server_requests_seconds Duration of HTTP server request handling +# TYPE http_server_requests_seconds histogram +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",quantile="0.002796201"} 0.046137344 +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",quantile="0.003145726"} 0.046137344 +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",noquantile="0.005"} 1234 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",le="0.001"} 0.0 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",le="0.001048576"} 0.0 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",nole="0.002"} 1234 +http_server_requests_seconds_count{exception="None",uri="/actuator/prometheus"} 1.0 +http_server_requests_seconds_sum{exception="None",uri="/actuator/prometheus"} 0.046745444 +http_server_requests_seconds_created{exception="None",uri="/actuator/prometheus"} 0.046745444 +# EOF` + expected := []*MetricFamily{ + { + Name: stringp("http_server_requests_seconds"), + Help: stringp("Duration of HTTP server request handling"), + Type: "histogram", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "exception", + Value: "None", + }, + { + Name: "uri", + Value: "/actuator/prometheus", + }, + }, + Name: stringp("http_server_requests_seconds"), + Histogram: &Histogram{ + IsGaugeHistogram: false, + SampleCount: uint64p(1.0), + SampleSum: float64p(0.046745444), + Bucket: []*Bucket{ + { + CumulativeCount: uint64p(0), + UpperBound: float64p(0.001), + }, + { + CumulativeCount: uint64p(0), + UpperBound: float64p(0.001048576), + }, + }, + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestHistogramPrometheus(t *testing.T) { + input := ` +# HELP http_server_requests_seconds Duration of HTTP server request handling +# TYPE http_server_requests_seconds histogram +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",quantile="0.002796201"} 0.046137344 +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",quantile="0.003145726"} 0.046137344 +http_server_requests_seconds{exception="None",uri="/actuator/prometheus",noquantile="0.005"} 1234 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",le="0.001"} 0.0 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",le="0.001048576"} 0.0 +http_server_requests_seconds_bucket{exception="None",uri="/actuator/prometheus",nole="0.002"} 1234 +http_server_requests_seconds_count{exception="None",uri="/actuator/prometheus"} 1.0 +http_server_requests_seconds_sum{exception="None",uri="/actuator/prometheus"} 0.046745444 +http_server_requests_seconds_created{exception="None",uri="/actuator/prometheus"} 0.046745444` + expected := []*MetricFamily{ + { + Name: stringp("http_server_requests_seconds"), + Help: stringp("Duration of HTTP server request handling"), + Type: "histogram", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "exception", + Value: "None", + }, + { + Name: "uri", + Value: "/actuator/prometheus", + }, + }, + Name: stringp("http_server_requests_seconds"), + Histogram: &Histogram{ + IsGaugeHistogram: false, + SampleCount: uint64p(1.0), + SampleSum: float64p(0.046745444), + Bucket: []*Bucket{ + { + CumulativeCount: uint64p(0), + UpperBound: float64p(0.001), + }, + { + CumulativeCount: uint64p(0), + UpperBound: float64p(0.001048576), + }, + }, + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input), ContentTypeTextFormat, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", ContentTypeTextFormat) + } + require.ElementsMatch(t, expected, result) +} + +func TestGaugeHistogramOpenMetrics(t *testing.T) { + input := ` +# TYPE ggh gaugehistogram +ggh_bucket{le=".9"} 2 +ggh_bucket{nole=".99"} 10 +ggh_gcount 2 +ggh_gsum 1 +ggh_impossible 321 +ggh 99 +# EOF` + expected := []*MetricFamily{ + { + Name: stringp("ggh"), + Help: nil, + Type: "gaugehistogram", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{}, + Name: stringp("ggh"), + Histogram: &Histogram{ + IsGaugeHistogram: true, + SampleCount: uint64p(2.0), + SampleSum: float64p(1), + Bucket: []*Bucket{ + { + CumulativeCount: uint64p(2), + UpperBound: float64p(0.9), + }, + }, + }, + }, + }, + }, + } + + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestUnknownOpenMetrics(t *testing.T) { + input := ` +# HELP redis_connected_clients Redis connected clients +# TYPE redis_connected_clients unknown +redis_connected_clients{instance="rough-snowflake-web"} 10.0 +# EOF` + expected := []*MetricFamily{ + { + Name: stringp("redis_connected_clients"), + Help: stringp("Redis connected clients"), + Type: "unknown", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "instance", + Value: "rough-snowflake-web", + }, + }, + Name: stringp("redis_connected_clients"), + Unknown: &Unknown{ + Value: float64p(10), + }, + }, + }, + }, + } + result, err := ParseMetricFamilies([]byte(input[1:]), OpenMetricsType, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", OpenMetricsType) + } + require.ElementsMatch(t, expected, result) +} + +func TestUntypedPrometheus(t *testing.T) { + input := ` +# HELP redis_connected_clients Redis connected clients +# TYPE redis_connected_clients untyped +redis_connected_clients{instance="rough-snowflake-web"} 10.0` + expected := []*MetricFamily{ + { + Name: stringp("redis_connected_clients"), + Help: stringp("Redis connected clients"), + Type: "unknown", + Unit: nil, + Metric: []*OpenMetric{ + { + Label: []*labels.Label{ + { + Name: "instance", + Value: "rough-snowflake-web", + }, + }, + Name: stringp("redis_connected_clients"), + Unknown: &Unknown{ + Value: float64p(10), + }, + }, + }, + }, + } + result, err := ParseMetricFamilies([]byte(input), ContentTypeTextFormat, time.Now()) + if err != nil { + t.Fatalf("ParseMetricFamilies for content type %s returned an error.", ContentTypeTextFormat) + } + require.ElementsMatch(t, expected, result) +} diff --git a/metricbeat/include/list_docker.go b/metricbeat/include/list_docker.go index bd3e36dfd9e..fb79ffcca58 100644 --- a/metricbeat/include/list_docker.go +++ b/metricbeat/include/list_docker.go @@ -46,6 +46,7 @@ import ( _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_daemonset" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_deployment" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_job" + _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_namespace" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_node" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_persistentvolume" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_persistentvolumeclaim" diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index eabdcc8e918..88e353e883b 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -1285,8 +1285,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -2172,6 +2173,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is metricbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "metricbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index 00737472f2c..0bf7aa5b532 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -170,18 +170,20 @@ func getNodeName(http *helper.HTTP, uri string) (string, error) { Nodes map[string]interface{} `json:"nodes"` }{} - json.Unmarshal(content, &nodesStruct) + err = json.Unmarshal(content, &nodesStruct) + if err != nil { + return "", err + } // _local will only fetch one node info. First entry is node name for k := range nodesStruct.Nodes { return k, nil } - return "", fmt.Errorf("No local node found") + return "", fmt.Errorf("no local node found") } func getMasterName(http *helper.HTTP, uri string) (string, error) { - // TODO: evaluate on why when run with ?local=true request does not contain master_node field - content, err := fetchPath(http, uri, "_cluster/state/master_node", "") + content, err := fetchPath(http, uri, "_cluster/state/master_node", "local=true") if err != nil { return "", err } @@ -190,7 +192,10 @@ func getMasterName(http *helper.HTTP, uri string) (string, error) { MasterNode string `json:"master_node"` }{} - json.Unmarshal(content, &clusterStruct) + err = json.Unmarshal(content, &clusterStruct) + if err != nil { + return "", err + } return clusterStruct.MasterNode, nil } @@ -236,7 +241,10 @@ func GetNodeInfo(http *helper.HTTP, uri string, nodeID string) (*NodeInfo, error Nodes map[string]*NodeInfo `json:"nodes"` }{} - json.Unmarshal(content, &nodesStruct) + err = json.Unmarshal(content, &nodesStruct) + if err != nil { + return nil, err + } // _local will only fetch one node info. First entry is node name for k, v := range nodesStruct.Nodes { @@ -283,11 +291,11 @@ func GetLicense(http *helper.HTTP, resetURI string) (*License, error) { // GetClusterState returns cluster state information. func GetClusterState(http *helper.HTTP, resetURI string, metrics []string) (mapstr.M, error) { clusterStateURI := "_cluster/state" - if metrics != nil && len(metrics) > 0 { + if len(metrics) > 0 { clusterStateURI += "/" + strings.Join(metrics, ",") } - content, err := fetchPath(http, resetURI, clusterStateURI, "") + content, err := fetchPath(http, resetURI, clusterStateURI, "local=true") if err != nil { return nil, err } @@ -310,7 +318,7 @@ func GetClusterSettings(http *helper.HTTP, resetURI string, includeDefaults bool queryParams = append(queryParams, "include_defaults=true") } - if filterPaths != nil && len(filterPaths) > 0 { + if len(filterPaths) > 0 { filterPathQueryParam := "filter_path=" + strings.Join(filterPaths, ",") queryParams = append(queryParams, filterPathQueryParam) } @@ -451,7 +459,7 @@ func GetMasterNodeID(http *helper.HTTP, resetURI string) (string, error) { return "", err } - for nodeID, _ := range response.Nodes { + for nodeID := range response.Nodes { return nodeID, nil } diff --git a/metricbeat/module/elasticsearch/shard/shard.go b/metricbeat/module/elasticsearch/shard/shard.go index 63650d55596..fe0094ad8a5 100644 --- a/metricbeat/module/elasticsearch/shard/shard.go +++ b/metricbeat/module/elasticsearch/shard/shard.go @@ -31,7 +31,7 @@ func init() { } const ( - statePath = "/_cluster/state/version,nodes,master_node,routing_table" + statePath = "/_cluster/state/version,nodes,master_node,routing_table?local=true" ) // MetricSet type defines all fields of the MetricSet diff --git a/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml b/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml index 204b4313e54..b65ea0734c9 100644 --- a/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml +++ b/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml @@ -40,6 +40,7 @@ data: - state_persistentvolume - state_persistentvolumeclaim - state_storageclass + - state_namespace - module: kubernetes metricsets: - apiserver diff --git a/metricbeat/module/kubernetes/apiserver/_meta/test/metrics.2.0.expected b/metricbeat/module/kubernetes/apiserver/_meta/test/metrics.2.0.expected index b290a2ecd97..9a8097997df 100644 --- a/metricbeat/module/kubernetes/apiserver/_meta/test/metrics.2.0.expected +++ b/metricbeat/module/kubernetes/apiserver/_meta/test/metrics.2.0.expected @@ -4,79 +4,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 7, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 7, - "sum": 2839007440.349 - } - }, - "group": "apps", - "longrunning": { - "count": 3 - }, - "resource": "deployments", - "scope": "cluster", - "verb": "WATCH", + "count": 22, + "resource": "nodes", + "scope": "resource", + "subresource": "status", + "verb": "PATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 7, - "1000": 7, - "10000": 7, - "100000": 7, - "1000000": 7, - "10000000": 7, - "100000000": 7, - "1000000000": 7 - }, - "count": 7, - "sum": 0 - } - } } }, "Index": "", @@ -95,79 +30,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 2, - "sum": 1081003139.2180002 - } - }, - "group": "policy", - "longrunning": { - "count": 1 - }, - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 0 - } - } + "count": 124, + "group": "authorization.k8s.io", + "resource": "subjectaccessreviews", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -190,7 +60,7 @@ "duration": { "us": { "bucket": { - "+Inf": 7, + "+Inf": 8, "100000": 0, "1000000": 0, "10000000": 0, @@ -229,33 +99,33 @@ "900000": 0, "9000000": 0 }, - "count": 7, - "sum": 3222008102.2929997 + "count": 8, + "sum": 3669013015.7660003 } }, - "group": "storage.k8s.io", + "group": "discovery.k8s.io", "longrunning": { "count": 3 }, - "resource": "volumeattachments", + "resource": "endpointslices", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 7, - "1000": 7, - "10000": 7, - "100000": 7, - "1000000": 7, - "10000000": 7, - "100000000": 7, - "1000000000": 7 + "+Inf": 8, + "1000": 8, + "10000": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "100000000": 8, + "1000000000": 8 }, - "count": 7, + "count": 8, "sum": 0 } } @@ -279,11 +149,12 @@ "request": { "code": "0", "component": "apiserver", - "count": 62, - "resource": "pods", + "count": 2, + "group": "policy", + "resource": "poddisruptionbudgets", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v1beta1" } }, "Index": "", @@ -302,13 +173,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "group": "networking.k8s.io", - "resource": "ingresses", - "scope": "cluster", - "verb": "LIST", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 2405.561 + } + }, + "group": "apps", + "resource": "statefulsets", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -327,13 +243,59 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } - }, "request": { - "resource": "replicasets.apps" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 11, + "100000": 11, + "1000000": 11, + "10000000": 11, + "1250000": 11, + "150000": 11, + "1500000": 11, + "15000000": 11, + "1750000": 11, + "200000": 11, + "2000000": 11, + "20000000": 11, + "250000": 11, + "2500000": 11, + "25000000": 11, + "300000": 11, + "3000000": 11, + "30000000": 11, + "350000": 11, + "3500000": 11, + "400000": 11, + "4000000": 11, + "40000000": 11, + "450000": 11, + "4500000": 11, + "50000": 11, + "500000": 11, + "5000000": 11, + "50000000": 11, + "600000": 11, + "6000000": 11, + "60000000": 11, + "700000": 11, + "7000000": 11, + "800000": 11, + "8000000": 11, + "900000": 11, + "9000000": 11 + }, + "count": 11, + "sum": 36154.111000000004 + } + }, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", + "scope": "resource", + "verb": "POST", + "version": "v1beta1" } }, "Index": "", @@ -352,29 +314,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", + "component": "apiserver", + "count": 2, + "group": "apiregistration.k8s.io", + "resource": "apiservices", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "watch": { - "events": { - "kind": "ResourceQuota", - "size": { - "bytes": { - "bucket": { - "+Inf": 34, - "1024": 34, - "131072": 34, - "16384": 34, - "2048": 34, - "32768": 34, - "4096": 34, - "65536": 34, - "8192": 34 - }, - "count": 34, - "sum": 2006 - } - } - } } }, "Index": "", @@ -393,79 +340,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 15, - "100000": 0, - "1000000": 0, - "10000000": 1, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 1, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 1, - "250000": 0, - "2500000": 0, - "25000000": 1, - "300000": 0, - "3000000": 1, - "30000000": 1, - "350000": 0, - "3500000": 1, - "400000": 0, - "4000000": 1, - "40000000": 1, - "450000": 0, - "4500000": 1, - "50000": 0, - "500000": 0, - "5000000": 1, - "50000000": 1, - "600000": 0, - "6000000": 1, - "60000000": 1, - "700000": 0, - "7000000": 1, - "800000": 0, - "8000000": 1, - "900000": 0, - "9000000": 1 - }, - "count": 15, - "sum": 5839543516.696 - } - }, - "group": "storage.k8s.io", - "longrunning": { - "count": 5 - }, - "resource": "csidrivers", + "count": 6, + "group": "policy", + "resource": "poddisruptionbudgets", "scope": "cluster", "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 15, - "1000": 15, - "10000": 15, - "100000": 15, - "1000000": 15, - "10000000": 15, - "100000000": 15, - "1000000000": 15 - }, - "count": 15, - "sum": 0 - } - } } }, "Index": "", @@ -484,237 +366,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 1277.362 - } - }, - "group": "batch", - "resource": "cronjobs", - "scope": "resource", - "verb": "GET", + "count": 3, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "cluster", + "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 210 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, - "request": { - "resource": "ingresses.networking.k8s.io" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 500.09499999999997 - } - }, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 427 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", - "component": "apiserver", - "count": 9, - "resource": "secrets", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } - }, - "request": { - "resource": "nodes" } }, "Index": "", @@ -848,9 +507,8 @@ "request": { "code": "0", "component": "apiserver", - "count": 3, - "group": "coordination.k8s.io", - "resource": "leases", + "count": 9, + "resource": "secrets", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -871,15 +529,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "code": "0", - "component": "apiserver", - "count": 6, - "group": "policy", - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" + "resource": "nodes" } }, "Index": "", @@ -897,59 +553,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 11, - "100000": 11, - "1000000": 11, - "10000000": 11, - "1250000": 11, - "150000": 11, - "1500000": 11, - "15000000": 11, - "1750000": 11, - "200000": 11, - "2000000": 11, - "20000000": 11, - "250000": 11, - "2500000": 11, - "25000000": 11, - "300000": 11, - "3000000": 11, - "30000000": 11, - "350000": 11, - "3500000": 11, - "400000": 11, - "4000000": 11, - "40000000": 11, - "450000": 11, - "4500000": 11, - "50000": 11, - "500000": 11, - "5000000": 11, - "50000000": 11, - "600000": 11, - "6000000": 11, - "60000000": 11, - "700000": 11, - "7000000": 11, - "800000": 11, - "8000000": 11, - "900000": 11, - "9000000": 11 - }, - "count": 11, - "sum": 36154.111000000004 - } - }, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", - "scope": "resource", - "verb": "POST", - "version": "v1beta1" + "resource": "ingresses.networking.k8s.io" } }, "Index": "", @@ -1012,67 +622,32 @@ "9000000": 1 }, "count": 1, - "sum": 2405.561 + "sum": 500.09499999999997 } }, - "group": "apps", - "resource": "statefulsets", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "cluster", + "verb": "LIST", "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "apiregistration.k8s.io", - "resource": "apiservices", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", - "component": "apiserver", - "count": 2, - "group": "policy", - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 427 + } + } } }, "Index": "", @@ -1095,72 +670,72 @@ "duration": { "us": { "bucket": { - "+Inf": 8, + "+Inf": 15, "100000": 0, "1000000": 0, - "10000000": 0, + "10000000": 1, "1250000": 0, "150000": 0, "1500000": 0, - "15000000": 0, + "15000000": 1, "1750000": 0, "200000": 0, "2000000": 0, - "20000000": 0, + "20000000": 1, "250000": 0, "2500000": 0, - "25000000": 0, + "25000000": 1, "300000": 0, - "3000000": 0, - "30000000": 0, + "3000000": 1, + "30000000": 1, "350000": 0, - "3500000": 0, + "3500000": 1, "400000": 0, - "4000000": 0, - "40000000": 0, + "4000000": 1, + "40000000": 1, "450000": 0, - "4500000": 0, + "4500000": 1, "50000": 0, "500000": 0, - "5000000": 0, - "50000000": 0, + "5000000": 1, + "50000000": 1, "600000": 0, - "6000000": 0, - "60000000": 0, + "6000000": 1, + "60000000": 1, "700000": 0, - "7000000": 0, + "7000000": 1, "800000": 0, - "8000000": 0, + "8000000": 1, "900000": 0, - "9000000": 0 + "9000000": 1 }, - "count": 8, - "sum": 3669013015.7660003 + "count": 15, + "sum": 5839543516.696 } }, - "group": "discovery.k8s.io", + "group": "storage.k8s.io", "longrunning": { - "count": 3 + "count": 5 }, - "resource": "endpointslices", + "resource": "csidrivers", "scope": "cluster", "verb": "WATCH", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 8, - "1000": 8, - "10000": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "100000000": 8, - "1000000000": 8 + "+Inf": 15, + "1000": 15, + "10000": 15, + "100000": 15, + "1000000": 15, + "10000000": 15, + "100000000": 15, + "1000000000": 15 }, - "count": 8, + "count": 15, "sum": 0 } } @@ -1182,14 +757,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 124, - "group": "authorization.k8s.io", - "resource": "subjectaccessreviews", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 1277.362 + } + }, + "group": "batch", + "resource": "cronjobs", "scope": "resource", - "verb": "POST", + "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 210 + } + } } }, "Index": "", @@ -1208,14 +845,29 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 22, - "resource": "nodes", - "scope": "resource", - "subresource": "status", - "verb": "PATCH", "version": "v1" + }, + "watch": { + "events": { + "kind": "ResourceQuota", + "size": { + "bytes": { + "bucket": { + "+Inf": 34, + "1024": 34, + "131072": 34, + "16384": 34, + "2048": 34, + "32768": 34, + "4096": 34, + "65536": 34, + "8192": 34 + }, + "count": 34, + "sum": 2006 + } + } + } } }, "Index": "", @@ -1234,30 +886,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "batch", - "version": "v1beta1" - }, - "watch": { - "events": { - "kind": "CronJob", - "size": { - "bytes": { - "bucket": { - "+Inf": 38, - "1024": 19, - "131072": 38, - "16384": 38, - "2048": 20, - "32768": 38, - "4096": 38, - "65536": 38, - "8192": 38 - }, - "count": 38, - "sum": 55822 - } - } - } + "code": "200", + "component": "apiserver", + "count": 2, + "group": "networking.k8s.io", + "resource": "ingresses", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -1275,14 +911,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 48, - "resource": "pods", - "scope": "cluster", - "verb": "LIST", - "version": "v1" + "resource": "replicasets.apps" } }, "Index": "", @@ -1301,76 +936,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "1250000": 8, - "150000": 8, - "1500000": 8, - "15000000": 8, - "1750000": 8, - "200000": 8, - "2000000": 8, - "20000000": 8, - "250000": 8, - "2500000": 8, - "25000000": 8, - "300000": 8, - "3000000": 8, - "30000000": 8, - "350000": 8, - "3500000": 8, - "400000": 8, - "4000000": 8, - "40000000": 8, - "450000": 8, - "4500000": 8, - "50000": 8, - "500000": 8, - "5000000": 8, - "50000000": 8, - "600000": 8, - "6000000": 8, - "60000000": 8, - "700000": 8, - "7000000": 8, - "800000": 8, - "8000000": 8, - "900000": 8, - "9000000": 8 - }, - "count": 8, - "sum": 8839.859 - } - }, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", + "count": 62, + "resource": "pods", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 8, - "1000": 6, - "10000": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "100000000": 8, - "1000000000": 8 - }, - "count": 8, - "sum": 12945 - } - } } }, "Index": "", @@ -1389,14 +961,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 5, - "group": "networking.k8s.io", - "resource": "networkpolicies", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 2, + "sum": 1081003139.2180002 + } + }, + "group": "policy", + "longrunning": { + "count": 1 + }, + "resource": "poddisruptionbudgets", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 0 + } + } } }, "Index": "", @@ -1419,54 +1056,75 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 7, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 2144.12 + "count": 7, + "sum": 3222008102.2929997 } }, - "resource": "persistentvolumeclaims", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "group": "storage.k8s.io", + "longrunning": { + "count": 3 + }, + "resource": "volumeattachments", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 7, + "1000": 7, + "10000": 7, + "100000": 7, + "1000000": 7, + "10000000": 7, + "100000000": 7, + "1000000000": 7 + }, + "count": 7, + "sum": 0 + } + } } }, "Index": "", @@ -1489,80 +1147,75 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 7, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 3979.419 + "count": 7, + "sum": 2839007440.349 } }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "resource", - "verb": "DELETE", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 6, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", - "scope": "resource", - "verb": "APPLY", + "group": "apps", + "longrunning": { + "count": 3 + }, + "resource": "deployments", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 7, + "1000": 7, + "10000": 7, + "100000": 7, + "1000000": 7, + "10000000": 7, + "100000000": 7, + "1000000000": 7 + }, + "count": 7, + "sum": 0 + } + } } }, "Index": "", @@ -1583,38 +1236,12 @@ "request": { "code": "200", "component": "apiserver", - "count": 3, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", + "count": 11, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", "scope": "resource", - "subresource": "approval", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "group": "policy", - "resource": "podsecuritypolicies", - "scope": "cluster", - "verb": "LIST", + "subresource": "status", + "verb": "PATCH", "version": "v1beta1" } }, @@ -1629,32 +1256,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 4, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -1758,12 +1359,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 11, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", - "scope": "resource", - "subresource": "status", - "verb": "PATCH", + "count": 1, + "group": "policy", + "resource": "podsecuritypolicies", + "scope": "cluster", + "verb": "LIST", "version": "v1beta1" } }, @@ -1783,30 +1383,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "networking.k8s.io", + "code": "200", + "component": "apiserver", + "count": 4, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "watch": { - "events": { - "kind": "IngressClass", - "size": { - "bytes": { - "bucket": { - "+Inf": 16, - "1024": 16, - "131072": 16, - "16384": 16, - "2048": 16, - "32768": 16, - "4096": 16, - "65536": 16, - "8192": 16 - }, - "count": 16, - "sum": 1216 - } - } - } } }, "Index": "", @@ -1827,11 +1411,12 @@ "request": { "code": "200", "component": "apiserver", - "count": 2, - "group": "networking.k8s.io", - "resource": "ingressclasses", - "scope": "cluster", - "verb": "LIST", + "count": 3, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", + "scope": "resource", + "subresource": "approval", + "verb": "PUT", "version": "v1" } }, @@ -1851,79 +1436,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2599005191.02 - } - }, - "group": "scheduling.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "priorityclasses", - "scope": "cluster", - "verb": "WATCH", + "count": 6, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", + "scope": "resource", + "verb": "APPLY", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 - } - } } }, "Index": "", @@ -1942,14 +1462,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 3979.419 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "resource", + "verb": "DELETE", + "version": "v1" } }, "Index": "", @@ -1968,13 +1532,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 1, - "group": "batch", - "resource": "cronjobs", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 2144.12 + } + }, + "resource": "persistentvolumeclaims", "scope": "resource", - "verb": "GET", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -1994,13 +1602,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 2, - "group": "batch", - "resource": "cronjobs", + "count": 5, + "group": "networking.k8s.io", + "resource": "networkpolicies", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" } }, @@ -2024,80 +1632,77 @@ "duration": { "us": { "bucket": { - "+Inf": 5, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 5, - "sum": 2164003818.5230002 - } - }, - "group": "rbac.authorization.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "rolebindings", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 - }, - "count": 5, - "sum": 0 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", + "+Inf": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "1250000": 8, + "150000": 8, + "1500000": 8, + "15000000": 8, + "1750000": 8, + "200000": 8, + "2000000": 8, + "20000000": 8, + "250000": 8, + "2500000": 8, + "25000000": 8, + "300000": 8, + "3000000": 8, + "30000000": 8, + "350000": 8, + "3500000": 8, + "400000": 8, + "4000000": 8, + "40000000": 8, + "450000": 8, + "4500000": 8, + "50000": 8, + "500000": 8, + "5000000": 8, + "50000000": 8, + "600000": 8, + "6000000": 8, + "60000000": 8, + "700000": 8, + "7000000": 8, + "800000": 8, + "8000000": 8, + "900000": 8, + "9000000": 8 + }, + "count": 8, + "sum": 8839.859 + } + }, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", + "scope": "cluster", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 8, + "1000": 6, + "10000": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "100000000": 8, + "1000000000": 8 + }, + "count": 8, + "sum": 12945 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", "Timestamp": "0001-01-01T00:00:00Z", "Error": null, "Host": "", @@ -2111,13 +1716,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "resource": "persistentvolumes", - "scope": "resource", - "verb": "PUT", - "version": "v1" + "group": "batch", + "version": "v1beta1" + }, + "watch": { + "events": { + "kind": "CronJob", + "size": { + "bytes": { + "bucket": { + "+Inf": 38, + "1024": 19, + "131072": 38, + "16384": 38, + "2048": 20, + "32768": 38, + "4096": 38, + "65536": 38, + "8192": 38 + }, + "count": 38, + "sum": 55822 + } + } + } } }, "Index": "", @@ -2136,78 +1758,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 12, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 12, - "sum": 5385011154.172999 - } - }, - "longrunning": { - "count": 5 - }, - "resource": "persistentvolumeclaims", + "count": 48, + "resource": "pods", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 12, - "1000": 12, - "10000": 12, - "100000": 12, - "1000000": 12, - "10000000": 12, - "100000000": 12, - "1000000000": 12 - }, - "count": 12, - "sum": 0 - } - } } }, "Index": "", @@ -2225,13 +1782,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "runtimeclasses.node.k8s.io" + "code": "404", + "component": "apiserver", + "count": 42, + "resource": "serviceaccounts", + "scope": "resource", + "verb": "GET", + "version": "v1" } }, "Index": "", @@ -2294,13 +1852,32 @@ "9000000": 3 }, "count": 3, - "sum": 9930.704 + "sum": 1737.233 } }, - "resource": "services", - "scope": "resource", - "verb": "POST", + "group": "admissionregistration.k8s.io", + "resource": "mutatingwebhookconfigurations", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 264 + } + } } }, "Index": "", @@ -2319,58 +1896,52 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 10, - "100000": 9, - "1000000": 10, - "10000000": 10, - "1250000": 10, - "150000": 10, - "1500000": 10, - "15000000": 10, - "1750000": 10, - "200000": 10, - "2000000": 10, - "20000000": 10, - "250000": 10, - "2500000": 10, - "25000000": 10, - "300000": 10, - "3000000": 10, - "30000000": 10, - "350000": 10, - "3500000": 10, - "400000": 10, - "4000000": 10, - "40000000": 10, - "450000": 10, - "4500000": 10, - "50000": 9, - "500000": 10, - "5000000": 10, - "50000000": 10, - "600000": 10, - "6000000": 10, - "60000000": 10, - "700000": 10, - "7000000": 10, - "800000": 10, - "8000000": 10, - "900000": 10, - "9000000": 10 - }, - "count": 10, - "sum": 161328.207 - } - }, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "resource", - "verb": "PUT", + "code": "200", + "count": 143, + "subresource": "/livez", + "verb": "GET" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "rbac.authorization.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "ClusterRoleBinding", + "size": { + "bytes": { + "bucket": { + "+Inf": 79, + "1024": 77, + "131072": 79, + "16384": 79, + "2048": 79, + "32768": 79, + "4096": 79, + "65536": 79, + "8192": 79 + }, + "count": 79, + "sum": 43699 + } + } + } } }, "Index": "", @@ -2514,70 +2085,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "count": 143, - "subresource": "/livez", - "verb": "GET" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "group": "rbac.authorization.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "ClusterRoleBinding", - "size": { - "bytes": { - "bucket": { - "+Inf": 79, - "1024": 77, - "131072": 79, - "16384": 79, - "2048": 79, - "32768": 79, - "4096": 79, - "65536": 79, - "8192": 79 - }, - "count": 79, - "sum": 43699 - } - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -2627,32 +2134,13 @@ "9000000": 3 }, "count": 3, - "sum": 1737.233 + "sum": 9930.704 } }, - "group": "admissionregistration.k8s.io", - "resource": "mutatingwebhookconfigurations", - "scope": "cluster", - "verb": "LIST", + "resource": "services", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 264 - } - } } }, "Index": "", @@ -2671,12 +2159,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 42, - "resource": "serviceaccounts", + "duration": { + "us": { + "bucket": { + "+Inf": 10, + "100000": 9, + "1000000": 10, + "10000000": 10, + "1250000": 10, + "150000": 10, + "1500000": 10, + "15000000": 10, + "1750000": 10, + "200000": 10, + "2000000": 10, + "20000000": 10, + "250000": 10, + "2500000": 10, + "25000000": 10, + "300000": 10, + "3000000": 10, + "30000000": 10, + "350000": 10, + "3500000": 10, + "400000": 10, + "4000000": 10, + "40000000": 10, + "450000": 10, + "4500000": 10, + "50000": 9, + "500000": 10, + "5000000": 10, + "50000000": 10, + "600000": 10, + "6000000": 10, + "60000000": 10, + "700000": 10, + "7000000": 10, + "800000": 10, + "8000000": 10, + "900000": 10, + "9000000": 10 + }, + "count": 10, + "sum": 161328.207 + } + }, + "group": "discovery.k8s.io", + "resource": "endpointslices", "scope": "resource", - "verb": "GET", + "verb": "PUT", "version": "v1" } }, @@ -2695,15 +2228,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "storage.k8s.io", - "resource": "csinodes", - "scope": "cluster", - "verb": "LIST", - "version": "v1" + "resource": "runtimeclasses.node.k8s.io" } }, "Index": "", @@ -2726,7 +2257,7 @@ "duration": { "us": { "bucket": { - "+Inf": 2, + "+Inf": 12, "100000": 0, "1000000": 0, "10000000": 0, @@ -2765,14 +2296,14 @@ "900000": 0, "9000000": 0 }, - "count": 2, - "sum": 897001982.94 + "count": 12, + "sum": 5385011154.172999 } }, "longrunning": { - "count": 1 + "count": 5 }, - "resource": "events", + "resource": "persistentvolumeclaims", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -2781,16 +2312,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 12, + "1000": 12, + "10000": 12, + "100000": 12, + "1000000": 12, + "10000000": 12, + "100000000": 12, + "1000000000": 12 }, - "count": 2, + "count": 12, "sum": 0 } } @@ -2812,14 +2343,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 2, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", - "scope": "cluster", - "verb": "WATCH", - "version": "v2beta1" + "count": 1, + "resource": "persistentvolumes", + "scope": "resource", + "verb": "PUT", + "version": "v1" } }, "Index": "", @@ -2842,70 +2372,73 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 5, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 191.292 + "count": 5, + "sum": 2164003818.5230002 } }, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "namespace", - "verb": "LIST", + "group": "rbac.authorization.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "rolebindings", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, - "1000": 0, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 }, - "count": 1, - "sum": 1592 + "count": 5, + "sum": 0 } } } @@ -2926,56 +2459,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 2228.533 - } - }, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "PUT", + "count": 2, + "group": "batch", + "resource": "cronjobs", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -2997,11 +2487,12 @@ "request": { "code": "200", "component": "apiserver", - "count": 3, - "resource": "secrets", + "count": 2, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", "scope": "cluster", "verb": "LIST", - "version": "v1" + "version": "v1beta1" } }, "Index": "", @@ -3020,75 +2511,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 117, - "100000": 117, - "1000000": 117, - "10000000": 117, - "1250000": 117, - "150000": 117, - "1500000": 117, - "15000000": 117, - "1750000": 117, - "200000": 117, - "2000000": 117, - "20000000": 117, - "250000": 117, - "2500000": 117, - "25000000": 117, - "300000": 117, - "3000000": 117, - "30000000": 117, - "350000": 117, - "3500000": 117, - "400000": 117, - "4000000": 117, - "40000000": 117, - "450000": 117, - "4500000": 117, - "50000": 117, - "500000": 117, - "5000000": 117, - "50000000": 117, - "600000": 117, - "6000000": 117, - "60000000": 117, - "700000": 117, - "7000000": 117, - "800000": 117, - "8000000": 117, - "900000": 117, - "9000000": 117 - }, - "count": 117, - "sum": 189362.956 - } - }, - "resource": "serviceaccounts", + "count": 1, + "group": "batch", + "resource": "cronjobs", "scope": "resource", "verb": "GET", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 117, - "1000": 117, - "10000": 117, - "100000": 117, - "1000000": 117, - "10000000": 117, - "100000000": 117, - "1000000000": 117 - }, - "count": 117, - "sum": 19717 - } - } } }, "Index": "", @@ -3107,70 +2537,77 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", "duration": { "us": { "bucket": { - "+Inf": 143, - "100000": 140, - "1000000": 142, - "10000000": 143, - "1250000": 143, - "150000": 140, - "1500000": 143, - "15000000": 143, - "1750000": 143, - "200000": 140, - "2000000": 143, - "20000000": 143, - "250000": 140, - "2500000": 143, - "25000000": 143, - "300000": 140, - "3000000": 143, - "30000000": 143, - "350000": 140, - "3500000": 143, - "400000": 140, - "4000000": 143, - "40000000": 143, - "450000": 141, - "4500000": 143, - "50000": 139, - "500000": 141, - "5000000": 143, - "50000000": 143, - "600000": 141, - "6000000": 143, - "60000000": 143, - "700000": 141, - "7000000": 143, - "800000": 141, - "8000000": 143, - "900000": 142, - "9000000": 143 + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 143, - "sum": 2504873.9210000015 + "count": 6, + "sum": 2599005191.02 } }, - "subresource": "/livez", - "verb": "GET" + "group": "scheduling.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "priorityclasses", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 143, - "1000": 143, - "10000": 143, - "100000": 143, - "1000000": 143, - "10000000": 143, - "100000000": 143, - "1000000000": 143 + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 143, - "sum": 286 + "count": 6, + "sum": 0 } } } @@ -3191,56 +2628,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 2955.975 - } - }, - "resource": "configmaps", - "scope": "resource", - "verb": "PUT", + "count": 2, + "group": "networking.k8s.io", + "resource": "ingressclasses", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -3260,26 +2654,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "group": "networking.k8s.io", "version": "v1" }, "watch": { "events": { - "kind": "Pod", + "kind": "IngressClass", "size": { "bytes": { "bucket": { - "+Inf": 1635, - "1024": 606, - "131072": 1635, - "16384": 1635, - "2048": 798, - "32768": 1635, - "4096": 1355, - "65536": 1635, - "8192": 1629 + "+Inf": 16, + "1024": 16, + "131072": 16, + "16384": 16, + "2048": 16, + "32768": 16, + "4096": 16, + "65536": 16, + "8192": 16 }, - "count": 1635, - "sum": 3884458 + "count": 16, + "sum": 1216 } } } @@ -3305,22 +2700,22 @@ }, "watch": { "events": { - "kind": "ServiceAccount", + "kind": "Service", "size": { "bytes": { "bucket": { - "+Inf": 203, - "1024": 203, - "131072": 203, - "16384": 203, - "2048": 203, - "32768": 203, - "4096": 203, - "65536": 203, - "8192": 203 + "+Inf": 145, + "1024": 133, + "131072": 145, + "16384": 145, + "2048": 145, + "32768": 145, + "4096": 145, + "65536": 145, + "8192": 145 }, - "count": 203, - "sum": 38576 + "count": 145, + "sum": 28100 } } } @@ -3342,13 +2737,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "409", "component": "apiserver", - "count": 75, - "resource": "pods", + "count": 1, + "resource": "nodes", "scope": "resource", - "subresource": "status", - "verb": "PATCH", + "verb": "POST", "version": "v1" } }, @@ -3474,22 +2868,22 @@ }, "watch": { "events": { - "kind": "Service", + "kind": "Pod", "size": { "bytes": { "bucket": { - "+Inf": 145, - "1024": 133, - "131072": 145, - "16384": 145, - "2048": 145, - "32768": 145, - "4096": 145, - "65536": 145, - "8192": 145 + "+Inf": 1635, + "1024": 606, + "131072": 1635, + "16384": 1635, + "2048": 798, + "32768": 1635, + "4096": 1355, + "65536": 1635, + "8192": 1629 }, - "count": 145, - "sum": 28100 + "count": 1635, + "sum": 3884458 } } } @@ -3511,39 +2905,29 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "409", - "component": "apiserver", - "count": 1, - "resource": "nodes", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 8, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", - "scope": "cluster", - "verb": "LIST", "version": "v1" + }, + "watch": { + "events": { + "kind": "ServiceAccount", + "size": { + "bytes": { + "bucket": { + "+Inf": 203, + "1024": 203, + "131072": 203, + "16384": 203, + "2048": 203, + "32768": 203, + "4096": 203, + "65536": 203, + "8192": 203 + }, + "count": 203, + "sum": 38576 + } + } + } } }, "Index": "", @@ -3561,13 +2945,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 6 - } - }, "request": { - "resource": "leases.coordination.k8s.io" + "code": "200", + "component": "apiserver", + "count": 75, + "resource": "pods", + "scope": "resource", + "subresource": "status", + "verb": "PATCH", + "version": "v1" } }, "Index": "", @@ -3586,28 +2972,70 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "networking.k8s.io", - "version": "v1" + "duration": { + "us": { + "bucket": { + "+Inf": 143, + "100000": 140, + "1000000": 142, + "10000000": 143, + "1250000": 143, + "150000": 140, + "1500000": 143, + "15000000": 143, + "1750000": 143, + "200000": 140, + "2000000": 143, + "20000000": 143, + "250000": 140, + "2500000": 143, + "25000000": 143, + "300000": 140, + "3000000": 143, + "30000000": 143, + "350000": 140, + "3500000": 143, + "400000": 140, + "4000000": 143, + "40000000": 143, + "450000": 141, + "4500000": 143, + "50000": 139, + "500000": 141, + "5000000": 143, + "50000000": 143, + "600000": 141, + "6000000": 143, + "60000000": 143, + "700000": 141, + "7000000": 143, + "800000": 141, + "8000000": 143, + "900000": 142, + "9000000": 143 + }, + "count": 143, + "sum": 2504873.9210000015 + } + }, + "subresource": "/livez", + "verb": "GET" }, - "watch": { - "events": { - "kind": "Ingress", - "size": { - "bytes": { - "bucket": { - "+Inf": 18, - "1024": 18, - "131072": 18, - "16384": 18, - "2048": 18, - "32768": 18, - "4096": 18, - "65536": 18, - "8192": 18 - }, - "count": 18, - "sum": 1314 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 143, + "1000": 143, + "10000": 143, + "100000": 143, + "1000000": 143, + "10000000": 143, + "100000000": 143, + "1000000000": 143 + }, + "count": 143, + "sum": 286 } } } @@ -3623,32 +3051,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "201", - "component": "apiserver", - "count": 37, - "group": "apiregistration.k8s.io", - "resource": "apiservices", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -3698,11 +3100,79 @@ "9000000": 2 }, "count": 2, - "sum": 1474.186 + "sum": 2955.975 } }, - "group": "scheduling.k8s.io", - "resource": "priorityclasses", + "resource": "configmaps", + "scope": "resource", + "verb": "PUT", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 117, + "100000": 117, + "1000000": 117, + "10000000": 117, + "1250000": 117, + "150000": 117, + "1500000": 117, + "15000000": 117, + "1750000": 117, + "200000": 117, + "2000000": 117, + "20000000": 117, + "250000": 117, + "2500000": 117, + "25000000": 117, + "300000": 117, + "3000000": 117, + "30000000": 117, + "350000": 117, + "3500000": 117, + "400000": 117, + "4000000": 117, + "40000000": 117, + "450000": 117, + "4500000": 117, + "50000": 117, + "500000": 117, + "5000000": 117, + "50000000": 117, + "600000": 117, + "6000000": 117, + "60000000": 117, + "700000": 117, + "7000000": 117, + "800000": 117, + "8000000": 117, + "900000": 117, + "9000000": 117 + }, + "count": 117, + "sum": 189362.956 + } + }, + "resource": "serviceaccounts", "scope": "resource", "verb": "GET", "version": "v1" @@ -3711,17 +3181,17 @@ "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 117, + "1000": 117, + "10000": 117, + "100000": 117, + "1000000": 117, + "10000000": 117, + "100000000": 117, + "1000000000": 117 }, - "count": 2, - "sum": 380 + "count": 117, + "sum": 19717 } } } @@ -3745,8 +3215,7 @@ "code": "200", "component": "apiserver", "count": 3, - "group": "storage.k8s.io", - "resource": "volumeattachments", + "resource": "secrets", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -3768,14 +3237,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 8, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 191.292 + } + }, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "namespace", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 0, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 1592 + } + } } }, "Index": "", @@ -3794,39 +3325,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 11, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 2228.533 + } + }, + "resource": "persistentvolumeclaims", "scope": "resource", - "verb": "POST", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "group": "apps", - "resource": "deployments", - "scope": "cluster", - "verb": "LIST", + "verb": "PUT", "version": "v1" } }, @@ -3841,30 +3389,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, - "request": { - "resource": "customresourcedefinitions.apiextensions.k8s.io" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -3874,7 +3398,7 @@ "duration": { "us": { "bucket": { - "+Inf": 14, + "+Inf": 2, "100000": 0, "1000000": 0, "10000000": 0, @@ -3913,14 +3437,14 @@ "900000": 0, "9000000": 0 }, - "count": 14, - "sum": 5997012252.085001 + "count": 2, + "sum": 897001982.94 } }, "longrunning": { - "count": 5 + "count": 1 }, - "resource": "endpoints", + "resource": "events", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -3929,16 +3453,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 14, - "1000": 14, - "10000": 14, - "100000": 14, - "1000000": 14, - "10000000": 14, - "100000000": 14, - "1000000000": 14 + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 14, + "count": 2, "sum": 0 } } @@ -3960,76 +3484,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 2588.612 - } - }, - "group": "apps", - "resource": "deployments", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 97 - } - } + "count": 2, + "group": "autoscaling", + "resource": "horizontalpodautoscalers", + "scope": "cluster", + "verb": "WATCH", + "version": "v2beta1" } }, "Index": "", @@ -4048,12 +3510,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "200", "component": "apiserver", - "count": 12, - "resource": "configmaps", - "scope": "resource", - "verb": "POST", + "count": 2, + "group": "storage.k8s.io", + "resource": "csinodes", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -4124,9 +3587,8 @@ "request": { "code": "201", "component": "apiserver", - "count": 15, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", + "count": 12, + "resource": "configmaps", "scope": "resource", "verb": "POST", "version": "v1" @@ -4152,79 +3614,72 @@ "duration": { "us": { "bucket": { - "+Inf": 2363, - "100000": 2352, - "1000000": 2362, - "10000000": 2363, - "1250000": 2363, - "150000": 2353, - "1500000": 2363, - "15000000": 2363, - "1750000": 2363, - "200000": 2355, - "2000000": 2363, - "20000000": 2363, - "250000": 2356, - "2500000": 2363, - "25000000": 2363, - "300000": 2356, - "3000000": 2363, - "30000000": 2363, - "350000": 2356, - "3500000": 2363, - "400000": 2358, - "4000000": 2363, - "40000000": 2363, - "450000": 2358, - "4500000": 2363, - "50000": 2349, - "500000": 2358, - "5000000": 2363, - "50000000": 2363, - "600000": 2360, - "6000000": 2363, - "60000000": 2363, - "700000": 2361, - "7000000": 2363, - "800000": 2361, - "8000000": 2363, - "900000": 2362, - "9000000": 2363 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 2363, - "sum": 12932811.667999994 + "count": 1, + "sum": 2588.612 } }, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "resource", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "resource": "events", - "scope": "cluster", + "group": "apps", + "resource": "deployments", + "scope": "namespace", "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 97 + } + } } }, "Index": "", @@ -4247,7 +3702,7 @@ "duration": { "us": { "bucket": { - "+Inf": 4, + "+Inf": 14, "100000": 0, "1000000": 0, "10000000": 0, @@ -4286,15 +3741,14 @@ "900000": 0, "9000000": 0 }, - "count": 4, - "sum": 1925003926.877 + "count": 14, + "sum": 5997012252.085001 } }, - "group": "batch", "longrunning": { - "count": 2 + "count": 5 }, - "resource": "cronjobs", + "resource": "endpoints", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -4303,16 +3757,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 4, - "1000": 4, - "10000": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 + "+Inf": 14, + "1000": 14, + "10000": 14, + "100000": 14, + "1000000": 14, + "10000000": 14, + "100000000": 14, + "1000000000": 14 }, - "count": 4, + "count": 14, "sum": 0 } } @@ -4339,7 +3793,7 @@ } }, "request": { - "resource": "volumeattachments.storage.k8s.io" + "resource": "customresourcedefinitions.apiextensions.k8s.io" } }, "Index": "", @@ -4358,13 +3812,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "201", "component": "apiserver", - "count": 3, - "group": "policy", - "resource": "podsecuritypolicies", - "scope": "cluster", - "verb": "WATCH", + "count": 11, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", + "scope": "resource", + "verb": "POST", "version": "v1beta1" } }, @@ -4384,14 +3838,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 4, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", + "count": 3, + "group": "storage.k8s.io", + "resource": "volumeattachments", "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -4409,15 +3863,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 146 - } - }, "request": { - "code": "404", - "host": "[::1]:6443", - "method": "GET" + "code": "0", + "component": "apiserver", + "count": 8, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -4438,8 +3892,9 @@ "request": { "code": "200", "component": "apiserver", - "count": 5, - "resource": "persistentvolumeclaims", + "count": 3, + "group": "apps", + "resource": "deployments", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -4465,73 +3920,70 @@ "duration": { "us": { "bucket": { - "+Inf": 4, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 4, - "sum": 1957001969.333 + "count": 2, + "sum": 1474.186 } }, - "group": "flowcontrol.apiserver.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "flowschemas", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + "group": "scheduling.k8s.io", + "resource": "priorityclasses", + "scope": "resource", + "verb": "GET", + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 4, - "1000": 4, - "10000": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 4, - "sum": 0 + "count": 2, + "sum": 380 } } } @@ -4552,13 +4004,55 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "group": "networking.k8s.io", + "version": "v1" + }, + "watch": { + "events": { + "kind": "Ingress", + "size": { + "bytes": { + "bucket": { + "+Inf": 18, + "1024": 18, + "131072": 18, + "16384": 18, + "2048": 18, + "32768": 18, + "4096": 18, + "65536": 18, + "8192": 18 + }, + "count": 18, + "sum": 1314 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "201", "component": "apiserver", - "count": 3, - "group": "batch", - "resource": "jobs", - "scope": "cluster", - "verb": "LIST", + "count": 37, + "group": "apiregistration.k8s.io", + "resource": "apiservices", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -4578,30 +4072,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "extensions", - "version": "v1beta1" - }, - "watch": { - "events": { - "kind": "Ingress", - "size": { - "bytes": { - "bucket": { - "+Inf": 11, - "1024": 11, - "131072": 11, - "16384": 11, - "2048": 11, - "32768": 11, - "4096": 11, - "65536": 11, - "8192": 11 - }, - "count": 11, - "sum": 781 - } - } - } + "code": "200", + "component": "apiserver", + "count": 8, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -4621,11 +4099,11 @@ "MetricSetFields": { "etcd": { "object": { - "count": 3 + "count": 6 } }, "request": { - "resource": "services" + "resource": "leases.coordination.k8s.io" } }, "Index": "", @@ -4644,29 +4122,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", + "component": "apiserver", + "count": 30, + "group": "storage.k8s.io", + "resource": "csinodes", + "scope": "resource", + "verb": "GET", "version": "v1" - }, - "watch": { - "events": { - "kind": "ReplicationController", - "size": { - "bytes": { - "bucket": { - "+Inf": 29, - "1024": 29, - "131072": 29, - "16384": 29, - "2048": 29, - "32768": 29, - "4096": 29, - "65536": 29, - "8192": 29 - }, - "count": 29, - "sum": 2349 - } - } - } } }, "Index": "", @@ -4687,9 +4150,9 @@ "request": { "code": "201", "component": "apiserver", - "count": 4, - "group": "apps", - "resource": "daemonsets", + "count": 69, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", "scope": "resource", "verb": "POST", "version": "v1" @@ -4706,93 +4169,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 2951.2230000000004 - } - }, - "resource": "secrets", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 114365 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -4867,14 +4243,53 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", - "component": "apiserver", - "count": 69, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", - "scope": "resource", - "verb": "POST", "version": "v1" + }, + "watch": { + "events": { + "kind": "ReplicationController", + "size": { + "bytes": { + "bucket": { + "+Inf": 29, + "1024": 29, + "131072": 29, + "16384": 29, + "2048": 29, + "32768": 29, + "4096": 29, + "65536": 29, + "8192": 29 + }, + "count": 29, + "sum": 2349 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, + "request": { + "resource": "services" } }, "Index": "", @@ -4893,14 +4308,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 30, - "group": "storage.k8s.io", - "resource": "csinodes", - "scope": "resource", - "verb": "GET", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 2951.2230000000004 + } + }, + "resource": "secrets", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 114365 + } + } } }, "Index": "", @@ -4919,14 +4395,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", - "count": 11, + "count": 4, "group": "apps", - "resource": "replicasets", + "resource": "daemonsets", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "POST", "version": "v1" } }, @@ -4941,6 +4416,48 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "extensions", + "version": "v1beta1" + }, + "watch": { + "events": { + "kind": "Ingress", + "size": { + "bytes": { + "bucket": { + "+Inf": 11, + "1024": 11, + "131072": 11, + "16384": 11, + "2048": 11, + "32768": 11, + "4096": 11, + "65536": 11, + "8192": 11 + }, + "count": 11, + "sum": 781 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -4948,9 +4465,9 @@ "request": { "code": "200", "component": "apiserver", - "count": 2, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", + "count": 3, + "group": "batch", + "resource": "jobs", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -4976,54 +4493,75 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 4, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 1847.6460000000002 + "count": 4, + "sum": 1957001969.333 } }, - "group": "storage.k8s.io", - "resource": "storageclasses", - "scope": "resource", - "verb": "POST", - "version": "v1" + "group": "flowcontrol.apiserver.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "flowschemas", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1000": 4, + "10000": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 + }, + "count": 4, + "sum": 0 + } + } } }, "Index": "", @@ -5042,30 +4580,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "rbac.authorization.k8s.io", + "code": "200", + "component": "apiserver", + "count": 5, + "resource": "persistentvolumeclaims", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "watch": { - "events": { - "kind": "RoleBinding", - "size": { - "bytes": { - "bucket": { - "+Inf": 43, - "1024": 43, - "131072": 43, - "16384": 43, - "2048": 43, - "32768": 43, - "4096": 43, - "65536": 43, - "8192": 43 - }, - "count": 43, - "sum": 19711 - } - } - } } }, "Index": "", @@ -5083,15 +4604,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "client": { + "request": { + "count": 146 + } + }, "request": { - "code": "201", - "component": "apiserver", - "count": 21, - "group": "batch", - "resource": "jobs", - "scope": "resource", - "verb": "POST", - "version": "v1" + "code": "404", + "host": "[::1]:6443", + "method": "GET" } }, "Index": "", @@ -5109,13 +4630,80 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 13 - } - }, "request": { - "resource": "roles.rbac.authorization.k8s.io" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 4, + "sum": 1925003926.877 + } + }, + "group": "batch", + "longrunning": { + "count": 2 + }, + "resource": "cronjobs", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1000": 4, + "10000": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 + }, + "count": 4, + "sum": 0 + } + } } }, "Index": "", @@ -5136,10 +4724,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 27, + "count": 1, "resource": "events", - "scope": "resource", - "verb": "PATCH", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -5159,30 +4747,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "coordination.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "Lease", - "size": { - "bytes": { - "bucket": { - "+Inf": 2745, - "1024": 2745, - "131072": 2745, - "16384": 2745, - "2048": 2745, - "32768": 2745, - "4096": 2745, - "65536": 2745, - "8192": 2745 - }, - "count": 2745, - "sum": 1262194 - } - } - } + "code": "0", + "component": "apiserver", + "count": 3, + "group": "policy", + "resource": "podsecuritypolicies", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" } }, "Index": "", @@ -5201,14 +4773,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", "count": 4, - "group": "apps", - "resource": "statefulsets", + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", "scope": "cluster", - "verb": "LIST", - "version": "v1" + "verb": "WATCH", + "version": "v1beta1" } }, "Index": "", @@ -5226,58 +4798,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 17, - "100000": 17, - "1000000": 17, - "10000000": 17, - "1250000": 17, - "150000": 17, - "1500000": 17, - "15000000": 17, - "1750000": 17, - "200000": 17, - "2000000": 17, - "20000000": 17, - "250000": 17, - "2500000": 17, - "25000000": 17, - "300000": 17, - "3000000": 17, - "30000000": 17, - "350000": 17, - "3500000": 17, - "400000": 17, - "4000000": 17, - "40000000": 17, - "450000": 17, - "4500000": 17, - "50000": 17, - "500000": 17, - "5000000": 17, - "50000000": 17, - "600000": 17, - "6000000": 17, - "60000000": 17, - "700000": 17, - "7000000": 17, - "800000": 17, - "8000000": 17, - "900000": 17, - "9000000": 17 - }, - "count": 17, - "sum": 75247.61700000001 - } - }, - "resource": "nodes", - "scope": "resource", - "verb": "PATCH", - "version": "v1" + "resource": "volumeattachments.storage.k8s.io" } }, "Index": "", @@ -5296,13 +4823,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "group": "apps", - "resource": "daemonsets", + "duration": { + "us": { + "bucket": { + "+Inf": 2363, + "100000": 2352, + "1000000": 2362, + "10000000": 2363, + "1250000": 2363, + "150000": 2353, + "1500000": 2363, + "15000000": 2363, + "1750000": 2363, + "200000": 2355, + "2000000": 2363, + "20000000": 2363, + "250000": 2356, + "2500000": 2363, + "25000000": 2363, + "300000": 2356, + "3000000": 2363, + "30000000": 2363, + "350000": 2356, + "3500000": 2363, + "400000": 2358, + "4000000": 2363, + "40000000": 2363, + "450000": 2358, + "4500000": 2363, + "50000": 2349, + "500000": 2358, + "5000000": 2363, + "50000000": 2363, + "600000": 2360, + "6000000": 2363, + "60000000": 2363, + "700000": 2361, + "7000000": 2363, + "800000": 2361, + "8000000": 2363, + "900000": 2362, + "9000000": 2363 + }, + "count": 2363, + "sum": 12932811.667999994 + } + }, + "group": "coordination.k8s.io", + "resource": "leases", "scope": "resource", - "verb": "DELETE", + "verb": "PUT", "version": "v1" } }, @@ -5322,30 +4893,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", + "component": "apiserver", + "count": 15, "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "watch": { - "events": { - "kind": "ClusterRole", - "size": { - "bytes": { - "bucket": { - "+Inf": 110, - "1024": 85, - "131072": 110, - "16384": 110, - "2048": 96, - "32768": 110, - "4096": 110, - "65536": 110, - "8192": 110 - }, - "count": 110, - "sum": 94975 - } - } - } } }, "Index": "", @@ -5364,14 +4919,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 6, + "sum": 2640006405.135 + } + }, "group": "rbac.authorization.k8s.io", + "longrunning": { + "count": 2 + }, "resource": "roles", - "scope": "resource", - "verb": "DELETE", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 0 + } + } } }, "Index": "", @@ -5391,11 +5011,11 @@ "MetricSetFields": { "etcd": { "object": { - "count": 1 + "count": 5 } }, "request": { - "resource": "storageclasses.storage.k8s.io" + "resource": "namespaces" } }, "Index": "", @@ -5414,30 +5034,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "policy", - "version": "v1beta1" - }, - "watch": { - "events": { - "kind": "PodSecurityPolicy", - "size": { - "bytes": { - "bucket": { - "+Inf": 7, - "1024": 7, - "131072": 7, - "16384": 7, - "2048": 7, - "32768": 7, - "4096": 7, - "65536": 7, - "8192": 7 - }, - "count": 7, - "sum": 714 - } - } - } + "code": "200", + "component": "apiserver", + "count": 1, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", + "scope": "resource", + "verb": "DELETE", + "version": "v1" } }, "Index": "", @@ -5458,11 +5062,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 2, - "group": "networking.k8s.io", - "resource": "networkpolicies", - "scope": "cluster", - "verb": "LIST", + "count": 142, + "resource": "services", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -5486,7 +5089,7 @@ "duration": { "us": { "bucket": { - "+Inf": 9, + "+Inf": 5, "100000": 0, "1000000": 0, "10000000": 0, @@ -5525,14 +5128,15 @@ "900000": 0, "9000000": 0 }, - "count": 9, - "sum": 3646007358.1160007 + "count": 5, + "sum": 2233004071.303 } }, + "group": "networking.k8s.io", "longrunning": { - "count": 3 + "count": 2 }, - "resource": "secrets", + "resource": "ingresses", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -5541,16 +5145,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 9, - "1000": 9, - "10000": 9, - "100000": 9, - "1000000": 9, - "10000000": 9, - "100000000": 9, - "1000000000": 9 + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 }, - "count": 9, + "count": 5, "sum": 0 } } @@ -5567,31 +5171,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 142, - "resource": "services", - "scope": "resource", - "verb": "GET", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -5643,7 +5222,7 @@ "duration": { "us": { "bucket": { - "+Inf": 5, + "+Inf": 9, "100000": 0, "1000000": 0, "10000000": 0, @@ -5682,15 +5261,14 @@ "900000": 0, "9000000": 0 }, - "count": 5, - "sum": 2233004071.303 + "count": 9, + "sum": 3646007358.1160007 } }, - "group": "networking.k8s.io", "longrunning": { - "count": 2 + "count": 3 }, - "resource": "ingresses", + "resource": "secrets", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -5699,16 +5277,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "+Inf": 9, + "1000": 9, + "10000": 9, + "100000": 9, + "1000000": 9, + "10000000": 9, + "100000000": 9, + "1000000000": 9 }, - "count": 5, + "count": 9, "sum": 0 } } @@ -5725,6 +5303,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 1 + } + }, + "request": { + "resource": "storageclasses.storage.k8s.io" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -5732,9 +5334,9 @@ "request": { "code": "200", "component": "apiserver", - "count": 1, + "count": 2, "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "resource": "roles", "scope": "resource", "verb": "DELETE", "version": "v1" @@ -5756,77 +5358,54 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2640006405.135 - } - }, - "group": "rbac.authorization.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "roles", + "count": 2, + "group": "networking.k8s.io", + "resource": "networkpolicies", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "policy", + "version": "v1beta1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 + "watch": { + "events": { + "kind": "PodSecurityPolicy", + "size": { + "bytes": { + "bucket": { + "+Inf": 7, + "1024": 7, + "131072": 7, + "16384": 7, + "2048": 7, + "32768": 7, + "4096": 7, + "65536": 7, + "8192": 7 + }, + "count": 7, + "sum": 714 + } } } } @@ -5846,13 +5425,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 5 - } - }, "request": { - "resource": "namespaces" + "code": "200", + "component": "apiserver", + "count": 1, + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "verb": "DELETE", + "version": "v1" } }, "Index": "", @@ -5871,74 +5452,28 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 214, - "100000": 214, - "1000000": 214, - "10000000": 214, - "1250000": 214, - "150000": 214, - "1500000": 214, - "15000000": 214, - "1750000": 214, - "200000": 214, - "2000000": 214, - "20000000": 214, - "250000": 214, - "2500000": 214, - "25000000": 214, - "300000": 214, - "3000000": 214, - "30000000": 214, - "350000": 214, - "3500000": 214, - "400000": 214, - "4000000": 214, - "40000000": 214, - "450000": 214, - "4500000": 214, - "50000": 214, - "500000": 214, - "5000000": 214, - "50000000": 214, - "600000": 214, - "6000000": 214, - "60000000": 214, - "700000": 214, - "7000000": 214, - "800000": 214, - "8000000": 214, - "900000": 214, - "9000000": 214 - }, - "count": 214, - "sum": 550773.7160000002 - } - }, - "group": "batch", - "resource": "jobs", - "scope": "resource", - "verb": "GET", + "group": "rbac.authorization.k8s.io", "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 214, - "1000": 0, - "10000": 214, - "100000": 214, - "1000000": 214, - "10000000": 214, - "100000000": 214, - "1000000000": 214 - }, - "count": 214, - "sum": 415680 + "watch": { + "events": { + "kind": "ClusterRole", + "size": { + "bytes": { + "bucket": { + "+Inf": 110, + "1024": 85, + "131072": 110, + "16384": 110, + "2048": 96, + "32768": 110, + "4096": 110, + "65536": 110, + "8192": 110 + }, + "count": 110, + "sum": 94975 + } } } } @@ -5963,69 +5498,119 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 17, + "100000": 17, + "1000000": 17, + "10000000": 17, + "1250000": 17, + "150000": 17, + "1500000": 17, + "15000000": 17, + "1750000": 17, + "200000": 17, + "2000000": 17, + "20000000": 17, + "250000": 17, + "2500000": 17, + "25000000": 17, + "300000": 17, + "3000000": 17, + "30000000": 17, + "350000": 17, + "3500000": 17, + "400000": 17, + "4000000": 17, + "40000000": 17, + "450000": 17, + "4500000": 17, + "50000": 17, + "500000": 17, + "5000000": 17, + "50000000": 17, + "600000": 17, + "6000000": 17, + "60000000": 17, + "700000": 17, + "7000000": 17, + "800000": 17, + "8000000": 17, + "900000": 17, + "9000000": 17 }, - "count": 2, - "sum": 2604.2340000000004 + "count": 17, + "sum": 75247.61700000001 } }, - "resource": "configmaps", + "resource": "nodes", + "scope": "resource", + "verb": "PATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 4, + "group": "apps", + "resource": "statefulsets", "scope": "cluster", "verb": "LIST", "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "coordination.k8s.io", + "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 0, - "10000": 1, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 26574 + "watch": { + "events": { + "kind": "Lease", + "size": { + "bytes": { + "bucket": { + "+Inf": 2745, + "1024": 2745, + "131072": 2745, + "16384": 2745, + "2048": 2745, + "32768": 2745, + "4096": 2745, + "65536": 2745, + "8192": 2745 + }, + "count": 2745, + "sum": 1262194 + } } } } @@ -6046,14 +5631,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "409", + "code": "200", "component": "apiserver", - "count": 21, - "group": "batch", - "resource": "cronjobs", + "count": 27, + "resource": "events", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "PATCH", "version": "v1" } }, @@ -6074,11 +5657,11 @@ "MetricSetFields": { "etcd": { "object": { - "count": 0 + "count": 13 } }, "request": { - "resource": "podsecuritypolicies.policy" + "resource": "roles.rbac.authorization.k8s.io" } }, "Index": "", @@ -6097,78 +5680,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 4, - "sum": 1876003810.848 - } - }, - "longrunning": { - "count": 2 - }, - "resource": "configmaps", - "scope": "cluster", - "verb": "WATCH", + "count": 21, + "group": "batch", + "resource": "jobs", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 4, - "1000": 4, - "10000": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 - }, - "count": 4, - "sum": 0 - } - } } }, "Index": "", @@ -6187,30 +5706,15 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "batch", + "code": "200", + "component": "apiserver", + "count": 11, + "group": "apps", + "resource": "replicasets", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" - }, - "watch": { - "events": { - "kind": "Job", - "size": { - "bytes": { - "bucket": { - "+Inf": 168, - "1024": 54, - "131072": 168, - "16384": 168, - "2048": 151, - "32768": 168, - "4096": 168, - "65536": 168, - "8192": 168 - }, - "count": 168, - "sum": 186809 - } - } - } } }, "Index": "", @@ -6228,13 +5732,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } - }, "request": { - "resource": "certificatesigningrequests.certificates.k8s.io" + "code": "200", + "component": "apiserver", + "count": 2, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -6257,72 +5763,54 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 2, - "sum": 1089.865 + "count": 1, + "sum": 1847.6460000000002 } }, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 2906 - } - } + "group": "storage.k8s.io", + "resource": "storageclasses", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -6341,13 +5829,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", - "component": "apiserver", - "count": 3, - "resource": "services", - "scope": "resource", - "verb": "POST", + "group": "rbac.authorization.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "RoleBinding", + "size": { + "bytes": { + "bucket": { + "+Inf": 43, + "1024": 43, + "131072": 43, + "16384": 43, + "2048": 43, + "32768": 43, + "4096": 43, + "65536": 43, + "8192": 43 + }, + "count": 43, + "sum": 19711 + } + } + } } }, "Index": "", @@ -6366,12 +5871,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "200", "component": "apiserver", - "count": 29, - "resource": "pods", - "scope": "resource", - "verb": "GET", + "count": 1, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -6391,14 +5897,142 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 6, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "duration": { + "us": { + "bucket": { + "+Inf": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "1250000": 5, + "150000": 5, + "1500000": 5, + "15000000": 5, + "1750000": 5, + "200000": 5, + "2000000": 5, + "20000000": 5, + "250000": 5, + "2500000": 5, + "25000000": 5, + "300000": 5, + "3000000": 5, + "30000000": 5, + "350000": 5, + "3500000": 5, + "400000": 5, + "4000000": 5, + "40000000": 5, + "450000": 5, + "4500000": 5, + "50000": 5, + "500000": 5, + "5000000": 5, + "50000000": 5, + "600000": 5, + "6000000": 5, + "60000000": 5, + "700000": 5, + "7000000": 5, + "800000": 5, + "8000000": 5, + "900000": 5, + "9000000": 5 + }, + "count": 5, + "sum": 23534.366 + } + }, + "resource": "endpoints", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 5, + "1000": 4, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 + }, + "count": 5, + "sum": 4501 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "404", + "component": "apiserver", + "count": 1, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "version": "v1" + }, + "watch": { + "events": { + "kind": "Node", + "size": { + "bytes": { + "bucket": { + "+Inf": 1075, + "1024": 676, + "131072": 1075, + "16384": 1075, + "2048": 676, + "32768": 1075, + "4096": 832, + "65536": 1075, + "8192": 1075 + }, + "count": 1075, + "sum": 1799396 + } + } + } } }, "Index": "", @@ -6461,11 +6095,35 @@ "9000000": 1 }, "count": 1, - "sum": 6834.9800000000005 + "sum": 3649.158 } }, - "group": "apps", - "resource": "statefulsets", + "resource": "persistentvolumes", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "201", + "component": "apiserver", + "count": 44, + "resource": "serviceaccounts", "scope": "resource", "verb": "POST", "version": "v1" @@ -6482,6 +6140,32 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "404", + "component": "apiserver", + "count": 11, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -6489,9 +6173,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 701, - "resource": "endpoints", + "count": 3, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", "scope": "resource", + "subresource": "status", "verb": "PUT", "version": "v1" } @@ -6507,6 +6193,31 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 28, + "resource": "limitranges", + "scope": "namespace", + "verb": "LIST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -6577,58 +6288,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 28, - "resource": "limitranges", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -6678,10 +6337,11 @@ "9000000": 1 }, "count": 1, - "sum": 3649.158 + "sum": 6834.9800000000005 } }, - "resource": "persistentvolumes", + "group": "apps", + "resource": "statefulsets", "scope": "resource", "verb": "POST", "version": "v1" @@ -6703,12 +6363,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "200", "component": "apiserver", - "count": 44, - "resource": "serviceaccounts", + "count": 701, + "resource": "endpoints", "scope": "resource", - "verb": "POST", + "verb": "PUT", "version": "v1" } }, @@ -6728,13 +6388,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "0", "component": "apiserver", - "count": 11, + "count": 6, "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "resource", - "verb": "GET", + "resource": "clusterroles", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -6756,9 +6416,8 @@ "request": { "code": "404", "component": "apiserver", - "count": 1, - "group": "discovery.k8s.io", - "resource": "endpointslices", + "count": 29, + "resource": "pods", "scope": "resource", "verb": "GET", "version": "v1" @@ -6780,26 +6439,52 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", + "component": "apiserver", + "count": 3, + "resource": "services", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "batch", "version": "v1" }, "watch": { "events": { - "kind": "Node", + "kind": "Job", "size": { "bytes": { "bucket": { - "+Inf": 1075, - "1024": 676, - "131072": 1075, - "16384": 1075, - "2048": 676, - "32768": 1075, - "4096": 832, - "65536": 1075, - "8192": 1075 + "+Inf": 168, + "1024": 54, + "131072": 168, + "16384": 168, + "2048": 151, + "32768": 168, + "4096": 168, + "65536": 168, + "8192": 168 }, - "count": 1075, - "sum": 1799396 + "count": 168, + "sum": 186809 } } } @@ -6825,69 +6510,70 @@ "duration": { "us": { "bucket": { - "+Inf": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "1250000": 5, - "150000": 5, - "1500000": 5, - "15000000": 5, - "1750000": 5, - "200000": 5, - "2000000": 5, - "20000000": 5, - "250000": 5, - "2500000": 5, - "25000000": 5, - "300000": 5, - "3000000": 5, - "30000000": 5, - "350000": 5, - "3500000": 5, - "400000": 5, - "4000000": 5, - "40000000": 5, - "450000": 5, - "4500000": 5, - "50000": 5, - "500000": 5, - "5000000": 5, - "50000000": 5, - "600000": 5, - "6000000": 5, - "60000000": 5, - "700000": 5, - "7000000": 5, - "800000": 5, - "8000000": 5, - "900000": 5, - "9000000": 5 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 5, - "sum": 23534.366 + "count": 2, + "sum": 1089.865 } }, - "resource": "endpoints", + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", "scope": "cluster", "verb": "LIST", - "version": "v1" + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 5, - "1000": 4, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "+Inf": 2, + "1000": 1, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 5, - "sum": 4501 + "count": 2, + "sum": 2906 } } } @@ -6907,15 +6593,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "namespace", - "verb": "LIST", - "version": "v1" + "resource": "certificatesigningrequests.certificates.k8s.io" } }, "Index": "", @@ -6934,149 +6618,39 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "autoscaling", + "code": "409", + "component": "apiserver", + "count": 21, + "group": "batch", + "resource": "cronjobs", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } }, - "watch": { - "events": { - "kind": "HorizontalPodAutoscaler", - "size": { - "bytes": { - "bucket": { - "+Inf": 9, - "1024": 9, - "131072": 9, - "16384": 9, - "2048": 9, - "32768": 9, - "4096": 9, - "65536": 9, - "8192": 9 - }, - "count": 9, - "sum": 855 - } - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 1 - } - }, - "request": { - "resource": "persistentvolumes" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 12, - "100000": 12, - "1000000": 12, - "10000000": 12, - "1250000": 12, - "150000": 12, - "1500000": 12, - "15000000": 12, - "1750000": 12, - "200000": 12, - "2000000": 12, - "20000000": 12, - "250000": 12, - "2500000": 12, - "25000000": 12, - "300000": 12, - "3000000": 12, - "30000000": 12, - "350000": 12, - "3500000": 12, - "400000": 12, - "4000000": 12, - "40000000": 12, - "450000": 12, - "4500000": 12, - "50000": 12, - "500000": 12, - "5000000": 12, - "50000000": 12, - "600000": 12, - "6000000": 12, - "60000000": 12, - "700000": 12, - "7000000": 12, - "800000": 12, - "8000000": 12, - "900000": 12, - "9000000": 12 - }, - "count": 12, - "sum": 18390.601 - } - }, - "resource": "configmaps", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { "request": { - "code": "404", - "component": "apiserver", - "count": 2, - "group": "scheduling.k8s.io", - "resource": "priorityclasses", - "scope": "resource", - "verb": "GET", - "version": "v1" + "resource": "podsecuritypolicies.policy" } }, "Index": "", @@ -7099,7 +6673,7 @@ "duration": { "us": { "bucket": { - "+Inf": 5, + "+Inf": 4, "100000": 0, "1000000": 0, "10000000": 0, @@ -7138,15 +6712,14 @@ "900000": 0, "9000000": 0 }, - "count": 5, - "sum": 2189005324.1089997 + "count": 4, + "sum": 1876003810.848 } }, - "group": "networking.k8s.io", "longrunning": { "count": 2 }, - "resource": "networkpolicies", + "resource": "configmaps", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -7155,16 +6728,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "+Inf": 4, + "1000": 4, + "10000": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 }, - "count": 5, + "count": 4, "sum": 0 } } @@ -7186,14 +6759,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 6, - "group": "node.k8s.io", - "resource": "runtimeclasses", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 2604.2340000000004 + } + }, + "resource": "configmaps", "scope": "cluster", "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 0, + "10000": 1, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 26574 + } + } } }, "Index": "", @@ -7212,41 +6846,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 20, - "group": "apps", - "resource": "daemonsets", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "scheduling.k8s.io", - "resource": "priorityclasses", - "scope": "cluster", - "verb": "LIST", + "duration": { + "us": { + "bucket": { + "+Inf": 214, + "100000": 214, + "1000000": 214, + "10000000": 214, + "1250000": 214, + "150000": 214, + "1500000": 214, + "15000000": 214, + "1750000": 214, + "200000": 214, + "2000000": 214, + "20000000": 214, + "250000": 214, + "2500000": 214, + "25000000": 214, + "300000": 214, + "3000000": 214, + "30000000": 214, + "350000": 214, + "3500000": 214, + "400000": 214, + "4000000": 214, + "40000000": 214, + "450000": 214, + "4500000": 214, + "50000": 214, + "500000": 214, + "5000000": 214, + "50000000": 214, + "600000": 214, + "6000000": 214, + "60000000": 214, + "700000": 214, + "7000000": 214, + "800000": 214, + "8000000": 214, + "900000": 214, + "9000000": 214 + }, + "count": 214, + "sum": 550773.7160000002 + } + }, + "group": "batch", + "resource": "jobs", + "scope": "resource", + "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 214, + "1000": 0, + "10000": 214, + "100000": 214, + "1000000": 214, + "10000000": 214, + "100000000": 214, + "1000000000": 214 + }, + "count": 214, + "sum": 415680 + } + } } }, "Index": "", @@ -7269,72 +6938,54 @@ "duration": { "us": { "bucket": { - "+Inf": 143, - "100000": 143, - "1000000": 143, - "10000000": 143, - "1250000": 143, - "150000": 143, - "1500000": 143, - "15000000": 143, - "1750000": 143, - "200000": 143, - "2000000": 143, - "20000000": 143, - "250000": 143, - "2500000": 143, - "25000000": 143, - "300000": 143, - "3000000": 143, - "30000000": 143, - "350000": 143, - "3500000": 143, - "400000": 143, - "4000000": 143, - "40000000": 143, - "450000": 143, - "4500000": 143, - "50000": 143, - "500000": 143, - "5000000": 143, - "50000000": 143, - "600000": 143, - "6000000": 143, - "60000000": 143, - "700000": 143, - "7000000": 143, - "800000": 143, - "8000000": 143, - "900000": 143, - "9000000": 143 + "+Inf": 58, + "100000": 58, + "1000000": 58, + "10000000": 58, + "1250000": 58, + "150000": 58, + "1500000": 58, + "15000000": 58, + "1750000": 58, + "200000": 58, + "2000000": 58, + "20000000": 58, + "250000": 58, + "2500000": 58, + "25000000": 58, + "300000": 58, + "3000000": 58, + "30000000": 58, + "350000": 58, + "3500000": 58, + "400000": 58, + "4000000": 58, + "40000000": 58, + "450000": 58, + "4500000": 58, + "50000": 58, + "500000": 58, + "5000000": 58, + "50000000": 58, + "600000": 58, + "6000000": 58, + "60000000": 58, + "700000": 58, + "7000000": 58, + "800000": 58, + "8000000": 58, + "900000": 58, + "9000000": 58 }, - "count": 143, - "sum": 137488.495 + "count": 58, + "sum": 283030.888 } }, - "group": "discovery.k8s.io", - "resource": "endpointslices", + "resource": "serviceaccounts", "scope": "resource", - "verb": "GET", + "subresource": "token", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 143, - "1000": 143, - "10000": 143, - "100000": 143, - "1000000": 143, - "10000000": 143, - "100000000": 143, - "1000000000": 143 - }, - "count": 143, - "sum": 58241 - } - } } }, "Index": "", @@ -7353,12 +7004,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 8, - "resource": "replicationcontrollers", - "scope": "cluster", - "verb": "WATCH", + "count": 276, + "resource": "namespaces", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -7377,13 +7028,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "csidrivers.storage.k8s.io" + "code": "201", + "component": "apiserver", + "count": 1, + "resource": "persistentvolumes", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -7401,14 +7053,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "resource": "limitranges", - "scope": "cluster", - "verb": "LIST", - "version": "v1" + "resource": "endpointslices.discovery.k8s.io" } }, "Index": "", @@ -7426,30 +7077,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "version": "v1" - }, - "watch": { - "events": { - "kind": "PersistentVolumeClaim", - "size": { - "bytes": { - "bucket": { - "+Inf": 24, - "1024": 17, - "131072": 24, - "16384": 24, - "2048": 24, - "32768": 24, - "4096": 24, - "65536": 24, - "8192": 24 - }, - "count": 24, - "sum": 13488 - } - } + "etcd": { + "object": { + "count": 0 } + }, + "request": { + "resource": "podtemplates" } }, "Index": "", @@ -7733,37 +7367,30 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "podtemplates" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } + "version": "v1" }, - "request": { - "resource": "endpointslices.discovery.k8s.io" + "watch": { + "events": { + "kind": "PersistentVolumeClaim", + "size": { + "bytes": { + "bucket": { + "+Inf": 24, + "1024": 17, + "131072": 24, + "16384": 24, + "2048": 24, + "32768": 24, + "4096": 24, + "65536": 24, + "8192": 24 + }, + "count": 24, + "sum": 13488 + } + } + } } }, "Index": "", @@ -7784,10 +7411,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 276, - "resource": "namespaces", - "scope": "resource", - "verb": "GET", + "count": 3, + "resource": "limitranges", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -7806,59 +7433,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 58, - "100000": 58, - "1000000": 58, - "10000000": 58, - "1250000": 58, - "150000": 58, - "1500000": 58, - "15000000": 58, - "1750000": 58, - "200000": 58, - "2000000": 58, - "20000000": 58, - "250000": 58, - "2500000": 58, - "25000000": 58, - "300000": 58, - "3000000": 58, - "30000000": 58, - "350000": 58, - "3500000": 58, - "400000": 58, - "4000000": 58, - "40000000": 58, - "450000": 58, - "4500000": 58, - "50000": 58, - "500000": 58, - "5000000": 58, - "50000000": 58, - "600000": 58, - "6000000": 58, - "60000000": 58, - "700000": 58, - "7000000": 58, - "800000": 58, - "8000000": 58, - "900000": 58, - "9000000": 58 - }, - "count": 58, - "sum": 283030.888 - } - }, - "resource": "serviceaccounts", - "scope": "resource", - "subresource": "token", - "verb": "POST", - "version": "v1" + "resource": "csidrivers.storage.k8s.io" } }, "Index": "", @@ -7877,12 +7458,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "0", "component": "apiserver", - "count": 1, - "resource": "persistentvolumes", - "scope": "resource", - "verb": "POST", + "count": 8, + "resource": "replicationcontrollers", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -7906,70 +7487,70 @@ "duration": { "us": { "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 + "+Inf": 143, + "100000": 143, + "1000000": 143, + "10000000": 143, + "1250000": 143, + "150000": 143, + "1500000": 143, + "15000000": 143, + "1750000": 143, + "200000": 143, + "2000000": 143, + "20000000": 143, + "250000": 143, + "2500000": 143, + "25000000": 143, + "300000": 143, + "3000000": 143, + "30000000": 143, + "350000": 143, + "3500000": 143, + "400000": 143, + "4000000": 143, + "40000000": 143, + "450000": 143, + "4500000": 143, + "50000": 143, + "500000": 143, + "5000000": 143, + "50000000": 143, + "600000": 143, + "6000000": 143, + "60000000": 143, + "700000": 143, + "7000000": 143, + "800000": 143, + "8000000": 143, + "900000": 143, + "9000000": 143 }, - "count": 3, - "sum": 1726.521 + "count": 143, + "sum": 137488.495 } }, - "group": "batch", - "resource": "jobs", - "scope": "cluster", - "verb": "LIST", + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "resource", + "verb": "GET", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 3, - "1000": 1, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 + "+Inf": 143, + "1000": 143, + "10000": 143, + "100000": 143, + "1000000": 143, + "10000000": 143, + "100000000": 143, + "1000000000": 143 }, - "count": 3, - "sum": 11029 + "count": 143, + "sum": 58241 } } } @@ -7989,13 +7570,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 68 - } - }, "request": { - "resource": "clusterroles.rbac.authorization.k8s.io" + "code": "200", + "component": "apiserver", + "count": 2, + "group": "scheduling.k8s.io", + "resource": "priorityclasses", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -8014,79 +7597,15 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2434004609.5880003 - } - }, - "group": "rbac.authorization.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "clusterrolebindings", - "scope": "cluster", - "verb": "WATCH", + "count": 20, + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 - } - } } }, "Index": "", @@ -8109,7 +7628,7 @@ "duration": { "us": { "bucket": { - "+Inf": 6, + "+Inf": 5, "100000": 0, "1000000": 0, "10000000": 0, @@ -8148,15 +7667,15 @@ "900000": 0, "9000000": 0 }, - "count": 6, - "sum": 2700005691.396 + "count": 5, + "sum": 2189005324.1089997 } }, - "group": "apiextensions.k8s.io", + "group": "networking.k8s.io", "longrunning": { "count": 2 }, - "resource": "customresourcedefinitions", + "resource": "networkpolicies", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -8165,16 +7684,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 }, - "count": 6, + "count": 5, "sum": 0 } } @@ -8196,30 +7715,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "apps", + "code": "200", + "component": "apiserver", + "count": 6, + "group": "node.k8s.io", + "resource": "runtimeclasses", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "watch": { - "events": { - "kind": "ControllerRevision", - "size": { - "bytes": { - "bucket": { - "+Inf": 16, - "1024": 10, - "131072": 16, - "16384": 16, - "2048": 11, - "32768": 16, - "4096": 13, - "65536": 16, - "8192": 16 - }, - "count": 16, - "sum": 24506 - } - } - } } }, "Index": "", @@ -8238,11 +7741,11 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "404", "component": "apiserver", - "count": 142, - "group": "discovery.k8s.io", - "resource": "endpointslices", + "count": 2, + "group": "scheduling.k8s.io", + "resource": "priorityclasses", "scope": "resource", "verb": "GET", "version": "v1" @@ -8263,30 +7766,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "version": "v1" - }, - "watch": { - "events": { - "kind": "Endpoints", - "size": { - "bytes": { - "bucket": { - "+Inf": 3515, - "1024": 3515, - "131072": 3515, - "16384": 3515, - "2048": 3515, - "32768": 3515, - "4096": 3515, - "65536": 3515, - "8192": 3515 - }, - "count": 3515, - "sum": 1888449 - } - } + "etcd": { + "object": { + "count": 1 } + }, + "request": { + "resource": "persistentvolumes" } }, "Index": "", @@ -8305,57 +7791,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 - }, - "count": 4, - "sum": 9547.679999999998 - } - }, - "resource": "endpoints", - "scope": "resource", - "verb": "POST", + "group": "autoscaling", "version": "v1" + }, + "watch": { + "events": { + "kind": "HorizontalPodAutoscaler", + "size": { + "bytes": { + "bucket": { + "+Inf": 9, + "1024": 9, + "131072": 9, + "16384": 9, + "2048": 9, + "32768": 9, + "4096": 9, + "65536": 9, + "8192": 9 + }, + "count": 9, + "sum": 855 + } + } + } } }, "Index": "", @@ -8378,72 +7837,127 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 12, + "100000": 12, + "1000000": 12, + "10000000": 12, + "1250000": 12, + "150000": 12, + "1500000": 12, + "15000000": 12, + "1750000": 12, + "200000": 12, + "2000000": 12, + "20000000": 12, + "250000": 12, + "2500000": 12, + "25000000": 12, + "300000": 12, + "3000000": 12, + "30000000": 12, + "350000": 12, + "3500000": 12, + "400000": 12, + "4000000": 12, + "40000000": 12, + "450000": 12, + "4500000": 12, + "50000": 12, + "500000": 12, + "5000000": 12, + "50000000": 12, + "600000": 12, + "6000000": 12, + "60000000": 12, + "700000": 12, + "7000000": 12, + "800000": 12, + "8000000": 12, + "900000": 12, + "9000000": 12 }, - "count": 2, - "sum": 1463.528 + "count": 12, + "sum": 18390.601 } }, - "group": "batch", - "resource": "cronjobs", - "scope": "cluster", - "verb": "LIST", + "resource": "configmaps", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 3227 - } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 1, + "resource": "secrets", + "scope": "resource", + "verb": "DELETE", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 0 } + }, + "request": { + "resource": "networkpolicies.networking.k8s.io" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "201", + "component": "apiserver", + "count": 3, + "resource": "nodes", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -8570,42 +8084,81 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, - "request": { - "resource": "networkpolicies.networking.k8s.io" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 3, - "resource": "nodes", - "scope": "resource", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 1463.528 + } + }, + "group": "batch", + "resource": "cronjobs", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 1, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 3227 + } + } } }, "Index": "", @@ -8624,12 +8177,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "resource": "secrets", - "scope": "resource", - "verb": "DELETE", + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 + }, + "count": 4, + "sum": 9547.679999999998 + } + }, + "resource": "endpoints", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -8649,58 +8246,97 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "1250000": 6, - "150000": 6, - "1500000": 6, - "15000000": 6, - "1750000": 6, - "200000": 6, - "2000000": 6, - "20000000": 6, - "250000": 6, - "2500000": 6, - "25000000": 6, - "300000": 6, - "3000000": 6, - "30000000": 6, - "350000": 6, - "3500000": 6, - "400000": 6, - "4000000": 6, - "40000000": 6, - "450000": 6, - "4500000": 6, - "50000": 6, - "500000": 6, - "5000000": 6, - "50000000": 6, - "600000": 6, - "6000000": 6, - "60000000": 6, - "700000": 6, - "7000000": 6, - "800000": 6, - "8000000": 6, - "900000": 6, - "9000000": 6 - }, - "count": 6, - "sum": 13536.479 + "version": "v1" + }, + "watch": { + "events": { + "kind": "Endpoints", + "size": { + "bytes": { + "bucket": { + "+Inf": 3515, + "1024": 3515, + "131072": 3515, + "16384": 3515, + "2048": 3515, + "32768": 3515, + "4096": 3515, + "65536": 3515, + "8192": 3515 + }, + "count": 3515, + "sum": 1888449 + } } - }, - "group": "coordination.k8s.io", - "resource": "leases", + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 142, + "group": "discovery.k8s.io", + "resource": "endpointslices", "scope": "resource", - "verb": "POST", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "apps", "version": "v1" + }, + "watch": { + "events": { + "kind": "ControllerRevision", + "size": { + "bytes": { + "bucket": { + "+Inf": 16, + "1024": 10, + "131072": 16, + "16384": 16, + "2048": 11, + "32768": 16, + "4096": 13, + "65536": 16, + "8192": 16 + }, + "count": 16, + "sum": 24506 + } + } + } } }, "Index": "", @@ -8763,14 +8399,14 @@ "9000000": 0 }, "count": 6, - "sum": 2447005559.725 + "sum": 2700005691.396 } }, - "group": "rbac.authorization.k8s.io", + "group": "apiextensions.k8s.io", "longrunning": { "count": 2 }, - "resource": "clusterroles", + "resource": "customresourcedefinitions", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -8809,39 +8445,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "audit": { - "event": { - "count": 0 - }, - "rejected": { - "count": 0 - } - }, - "process": { - "cpu": { - "sec": 84 - }, - "fds": { - "open": { - "count": 127 - } - }, - "memory": { - "resident": { - "bytes": 380186624 - }, - "virtual": { - "bytes": 1146454016 - } - }, - "started": { - "sec": 1654503718.97 + "etcd": { + "object": { + "count": 68 } }, "request": { - "current": { - "count": 1 - } + "resource": "clusterroles.rbac.authorization.k8s.io" } }, "Index": "", @@ -8864,69 +8474,73 @@ "duration": { "us": { "bucket": { - "+Inf": 144, - "100000": 144, - "1000000": 144, - "10000000": 144, - "1250000": 144, - "150000": 144, - "1500000": 144, - "15000000": 144, - "1750000": 144, - "200000": 144, - "2000000": 144, - "20000000": 144, - "250000": 144, - "2500000": 144, - "25000000": 144, - "300000": 144, - "3000000": 144, - "30000000": 144, - "350000": 144, - "3500000": 144, - "400000": 144, - "4000000": 144, - "40000000": 144, - "450000": 144, - "4500000": 144, - "50000": 144, - "500000": 144, - "5000000": 144, - "50000000": 144, - "600000": 144, - "6000000": 144, - "60000000": 144, - "700000": 144, - "7000000": 144, - "800000": 144, - "8000000": 144, - "900000": 144, - "9000000": 144 + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 144, - "sum": 148905.88100000005 + "count": 6, + "sum": 2434004609.5880003 } }, - "resource": "services", - "scope": "resource", - "verb": "GET", + "group": "rbac.authorization.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "clusterrolebindings", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 144, - "1000": 144, - "10000": 144, - "100000": 144, - "1000000": 144, - "10000000": 144, - "100000000": 144, - "1000000000": 144 + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 144, - "sum": 85813 + "count": 6, + "sum": 0 } } } @@ -8951,51 +8565,51 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 }, - "count": 1, - "sum": 355.325 + "count": 3, + "sum": 1726.521 } }, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", + "group": "batch", + "resource": "jobs", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -9004,17 +8618,17 @@ "size": { "bytes": { "bucket": { - "+Inf": 1, + "+Inf": 3, "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 }, - "count": 1, - "sum": 66 + "count": 3, + "sum": 11029 } } } @@ -9035,30 +8649,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "storage.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "VolumeAttachment", - "size": { - "bytes": { - "bucket": { - "+Inf": 24, - "1024": 24, - "131072": 24, - "16384": 24, - "2048": 24, - "32768": 24, - "4096": 24, - "65536": 24, - "8192": 24 - }, - "count": 24, - "sum": 2040 - } - } - } + "code": "200", + "component": "apiserver", + "count": 1, + "group": "policy", + "resource": "poddisruptionbudgets", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" } }, "Index": "", @@ -9077,58 +8675,72 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 8717.697 + "+Inf": 1434, + "100000": 1418, + "1000000": 1433, + "10000000": 1434, + "1250000": 1433, + "150000": 1421, + "1500000": 1434, + "15000000": 1434, + "1750000": 1434, + "200000": 1423, + "2000000": 1434, + "20000000": 1434, + "250000": 1424, + "2500000": 1434, + "25000000": 1434, + "300000": 1424, + "3000000": 1434, + "30000000": 1434, + "350000": 1425, + "3500000": 1434, + "400000": 1425, + "4000000": 1434, + "40000000": 1434, + "450000": 1425, + "4500000": 1434, + "50000": 1416, + "500000": 1426, + "5000000": 1434, + "50000000": 1434, + "600000": 1427, + "6000000": 1434, + "60000000": 1434, + "700000": 1427, + "7000000": 1434, + "800000": 1427, + "8000000": 1434, + "900000": 1431, + "9000000": 1434 + }, + "count": 1434, + "sum": 11367597.736000028 } }, - "group": "batch", - "resource": "cronjobs", - "scope": "resource", - "verb": "POST", - "version": "v1" + "subresource": "/readyz", + "verb": "GET" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1434, + "1000": 1434, + "10000": 1434, + "100000": 1434, + "1000000": 1434, + "10000000": 1434, + "100000000": 1434, + "1000000000": 1434 + }, + "count": 1434, + "sum": 2840 + } + } } }, "Index": "", @@ -9147,13 +8759,10 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 44, - "resource": "serviceaccounts", - "scope": "resource", - "verb": "PUT", - "version": "v1" + "code": "0", + "count": 3, + "subresource": "/healthz", + "verb": "GET" } }, "Index": "", @@ -9172,13 +8781,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "201", "component": "apiserver", "count": 3, - "group": "apps", - "resource": "controllerrevisions", - "scope": "cluster", - "verb": "WATCH", + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -9200,10 +8809,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 41, - "resource": "namespaces", - "scope": "cluster", - "verb": "LIST", + "count": 2363, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "PUT", "version": "v1" } }, @@ -9222,58 +8832,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 53, - "100000": 53, - "1000000": 53, - "10000000": 53, - "1250000": 53, - "150000": 53, - "1500000": 53, - "15000000": 53, - "1750000": 53, - "200000": 53, - "2000000": 53, - "20000000": 53, - "250000": 53, - "2500000": 53, - "25000000": 53, - "300000": 53, - "3000000": 53, - "30000000": 53, - "350000": 53, - "3500000": 53, - "400000": 53, - "4000000": 53, - "40000000": 53, - "450000": 53, - "4500000": 53, - "50000": 53, - "500000": 53, - "5000000": 53, - "50000000": 53, - "600000": 53, - "6000000": 53, - "60000000": 53, - "700000": 53, - "7000000": 53, - "800000": 53, - "8000000": 53, - "900000": 53, - "9000000": 53 - }, - "count": 53, - "sum": 229957.40899999996 - } - }, - "resource": "pods", - "scope": "resource", - "verb": "POST", - "version": "v1" + "resource": "csistoragecapacities.storage.k8s.io" } }, "Index": "", @@ -9379,13 +8944,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2363, - "group": "coordination.k8s.io", - "resource": "leases", + "duration": { + "us": { + "bucket": { + "+Inf": 53, + "100000": 53, + "1000000": 53, + "10000000": 53, + "1250000": 53, + "150000": 53, + "1500000": 53, + "15000000": 53, + "1750000": 53, + "200000": 53, + "2000000": 53, + "20000000": 53, + "250000": 53, + "2500000": 53, + "25000000": 53, + "300000": 53, + "3000000": 53, + "30000000": 53, + "350000": 53, + "3500000": 53, + "400000": 53, + "4000000": 53, + "40000000": 53, + "450000": 53, + "4500000": 53, + "50000": 53, + "500000": 53, + "5000000": 53, + "50000000": 53, + "600000": 53, + "6000000": 53, + "60000000": 53, + "700000": 53, + "7000000": 53, + "800000": 53, + "8000000": 53, + "900000": 53, + "9000000": 53 + }, + "count": 53, + "sum": 229957.40899999996 + } + }, + "resource": "pods", "scope": "resource", - "verb": "PUT", + "verb": "POST", "version": "v1" } }, @@ -9400,42 +9008,18 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, - "request": { - "resource": "csistoragecapacities.storage.k8s.io" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "0", "component": "apiserver", "count": 3, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "resource", - "verb": "POST", + "group": "apps", + "resource": "controllerrevisions", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -9455,10 +9039,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", - "count": 3, - "subresource": "/healthz", - "verb": "GET" + "code": "200", + "component": "apiserver", + "count": 41, + "resource": "namespaces", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -9477,70 +9064,28 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 1434, - "100000": 1418, - "1000000": 1433, - "10000000": 1434, - "1250000": 1433, - "150000": 1421, - "1500000": 1434, - "15000000": 1434, - "1750000": 1434, - "200000": 1423, - "2000000": 1434, - "20000000": 1434, - "250000": 1424, - "2500000": 1434, - "25000000": 1434, - "300000": 1424, - "3000000": 1434, - "30000000": 1434, - "350000": 1425, - "3500000": 1434, - "400000": 1425, - "4000000": 1434, - "40000000": 1434, - "450000": 1425, - "4500000": 1434, - "50000": 1416, - "500000": 1426, - "5000000": 1434, - "50000000": 1434, - "600000": 1427, - "6000000": 1434, - "60000000": 1434, - "700000": 1427, - "7000000": 1434, - "800000": 1427, - "8000000": 1434, - "900000": 1431, - "9000000": 1434 - }, - "count": 1434, - "sum": 11367597.736000028 - } - }, - "subresource": "/readyz", - "verb": "GET" + "group": "storage.k8s.io", + "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1434, - "1000": 1434, - "10000": 1434, - "100000": 1434, - "1000000": 1434, - "10000000": 1434, - "100000000": 1434, - "1000000000": 1434 - }, - "count": 1434, - "sum": 2840 + "watch": { + "events": { + "kind": "VolumeAttachment", + "size": { + "bytes": { + "bucket": { + "+Inf": 24, + "1024": 24, + "131072": 24, + "16384": 24, + "2048": 24, + "32768": 24, + "4096": 24, + "65536": 24, + "8192": 24 + }, + "count": 24, + "sum": 2040 + } } } } @@ -9561,14 +9106,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "group": "policy", - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 8717.697 + } + }, + "group": "batch", + "resource": "cronjobs", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -9587,56 +9176,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "1250000": 5, - "150000": 5, - "1500000": 5, - "15000000": 5, - "1750000": 5, - "200000": 5, - "2000000": 5, - "20000000": 5, - "250000": 5, - "2500000": 5, - "25000000": 5, - "300000": 5, - "3000000": 5, - "30000000": 5, - "350000": 5, - "3500000": 5, - "400000": 5, - "4000000": 5, - "40000000": 5, - "450000": 5, - "4500000": 5, - "50000": 5, - "500000": 5, - "5000000": 5, - "50000000": 5, - "600000": 5, - "6000000": 5, - "60000000": 5, - "700000": 5, - "7000000": 5, - "800000": 5, - "8000000": 5, - "900000": 5, - "9000000": 5 - }, - "count": 5, - "sum": 16716.743 - } - }, - "resource": "namespaces", + "count": 44, + "resource": "serviceaccounts", "scope": "resource", - "verb": "POST", + "verb": "PUT", "version": "v1" } }, @@ -9700,14 +9245,14 @@ "9000000": 1 }, "count": 1, - "sum": 1538.837 + "sum": 355.325 } }, - "group": "policy", - "resource": "poddisruptionbudgets", + "group": "autoscaling", + "resource": "horizontalpodautoscalers", "scope": "cluster", "verb": "LIST", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { @@ -9723,7 +9268,7 @@ "1000000000": 1 }, "count": 1, - "sum": 62 + "sum": 66 } } } @@ -9748,851 +9293,50 @@ "duration": { "us": { "bucket": { - "+Inf": 13, - "100000": 13, - "1000000": 13, - "10000000": 13, - "1250000": 13, - "150000": 13, - "1500000": 13, - "15000000": 13, - "1750000": 13, - "200000": 13, - "2000000": 13, - "20000000": 13, - "250000": 13, - "2500000": 13, - "25000000": 13, - "300000": 13, - "3000000": 13, - "30000000": 13, - "350000": 13, - "3500000": 13, - "400000": 13, - "4000000": 13, - "40000000": 13, - "450000": 13, - "4500000": 13, - "50000": 13, - "500000": 13, - "5000000": 13, - "50000000": 13, - "600000": 13, - "6000000": 13, - "60000000": 13, - "700000": 13, - "7000000": 13, - "800000": 13, - "8000000": 13, - "900000": 13, - "9000000": 13 - }, - "count": 13, - "sum": 55283.98299999999 - } - }, - "group": "apps", - "resource": "replicasets", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 1 - } - }, - "request": { - "resource": "persistentvolumeclaims" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 701, - "100000": 698, - "1000000": 701, - "10000000": 701, - "1250000": 701, - "150000": 700, - "1500000": 701, - "15000000": 701, - "1750000": 701, - "200000": 701, - "2000000": 701, - "20000000": 701, - "250000": 701, - "2500000": 701, - "25000000": 701, - "300000": 701, - "3000000": 701, - "30000000": 701, - "350000": 701, - "3500000": 701, - "400000": 701, - "4000000": 701, - "40000000": 701, - "450000": 701, - "4500000": 701, - "50000": 697, - "500000": 701, - "5000000": 701, - "50000000": 701, - "600000": 701, - "6000000": 701, - "60000000": 701, - "700000": 701, - "7000000": 701, - "800000": 701, - "8000000": 701, - "900000": 701, - "9000000": 701 - }, - "count": 701, - "sum": 2291024.148000001 - } - }, - "resource": "endpoints", - "scope": "resource", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "201", - "component": "apiserver", - "count": 45, - "resource": "secrets", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "409", - "component": "apiserver", - "count": 3, - "group": "apps", - "resource": "deployments", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 28, - "100000": 28, - "1000000": 28, - "10000000": 28, - "1250000": 28, - "150000": 28, - "1500000": 28, - "15000000": 28, - "1750000": 28, - "200000": 28, - "2000000": 28, - "20000000": 28, - "250000": 28, - "2500000": 28, - "25000000": 28, - "300000": 28, - "3000000": 28, - "30000000": 28, - "350000": 28, - "3500000": 28, - "400000": 28, - "4000000": 28, - "40000000": 28, - "450000": 28, - "4500000": 28, - "50000": 28, - "500000": 28, - "5000000": 28, - "50000000": 28, - "600000": 28, - "6000000": 28, - "60000000": 28, - "700000": 28, - "7000000": 28, - "800000": 28, - "8000000": 28, - "900000": 28, - "9000000": 28 - }, - "count": 28, - "sum": 108303.68399999998 - } - }, - "group": "batch", - "resource": "jobs", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 43 - } - }, - "request": { - "resource": "serviceaccounts" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, - "request": { - "resource": "horizontalpodautoscalers.autoscaling" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "404", - "component": "apiserver", - "count": 2, - "group": "apps", - "resource": "deployments", - "scope": "resource", - "verb": "GET", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 9136.236 - } - }, - "group": "apps", - "resource": "replicasets", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 48, - "100000": 48, - "1000000": 48, - "10000000": 48, - "1250000": 48, - "150000": 48, - "1500000": 48, - "15000000": 48, - "1750000": 48, - "200000": 48, - "2000000": 48, - "20000000": 48, - "250000": 48, - "2500000": 48, - "25000000": 48, - "300000": 48, - "3000000": 48, - "30000000": 48, - "350000": 48, - "3500000": 48, - "400000": 48, - "4000000": 48, - "40000000": 48, - "450000": 48, - "4500000": 48, - "50000": 48, - "500000": 48, - "5000000": 48, - "50000000": 48, - "600000": 48, - "6000000": 48, - "60000000": 48, - "700000": 48, - "7000000": 48, - "800000": 48, - "8000000": 48, - "900000": 48, - "9000000": 48 - }, - "count": 48, - "sum": 40566.472 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "resource", - "verb": "GET", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 48, - "1000": 48, - "10000": 48, - "100000": 48, - "1000000": 48, - "10000000": 48, - "100000000": 48, - "1000000000": 48 - }, - "count": 48, - "sum": 11720 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "resource", - "verb": "DELETE", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "409", - "component": "apiserver", - "count": 2, - "group": "apps", - "resource": "replicasets", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 - }, - "count": 4, - "sum": 1832.023 - } - }, - "group": "apps", - "resource": "statefulsets", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 4, - "1000": 2, - "10000": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 - }, - "count": 4, - "sum": 5089 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 764.574 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 6536 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 11, - "100000": 11, - "1000000": 11, - "10000000": 11, - "1250000": 11, - "150000": 11, - "1500000": 11, - "15000000": 11, - "1750000": 11, - "200000": 11, - "2000000": 11, - "20000000": 11, - "250000": 11, - "2500000": 11, - "25000000": 11, - "300000": 11, - "3000000": 11, - "30000000": 11, - "350000": 11, - "3500000": 11, - "400000": 11, - "4000000": 11, - "40000000": 11, - "450000": 11, - "4500000": 11, - "50000": 11, - "500000": 11, - "5000000": 11, - "50000000": 11, - "600000": 11, - "6000000": 11, - "60000000": 11, - "700000": 11, - "7000000": 11, - "800000": 11, - "8000000": 11, - "900000": 11, - "9000000": 11 + "+Inf": 144, + "100000": 144, + "1000000": 144, + "10000000": 144, + "1250000": 144, + "150000": 144, + "1500000": 144, + "15000000": 144, + "1750000": 144, + "200000": 144, + "2000000": 144, + "20000000": 144, + "250000": 144, + "2500000": 144, + "25000000": 144, + "300000": 144, + "3000000": 144, + "30000000": 144, + "350000": 144, + "3500000": 144, + "400000": 144, + "4000000": 144, + "40000000": 144, + "450000": 144, + "4500000": 144, + "50000": 144, + "500000": 144, + "5000000": 144, + "50000000": 144, + "600000": 144, + "6000000": 144, + "60000000": 144, + "700000": 144, + "7000000": 144, + "800000": 144, + "8000000": 144, + "900000": 144, + "9000000": 144 }, - "count": 11, - "sum": 10736.747000000001 + "count": 144, + "sum": 148905.88100000005 } }, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", + "resource": "services", "scope": "resource", "verb": "GET", "version": "v1" @@ -10601,17 +9345,17 @@ "size": { "bytes": { "bucket": { - "+Inf": 11, - "1000": 11, - "10000": 11, - "100000": 11, - "1000000": 11, - "10000000": 11, - "100000000": 11, - "1000000000": 11 + "+Inf": 144, + "1000": 144, + "10000": 144, + "100000": 144, + "1000000": 144, + "10000000": 144, + "100000000": 144, + "1000000000": 144 }, - "count": 11, - "sum": 2773 + "count": 144, + "sum": 85813 } } } @@ -10631,30 +9375,38 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "group": "discovery.k8s.io", - "version": "v1" + "audit": { + "event": { + "count": 0 + }, + "rejected": { + "count": 0 + } }, - "watch": { - "events": { - "kind": "EndpointSlice", - "size": { - "bytes": { - "bucket": { - "+Inf": 25, - "1024": 15, - "131072": 25, - "16384": 25, - "2048": 25, - "32768": 25, - "4096": 25, - "65536": 25, - "8192": 25 - }, - "count": 25, - "sum": 14416 - } + "process": { + "cpu": { + "sec": 84 + }, + "fds": { + "open": { + "count": 127 + } + }, + "memory": { + "resident": { + "bytes": 380186624 + }, + "virtual": { + "bytes": 1146454016 } + }, + "started": { + "sec": 1654503718.97 + } + }, + "request": { + "current": { + "count": 1 } } }, @@ -10678,93 +9430,73 @@ "duration": { "us": { "bucket": { - "+Inf": 45, - "100000": 45, - "1000000": 45, - "10000000": 45, - "1250000": 45, - "150000": 45, - "1500000": 45, - "15000000": 45, - "1750000": 45, - "200000": 45, - "2000000": 45, - "20000000": 45, - "250000": 45, - "2500000": 45, - "25000000": 45, - "300000": 45, - "3000000": 45, - "30000000": 45, - "350000": 45, - "3500000": 45, - "400000": 45, - "4000000": 45, - "40000000": 45, - "450000": 45, - "4500000": 45, - "50000": 45, - "500000": 45, - "5000000": 45, - "50000000": 45, - "600000": 45, - "6000000": 45, - "60000000": 45, - "700000": 45, - "7000000": 45, - "800000": 45, - "8000000": 45, - "900000": 45, - "9000000": 45 - }, - "count": 45, - "sum": 103197.935 - } - }, - "resource": "secrets", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "group": "events.k8s.io", + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 6, + "sum": 2447005559.725 + } + }, + "group": "rbac.authorization.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "clusterroles", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, - "watch": { - "events": { - "kind": "Event", - "size": { - "bytes": { - "bucket": { - "+Inf": 204, - "1024": 204, - "131072": 204, - "16384": 204, - "2048": 204, - "32768": 204, - "4096": 204, - "65536": 204, - "8192": 204 - }, - "count": 204, - "sum": 140685 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 0 } } } @@ -10785,12 +9517,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 34, - "resource": "configmaps", - "scope": "namespace", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "1250000": 6, + "150000": 6, + "1500000": 6, + "15000000": 6, + "1750000": 6, + "200000": 6, + "2000000": 6, + "20000000": 6, + "250000": 6, + "2500000": 6, + "25000000": 6, + "300000": 6, + "3000000": 6, + "30000000": 6, + "350000": 6, + "3500000": 6, + "400000": 6, + "4000000": 6, + "40000000": 6, + "450000": 6, + "4500000": 6, + "50000": 6, + "500000": 6, + "5000000": 6, + "50000000": 6, + "600000": 6, + "6000000": 6, + "60000000": 6, + "700000": 6, + "7000000": 6, + "800000": 6, + "8000000": 6, + "900000": 6, + "9000000": 6 + }, + "count": 6, + "sum": 13536.479 + } + }, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -10814,70 +9591,70 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 48, + "100000": 48, + "1000000": 48, + "10000000": 48, + "1250000": 48, + "150000": 48, + "1500000": 48, + "15000000": 48, + "1750000": 48, + "200000": 48, + "2000000": 48, + "20000000": 48, + "250000": 48, + "2500000": 48, + "25000000": 48, + "300000": 48, + "3000000": 48, + "30000000": 48, + "350000": 48, + "3500000": 48, + "400000": 48, + "4000000": 48, + "40000000": 48, + "450000": 48, + "4500000": 48, + "50000": 48, + "500000": 48, + "5000000": 48, + "50000000": 48, + "600000": 48, + "6000000": 48, + "60000000": 48, + "700000": 48, + "7000000": 48, + "800000": 48, + "8000000": 48, + "900000": 48, + "9000000": 48 }, - "count": 1, - "sum": 1241.2079999999999 + "count": 48, + "sum": 40566.472 } }, - "group": "extensions", - "resource": "ingresses", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "resource", + "verb": "GET", + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "+Inf": 48, + "1000": 48, + "10000": 48, + "100000": 48, + "1000000": 48, + "10000000": 48, + "100000000": 48, + "1000000000": 48 }, - "count": 1, - "sum": 54 + "count": 48, + "sum": 11720 } } } @@ -10942,11 +9719,11 @@ "9000000": 3 }, "count": 3, - "sum": 7383.61 + "sum": 9136.236 } }, - "group": "storage.k8s.io", - "resource": "csinodes", + "group": "apps", + "resource": "replicasets", "scope": "resource", "verb": "POST", "version": "v1" @@ -10968,14 +9745,62 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", - "component": "apiserver", - "count": 13, - "group": "storage.k8s.io", - "resource": "storageclasses", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" + "code": "404", + "component": "apiserver", + "count": 2, + "group": "apps", + "resource": "deployments", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, + "request": { + "resource": "horizontalpodautoscalers.autoscaling" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 43 + } + }, + "request": { + "resource": "serviceaccounts" } }, "Index": "", @@ -10994,30 +9819,15 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "policy", - "version": "v1beta1" - }, - "watch": { - "events": { - "kind": "PodDisruptionBudget", - "size": { - "bytes": { - "bucket": { - "+Inf": 10, - "1024": 10, - "131072": 10, - "16384": 10, - "2048": 10, - "32768": 10, - "4096": 10, - "65536": 10, - "8192": 10 - }, - "count": 10, - "sum": 870 - } - } - } + "code": "409", + "component": "apiserver", + "count": 3, + "group": "apps", + "resource": "deployments", + "scope": "resource", + "subresource": "status", + "verb": "PUT", + "version": "v1" } }, "Index": "", @@ -11040,53 +9850,54 @@ "duration": { "us": { "bucket": { - "+Inf": 15, - "100000": 15, - "1000000": 15, - "10000000": 15, - "1250000": 15, - "150000": 15, - "1500000": 15, - "15000000": 15, - "1750000": 15, - "200000": 15, - "2000000": 15, - "20000000": 15, - "250000": 15, - "2500000": 15, - "25000000": 15, - "300000": 15, - "3000000": 15, - "30000000": 15, - "350000": 15, - "3500000": 15, - "400000": 15, - "4000000": 15, - "40000000": 15, - "450000": 15, - "4500000": 15, - "50000": 15, - "500000": 15, - "5000000": 15, - "50000000": 15, - "600000": 15, - "6000000": 15, - "60000000": 15, - "700000": 15, - "7000000": 15, - "800000": 15, - "8000000": 15, - "900000": 15, - "9000000": 15 + "+Inf": 28, + "100000": 28, + "1000000": 28, + "10000000": 28, + "1250000": 28, + "150000": 28, + "1500000": 28, + "15000000": 28, + "1750000": 28, + "200000": 28, + "2000000": 28, + "20000000": 28, + "250000": 28, + "2500000": 28, + "25000000": 28, + "300000": 28, + "3000000": 28, + "30000000": 28, + "350000": 28, + "3500000": 28, + "400000": 28, + "4000000": 28, + "40000000": 28, + "450000": 28, + "4500000": 28, + "50000": 28, + "500000": 28, + "5000000": 28, + "50000000": 28, + "600000": 28, + "6000000": 28, + "60000000": 28, + "700000": 28, + "7000000": 28, + "800000": 28, + "8000000": 28, + "900000": 28, + "9000000": 28 }, - "count": 15, - "sum": 22465.836999999996 + "count": 28, + "sum": 108303.68399999998 } }, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", + "group": "batch", + "resource": "jobs", "scope": "resource", - "verb": "POST", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -11106,13 +9917,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", - "count": 1, - "group": "apps", - "resource": "deployments", - "scope": "namespace", - "verb": "LIST", + "count": 45, + "resource": "secrets", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -11132,13 +9942,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "group": "apps", - "resource": "daemonsets", - "scope": "namespace", - "verb": "LIST", + "duration": { + "us": { + "bucket": { + "+Inf": 701, + "100000": 698, + "1000000": 701, + "10000000": 701, + "1250000": 701, + "150000": 700, + "1500000": 701, + "15000000": 701, + "1750000": 701, + "200000": 701, + "2000000": 701, + "20000000": 701, + "250000": 701, + "2500000": 701, + "25000000": 701, + "300000": 701, + "3000000": 701, + "30000000": 701, + "350000": 701, + "3500000": 701, + "400000": 701, + "4000000": 701, + "40000000": 701, + "450000": 701, + "4500000": 701, + "50000": 697, + "500000": 701, + "5000000": 701, + "50000000": 701, + "600000": 701, + "6000000": 701, + "60000000": 701, + "700000": 701, + "7000000": 701, + "800000": 701, + "8000000": 701, + "900000": 701, + "9000000": 701 + }, + "count": 701, + "sum": 2291024.148000001 + } + }, + "resource": "endpoints", + "scope": "resource", + "verb": "PUT", "version": "v1" } }, @@ -11159,74 +10012,58 @@ "MetricSetFields": { "request": { "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "1250000": 6, - "150000": 6, - "1500000": 6, - "15000000": 6, - "1750000": 6, - "200000": 6, - "2000000": 6, - "20000000": 6, - "250000": 6, - "2500000": 6, - "25000000": 6, - "300000": 6, - "3000000": 6, - "30000000": 6, - "350000": 6, - "3500000": 6, - "400000": 6, - "4000000": 6, - "40000000": 6, - "450000": 6, - "4500000": 6, - "50000": 6, - "500000": 6, - "5000000": 6, - "50000000": 6, - "600000": 6, - "6000000": 6, - "60000000": 6, - "700000": 6, - "7000000": 6, - "800000": 6, - "8000000": 6, - "900000": 6, - "9000000": 6 + "duration": { + "us": { + "bucket": { + "+Inf": 13, + "100000": 13, + "1000000": 13, + "10000000": 13, + "1250000": 13, + "150000": 13, + "1500000": 13, + "15000000": 13, + "1750000": 13, + "200000": 13, + "2000000": 13, + "20000000": 13, + "250000": 13, + "2500000": 13, + "25000000": 13, + "300000": 13, + "3000000": 13, + "30000000": 13, + "350000": 13, + "3500000": 13, + "400000": 13, + "4000000": 13, + "40000000": 13, + "450000": 13, + "4500000": 13, + "50000": 13, + "500000": 13, + "5000000": 13, + "50000000": 13, + "600000": 13, + "6000000": 13, + "60000000": 13, + "700000": 13, + "7000000": 13, + "800000": 13, + "8000000": 13, + "900000": 13, + "9000000": 13 }, - "count": 6, - "sum": 16883.790999999997 + "count": 13, + "sum": 55283.98299999999 } }, - "resource": "persistentvolumes", - "scope": "cluster", - "verb": "LIST", + "group": "apps", + "resource": "replicasets", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 4, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 3694 - } - } } }, "Index": "", @@ -11289,14 +10126,32 @@ "9000000": 1 }, "count": 1, - "sum": 3088.653 + "sum": 1538.837 } }, - "group": "apps", - "resource": "daemonsets", - "scope": "resource", - "verb": "DELETE", - "version": "v1" + "group": "policy", + "resource": "poddisruptionbudgets", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 62 + } + } } }, "Index": "", @@ -11314,14 +10169,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 1 + } + }, "request": { - "code": "0", - "component": "apiserver", - "count": 4, - "resource": "configmaps", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" + "resource": "persistentvolumeclaims" } }, "Index": "", @@ -11344,51 +10198,50 @@ "duration": { "us": { "bucket": { - "+Inf": 21, - "100000": 21, - "1000000": 21, - "10000000": 21, - "1250000": 21, - "150000": 21, - "1500000": 21, - "15000000": 21, - "1750000": 21, - "200000": 21, - "2000000": 21, - "20000000": 21, - "250000": 21, - "2500000": 21, - "25000000": 21, - "300000": 21, - "3000000": 21, - "30000000": 21, - "350000": 21, - "3500000": 21, - "400000": 21, - "4000000": 21, - "40000000": 21, - "450000": 21, - "4500000": 21, - "50000": 21, - "500000": 21, - "5000000": 21, - "50000000": 21, - "600000": 21, - "6000000": 21, - "60000000": 21, - "700000": 21, - "7000000": 21, - "800000": 21, - "8000000": 21, - "900000": 21, - "9000000": 21 + "+Inf": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "1250000": 5, + "150000": 5, + "1500000": 5, + "15000000": 5, + "1750000": 5, + "200000": 5, + "2000000": 5, + "20000000": 5, + "250000": 5, + "2500000": 5, + "25000000": 5, + "300000": 5, + "3000000": 5, + "30000000": 5, + "350000": 5, + "3500000": 5, + "400000": 5, + "4000000": 5, + "40000000": 5, + "450000": 5, + "4500000": 5, + "50000": 5, + "500000": 5, + "5000000": 5, + "50000000": 5, + "600000": 5, + "6000000": 5, + "60000000": 5, + "700000": 5, + "7000000": 5, + "800000": 5, + "8000000": 5, + "900000": 5, + "9000000": 5 }, - "count": 21, - "sum": 82803.684 + "count": 5, + "sum": 16716.743 } }, - "group": "batch", - "resource": "jobs", + "resource": "namespaces", "scope": "resource", "verb": "POST", "version": "v1" @@ -11414,50 +10267,51 @@ "duration": { "us": { "bucket": { - "+Inf": 44, - "100000": 44, - "1000000": 44, - "10000000": 44, - "1250000": 44, - "150000": 44, - "1500000": 44, - "15000000": 44, - "1750000": 44, - "200000": 44, - "2000000": 44, - "20000000": 44, - "250000": 44, - "2500000": 44, - "25000000": 44, - "300000": 44, - "3000000": 44, - "30000000": 44, - "350000": 44, - "3500000": 44, - "400000": 44, - "4000000": 44, - "40000000": 44, - "450000": 44, - "4500000": 44, - "50000": 44, - "500000": 44, - "5000000": 44, - "50000000": 44, - "600000": 44, - "6000000": 44, - "60000000": 44, - "700000": 44, - "7000000": 44, - "800000": 44, - "8000000": 44, - "900000": 44, - "9000000": 44 + "+Inf": 21, + "100000": 21, + "1000000": 21, + "10000000": 21, + "1250000": 21, + "150000": 21, + "1500000": 21, + "15000000": 21, + "1750000": 21, + "200000": 21, + "2000000": 21, + "20000000": 21, + "250000": 21, + "2500000": 21, + "25000000": 21, + "300000": 21, + "3000000": 21, + "30000000": 21, + "350000": 21, + "3500000": 21, + "400000": 21, + "4000000": 21, + "40000000": 21, + "450000": 21, + "4500000": 21, + "50000": 21, + "500000": 21, + "5000000": 21, + "50000000": 21, + "600000": 21, + "6000000": 21, + "60000000": 21, + "700000": 21, + "7000000": 21, + "800000": 21, + "8000000": 21, + "900000": 21, + "9000000": 21 }, - "count": 44, - "sum": 77487.755 + "count": 21, + "sum": 82803.684 } }, - "resource": "serviceaccounts", + "group": "batch", + "resource": "jobs", "scope": "resource", "verb": "POST", "version": "v1" @@ -11479,79 +10333,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 9, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 9, - "sum": 3736008440.8040004 - } - }, - "group": "apps", - "longrunning": { - "count": 4 - }, - "resource": "replicasets", + "count": 4, + "resource": "configmaps", "scope": "cluster", "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 9, - "1000": 9, - "10000": 9, - "100000": 9, - "1000000": 9, - "10000000": 9, - "100000000": 9, - "1000000000": 9 - }, - "count": 9, - "sum": 0 - } - } } }, "Index": "", @@ -11570,14 +10358,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 3088.653 + } + }, "group": "apps", - "resource": "statefulsets", + "resource": "daemonsets", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "DELETE", "version": "v1" } }, @@ -11601,70 +10432,69 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "1250000": 6, + "150000": 6, + "1500000": 6, + "15000000": 6, + "1750000": 6, + "200000": 6, + "2000000": 6, + "20000000": 6, + "250000": 6, + "2500000": 6, + "25000000": 6, + "300000": 6, + "3000000": 6, + "30000000": 6, + "350000": 6, + "3500000": 6, + "400000": 6, + "4000000": 6, + "40000000": 6, + "450000": 6, + "4500000": 6, + "50000": 6, + "500000": 6, + "5000000": 6, + "50000000": 6, + "600000": 6, + "6000000": 6, + "60000000": 6, + "700000": 6, + "7000000": 6, + "800000": 6, + "8000000": 6, + "900000": 6, + "9000000": 6 }, - "count": 2, - "sum": 4867.572 + "count": 6, + "sum": 16883.790999999997 } }, - "group": "apps", - "resource": "deployments", - "scope": "resource", - "verb": "GET", + "resource": "persistentvolumes", + "scope": "cluster", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 6, + "1000": 4, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 2, - "sum": 484 + "count": 6, + "sum": 3694 } } } @@ -11685,13 +10515,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 6, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "cluster", - "verb": "WATCH", + "count": 1, + "group": "apps", + "resource": "daemonsets", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -11711,12 +10541,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 1, - "resource": "secrets", + "duration": { + "us": { + "bucket": { + "+Inf": 15, + "100000": 15, + "1000000": 15, + "10000000": 15, + "1250000": 15, + "150000": 15, + "1500000": 15, + "15000000": 15, + "1750000": 15, + "200000": 15, + "2000000": 15, + "20000000": 15, + "250000": 15, + "2500000": 15, + "25000000": 15, + "300000": 15, + "3000000": 15, + "30000000": 15, + "350000": 15, + "3500000": 15, + "400000": 15, + "4000000": 15, + "40000000": 15, + "450000": 15, + "4500000": 15, + "50000": 15, + "500000": 15, + "5000000": 15, + "50000000": 15, + "600000": 15, + "6000000": 15, + "60000000": 15, + "700000": 15, + "7000000": 15, + "800000": 15, + "8000000": 15, + "900000": 15, + "9000000": 15 + }, + "count": 15, + "sum": 22465.836999999996 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", "scope": "resource", - "verb": "GET", + "verb": "POST", "version": "v1" } }, @@ -11736,11 +10611,81 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "200", "component": "apiserver", "count": 1, + "group": "apps", + "resource": "deployments", + "scope": "namespace", + "verb": "LIST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 7383.61 + } + }, "group": "storage.k8s.io", - "resource": "storageclasses", + "resource": "csinodes", "scope": "resource", "verb": "POST", "version": "v1" @@ -11761,13 +10706,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 38 - } - }, "request": { - "resource": "pods" + "code": "0", + "component": "apiserver", + "count": 13, + "group": "storage.k8s.io", + "resource": "storageclasses", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -11786,26 +10733,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "version": "v1" + "group": "policy", + "version": "v1beta1" }, "watch": { "events": { - "kind": "Secret", + "kind": "PodDisruptionBudget", "size": { "bytes": { "bucket": { - "+Inf": 125, - "1024": 33, - "131072": 125, - "16384": 125, - "2048": 33, - "32768": 125, - "4096": 125, - "65536": 125, - "8192": 125 + "+Inf": 10, + "1024": 10, + "131072": 10, + "16384": 10, + "2048": 10, + "32768": 10, + "4096": 10, + "65536": 10, + "8192": 10 }, - "count": 125, - "sum": 245881 + "count": 10, + "sum": 870 } } } @@ -11827,13 +10775,118 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", - "component": "apiserver", - "count": 1, - "resource": "configmaps", - "scope": "resource", - "verb": "PUT", + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 1241.2079999999999 + } + }, + "group": "extensions", + "resource": "ingresses", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 54 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "events.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "Event", + "size": { + "bytes": { + "bucket": { + "+Inf": 204, + "1024": 204, + "131072": 204, + "16384": 204, + "2048": 204, + "32768": 204, + "4096": 204, + "65536": 204, + "8192": 204 + }, + "count": 204, + "sum": 140685 + } + } + } } }, "Index": "", @@ -11854,10 +10907,9 @@ "request": { "code": "0", "component": "apiserver", - "count": 9, - "group": "apps", - "resource": "replicasets", - "scope": "cluster", + "count": 34, + "resource": "configmaps", + "scope": "namespace", "verb": "WATCH", "version": "v1" } @@ -11878,14 +10930,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "group": "policy", - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "LIST", + "duration": { + "us": { + "bucket": { + "+Inf": 11, + "100000": 11, + "1000000": 11, + "10000000": 11, + "1250000": 11, + "150000": 11, + "1500000": 11, + "15000000": 11, + "1750000": 11, + "200000": 11, + "2000000": 11, + "20000000": 11, + "250000": 11, + "2500000": 11, + "25000000": 11, + "300000": 11, + "3000000": 11, + "30000000": 11, + "350000": 11, + "3500000": 11, + "400000": 11, + "4000000": 11, + "40000000": 11, + "450000": 11, + "4500000": 11, + "50000": 11, + "500000": 11, + "5000000": 11, + "50000000": 11, + "600000": 11, + "6000000": 11, + "60000000": 11, + "700000": 11, + "7000000": 11, + "800000": 11, + "8000000": 11, + "900000": 11, + "9000000": 11 + }, + "count": 11, + "sum": 10736.747000000001 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "resource", + "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 11, + "1000": 11, + "10000": 11, + "100000": 11, + "1000000": 11, + "10000000": 11, + "100000000": 11, + "1000000000": 11 + }, + "count": 11, + "sum": 2773 + } + } } }, "Index": "", @@ -11903,13 +11017,58 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } - }, "request": { - "resource": "csinodes.storage.k8s.io" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 45, + "100000": 45, + "1000000": 45, + "10000000": 45, + "1250000": 45, + "150000": 45, + "1500000": 45, + "15000000": 45, + "1750000": 45, + "200000": 45, + "2000000": 45, + "20000000": 45, + "250000": 45, + "2500000": 45, + "25000000": 45, + "300000": 45, + "3000000": 45, + "30000000": 45, + "350000": 45, + "3500000": 45, + "400000": 45, + "4000000": 45, + "40000000": 45, + "450000": 45, + "4500000": 45, + "50000": 45, + "500000": 45, + "5000000": 45, + "50000000": 45, + "600000": 45, + "6000000": 45, + "60000000": 45, + "700000": 45, + "7000000": 45, + "800000": 45, + "8000000": 45, + "900000": 45, + "9000000": 45 + }, + "count": 45, + "sum": 103197.935 + } + }, + "resource": "secrets", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -11928,14 +11087,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", - "component": "apiserver", - "count": 5, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "cluster", - "verb": "WATCH", + "group": "discovery.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "EndpointSlice", + "size": { + "bytes": { + "bucket": { + "+Inf": 25, + "1024": 15, + "131072": 25, + "16384": 25, + "2048": 25, + "32768": 25, + "4096": 25, + "65536": 25, + "8192": 25 + }, + "count": 25, + "sum": 14416 + } + } + } } }, "Index": "", @@ -11958,73 +11133,70 @@ "duration": { "us": { "bucket": { - "+Inf": 7, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 }, - "count": 7, - "sum": 3487007382.103 + "count": 4, + "sum": 1832.023 } }, - "group": "admissionregistration.k8s.io", - "longrunning": { - "count": 3 - }, - "resource": "mutatingwebhookconfigurations", + "group": "apps", + "resource": "statefulsets", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 7, - "1000": 7, - "10000": 7, - "100000": 7, - "1000000": 7, - "10000000": 7, - "100000000": 7, - "1000000000": 7 + "+Inf": 4, + "1000": 2, + "10000": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 }, - "count": 7, - "sum": 0 + "count": 4, + "sum": 5089 } } } @@ -12049,70 +11221,70 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 1, - "sum": 429.012 + "count": 2, + "sum": 764.574 } }, - "group": "policy", - "resource": "podsecuritypolicies", + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", "scope": "cluster", "verb": "LIST", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, + "+Inf": 2, "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 1, - "sum": 60 + "count": 2, + "sum": 6536 } } } @@ -12133,11 +11305,11 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "409", "component": "apiserver", - "count": 138, - "group": "batch", - "resource": "cronjobs", + "count": 2, + "group": "apps", + "resource": "replicasets", "scope": "resource", "subresource": "status", "verb": "PUT", @@ -12160,13 +11332,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 5, - "group": "networking.k8s.io", - "resource": "ingresses", + "count": 1, + "group": "coordination.k8s.io", + "resource": "leases", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" } }, @@ -12186,75 +11358,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 41, - "100000": 41, - "1000000": 41, - "10000000": 41, - "1250000": 41, - "150000": 41, - "1500000": 41, - "15000000": 41, - "1750000": 41, - "200000": 41, - "2000000": 41, - "20000000": 41, - "250000": 41, - "2500000": 41, - "25000000": 41, - "300000": 41, - "3000000": 41, - "30000000": 41, - "350000": 41, - "3500000": 41, - "400000": 41, - "4000000": 41, - "40000000": 41, - "450000": 41, - "4500000": 41, - "50000": 41, - "500000": 41, - "5000000": 41, - "50000000": 41, - "600000": 41, - "6000000": 41, - "60000000": 41, - "700000": 41, - "7000000": 41, - "800000": 41, - "8000000": 41, - "900000": 41, - "9000000": 41 - }, - "count": 41, - "sum": 28886.38599999999 - } - }, - "resource": "namespaces", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 41, - "1000": 1, - "10000": 41, - "100000": 41, - "1000000": 41, - "10000000": 41, - "100000000": 41, - "1000000000": 41 - }, - "count": 41, - "sum": 108716 - } - } + "count": 2, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "resource", + "verb": "DELETE", + "version": "v1" } }, "Index": "", @@ -12273,75 +11384,38 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 13605.571 - } - }, - "resource": "limitranges", + "count": 2, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", "scope": "cluster", "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 123 - } + "version": "v1beta1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 3 } + }, + "request": { + "resource": "csinodes.storage.k8s.io" } }, "Index": "", @@ -12360,13 +11434,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 3, + "count": 9, "group": "apps", - "resource": "daemonsets", + "resource": "replicasets", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" } }, @@ -12386,75 +11460,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 14442.617 - } - }, - "resource": "serviceaccounts", + "count": 2, + "group": "policy", + "resource": "poddisruptionbudgets", "scope": "cluster", "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 270 - } - } } }, "Index": "", @@ -12473,14 +11486,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "404", "component": "apiserver", "count": 1, - "group": "extensions", - "resource": "ingresses", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "resource": "configmaps", + "scope": "resource", + "verb": "PUT", + "version": "v1" } }, "Index": "", @@ -12499,27 +11511,26 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "policy", "version": "v1" }, "watch": { "events": { - "kind": "PodDisruptionBudget", + "kind": "Secret", "size": { "bytes": { "bucket": { - "+Inf": 17, - "1024": 17, - "131072": 17, - "16384": 17, - "2048": 17, - "32768": 17, - "4096": 17, - "65536": 17, - "8192": 17 + "+Inf": 125, + "1024": 33, + "131072": 125, + "16384": 125, + "2048": 33, + "32768": 125, + "4096": 125, + "65536": 125, + "8192": 125 }, - "count": 17, - "sum": 1394 + "count": 125, + "sum": 245881 } } } @@ -12542,11 +11553,63 @@ "MetricSetFields": { "etcd": { "object": { - "count": 12 + "count": 38 } }, "request": { - "resource": "configmaps" + "resource": "pods" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "201", + "component": "apiserver", + "count": 1, + "group": "storage.k8s.io", + "resource": "storageclasses", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 6, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -12567,9 +11630,8 @@ "request": { "code": "404", "component": "apiserver", - "count": 11, - "group": "rbac.authorization.k8s.io", - "resource": "roles", + "count": 1, + "resource": "secrets", "scope": "resource", "verb": "GET", "version": "v1" @@ -12635,13 +11697,13 @@ "9000000": 2 }, "count": 2, - "sum": 622.155 + "sum": 4867.572 } }, - "group": "networking.k8s.io", - "resource": "ingresses", - "scope": "cluster", - "verb": "LIST", + "group": "apps", + "resource": "deployments", + "scope": "resource", + "verb": "GET", "version": "v1" }, "response": { @@ -12658,7 +11720,7 @@ "1000000000": 2 }, "count": 2, - "sum": 112 + "sum": 484 } } } @@ -12679,56 +11741,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 3, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 3, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 - }, - "count": 4, - "sum": 110857.38 - } - }, - "resource": "nodes", + "count": 1, + "group": "apps", + "resource": "statefulsets", "scope": "resource", - "verb": "POST", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -12748,13 +11768,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "group": "storage.k8s.io", - "resource": "csinodes", + "duration": { + "us": { + "bucket": { + "+Inf": 44, + "100000": 44, + "1000000": 44, + "10000000": 44, + "1250000": 44, + "150000": 44, + "1500000": 44, + "15000000": 44, + "1750000": 44, + "200000": 44, + "2000000": 44, + "20000000": 44, + "250000": 44, + "2500000": 44, + "25000000": 44, + "300000": 44, + "3000000": 44, + "30000000": 44, + "350000": 44, + "3500000": 44, + "400000": 44, + "4000000": 44, + "40000000": 44, + "450000": 44, + "4500000": 44, + "50000": 44, + "500000": 44, + "5000000": 44, + "50000000": 44, + "600000": 44, + "6000000": 44, + "60000000": 44, + "700000": 44, + "7000000": 44, + "800000": 44, + "8000000": 44, + "900000": 44, + "9000000": 44 + }, + "count": 44, + "sum": 77487.755 + } + }, + "resource": "serviceaccounts", "scope": "resource", - "verb": "GET", + "verb": "POST", "version": "v1" } }, @@ -12778,7 +11841,7 @@ "duration": { "us": { "bucket": { - "+Inf": 3, + "+Inf": 9, "100000": 0, "1000000": 0, "10000000": 0, @@ -12817,36 +11880,155 @@ "900000": 0, "9000000": 0 }, - "count": 3, - "sum": 1228002635.407 + "count": 9, + "sum": 3736008440.8040004 } }, - "group": "coordination.k8s.io", + "group": "apps", "longrunning": { - "count": 1 + "count": 4 }, - "resource": "leases", + "resource": "replicasets", "scope": "cluster", "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 0 - } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 9, + "1000": 9, + "10000": 9, + "100000": 9, + "1000000": 9, + "10000000": 9, + "100000000": 9, + "1000000000": 9 + }, + "count": 9, + "sum": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 3, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 3, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 + }, + "count": 4, + "sum": 110857.38 + } + }, + "resource": "nodes", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "404", + "component": "apiserver", + "count": 11, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 12 } + }, + "request": { + "resource": "configmaps" } }, "Index": "", @@ -12909,11 +12091,11 @@ "9000000": 2 }, "count": 2, - "sum": 1309.226 + "sum": 622.155 } }, - "group": "storage.k8s.io", - "resource": "csinodes", + "group": "networking.k8s.io", + "resource": "ingresses", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -12932,7 +12114,7 @@ "1000000000": 2 }, "count": 2, - "sum": 1180 + "sum": 112 } } } @@ -12953,76 +12135,28 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 34, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 34, - "sum": 14422028428.523998 - } - }, - "longrunning": { - "count": 13 - }, - "resource": "configmaps", - "scope": "namespace", - "verb": "WATCH", + "group": "policy", "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 34, - "1000": 34, - "10000": 34, - "100000": 34, - "1000000": 34, - "10000000": 34, - "100000000": 34, - "1000000000": 34 - }, - "count": 34, - "sum": 0 + "watch": { + "events": { + "kind": "PodDisruptionBudget", + "size": { + "bytes": { + "bucket": { + "+Inf": 17, + "1024": 17, + "131072": 17, + "16384": 17, + "2048": 17, + "32768": 17, + "4096": 17, + "65536": 17, + "8192": 17 + }, + "count": 17, + "sum": 1394 + } } } } @@ -13046,11 +12180,11 @@ "code": "200", "component": "apiserver", "count": 1, - "group": "apps", - "resource": "controllerrevisions", - "scope": "resource", - "verb": "GET", - "version": "v1" + "group": "extensions", + "resource": "ingresses", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" } }, "Index": "", @@ -13113,21 +12247,20 @@ "9000000": 2 }, "count": 2, - "sum": 801.1450000000001 + "sum": 14442.617 } }, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", + "resource": "serviceaccounts", "scope": "cluster", "verb": "LIST", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { "+Inf": 2, - "1000": 1, + "1000": 2, "10000": 2, "100000": 2, "1000000": 2, @@ -13136,98 +12269,7 @@ "1000000000": 2 }, "count": 2, - "sum": 9848 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2547005731.3469996 - } - }, - "group": "flowcontrol.apiserver.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "prioritylevelconfigurations", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 + "sum": 270 } } } @@ -13248,13 +12290,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 2, - "group": "events.k8s.io", - "resource": "events", + "count": 3, + "group": "apps", + "resource": "daemonsets", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" } }, @@ -13274,14 +12316,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 1, - "group": "batch", - "resource": "cronjobs", - "scope": "resource", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 41, + "100000": 41, + "1000000": 41, + "10000000": 41, + "1250000": 41, + "150000": 41, + "1500000": 41, + "15000000": 41, + "1750000": 41, + "200000": 41, + "2000000": 41, + "20000000": 41, + "250000": 41, + "2500000": 41, + "25000000": 41, + "300000": 41, + "3000000": 41, + "30000000": 41, + "350000": 41, + "3500000": 41, + "400000": 41, + "4000000": 41, + "40000000": 41, + "450000": 41, + "4500000": 41, + "50000": 41, + "500000": 41, + "5000000": 41, + "50000000": 41, + "600000": 41, + "6000000": 41, + "60000000": 41, + "700000": 41, + "7000000": 41, + "800000": 41, + "8000000": 41, + "900000": 41, + "9000000": 41 + }, + "count": 41, + "sum": 28886.38599999999 + } + }, + "resource": "namespaces", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 41, + "1000": 1, + "10000": 41, + "100000": 41, + "1000000": 41, + "10000000": 41, + "100000000": 41, + "1000000000": 41 + }, + "count": 41, + "sum": 108716 + } + } } }, "Index": "", @@ -13300,28 +12403,73 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "scheduling.k8s.io", + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 13605.571 + } + }, + "resource": "limitranges", + "scope": "cluster", + "verb": "LIST", "version": "v1" }, - "watch": { - "events": { - "kind": "PriorityClass", - "size": { - "bytes": { - "bucket": { - "+Inf": 16, - "1024": 16, - "131072": 16, - "16384": 16, - "2048": 16, - "32768": 16, - "4096": 16, - "65536": 16, - "8192": 16 - }, - "count": 16, - "sum": 1876 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 123 } } } @@ -13342,12 +12490,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "0", "component": "apiserver", - "count": 1, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "GET", + "count": 5, + "group": "networking.k8s.io", + "resource": "ingresses", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -13367,28 +12516,77 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 7, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 7, + "sum": 3487007382.103 + } + }, "group": "admissionregistration.k8s.io", + "longrunning": { + "count": 3 + }, + "resource": "mutatingwebhookconfigurations", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, - "watch": { - "events": { - "kind": "ValidatingWebhookConfiguration", - "size": { - "bytes": { - "bucket": { - "+Inf": 27, - "1024": 27, - "131072": 27, - "16384": 27, - "2048": 27, - "32768": 27, - "4096": 27, - "65536": 27, - "8192": 27 - }, - "count": 27, - "sum": 2727 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 7, + "1000": 7, + "10000": 7, + "100000": 7, + "1000000": 7, + "10000000": 7, + "100000000": 7, + "1000000000": 7 + }, + "count": 7, + "sum": 0 } } } @@ -13409,76 +12607,15 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 49, - "100000": 49, - "1000000": 49, - "10000000": 49, - "1250000": 49, - "150000": 49, - "1500000": 49, - "15000000": 49, - "1750000": 49, - "200000": 49, - "2000000": 49, - "20000000": 49, - "250000": 49, - "2500000": 49, - "25000000": 49, - "300000": 49, - "3000000": 49, - "30000000": 49, - "350000": 49, - "3500000": 49, - "400000": 49, - "4000000": 49, - "40000000": 49, - "450000": 49, - "4500000": 49, - "50000": 49, - "500000": 49, - "5000000": 49, - "50000000": 49, - "600000": 49, - "6000000": 49, - "60000000": 49, - "700000": 49, - "7000000": 49, - "800000": 49, - "8000000": 49, - "900000": 49, - "9000000": 49 - }, - "count": 49, - "sum": 45143.681 - } - }, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", + "count": 138, + "group": "batch", + "resource": "cronjobs", "scope": "resource", - "verb": "GET", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 49, - "1000": 49, - "10000": 49, - "100000": 49, - "1000000": 49, - "10000000": 49, - "100000000": 49, - "1000000000": 49 - }, - "count": 49, - "sum": 17319 - } - } + "subresource": "status", + "verb": "PUT", + "version": "v1" } }, "Index": "", @@ -13541,11 +12678,11 @@ "9000000": 1 }, "count": 1, - "sum": 571.884 + "sum": 429.012 } }, - "group": "batch", - "resource": "cronjobs", + "group": "policy", + "resource": "podsecuritypolicies", "scope": "cluster", "verb": "LIST", "version": "v1beta1" @@ -13555,7 +12692,7 @@ "bytes": { "bucket": { "+Inf": 1, - "1000": 0, + "1000": 1, "10000": 1, "100000": 1, "1000000": 1, @@ -13564,7 +12701,7 @@ "1000000000": 1 }, "count": 1, - "sum": 1923 + "sum": 60 } } } @@ -13585,13 +12722,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "0", "component": "apiserver", - "count": 135, - "group": "authentication.k8s.io", - "resource": "tokenreviews", - "scope": "resource", - "verb": "POST", + "count": 5, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -13610,15 +12747,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 6, - "group": "storage.k8s.io", - "resource": "csidrivers", - "scope": "cluster", - "verb": "LIST", - "version": "v1" + "resource": "replicationcontrollers" } }, "Index": "", @@ -13637,15 +12772,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "409", - "component": "apiserver", - "count": 2, - "group": "apps", - "resource": "daemonsets", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "group": "rbac.authorization.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "Role", + "size": { + "bytes": { + "bucket": { + "+Inf": 46, + "1024": 46, + "131072": 46, + "16384": 46, + "2048": 46, + "32768": 46, + "4096": 46, + "65536": 46, + "8192": 46 + }, + "count": 46, + "sum": 16472 + } + } + } } }, "Index": "", @@ -13759,30 +12909,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "rbac.authorization.k8s.io", + "code": "201", + "component": "apiserver", + "count": 135, + "group": "authentication.k8s.io", + "resource": "tokenreviews", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "watch": { - "events": { - "kind": "Role", - "size": { - "bytes": { - "bucket": { - "+Inf": 46, - "1024": 46, - "131072": 46, - "16384": 46, - "2048": 46, - "32768": 46, - "4096": 46, - "65536": 46, - "8192": 46 - }, - "count": 46, - "sum": 16472 - } - } - } } }, "Index": "", @@ -13800,13 +12934,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "replicationcontrollers" + "code": "200", + "component": "apiserver", + "count": 6, + "group": "storage.k8s.io", + "resource": "csidrivers", + "scope": "cluster", + "verb": "LIST", + "version": "v1" } }, "Index": "", @@ -13825,53 +12961,101 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "409", "component": "apiserver", "count": 2, - "resource": "events", + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "subresource": "status", + "verb": "PUT", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 571.884 + } + }, + "group": "batch", + "resource": "cronjobs", "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "group": "autoscaling", - "version": "v2beta1" + "verb": "LIST", + "version": "v1beta1" }, - "watch": { - "events": { - "kind": "HorizontalPodAutoscaler", - "size": { - "bytes": { - "bucket": { - "+Inf": 10, - "1024": 10, - "131072": 10, - "16384": 10, - "2048": 10, - "32768": 10, - "4096": 10, - "65536": 10, - "8192": 10 - }, - "count": 10, - "sum": 1000 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 0, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 1923 } } } @@ -13896,70 +13080,70 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 49, + "100000": 49, + "1000000": 49, + "10000000": 49, + "1250000": 49, + "150000": 49, + "1500000": 49, + "15000000": 49, + "1750000": 49, + "200000": 49, + "2000000": 49, + "20000000": 49, + "250000": 49, + "2500000": 49, + "25000000": 49, + "300000": 49, + "3000000": 49, + "30000000": 49, + "350000": 49, + "3500000": 49, + "400000": 49, + "4000000": 49, + "40000000": 49, + "450000": 49, + "4500000": 49, + "50000": 49, + "500000": 49, + "5000000": 49, + "50000000": 49, + "600000": 49, + "6000000": 49, + "60000000": 49, + "700000": 49, + "7000000": 49, + "800000": 49, + "8000000": 49, + "900000": 49, + "9000000": 49 }, - "count": 2, - "sum": 713.132 + "count": 49, + "sum": 45143.681 } }, - "group": "apiregistration.k8s.io", - "resource": "apiservices", - "scope": "cluster", - "verb": "LIST", - "version": "v1" + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", + "scope": "resource", + "verb": "GET", + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 1, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 49, + "1000": 49, + "10000": 49, + "100000": 49, + "1000000": 49, + "10000000": 49, + "100000000": 49, + "1000000000": 49 }, - "count": 2, - "sum": 14960 + "count": 49, + "sum": 17319 } } } @@ -13979,13 +13163,31 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 11 - } - }, "request": { - "resource": "flowschemas.flowcontrol.apiserver.k8s.io" + "group": "admissionregistration.k8s.io", + "version": "v1" + }, + "watch": { + "events": { + "kind": "ValidatingWebhookConfiguration", + "size": { + "bytes": { + "bucket": { + "+Inf": 27, + "1024": 27, + "131072": 27, + "16384": 27, + "2048": 27, + "32768": 27, + "4096": 27, + "65536": 27, + "8192": 27 + }, + "count": 27, + "sum": 2727 + } + } + } } }, "Index": "", @@ -14004,75 +13206,39 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 3521.213 - } - }, - "resource": "replicationcontrollers", + "count": 1, + "resource": "persistentvolumeclaims", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 2, + "group": "events.k8s.io", + "resource": "events", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 156 - } - } } }, "Index": "", @@ -14091,27 +13257,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "storage.k8s.io", - "version": "v1beta1" + "group": "scheduling.k8s.io", + "version": "v1" }, "watch": { "events": { - "kind": "CSIStorageCapacity", + "kind": "PriorityClass", "size": { "bytes": { "bucket": { - "+Inf": 14, - "1024": 14, - "131072": 14, - "16384": 14, - "2048": 14, - "32768": 14, - "4096": 14, - "65536": 14, - "8192": 14 + "+Inf": 16, + "1024": 16, + "131072": 16, + "16384": 16, + "2048": 16, + "32768": 16, + "4096": 16, + "65536": 16, + "8192": 16 }, - "count": 14, - "sum": 1148 + "count": 16, + "sum": 1876 } } } @@ -14133,12 +13299,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", - "count": 87, - "resource": "pods", + "count": 1, + "group": "batch", + "resource": "cronjobs", "scope": "resource", - "verb": "GET", + "verb": "POST", "version": "v1" } }, @@ -14162,54 +13329,163 @@ "duration": { "us": { "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 3, - "sum": 5904.927 + "count": 6, + "sum": 2547005731.3469996 + } + }, + "group": "flowcontrol.apiserver.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "prioritylevelconfigurations", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 801.1450000000001 } }, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "resource", - "verb": "POST", - "version": "v1" + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 1, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 9848 + } + } } }, "Index": "", @@ -14228,38 +13504,11 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "200", "component": "apiserver", "count": 1, "group": "apps", - "resource": "statefulsets", - "scope": "resource", - "verb": "GET", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "group": "certificates.k8s.io", - "longrunning": { - "count": 0 - }, - "resource": "certificatesigningrequests", + "resource": "controllerrevisions", "scope": "resource", "verb": "GET", "version": "v1" @@ -14276,33 +13525,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "longrunning": { - "count": 1 - }, - "resource": "pods", - "scope": "namespace", - "subresource": "exec", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -14312,53 +13534,72 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 1, - "sum": 2823.041 + "count": 2, + "sum": 1309.226 } }, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "POST", + "group": "storage.k8s.io", + "resource": "csinodes", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 1180 + } + } } }, "Index": "", @@ -14381,70 +13622,73 @@ "duration": { "us": { "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 + "+Inf": 3, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 4, - "sum": 5192.941 + "count": 3, + "sum": 1228002635.407 } }, - "group": "apps", - "resource": "daemonsets", - "scope": "resource", - "verb": "GET", + "group": "coordination.k8s.io", + "longrunning": { + "count": 1 + }, + "resource": "leases", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 4, - "1000": 2, - "10000": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 }, - "count": 4, - "sum": 11632 + "count": 3, + "sum": 0 } } } @@ -14469,7 +13713,7 @@ "duration": { "us": { "bucket": { - "+Inf": 7, + "+Inf": 34, "100000": 0, "1000000": 0, "10000000": 0, @@ -14508,16 +13752,15 @@ "900000": 0, "9000000": 0 }, - "count": 7, - "sum": 2917007228.4469995 + "count": 34, + "sum": 14422028428.523998 } }, - "group": "apps", "longrunning": { - "count": 3 + "count": 13 }, - "resource": "daemonsets", - "scope": "cluster", + "resource": "configmaps", + "scope": "namespace", "verb": "WATCH", "version": "v1" }, @@ -14525,16 +13768,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 7, - "1000": 7, - "10000": 7, - "100000": 7, - "1000000": 7, - "10000000": 7, - "100000000": 7, - "1000000000": 7 + "+Inf": 34, + "1000": 34, + "10000": 34, + "100000": 34, + "1000000": 34, + "10000000": 34, + "100000000": 34, + "1000000000": 34 }, - "count": 7, + "count": 34, "sum": 0 } } @@ -14555,40 +13798,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 11 - } - }, "request": { "code": "200", - "host": "[::1]:6443", - "method": "PATCH" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", "component": "apiserver", - "count": 5, - "group": "networking.k8s.io", - "resource": "ingressclasses", - "scope": "cluster", - "verb": "WATCH", + "count": 2, + "group": "storage.k8s.io", + "resource": "csinodes", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -14719,143 +13936,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 6, - "resource": "pods", - "scope": "resource", - "verb": "DELETE", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 53 - } - }, - "request": { - "resource": "clusterrolebindings.rbac.authorization.k8s.io" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 3141.7900000000004 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 240 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -14865,7 +13945,7 @@ "duration": { "us": { "bucket": { - "+Inf": 2, + "+Inf": 7, "100000": 0, "1000000": 0, "10000000": 0, @@ -14904,33 +13984,33 @@ "900000": 0, "9000000": 0 }, - "count": 2, - "sum": 927002263.48 + "count": 7, + "sum": 2917007228.4469995 } }, - "group": "batch", + "group": "apps", "longrunning": { - "count": 1 + "count": 3 }, - "resource": "cronjobs", + "resource": "daemonsets", "scope": "cluster", "verb": "WATCH", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 7, + "1000": 7, + "10000": 7, + "100000": 7, + "1000000": 7, + "10000000": 7, + "100000000": 7, + "1000000000": 7 }, - "count": 2, + "count": 7, "sum": 0 } } @@ -14951,14 +14031,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "client": { + "request": { + "count": 11 + } + }, "request": { - "code": "404", - "component": "apiserver", - "count": 61, - "resource": "nodes", - "scope": "resource", - "verb": "GET", - "version": "v1" + "code": "200", + "host": "[::1]:6443", + "method": "PATCH" } }, "Index": "", @@ -14977,57 +14058,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 4279.515 - } - }, - "resource": "persistentvolumes", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "count": 5, + "group": "networking.k8s.io", + "resource": "ingressclasses", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -15046,13 +14083,77 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "validatingwebhookconfigurations.admissionregistration.k8s.io" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 + }, + "count": 4, + "sum": 5192.941 + } + }, + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "verb": "GET", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1000": 2, + "10000": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 + }, + "count": 4, + "sum": 11632 + } + } } }, "Index": "", @@ -15071,14 +14172,15 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 2, - "group": "batch", - "resource": "cronjobs", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + "longrunning": { + "count": 1 + }, + "resource": "pods", + "scope": "namespace", + "subresource": "exec", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -15101,52 +14203,51 @@ "duration": { "us": { "bucket": { - "+Inf": 38, - "100000": 38, - "1000000": 38, - "10000000": 38, - "1250000": 38, - "150000": 38, - "1500000": 38, - "15000000": 38, - "1750000": 38, - "200000": 38, - "2000000": 38, - "20000000": 38, - "250000": 38, - "2500000": 38, - "25000000": 38, - "300000": 38, - "3000000": 38, - "30000000": 38, - "350000": 38, - "3500000": 38, - "400000": 38, - "4000000": 38, - "40000000": 38, - "450000": 38, - "4500000": 38, - "50000": 38, - "500000": 38, - "5000000": 38, - "50000000": 38, - "600000": 38, - "6000000": 38, - "60000000": 38, - "700000": 38, - "7000000": 38, - "800000": 38, - "8000000": 38, - "900000": 38, - "9000000": 38 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 38, - "sum": 151822.701 + "count": 1, + "sum": 2823.041 } }, - "resource": "pods", + "resource": "persistentvolumeclaims", "scope": "resource", - "subresource": "binding", "verb": "POST", "version": "v1" } @@ -15167,11 +14268,55 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 6, - "group": "coordination.k8s.io", - "resource": "leases", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 5904.927 + } + }, + "group": "discovery.k8s.io", + "resource": "endpointslices", "scope": "resource", "verb": "POST", "version": "v1" @@ -15193,14 +14338,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "404", "component": "apiserver", - "count": 13, + "count": 1, "group": "apps", - "resource": "deployments", + "resource": "statefulsets", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "GET", "version": "v1" } }, @@ -15220,13 +14364,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", - "scope": "cluster", - "verb": "LIST", + "group": "certificates.k8s.io", + "longrunning": { + "count": 0 + }, + "resource": "certificatesigningrequests", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -15246,56 +14391,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 184, - "100000": 184, - "1000000": 184, - "10000000": 184, - "1250000": 184, - "150000": 184, - "1500000": 184, - "15000000": 184, - "1750000": 184, - "200000": 184, - "2000000": 184, - "20000000": 184, - "250000": 184, - "2500000": 184, - "25000000": 184, - "300000": 184, - "3000000": 184, - "30000000": 184, - "350000": 184, - "3500000": 184, - "400000": 184, - "4000000": 184, - "40000000": 184, - "450000": 184, - "4500000": 184, - "50000": 184, - "500000": 184, - "5000000": 184, - "50000000": 184, - "600000": 184, - "6000000": 184, - "60000000": 184, - "700000": 184, - "7000000": 184, - "800000": 184, - "8000000": 184, - "900000": 184, - "9000000": 184 - }, - "count": 184, - "sum": 561807.3190000001 - } - }, - "resource": "events", + "count": 87, + "resource": "pods", "scope": "resource", - "verb": "POST", + "verb": "GET", "version": "v1" } }, @@ -15310,6 +14411,48 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "storage.k8s.io", + "version": "v1beta1" + }, + "watch": { + "events": { + "kind": "CSIStorageCapacity", + "size": { + "bytes": { + "bucket": { + "+Inf": 14, + "1024": 14, + "131072": 14, + "16384": 14, + "2048": 14, + "32768": 14, + "4096": 14, + "65536": 14, + "8192": 14 + }, + "count": 14, + "sum": 1148 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -15319,72 +14462,70 @@ "duration": { "us": { "bucket": { - "+Inf": 8, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 8, - "sum": 3510006351.92 + "count": 2, + "sum": 713.132 } }, - "longrunning": { - "count": 3 - }, - "resource": "replicationcontrollers", + "group": "apiregistration.k8s.io", + "resource": "apiservices", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 8, - "1000": 8, - "10000": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "100000000": 8, - "1000000000": 8 + "+Inf": 2, + "1000": 1, + "10000": 1, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 8, - "sum": 0 + "count": 2, + "sum": 14960 } } } @@ -15400,30 +14541,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 4 - } - }, - "request": { - "resource": "controllerrevisions.apps" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -15473,11 +14590,10 @@ "9000000": 3 }, "count": 3, - "sum": 1015.211 + "sum": 3521.213 } }, - "group": "storage.k8s.io", - "resource": "volumeattachments", + "resource": "replicationcontrollers", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -15496,7 +14612,7 @@ "1000000000": 3 }, "count": 3, - "sum": 186 + "sum": 156 } } } @@ -15512,6 +14628,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 11 + } + }, + "request": { + "resource": "flowschemas.flowcontrol.apiserver.k8s.io" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -15519,10 +14659,9 @@ "request": { "code": "0", "component": "apiserver", - "count": 3, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "namespace", + "count": 2, + "resource": "events", + "scope": "cluster", "verb": "WATCH", "version": "v1" } @@ -15538,6 +14677,48 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "autoscaling", + "version": "v2beta1" + }, + "watch": { + "events": { + "kind": "HorizontalPodAutoscaler", + "size": { + "bytes": { + "bucket": { + "+Inf": 10, + "1024": 10, + "131072": 10, + "16384": 10, + "2048": 10, + "32768": 10, + "4096": 10, + "65536": 10, + "8192": 10 + }, + "count": 10, + "sum": 1000 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -15545,10 +14726,12 @@ "request": { "code": "200", "component": "apiserver", - "count": 31, - "resource": "resourcequotas", - "scope": "namespace", - "verb": "LIST", + "count": 13, + "group": "apps", + "resource": "deployments", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -15568,76 +14751,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 962.1300000000001 - } - }, - "group": "admissionregistration.k8s.io", - "resource": "validatingwebhookconfigurations", - "scope": "cluster", - "verb": "LIST", + "count": 6, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 270 - } - } } }, "Index": "", @@ -15656,14 +14777,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "group": "batch", - "resource": "cronjobs", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "duration": { + "us": { + "bucket": { + "+Inf": 38, + "100000": 38, + "1000000": 38, + "10000000": 38, + "1250000": 38, + "150000": 38, + "1500000": 38, + "15000000": 38, + "1750000": 38, + "200000": 38, + "2000000": 38, + "20000000": 38, + "250000": 38, + "2500000": 38, + "25000000": 38, + "300000": 38, + "3000000": 38, + "30000000": 38, + "350000": 38, + "3500000": 38, + "400000": 38, + "4000000": 38, + "40000000": 38, + "450000": 38, + "4500000": 38, + "50000": 38, + "500000": 38, + "5000000": 38, + "50000000": 38, + "600000": 38, + "6000000": 38, + "60000000": 38, + "700000": 38, + "7000000": 38, + "800000": 38, + "8000000": 38, + "900000": 38, + "9000000": 38 + }, + "count": 38, + "sum": 151822.701 + } + }, + "resource": "pods", + "scope": "resource", + "subresource": "binding", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -15726,99 +14891,10 @@ "9000000": 2 }, "count": 2, - "sum": 14386.007000000001 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "roles", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 4782 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 22, - "100000": 22, - "1000000": 22, - "10000000": 22, - "1250000": 22, - "150000": 22, - "1500000": 22, - "15000000": 22, - "1750000": 22, - "200000": 22, - "2000000": 22, - "20000000": 22, - "250000": 22, - "2500000": 22, - "25000000": 22, - "300000": 22, - "3000000": 22, - "30000000": 22, - "350000": 22, - "3500000": 22, - "400000": 22, - "4000000": 22, - "40000000": 22, - "450000": 22, - "4500000": 22, - "50000": 22, - "500000": 22, - "5000000": 22, - "50000000": 22, - "600000": 22, - "6000000": 22, - "60000000": 22, - "700000": 22, - "7000000": 22, - "800000": 22, - "8000000": 22, - "900000": 22, - "9000000": 22 - }, - "count": 22, - "sum": 135110.06400000004 + "sum": 4279.515 } }, - "group": "apps", - "resource": "daemonsets", + "resource": "persistentvolumes", "scope": "resource", "subresource": "status", "verb": "PUT", @@ -15840,15 +14916,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 184 + "etcd": { + "object": { + "count": 0 } }, "request": { - "code": "201", - "host": "[::1]:6443", - "method": "POST" + "resource": "validatingwebhookconfigurations.admissionregistration.k8s.io" } }, "Index": "", @@ -15867,30 +14941,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "storage.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "StorageClass", - "size": { - "bytes": { - "bucket": { - "+Inf": 34, - "1024": 34, - "131072": 34, - "16384": 34, - "2048": 34, - "32768": 34, - "4096": 34, - "65536": 34, - "8192": 34 - }, - "count": 34, - "sum": 4010 - } - } - } + "code": "0", + "component": "apiserver", + "count": 2, + "group": "batch", + "resource": "cronjobs", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" } }, "Index": "", @@ -15909,57 +14967,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 124, - "100000": 124, - "1000000": 124, - "10000000": 124, - "1250000": 124, - "150000": 124, - "1500000": 124, - "15000000": 124, - "1750000": 124, - "200000": 124, - "2000000": 124, - "20000000": 124, - "250000": 124, - "2500000": 124, - "25000000": 124, - "300000": 124, - "3000000": 124, - "30000000": 124, - "350000": 124, - "3500000": 124, - "400000": 124, - "4000000": 124, - "40000000": 124, - "450000": 124, - "4500000": 124, - "50000": 124, - "500000": 124, - "5000000": 124, - "50000000": 124, - "600000": 124, - "6000000": 124, - "60000000": 124, - "700000": 124, - "7000000": 124, - "800000": 124, - "8000000": 124, - "900000": 124, - "9000000": 124 - }, - "count": 124, - "sum": 132482.84000000008 - } - }, - "group": "authorization.k8s.io", - "resource": "subjectaccessreviews", + "count": 61, + "resource": "nodes", "scope": "resource", - "verb": "POST", + "verb": "GET", "version": "v1" } }, @@ -15978,75 +14991,78 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 1894.864 + "count": 2, + "sum": 927002263.48 } }, - "group": "storage.k8s.io", - "resource": "storageclasses", - "scope": "resource", - "verb": "GET", - "version": "v1" + "group": "batch", + "longrunning": { + "count": 1 + }, + "resource": "cronjobs", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 1, - "sum": 244 + "count": 2, + "sum": 0 } } } @@ -16066,15 +15082,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 53 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", - "scope": "cluster", - "verb": "LIST", - "version": "v2beta1" + "resource": "clusterrolebindings.rbac.authorization.k8s.io" } }, "Index": "", @@ -16137,12 +15151,12 @@ "9000000": 2 }, "count": 2, - "sum": 5519.6 + "sum": 3141.7900000000004 } }, - "group": "networking.k8s.io", - "resource": "ingressclasses", - "scope": "cluster", + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "namespace", "verb": "LIST", "version": "v1" }, @@ -16160,7 +15174,7 @@ "1000000000": 2 }, "count": 2, - "sum": 122 + "sum": 240 } } } @@ -16176,6 +15190,31 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 6, + "resource": "pods", + "scope": "resource", + "verb": "DELETE", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -16185,73 +15224,70 @@ "duration": { "us": { "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 6, - "sum": 2468004584.851 + "count": 1, + "sum": 1894.864 } }, - "group": "policy", - "longrunning": { - "count": 2 - }, - "resource": "poddisruptionbudgets", - "scope": "cluster", - "verb": "WATCH", + "group": "storage.k8s.io", + "resource": "storageclasses", + "scope": "resource", + "verb": "GET", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 }, - "count": 6, - "sum": 0 + "count": 1, + "sum": 244 } } } @@ -16272,13 +15308,83 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", + "component": "apiserver", + "count": 1, + "group": "autoscaling", + "resource": "horizontalpodautoscalers", + "scope": "cluster", + "verb": "LIST", + "version": "v2beta1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "component": "apiserver", - "count": 3, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 124, + "100000": 124, + "1000000": 124, + "10000000": 124, + "1250000": 124, + "150000": 124, + "1500000": 124, + "15000000": 124, + "1750000": 124, + "200000": 124, + "2000000": 124, + "20000000": 124, + "250000": 124, + "2500000": 124, + "25000000": 124, + "300000": 124, + "3000000": 124, + "30000000": 124, + "350000": 124, + "3500000": 124, + "400000": 124, + "4000000": 124, + "40000000": 124, + "450000": 124, + "4500000": 124, + "50000": 124, + "500000": 124, + "5000000": 124, + "50000000": 124, + "600000": 124, + "6000000": 124, + "60000000": 124, + "700000": 124, + "7000000": 124, + "800000": 124, + "8000000": 124, + "900000": 124, + "9000000": 124 + }, + "count": 124, + "sum": 132482.84000000008 + } + }, + "group": "authorization.k8s.io", + "resource": "subjectaccessreviews", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -16342,11 +15448,11 @@ "9000000": 2 }, "count": 2, - "sum": 16126.376000000002 + "sum": 14386.007000000001 } }, - "group": "apiextensions.k8s.io", - "resource": "customresourcedefinitions", + "group": "rbac.authorization.k8s.io", + "resource": "roles", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -16356,7 +15462,7 @@ "bytes": { "bucket": { "+Inf": 2, - "1000": 2, + "1000": 1, "10000": 2, "100000": 2, "1000000": 2, @@ -16365,7 +15471,7 @@ "1000000000": 2 }, "count": 2, - "sum": 140 + "sum": 4782 } } } @@ -16386,188 +15492,28 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", - "component": "apiserver", - "count": 1, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 44 - } - }, - "request": { - "resource": "secrets" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { + "group": "storage.k8s.io", "version": "v1" }, "watch": { - "events": { - "kind": "PodTemplate", - "size": { - "bytes": { - "bucket": { - "+Inf": 7, - "1024": 7, - "131072": 7, - "16384": 7, - "2048": 7, - "32768": 7, - "4096": 7, - "65536": 7, - "8192": 7 - }, - "count": 7, - "sum": 735 - } - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 17, - "resource": "nodes", - "scope": "resource", - "verb": "PATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 1245.864 - } - }, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "GET", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 230 + "events": { + "kind": "StorageClass", + "size": { + "bytes": { + "bucket": { + "+Inf": 34, + "1024": 34, + "131072": 34, + "16384": 34, + "2048": 34, + "32768": 34, + "4096": 34, + "65536": 34, + "8192": 34 + }, + "count": 34, + "sum": 4010 + } } } } @@ -16592,53 +15538,54 @@ "duration": { "us": { "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 + "+Inf": 22, + "100000": 22, + "1000000": 22, + "10000000": 22, + "1250000": 22, + "150000": 22, + "1500000": 22, + "15000000": 22, + "1750000": 22, + "200000": 22, + "2000000": 22, + "20000000": 22, + "250000": 22, + "2500000": 22, + "25000000": 22, + "300000": 22, + "3000000": 22, + "30000000": 22, + "350000": 22, + "3500000": 22, + "400000": 22, + "4000000": 22, + "40000000": 22, + "450000": 22, + "4500000": 22, + "50000": 22, + "500000": 22, + "5000000": 22, + "50000000": 22, + "600000": 22, + "6000000": 22, + "60000000": 22, + "700000": 22, + "7000000": 22, + "800000": 22, + "8000000": 22, + "900000": 22, + "9000000": 22 }, - "count": 3, - "sum": 12202.156 + "count": 22, + "sum": 135110.06400000004 } }, "group": "apps", - "resource": "deployments", + "resource": "daemonsets", "scope": "resource", - "verb": "POST", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -16657,15 +15604,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "client": { + "request": { + "count": 184 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", - "scope": "namespace", - "verb": "LIST", - "version": "v1" + "code": "201", + "host": "[::1]:6443", + "method": "POST" } }, "Index": "", @@ -16684,79 +15631,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2406004969.7720003 - } - }, + "count": 1, "group": "batch", - "longrunning": { - "count": 3 - }, - "resource": "jobs", + "resource": "cronjobs", "scope": "cluster", - "verb": "WATCH", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 - } - } + "verb": "LIST", + "version": "v1beta1" } }, "Index": "", @@ -16775,13 +15657,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "200", "component": "apiserver", - "count": 1, - "group": "storage.k8s.io", - "resource": "storageclasses", - "scope": "resource", - "verb": "GET", + "count": 31, + "resource": "resourcequotas", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -16792,64 +15673,64 @@ "Error": null, "Host": "", "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 }, - "count": 4, - "sum": 6066.859 + "count": 3, + "sum": 962.1300000000001 } }, - "group": "apps", - "resource": "replicasets", + "group": "admissionregistration.k8s.io", + "resource": "validatingwebhookconfigurations", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -16858,17 +15739,17 @@ "size": { "bytes": { "bucket": { - "+Inf": 4, - "1000": 2, + "+Inf": 3, + "1000": 3, "10000": 3, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 }, - "count": 4, - "sum": 22775 + "count": 3, + "sum": 270 } } } @@ -16888,13 +15769,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 7 - } - }, "request": { - "resource": "prioritylevelconfigurations.flowcontrol.apiserver.k8s.io" + "code": "0", + "component": "apiserver", + "count": 3, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "namespace", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -16913,13 +15796,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 13, - "resource": "configmaps", - "scope": "namespace", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 1015.211 + } + }, + "group": "storage.k8s.io", + "resource": "volumeattachments", + "scope": "cluster", "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 186 + } + } } }, "Index": "", @@ -16942,54 +15888,74 @@ "duration": { "us": { "bucket": { - "+Inf": 69, - "100000": 69, - "1000000": 69, - "10000000": 69, - "1250000": 69, - "150000": 69, - "1500000": 69, - "15000000": 69, - "1750000": 69, - "200000": 69, - "2000000": 69, - "20000000": 69, - "250000": 69, - "2500000": 69, - "25000000": 69, - "300000": 69, - "3000000": 69, - "30000000": 69, - "350000": 69, - "3500000": 69, - "400000": 69, - "4000000": 69, - "40000000": 69, - "450000": 69, - "4500000": 69, - "50000": 69, - "500000": 69, - "5000000": 69, - "50000000": 69, - "600000": 69, - "6000000": 69, - "60000000": 69, - "700000": 69, - "7000000": 69, - "800000": 69, - "8000000": 69, - "900000": 69, - "9000000": 69 + "+Inf": 8, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 8, + "sum": 3510006351.92 + } + }, + "longrunning": { + "count": 3 + }, + "resource": "replicationcontrollers", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 8, + "1000": 8, + "10000": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "100000000": 8, + "1000000000": 8 }, - "count": 69, - "sum": 104476.538 + "count": 8, + "sum": 0 } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", - "scope": "resource", - "verb": "POST", - "version": "v1" + } } }, "Index": "", @@ -17007,31 +15973,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "group": "storage.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "CSIDriver", - "size": { - "bytes": { - "bucket": { - "+Inf": 41, - "1024": 41, - "131072": 41, - "16384": 41, - "2048": 41, - "32768": 41, - "4096": 41, - "65536": 41, - "8192": 41 - }, - "count": 41, - "sum": 2788 - } - } + "etcd": { + "object": { + "count": 4 } + }, + "request": { + "resource": "controllerrevisions.apps" } }, "Index": "", @@ -17050,13 +15998,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "200", "component": "apiserver", "count": 1, - "group": "apps", - "resource": "statefulsets", - "scope": "resource", - "verb": "POST", + "group": "autoscaling", + "resource": "horizontalpodautoscalers", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -17076,13 +16024,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 13, - "group": "node.k8s.io", - "resource": "runtimeclasses", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 184, + "100000": 184, + "1000000": 184, + "10000000": 184, + "1250000": 184, + "150000": 184, + "1500000": 184, + "15000000": 184, + "1750000": 184, + "200000": 184, + "2000000": 184, + "20000000": 184, + "250000": 184, + "2500000": 184, + "25000000": 184, + "300000": 184, + "3000000": 184, + "30000000": 184, + "350000": 184, + "3500000": 184, + "400000": 184, + "4000000": 184, + "40000000": 184, + "450000": 184, + "4500000": 184, + "50000": 184, + "500000": 184, + "5000000": 184, + "50000000": 184, + "600000": 184, + "6000000": 184, + "60000000": 184, + "700000": 184, + "7000000": 184, + "800000": 184, + "8000000": 184, + "900000": 184, + "9000000": 184 + }, + "count": 184, + "sum": 561807.3190000001 + } + }, + "resource": "events", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -17146,55 +16137,14 @@ "9000000": 2 }, "count": 2, - "sum": 4906.463 + "sum": 2657.845 } }, - "group": "rbac.authorization.k8s.io", - "resource": "rolebindings", + "group": "scheduling.k8s.io", + "resource": "priorityclasses", "scope": "resource", - "verb": "DELETE", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { + "verb": "POST", "version": "v1" - }, - "watch": { - "events": { - "kind": "Namespace", - "size": { - "bytes": { - "bucket": { - "+Inf": 145, - "1024": 145, - "131072": 145, - "16384": 145, - "2048": 145, - "32768": 145, - "4096": 145, - "65536": 145, - "8192": 145 - }, - "count": 145, - "sum": 17237 - } - } - } } }, "Index": "", @@ -17216,11 +16166,11 @@ "code": "404", "component": "apiserver", "count": 2, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", + "group": "apps", + "resource": "daemonsets", "scope": "resource", "verb": "GET", - "version": "v1beta1" + "version": "v1" } }, "Index": "", @@ -17283,39 +16233,13 @@ "9000000": 2 }, "count": 2, - "sum": 2657.845 + "sum": 4906.463 } }, - "group": "scheduling.k8s.io", - "resource": "priorityclasses", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "404", - "component": "apiserver", - "count": 2, - "group": "apps", - "resource": "daemonsets", + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", "scope": "resource", - "verb": "GET", + "verb": "DELETE", "version": "v1" } }, @@ -17333,61 +16257,31 @@ { "RootFields": {}, "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 6230.098 - } - }, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", - "scope": "resource", - "subresource": "approval", - "verb": "PUT", + "MetricSetFields": { + "request": { "version": "v1" + }, + "watch": { + "events": { + "kind": "Namespace", + "size": { + "bytes": { + "bucket": { + "+Inf": 145, + "1024": 145, + "131072": 145, + "16384": 145, + "2048": 145, + "32768": 145, + "4096": 145, + "65536": 145, + "8192": 145 + }, + "count": 145, + "sum": 17237 + } + } + } } }, "Index": "", @@ -17406,58 +16300,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 75, - "100000": 75, - "1000000": 75, - "10000000": 75, - "1250000": 75, - "150000": 75, - "1500000": 75, - "15000000": 75, - "1750000": 75, - "200000": 75, - "2000000": 75, - "20000000": 75, - "250000": 75, - "2500000": 75, - "25000000": 75, - "300000": 75, - "3000000": 75, - "30000000": 75, - "350000": 75, - "3500000": 75, - "400000": 75, - "4000000": 75, - "40000000": 75, - "450000": 75, - "4500000": 75, - "50000": 75, - "500000": 75, - "5000000": 75, - "50000000": 75, - "600000": 75, - "6000000": 75, - "60000000": 75, - "700000": 75, - "7000000": 75, - "800000": 75, - "8000000": 75, - "900000": 75, - "9000000": 75 - }, - "count": 75, - "sum": 352185.06799999997 - } - }, - "resource": "pods", + "count": 2, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", "scope": "resource", - "subresource": "status", - "verb": "PATCH", - "version": "v1" + "verb": "GET", + "version": "v1beta1" } }, "Index": "", @@ -17476,30 +16326,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "admissionregistration.k8s.io", + "code": "0", + "component": "apiserver", + "count": 13, + "group": "node.k8s.io", + "resource": "runtimeclasses", + "scope": "cluster", + "verb": "WATCH", "version": "v1" - }, - "watch": { - "events": { - "kind": "MutatingWebhookConfiguration", - "size": { - "bytes": { - "bucket": { - "+Inf": 30, - "1024": 30, - "131072": 30, - "16384": 30, - "2048": 30, - "32768": 30, - "4096": 30, - "65536": 30, - "8192": 30 - }, - "count": 30, - "sum": 2970 - } - } - } } }, "Index": "", @@ -17518,13 +16352,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", "count": 1, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", + "group": "apps", + "resource": "statefulsets", "scope": "resource", - "verb": "DELETE", + "verb": "POST", "version": "v1" } }, @@ -17544,27 +16378,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "node.k8s.io", + "group": "storage.k8s.io", "version": "v1" }, "watch": { "events": { - "kind": "RuntimeClass", + "kind": "CSIDriver", "size": { "bytes": { "bucket": { - "+Inf": 50, - "1024": 50, - "131072": 50, - "16384": 50, - "2048": 50, - "32768": 50, - "4096": 50, - "65536": 50, - "8192": 50 + "+Inf": 41, + "1024": 41, + "131072": 41, + "16384": 41, + "2048": 41, + "32768": 41, + "4096": 41, + "65536": 41, + "8192": 41 }, - "count": 50, - "sum": 3400 + "count": 41, + "sum": 2788 } } } @@ -17588,11 +16422,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 4, - "resource": "pods", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "count": 13, + "resource": "configmaps", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -17616,71 +16449,54 @@ "duration": { "us": { "bucket": { - "+Inf": 180, - "100000": 180, - "1000000": 180, - "10000000": 180, - "1250000": 180, - "150000": 180, - "1500000": 180, - "15000000": 180, - "1750000": 180, - "200000": 180, - "2000000": 180, - "20000000": 180, - "250000": 180, - "2500000": 180, - "25000000": 180, - "300000": 180, - "3000000": 180, - "30000000": 180, - "350000": 180, - "3500000": 180, - "400000": 180, - "4000000": 180, - "40000000": 180, - "450000": 180, - "4500000": 180, - "50000": 180, - "500000": 180, - "5000000": 180, - "50000000": 180, - "600000": 180, - "6000000": 180, - "60000000": 180, - "700000": 180, - "7000000": 180, - "800000": 180, - "8000000": 180, - "900000": 180, - "9000000": 180 + "+Inf": 69, + "100000": 69, + "1000000": 69, + "10000000": 69, + "1250000": 69, + "150000": 69, + "1500000": 69, + "15000000": 69, + "1750000": 69, + "200000": 69, + "2000000": 69, + "20000000": 69, + "250000": 69, + "2500000": 69, + "25000000": 69, + "300000": 69, + "3000000": 69, + "30000000": 69, + "350000": 69, + "3500000": 69, + "400000": 69, + "4000000": 69, + "40000000": 69, + "450000": 69, + "4500000": 69, + "50000": 69, + "500000": 69, + "5000000": 69, + "50000000": 69, + "600000": 69, + "6000000": 69, + "60000000": 69, + "700000": 69, + "7000000": 69, + "800000": 69, + "8000000": 69, + "900000": 69, + "9000000": 69 }, - "count": 180, - "sum": 338773.72299999994 + "count": 69, + "sum": 104476.538 } }, - "resource": "configmaps", + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", "scope": "resource", - "verb": "GET", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 180, - "1000": 2, - "10000": 180, - "100000": 180, - "1000000": 180, - "10000000": 180, - "100000000": 180, - "1000000000": 180 - }, - "count": 180, - "sum": 234746 - } - } + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -17698,76 +16514,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 31, - "100000": 31, - "1000000": 31, - "10000000": 31, - "1250000": 31, - "150000": 31, - "1500000": 31, - "15000000": 31, - "1750000": 31, - "200000": 31, - "2000000": 31, - "20000000": 31, - "250000": 31, - "2500000": 31, - "25000000": 31, - "300000": 31, - "3000000": 31, - "30000000": 31, - "350000": 31, - "3500000": 31, - "400000": 31, - "4000000": 31, - "40000000": 31, - "450000": 31, - "4500000": 31, - "50000": 31, - "500000": 31, - "5000000": 31, - "50000000": 31, - "600000": 31, - "6000000": 31, - "60000000": 31, - "700000": 31, - "7000000": 31, - "800000": 31, - "8000000": 31, - "900000": 31, - "9000000": 31 - }, - "count": 31, - "sum": 40253.549000000006 - } - }, - "resource": "resourcequotas", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 31, - "1000": 31, - "10000": 31, - "100000": 31, - "1000000": 31, - "10000000": 31, - "100000000": 31, - "1000000000": 31 - }, - "count": 31, - "sum": 1443 - } + "etcd": { + "object": { + "count": 7 } + }, + "request": { + "resource": "prioritylevelconfigurations.flowcontrol.apiserver.k8s.io" } }, "Index": "", @@ -17786,57 +16539,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "404", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "1250000": 5, - "150000": 5, - "1500000": 5, - "15000000": 5, - "1750000": 5, - "200000": 5, - "2000000": 5, - "20000000": 5, - "250000": 5, - "2500000": 5, - "25000000": 5, - "300000": 5, - "3000000": 5, - "30000000": 5, - "350000": 5, - "3500000": 5, - "400000": 5, - "4000000": 5, - "40000000": 5, - "450000": 5, - "4500000": 5, - "50000": 5, - "500000": 5, - "5000000": 5, - "50000000": 5, - "600000": 5, - "6000000": 5, - "60000000": 5, - "700000": 5, - "7000000": 5, - "800000": 5, - "8000000": 5, - "900000": 5, - "9000000": 5 - }, - "count": 5, - "sum": 17416.967999999997 - } - }, - "group": "apps", - "resource": "controllerrevisions", + "count": 1, + "group": "storage.k8s.io", + "resource": "storageclasses", "scope": "resource", - "verb": "POST", + "verb": "GET", "version": "v1" } }, @@ -17900,13 +16609,57 @@ "9000000": 4 }, "count": 4, - "sum": 21547.815 + "sum": 6066.859 } }, "group": "apps", - "resource": "daemonsets", - "scope": "resource", - "verb": "POST", + "resource": "replicasets", + "scope": "cluster", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1000": 2, + "10000": 3, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 + }, + "count": 4, + "sum": 22775 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 2, + "group": "rbac.authorization.k8s.io", + "resource": "rolebindings", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -17930,69 +16683,73 @@ "duration": { "us": { "bucket": { - "+Inf": 32, - "100000": 32, - "1000000": 32, - "10000000": 32, - "1250000": 32, - "150000": 32, - "1500000": 32, - "15000000": 32, - "1750000": 32, - "200000": 32, - "2000000": 32, - "20000000": 32, - "250000": 32, - "2500000": 32, - "25000000": 32, - "300000": 32, - "3000000": 32, - "30000000": 32, - "350000": 32, - "3500000": 32, - "400000": 32, - "4000000": 32, - "40000000": 32, - "450000": 32, - "4500000": 32, - "50000": 32, - "500000": 32, - "5000000": 32, - "50000000": 32, - "600000": 32, - "6000000": 32, - "60000000": 32, - "700000": 32, - "7000000": 32, - "800000": 32, - "8000000": 32, - "900000": 32, - "9000000": 32 + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 32, - "sum": 70075.33400000002 + "count": 6, + "sum": 2406004969.7720003 } }, - "resource": "services", + "group": "batch", + "longrunning": { + "count": 3 + }, + "resource": "jobs", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 32, + "+Inf": 6, "1000": 6, - "10000": 32, - "100000": 32, - "1000000": 32, - "10000000": 32, - "100000000": 32, - "1000000000": 32 + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 32, - "sum": 69902 + "count": 6, + "sum": 0 } } } @@ -18013,40 +16770,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 6, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 948 - } - }, - "request": { - "code": "200", - "host": "[::1]:6443", - "method": "GET" + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 12202.156 + } + }, + "group": "apps", + "resource": "deployments", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -18109,14 +16884,31 @@ "9000000": 1 }, "count": 1, - "sum": 5285.116 + "sum": 1245.864 } }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "resource": "persistentvolumeclaims", "scope": "resource", - "verb": "DELETE", + "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 230 + } + } } }, "Index": "", @@ -18135,76 +16927,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 104, - "100000": 0, - "1000000": 0, - "10000000": 1, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 1, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 1, - "250000": 0, - "2500000": 0, - "25000000": 1, - "300000": 0, - "3000000": 1, - "30000000": 1, - "350000": 0, - "3500000": 1, - "400000": 0, - "4000000": 1, - "40000000": 1, - "450000": 0, - "4500000": 1, - "50000": 0, - "500000": 0, - "5000000": 1, - "50000000": 1, - "600000": 0, - "6000000": 1, - "60000000": 1, - "700000": 0, - "7000000": 1, - "800000": 0, - "8000000": 1, - "900000": 0, - "9000000": 1 - }, - "count": 104, - "sum": 45987621142.41202 - } - }, - "longrunning": { - "count": 23 - }, - "resource": "nodes", - "scope": "cluster", - "verb": "WATCH", "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 104, - "1000": 104, - "10000": 104, - "100000": 104, - "1000000": 104, - "10000000": 104, - "100000000": 104, - "1000000000": 104 - }, - "count": 104, - "sum": 0 + "watch": { + "events": { + "kind": "PodTemplate", + "size": { + "bytes": { + "bucket": { + "+Inf": 7, + "1024": 7, + "131072": 7, + "16384": 7, + "2048": 7, + "32768": 7, + "4096": 7, + "65536": 7, + "8192": 7 + }, + "count": 7, + "sum": 735 + } } } } @@ -18225,13 +16968,37 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "resource": "serviceaccounts", - "scope": "resource", - "verb": "DELETE", - "version": "v1" + "code": "200", + "component": "apiserver", + "count": 17, + "resource": "nodes", + "scope": "resource", + "verb": "PATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 44 + } + }, + "request": { + "resource": "secrets" } }, "Index": "", @@ -18250,58 +17017,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 13475.076 - } - }, - "group": "certificates.k8s.io", - "resource": "certificatesigningrequests", - "scope": "resource", - "subresource": "status", - "verb": "PUT", + "count": 3, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -18320,13 +17042,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "resourcequotas" + "code": "201", + "component": "apiserver", + "count": 1, + "resource": "persistentvolumeclaims", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -18345,14 +17068,76 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 9, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "resource", - "verb": "GET", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 16126.376000000002 + } + }, + "group": "apiextensions.k8s.io", + "resource": "customresourcedefinitions", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 140 + } + } } }, "Index": "", @@ -18415,11 +17200,11 @@ "9000000": 2 }, "count": 2, - "sum": 963.68 + "sum": 5519.6 } }, "group": "networking.k8s.io", - "resource": "networkpolicies", + "resource": "ingressclasses", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -18438,7 +17223,98 @@ "1000000000": 2 }, "count": 2, - "sum": 124 + "sum": 122 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 6, + "sum": 2468004584.851 + } + }, + "group": "policy", + "longrunning": { + "count": 2 + }, + "resource": "poddisruptionbudgets", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 0 } } } @@ -18454,6 +17330,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, + "request": { + "resource": "resourcequotas" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -18463,50 +17363,51 @@ "duration": { "us": { "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 }, - "count": 4, - "sum": 14914.901000000002 + "count": 3, + "sum": 13475.076 } }, - "resource": "pods", + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", "scope": "resource", "subresource": "status", "verb": "PUT", @@ -18524,6 +17425,31 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 1, + "resource": "serviceaccounts", + "scope": "resource", + "verb": "DELETE", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -18573,57 +17499,14 @@ "9000000": 1 }, "count": 1, - "sum": 8484.125 + "sum": 5285.116 } }, - "resource": "events", - "scope": "cluster", - "verb": "LIST", + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", + "scope": "resource", + "verb": "DELETE", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 0, - "10000": 0, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 11809 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 1 - } - }, - "request": { - "code": "404", - "host": "[::1]:6443", - "method": "PUT" } }, "Index": "", @@ -18646,69 +17529,72 @@ "duration": { "us": { "bucket": { - "+Inf": 839, - "100000": 828, - "1000000": 836, - "10000000": 839, - "1250000": 838, - "150000": 833, - "1500000": 839, - "15000000": 839, - "1750000": 839, - "200000": 833, - "2000000": 839, - "20000000": 839, - "250000": 833, - "2500000": 839, - "25000000": 839, - "300000": 833, - "3000000": 839, - "30000000": 839, - "350000": 834, - "3500000": 839, - "400000": 834, - "4000000": 839, - "40000000": 839, - "450000": 834, - "4500000": 839, - "50000": 827, - "500000": 834, - "5000000": 839, - "50000000": 839, - "600000": 835, - "6000000": 839, - "60000000": 839, - "700000": 836, - "7000000": 839, - "800000": 836, - "8000000": 839, - "900000": 836, - "9000000": 839 + "+Inf": 104, + "100000": 0, + "1000000": 0, + "10000000": 1, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 1, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 1, + "250000": 0, + "2500000": 0, + "25000000": 1, + "300000": 0, + "3000000": 1, + "30000000": 1, + "350000": 0, + "3500000": 1, + "400000": 0, + "4000000": 1, + "40000000": 1, + "450000": 0, + "4500000": 1, + "50000": 0, + "500000": 0, + "5000000": 1, + "50000000": 1, + "600000": 0, + "6000000": 1, + "60000000": 1, + "700000": 0, + "7000000": 1, + "800000": 0, + "8000000": 1, + "900000": 0, + "9000000": 1 }, - "count": 839, - "sum": 8754493.183000004 + "count": 104, + "sum": 45987621142.41202 } }, - "resource": "endpoints", - "scope": "resource", - "verb": "GET", + "longrunning": { + "count": 23 + }, + "resource": "nodes", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 839, - "1000": 839, - "10000": 839, - "100000": 839, - "1000000": 839, - "10000000": 839, - "100000000": 839, - "1000000000": 839 + "+Inf": 104, + "1000": 104, + "10000": 104, + "100000": 104, + "1000000": 104, + "10000000": 104, + "100000000": 104, + "1000000000": 104 }, - "count": 839, - "sum": 587342 + "count": 104, + "sum": 0 } } } @@ -18724,6 +17610,32 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 948 + } + }, + "request": { + "code": "200", + "host": "[::1]:6443", + "method": "GET" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -18773,13 +17685,12 @@ "9000000": 32 }, "count": 32, - "sum": 68234.144 + "sum": 70075.33400000002 } }, - "group": "storage.k8s.io", - "resource": "csinodes", - "scope": "resource", - "verb": "GET", + "resource": "services", + "scope": "cluster", + "verb": "LIST", "version": "v1" }, "response": { @@ -18787,7 +17698,7 @@ "bytes": { "bucket": { "+Inf": 32, - "1000": 32, + "1000": 6, "10000": 32, "100000": 32, "1000000": 32, @@ -18796,7 +17707,7 @@ "1000000000": 32 }, "count": 32, - "sum": 5672 + "sum": 69902 } } } @@ -18812,58 +17723,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "group": "admissionregistration.k8s.io", - "resource": "mutatingwebhookconfigurations", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "group": "admissionregistration.k8s.io", - "resource": "validatingwebhookconfigurations", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -18871,12 +17730,12 @@ "request": { "code": "0", "component": "apiserver", - "count": 3, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", + "count": 6, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v1beta1" } }, "Index": "", @@ -18899,97 +17758,54 @@ "duration": { "us": { "bucket": { - "+Inf": 28, - "100000": 28, - "1000000": 28, - "10000000": 28, - "1250000": 28, - "150000": 28, - "1500000": 28, - "15000000": 28, - "1750000": 28, - "200000": 28, - "2000000": 28, - "20000000": 28, - "250000": 28, - "2500000": 28, - "25000000": 28, - "300000": 28, - "3000000": 28, - "30000000": 28, - "350000": 28, - "3500000": 28, - "400000": 28, - "4000000": 28, - "40000000": 28, - "450000": 28, - "4500000": 28, - "50000": 28, - "500000": 28, - "5000000": 28, - "50000000": 28, - "600000": 28, - "6000000": 28, - "60000000": 28, - "700000": 28, - "7000000": 28, - "800000": 28, - "8000000": 28, - "900000": 28, - "9000000": 28 - }, - "count": 28, - "sum": 36566.024999999994 - } - }, - "resource": "limitranges", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 28, - "1000": 28, - "10000": 28, - "100000": 28, - "1000000": 28, - "10000000": 28, - "100000000": 28, - "1000000000": 28 - }, - "count": 28, - "sum": 1224 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "storage.k8s.io", - "resource": "csistoragecapacities", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 + }, + "count": 4, + "sum": 21547.815 + } + }, + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -19008,30 +17824,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "1250000": 5, + "150000": 5, + "1500000": 5, + "15000000": 5, + "1750000": 5, + "200000": 5, + "2000000": 5, + "20000000": 5, + "250000": 5, + "2500000": 5, + "25000000": 5, + "300000": 5, + "3000000": 5, + "30000000": 5, + "350000": 5, + "3500000": 5, + "400000": 5, + "4000000": 5, + "40000000": 5, + "450000": 5, + "4500000": 5, + "50000": 5, + "500000": 5, + "5000000": 5, + "50000000": 5, + "600000": 5, + "6000000": 5, + "60000000": 5, + "700000": 5, + "7000000": 5, + "800000": 5, + "8000000": 5, + "900000": 5, + "9000000": 5 + }, + "count": 5, + "sum": 17416.967999999997 + } + }, "group": "apps", + "resource": "controllerrevisions", + "scope": "resource", + "verb": "POST", "version": "v1" - }, - "watch": { - "events": { - "kind": "StatefulSet", - "size": { - "bytes": { - "bucket": { - "+Inf": 13, - "1024": 9, - "131072": 13, - "16384": 13, - "2048": 13, - "32768": 13, - "4096": 13, - "65536": 13, - "8192": 13 - }, - "count": 13, - "sum": 9152 - } - } - } } }, "Index": "", @@ -19050,13 +17894,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 2, - "resource": "services", + "duration": { + "us": { + "bucket": { + "+Inf": 180, + "100000": 180, + "1000000": 180, + "10000000": 180, + "1250000": 180, + "150000": 180, + "1500000": 180, + "15000000": 180, + "1750000": 180, + "200000": 180, + "2000000": 180, + "20000000": 180, + "250000": 180, + "2500000": 180, + "25000000": 180, + "300000": 180, + "3000000": 180, + "30000000": 180, + "350000": 180, + "3500000": 180, + "400000": 180, + "4000000": 180, + "40000000": 180, + "450000": 180, + "4500000": 180, + "50000": 180, + "500000": 180, + "5000000": 180, + "50000000": 180, + "600000": 180, + "6000000": 180, + "60000000": 180, + "700000": 180, + "7000000": 180, + "800000": 180, + "8000000": 180, + "900000": 180, + "9000000": 180 + }, + "count": 180, + "sum": 338773.72299999994 + } + }, + "resource": "configmaps", "scope": "resource", "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 180, + "1000": 2, + "10000": 180, + "100000": 180, + "1000000": 180, + "10000000": 180, + "100000000": 180, + "1000000000": 180 + }, + "count": 180, + "sum": 234746 + } + } } }, "Index": "", @@ -19079,54 +17985,71 @@ "duration": { "us": { "bucket": { - "+Inf": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "1250000": 6, - "150000": 6, - "1500000": 6, - "15000000": 6, - "1750000": 6, - "200000": 6, - "2000000": 6, - "20000000": 6, - "250000": 6, - "2500000": 6, - "25000000": 6, - "300000": 6, - "3000000": 6, - "30000000": 6, - "350000": 6, - "3500000": 6, - "400000": 6, - "4000000": 6, - "40000000": 6, - "450000": 6, - "4500000": 6, - "50000": 6, - "500000": 6, - "5000000": 6, - "50000000": 6, - "600000": 6, - "6000000": 6, - "60000000": 6, - "700000": 6, - "7000000": 6, - "800000": 6, - "8000000": 6, - "900000": 6, - "9000000": 6 + "+Inf": 31, + "100000": 31, + "1000000": 31, + "10000000": 31, + "1250000": 31, + "150000": 31, + "1500000": 31, + "15000000": 31, + "1750000": 31, + "200000": 31, + "2000000": 31, + "20000000": 31, + "250000": 31, + "2500000": 31, + "25000000": 31, + "300000": 31, + "3000000": 31, + "30000000": 31, + "350000": 31, + "3500000": 31, + "400000": 31, + "4000000": 31, + "40000000": 31, + "450000": 31, + "4500000": 31, + "50000": 31, + "500000": 31, + "5000000": 31, + "50000000": 31, + "600000": 31, + "6000000": 31, + "60000000": 31, + "700000": 31, + "7000000": 31, + "800000": 31, + "8000000": 31, + "900000": 31, + "9000000": 31 }, - "count": 6, - "sum": 17043.534 + "count": 31, + "sum": 40253.549000000006 + } + }, + "resource": "resourcequotas", + "scope": "namespace", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 31, + "1000": 31, + "10000": 31, + "100000": 31, + "1000000": 31, + "10000000": 31, + "100000000": 31, + "1000000000": 31 + }, + "count": 31, + "sum": 1443 } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", - "scope": "resource", - "verb": "APPLY", - "version": "v1" + } } }, "Index": "", @@ -19145,57 +18068,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 4230.055 - } - }, - "resource": "secrets", - "scope": "resource", - "verb": "DELETE", + "group": "node.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "RuntimeClass", + "size": { + "bytes": { + "bucket": { + "+Inf": 50, + "1024": 50, + "131072": 50, + "16384": 50, + "2048": 50, + "32768": 50, + "4096": 50, + "65536": 50, + "8192": 50 + }, + "count": 50, + "sum": 3400 + } + } + } } }, "Index": "", @@ -19214,76 +18110,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 - }, - "count": 1, - "sum": 251.70900000000003 - } - }, - "group": "autoscaling", - "resource": "horizontalpodautoscalers", - "scope": "cluster", - "verb": "LIST", - "version": "v2beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 71 - } - } + "count": 4, + "resource": "pods", + "scope": "resource", + "subresource": "status", + "verb": "PUT", + "version": "v1" } }, "Index": "", @@ -19302,13 +18136,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 1, - "resource": "serviceaccounts", - "scope": "namespace", - "verb": "LIST", + "group": "admissionregistration.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "MutatingWebhookConfiguration", + "size": { + "bytes": { + "bucket": { + "+Inf": 30, + "1024": 30, + "131072": 30, + "16384": 30, + "2048": 30, + "32768": 30, + "4096": 30, + "65536": 30, + "8192": 30 + }, + "count": 30, + "sum": 2970 + } + } + } } }, "Index": "", @@ -19327,79 +18178,84 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 5, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 5, - "sum": 2425003419.499 - } - }, - "group": "storage.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "csistoragecapacities", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { + "count": 1, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "resource", + "verb": "DELETE", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "+Inf": 75, + "100000": 75, + "1000000": 75, + "10000000": 75, + "1250000": 75, + "150000": 75, + "1500000": 75, + "15000000": 75, + "1750000": 75, + "200000": 75, + "2000000": 75, + "20000000": 75, + "250000": 75, + "2500000": 75, + "25000000": 75, + "300000": 75, + "3000000": 75, + "30000000": 75, + "350000": 75, + "3500000": 75, + "400000": 75, + "4000000": 75, + "40000000": 75, + "450000": 75, + "4500000": 75, + "50000": 75, + "500000": 75, + "5000000": 75, + "50000000": 75, + "600000": 75, + "6000000": 75, + "60000000": 75, + "700000": 75, + "7000000": 75, + "800000": 75, + "8000000": 75, + "900000": 75, + "9000000": 75 }, - "count": 5, - "sum": 0 + "count": 75, + "sum": 352185.06799999997 } - } + }, + "resource": "pods", + "scope": "resource", + "subresource": "status", + "verb": "PATCH", + "version": "v1" } }, "Index": "", @@ -19418,13 +18274,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 6, - "group": "batch", - "resource": "jobs", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 6230.098 + } + }, + "group": "certificates.k8s.io", + "resource": "certificatesigningrequests", + "scope": "resource", + "subresource": "approval", + "verb": "PUT", "version": "v1" } }, @@ -19488,31 +18389,13 @@ "9000000": 1 }, "count": 1, - "sum": 257.88 + "sum": 4230.055 } }, - "resource": "podtemplates", - "scope": "cluster", - "verb": "LIST", + "resource": "secrets", + "scope": "resource", + "verb": "DELETE", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 42 - } - } } }, "Index": "", @@ -19531,70 +18414,74 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", "duration": { "us": { "bucket": { - "+Inf": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "1250000": 5, - "150000": 5, - "1500000": 5, - "15000000": 5, - "1750000": 5, - "200000": 5, - "2000000": 5, - "20000000": 5, - "250000": 5, - "2500000": 5, - "25000000": 5, - "300000": 5, - "3000000": 5, - "30000000": 5, - "350000": 5, - "3500000": 5, - "400000": 5, - "4000000": 5, - "40000000": 5, - "450000": 5, - "4500000": 5, - "50000": 5, - "500000": 5, - "5000000": 5, - "50000000": 5, - "600000": 5, - "6000000": 5, - "60000000": 5, - "700000": 5, - "7000000": 5, - "800000": 5, - "8000000": 5, - "900000": 5, - "9000000": 5 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 5, - "sum": 12048.192 + "count": 1, + "sum": 251.70900000000003 } }, - "subresource": "/healthz", - "verb": "GET" + "group": "autoscaling", + "resource": "horizontalpodautoscalers", + "scope": "cluster", + "verb": "LIST", + "version": "v2beta1" }, "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 }, - "count": 5, - "sum": 4 + "count": 1, + "sum": 71 } } } @@ -19615,30 +18502,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "flowcontrol.apiserver.k8s.io", - "version": "v1beta1" - }, - "watch": { - "events": { - "kind": "FlowSchema", - "size": { - "bytes": { - "bucket": { - "+Inf": 35, - "1024": 34, - "131072": 35, - "16384": 35, - "2048": 35, - "32768": 35, - "4096": 35, - "65536": 35, - "8192": 35 - }, - "count": 35, - "sum": 17360 - } - } - } + "code": "404", + "component": "apiserver", + "count": 2, + "resource": "services", + "scope": "resource", + "verb": "GET", + "version": "v1" } }, "Index": "", @@ -19657,13 +18527,100 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 1, - "resource": "podtemplates", - "scope": "cluster", - "verb": "LIST", + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "1250000": 6, + "150000": 6, + "1500000": 6, + "15000000": 6, + "1750000": 6, + "200000": 6, + "2000000": 6, + "20000000": 6, + "250000": 6, + "2500000": 6, + "25000000": 6, + "300000": 6, + "3000000": 6, + "30000000": 6, + "350000": 6, + "3500000": 6, + "400000": 6, + "4000000": 6, + "40000000": 6, + "450000": 6, + "4500000": 6, + "50000": 6, + "500000": 6, + "5000000": 6, + "50000000": 6, + "600000": 6, + "6000000": 6, + "60000000": 6, + "700000": 6, + "7000000": 6, + "800000": 6, + "8000000": 6, + "900000": 6, + "9000000": 6 + }, + "count": 6, + "sum": 17043.534 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", + "scope": "resource", + "verb": "APPLY", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "apps", "version": "v1" + }, + "watch": { + "events": { + "kind": "StatefulSet", + "size": { + "bytes": { + "bucket": { + "+Inf": 13, + "1024": 9, + "131072": 13, + "16384": 13, + "2048": 13, + "32768": 13, + "4096": 13, + "65536": 13, + "8192": 13 + }, + "count": 13, + "sum": 9152 + } + } + } } }, "Index": "", @@ -19685,11 +18642,11 @@ "code": "200", "component": "apiserver", "count": 2, - "resource": "persistentvolumes", - "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" + "group": "storage.k8s.io", + "resource": "csistoragecapacities", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" } }, "Index": "", @@ -19712,53 +18669,71 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 28, + "100000": 28, + "1000000": 28, + "10000000": 28, + "1250000": 28, + "150000": 28, + "1500000": 28, + "15000000": 28, + "1750000": 28, + "200000": 28, + "2000000": 28, + "20000000": 28, + "250000": 28, + "2500000": 28, + "25000000": 28, + "300000": 28, + "3000000": 28, + "30000000": 28, + "350000": 28, + "3500000": 28, + "400000": 28, + "4000000": 28, + "40000000": 28, + "450000": 28, + "4500000": 28, + "50000": 28, + "500000": 28, + "5000000": 28, + "50000000": 28, + "600000": 28, + "6000000": 28, + "60000000": 28, + "700000": 28, + "7000000": 28, + "800000": 28, + "8000000": 28, + "900000": 28, + "9000000": 28 }, - "count": 1, - "sum": 3537.324 + "count": 28, + "sum": 36566.024999999994 } }, - "resource": "serviceaccounts", - "scope": "resource", - "verb": "DELETE", + "resource": "limitranges", + "scope": "namespace", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 28, + "1000": 28, + "10000": 28, + "100000": 28, + "1000000": 28, + "10000000": 28, + "100000000": 28, + "1000000000": 28 + }, + "count": 28, + "sum": 1224 + } + } } }, "Index": "", @@ -19777,76 +18752,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 - }, - "count": 4, - "sum": 2944.409 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", + "count": 3, + "group": "autoscaling", + "resource": "horizontalpodautoscalers", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 4, - "1000": 3, - "10000": 3, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 - }, - "count": 4, - "sum": 31531 - } - } } }, "Index": "", @@ -19867,11 +18780,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 10, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "resource", - "verb": "PUT", + "count": 3, + "group": "admissionregistration.k8s.io", + "resource": "mutatingwebhookconfigurations", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -19891,76 +18804,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 72, - "100000": 72, - "1000000": 72, - "10000000": 72, - "1250000": 72, - "150000": 72, - "1500000": 72, - "15000000": 72, - "1750000": 72, - "200000": 72, - "2000000": 72, - "20000000": 72, - "250000": 72, - "2500000": 72, - "25000000": 72, - "300000": 72, - "3000000": 72, - "30000000": 72, - "350000": 72, - "3500000": 72, - "400000": 72, - "4000000": 72, - "40000000": 72, - "450000": 72, - "4500000": 72, - "50000": 72, - "500000": 72, - "5000000": 72, - "50000000": 72, - "600000": 72, - "6000000": 72, - "60000000": 72, - "700000": 72, - "7000000": 72, - "800000": 72, - "8000000": 72, - "900000": 72, - "9000000": 72 - }, - "count": 72, - "sum": 64481.998 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", - "scope": "resource", - "verb": "GET", + "count": 3, + "group": "admissionregistration.k8s.io", + "resource": "validatingwebhookconfigurations", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 72, - "1000": 72, - "10000": 72, - "100000": 72, - "1000000": 72, - "10000000": 72, - "100000000": 72, - "1000000000": 72 - }, - "count": 72, - "sum": 16178 - } - } } }, "Index": "", @@ -19983,70 +18834,70 @@ "duration": { "us": { "bucket": { - "+Inf": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "1250000": 6, - "150000": 6, - "1500000": 6, - "15000000": 6, - "1750000": 6, - "200000": 6, - "2000000": 6, - "20000000": 6, - "250000": 6, - "2500000": 6, - "25000000": 6, - "300000": 6, - "3000000": 6, - "30000000": 6, - "350000": 6, - "3500000": 6, - "400000": 6, - "4000000": 6, - "40000000": 6, - "450000": 6, - "4500000": 6, - "50000": 6, - "500000": 6, - "5000000": 6, - "50000000": 6, - "600000": 6, - "6000000": 6, - "60000000": 6, - "700000": 6, - "7000000": 6, - "800000": 6, - "8000000": 6, - "900000": 6, - "9000000": 6 + "+Inf": 32, + "100000": 32, + "1000000": 32, + "10000000": 32, + "1250000": 32, + "150000": 32, + "1500000": 32, + "15000000": 32, + "1750000": 32, + "200000": 32, + "2000000": 32, + "20000000": 32, + "250000": 32, + "2500000": 32, + "25000000": 32, + "300000": 32, + "3000000": 32, + "30000000": 32, + "350000": 32, + "3500000": 32, + "400000": 32, + "4000000": 32, + "40000000": 32, + "450000": 32, + "4500000": 32, + "50000": 32, + "500000": 32, + "5000000": 32, + "50000000": 32, + "600000": 32, + "6000000": 32, + "60000000": 32, + "700000": 32, + "7000000": 32, + "800000": 32, + "8000000": 32, + "900000": 32, + "9000000": 32 }, - "count": 6, - "sum": 3581.286 + "count": 32, + "sum": 68234.144 } }, "group": "storage.k8s.io", - "resource": "csidrivers", - "scope": "cluster", - "verb": "LIST", + "resource": "csinodes", + "scope": "resource", + "verb": "GET", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 + "+Inf": 32, + "1000": 32, + "10000": 32, + "100000": 32, + "1000000": 32, + "10000000": 32, + "100000000": 32, + "1000000000": 32 }, - "count": 6, - "sum": 330 + "count": 32, + "sum": 5672 } } } @@ -20067,28 +18918,73 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "flowcontrol.apiserver.k8s.io", - "version": "v1beta1" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 839, + "100000": 828, + "1000000": 836, + "10000000": 839, + "1250000": 838, + "150000": 833, + "1500000": 839, + "15000000": 839, + "1750000": 839, + "200000": 833, + "2000000": 839, + "20000000": 839, + "250000": 833, + "2500000": 839, + "25000000": 839, + "300000": 833, + "3000000": 839, + "30000000": 839, + "350000": 834, + "3500000": 839, + "400000": 834, + "4000000": 839, + "40000000": 839, + "450000": 834, + "4500000": 839, + "50000": 827, + "500000": 834, + "5000000": 839, + "50000000": 839, + "600000": 835, + "6000000": 839, + "60000000": 839, + "700000": 836, + "7000000": 839, + "800000": 836, + "8000000": 839, + "900000": 836, + "9000000": 839 + }, + "count": 839, + "sum": 8754493.183000004 + } + }, + "resource": "endpoints", + "scope": "resource", + "verb": "GET", + "version": "v1" }, - "watch": { - "events": { - "kind": "PriorityLevelConfiguration", - "size": { - "bytes": { - "bucket": { - "+Inf": 19, - "1024": 19, - "131072": 19, - "16384": 19, - "2048": 19, - "32768": 19, - "4096": 19, - "65536": 19, - "8192": 19 - }, - "count": 19, - "sum": 4534 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 839, + "1000": 839, + "10000": 839, + "100000": 839, + "1000000": 839, + "10000000": 839, + "100000000": 839, + "1000000000": 839 + }, + "count": 839, + "sum": 587342 } } } @@ -20104,42 +19000,81 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 181 - } - }, - "request": { - "resource": "events" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, "MetricSetFields": { "request": { - "code": "403", "component": "apiserver", - "count": 7, - "resource": "pods", - "scope": "resource", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 963.68 + } + }, + "group": "networking.k8s.io", + "resource": "networkpolicies", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 124 + } + } } }, "Index": "", @@ -20162,75 +19097,54 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 }, - "count": 2, - "sum": 1067002576.502 + "count": 4, + "sum": 14914.901000000002 } }, - "group": "events.k8s.io", - "longrunning": { - "count": 1 - }, - "resource": "events", - "scope": "cluster", - "verb": "WATCH", + "resource": "pods", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 0 - } - } } }, "Index": "", @@ -20249,14 +19163,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 3, - "group": "storage.k8s.io", - "resource": "csinodes", - "scope": "resource", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 8484.125 + } + }, + "resource": "events", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 0, + "10000": 0, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 11809 + } + } } }, "Index": "", @@ -20274,11 +19249,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "client": { + "request": { + "count": 1 + } + }, "request": { - "code": "200", - "count": 1420, - "subresource": "/readyz", - "verb": "GET" + "code": "404", + "host": "[::1]:6443", + "method": "PUT" } }, "Index": "", @@ -20297,14 +19276,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "404", "component": "apiserver", - "count": 3, - "group": "extensions", - "resource": "ingresses", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + "count": 9, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "GET", + "version": "v1" } }, "Index": "", @@ -20322,13 +19301,77 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 37 - } - }, "request": { - "resource": "apiservices.apiregistration.k8s.io" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 72, + "100000": 72, + "1000000": 72, + "10000000": 72, + "1250000": 72, + "150000": 72, + "1500000": 72, + "15000000": 72, + "1750000": 72, + "200000": 72, + "2000000": 72, + "20000000": 72, + "250000": 72, + "2500000": 72, + "25000000": 72, + "300000": 72, + "3000000": 72, + "30000000": 72, + "350000": 72, + "3500000": 72, + "400000": 72, + "4000000": 72, + "40000000": 72, + "450000": 72, + "4500000": 72, + "50000": 72, + "500000": 72, + "5000000": 72, + "50000000": 72, + "600000": 72, + "6000000": 72, + "60000000": 72, + "700000": 72, + "7000000": 72, + "800000": 72, + "8000000": 72, + "900000": 72, + "9000000": 72 + }, + "count": 72, + "sum": 64481.998 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", + "scope": "resource", + "verb": "GET", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 72, + "1000": 72, + "10000": 72, + "100000": 72, + "1000000": 72, + "10000000": 72, + "100000000": 72, + "1000000000": 72 + }, + "count": 72, + "sum": 16178 + } + } } }, "Index": "", @@ -20391,11 +19434,11 @@ "9000000": 6 }, "count": 6, - "sum": 26525.21 + "sum": 3581.286 } }, - "group": "node.k8s.io", - "resource": "runtimeclasses", + "group": "storage.k8s.io", + "resource": "csidrivers", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -20430,32 +19473,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", - "component": "apiserver", - "count": 8, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -20463,10 +19480,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 3, - "resource": "replicationcontrollers", - "scope": "cluster", - "verb": "LIST", + "count": 10, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "resource", + "verb": "PUT", "version": "v1" } }, @@ -20530,12 +19548,12 @@ "9000000": 1 }, "count": 1, - "sum": 3355.154 + "sum": 3537.324 } }, - "resource": "persistentvolumes", + "resource": "serviceaccounts", "scope": "resource", - "verb": "PUT", + "verb": "DELETE", "version": "v1" } }, @@ -20555,12 +19573,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "200", "component": "apiserver", "count": 2, - "resource": "configmaps", + "resource": "persistentvolumes", "scope": "resource", - "verb": "GET", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -20580,13 +19599,118 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "resource": "configmaps", + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 + }, + "count": 4, + "sum": 2944.409 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", "scope": "cluster", "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1000": 3, + "10000": 3, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 + }, + "count": 4, + "sum": 31531 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "flowcontrol.apiserver.k8s.io", + "version": "v1beta1" + }, + "watch": { + "events": { + "kind": "FlowSchema", + "size": { + "bytes": { + "bucket": { + "+Inf": 35, + "1024": 34, + "131072": 35, + "16384": 35, + "2048": 35, + "32768": 35, + "4096": 35, + "65536": 35, + "8192": 35 + }, + "count": 35, + "sum": 17360 + } + } + } } }, "Index": "", @@ -20605,77 +19729,182 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", + "count": 1, + "resource": "podtemplates", + "scope": "cluster", + "verb": "LIST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "duration": { "us": { "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 + "+Inf": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "1250000": 5, + "150000": 5, + "1500000": 5, + "15000000": 5, + "1750000": 5, + "200000": 5, + "2000000": 5, + "20000000": 5, + "250000": 5, + "2500000": 5, + "25000000": 5, + "300000": 5, + "3000000": 5, + "30000000": 5, + "350000": 5, + "3500000": 5, + "400000": 5, + "4000000": 5, + "40000000": 5, + "450000": 5, + "4500000": 5, + "50000": 5, + "500000": 5, + "5000000": 5, + "50000000": 5, + "600000": 5, + "6000000": 5, + "60000000": 5, + "700000": 5, + "7000000": 5, + "800000": 5, + "8000000": 5, + "900000": 5, + "9000000": 5 + }, + "count": 5, + "sum": 12048.192 + } + }, + "subresource": "/healthz", + "verb": "GET" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 + }, + "count": 5, + "sum": 4 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 6, - "sum": 2591004700.7980003 + "count": 1, + "sum": 257.88 } }, - "group": "storage.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "csinodes", + "resource": "podtemplates", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 }, - "count": 6, - "sum": 0 + "count": 1, + "sum": 42 } } } @@ -20696,57 +19925,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 5292.259 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "roles", - "scope": "resource", - "verb": "DELETE", + "count": 6, + "group": "batch", + "resource": "jobs", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -20770,7 +19955,7 @@ "duration": { "us": { "bucket": { - "+Inf": 6, + "+Inf": 5, "100000": 0, "1000000": 0, "10000000": 0, @@ -20809,130 +19994,60 @@ "900000": 0, "9000000": 0 }, - "count": 6, - "sum": 2441004443.3759995 + "count": 5, + "sum": 2425003419.499 } }, + "group": "storage.k8s.io", "longrunning": { "count": 2 }, - "resource": "serviceaccounts", + "resource": "csistoragecapacities", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", - "component": "apiserver", - "count": 8, - "group": "admissionregistration.k8s.io", - "resource": "validatingwebhookconfigurations", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 135, - "100000": 135, - "1000000": 135, - "10000000": 135, - "1250000": 135, - "150000": 135, - "1500000": 135, - "15000000": 135, - "1750000": 135, - "200000": 135, - "2000000": 135, - "20000000": 135, - "250000": 135, - "2500000": 135, - "25000000": 135, - "300000": 135, - "3000000": 135, - "30000000": 135, - "350000": 135, - "3500000": 135, - "400000": 135, - "4000000": 135, - "40000000": 135, - "450000": 135, - "4500000": 135, - "50000": 135, - "500000": 135, - "5000000": 135, - "50000000": 135, - "600000": 135, - "6000000": 135, - "60000000": 135, - "700000": 135, - "7000000": 135, - "800000": 135, - "8000000": 135, - "900000": 135, - "9000000": 135 + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 }, - "count": 135, - "sum": 293881.7489999998 + "count": 5, + "sum": 0 } - }, - "group": "authentication.k8s.io", - "resource": "tokenreviews", - "scope": "resource", - "verb": "POST", + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 1, + "resource": "serviceaccounts", + "scope": "namespace", + "verb": "LIST", "version": "v1" } }, @@ -20996,13 +20111,12 @@ "9000000": 1 }, "count": 1, - "sum": 5679.247 + "sum": 3355.154 } }, - "group": "apps", - "resource": "controllerrevisions", + "resource": "persistentvolumes", "scope": "resource", - "verb": "DELETE", + "verb": "PUT", "version": "v1" } }, @@ -21022,14 +20136,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "404", "component": "apiserver", - "count": 28, - "group": "batch", - "resource": "jobs", + "count": 2, + "resource": "configmaps", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "GET", "version": "v1" } }, @@ -21051,10 +20163,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 178, - "resource": "configmaps", - "scope": "resource", - "verb": "GET", + "count": 3, + "resource": "replicationcontrollers", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -21069,6 +20181,56 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 8, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 37 + } + }, + "request": { + "resource": "apiservices.apiregistration.k8s.io" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -21078,54 +20240,120 @@ "duration": { "us": { "bucket": { - "+Inf": 54, - "100000": 54, - "1000000": 54, - "10000000": 54, - "1250000": 54, - "150000": 54, - "1500000": 54, - "15000000": 54, - "1750000": 54, - "200000": 54, - "2000000": 54, - "20000000": 54, - "250000": 54, - "2500000": 54, - "25000000": 54, - "300000": 54, - "3000000": 54, - "30000000": 54, - "350000": 54, - "3500000": 54, - "400000": 54, - "4000000": 54, - "40000000": 54, - "450000": 54, - "4500000": 54, - "50000": 54, - "500000": 54, - "5000000": 54, - "50000000": 54, - "600000": 54, - "6000000": 54, - "60000000": 54, - "700000": 54, - "7000000": 54, - "800000": 54, - "8000000": 54, - "900000": 54, - "9000000": 54 + "+Inf": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "1250000": 6, + "150000": 6, + "1500000": 6, + "15000000": 6, + "1750000": 6, + "200000": 6, + "2000000": 6, + "20000000": 6, + "250000": 6, + "2500000": 6, + "25000000": 6, + "300000": 6, + "3000000": 6, + "30000000": 6, + "350000": 6, + "3500000": 6, + "400000": 6, + "4000000": 6, + "40000000": 6, + "450000": 6, + "4500000": 6, + "50000": 6, + "500000": 6, + "5000000": 6, + "50000000": 6, + "600000": 6, + "6000000": 6, + "60000000": 6, + "700000": 6, + "7000000": 6, + "800000": 6, + "8000000": 6, + "900000": 6, + "9000000": 6 }, - "count": 54, - "sum": 84032.587 + "count": 6, + "sum": 26525.21 } }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "resource", - "verb": "POST", + "group": "node.k8s.io", + "resource": "runtimeclasses", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 330 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 3, + "group": "extensions", + "resource": "ingresses", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "count": 1420, + "subresource": "/readyz", + "verb": "GET" } }, "Index": "", @@ -21144,14 +20372,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 58, - "resource": "serviceaccounts", - "scope": "resource", - "subresource": "token", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 2, + "sum": 1067002576.502 + } + }, + "group": "events.k8s.io", + "longrunning": { + "count": 1 + }, + "resource": "events", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 0 + } + } } }, "Index": "", @@ -21170,10 +20463,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", - "count": 14, - "subresource": "/readyz", - "verb": "GET" + "code": "201", + "component": "apiserver", + "count": 3, + "group": "storage.k8s.io", + "resource": "csinodes", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -21191,14 +20488,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 181 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 837, - "resource": "endpoints", - "scope": "resource", - "verb": "GET", - "version": "v1" + "resource": "events" } }, "Index": "", @@ -21217,10 +20513,10 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "403", "component": "apiserver", - "count": 184, - "resource": "events", + "count": 7, + "resource": "pods", "scope": "resource", "verb": "POST", "version": "v1" @@ -21242,27 +20538,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "certificates.k8s.io", - "version": "v1" + "group": "flowcontrol.apiserver.k8s.io", + "version": "v1beta1" }, "watch": { "events": { - "kind": "CertificateSigningRequest", + "kind": "PriorityLevelConfiguration", "size": { "bytes": { "bucket": { - "+Inf": 27, - "1024": 18, - "131072": 27, - "16384": 27, - "2048": 22, - "32768": 27, - "4096": 27, - "65536": 27, - "8192": 27 + "+Inf": 19, + "1024": 19, + "131072": 19, + "16384": 19, + "2048": 19, + "32768": 19, + "4096": 19, + "65536": 19, + "8192": 19 }, - "count": 27, - "sum": 19209 + "count": 19, + "sum": 4534 } } } @@ -21284,76 +20580,39 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 5614.563999999999 - } - }, - "group": "apps", - "resource": "daemonsets", + "count": 15, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 32, + "resource": "services", "scope": "cluster", "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 0, - "10000": 1, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 38547 - } - } } }, "Index": "", @@ -21372,12 +20631,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 7, - "resource": "resourcequotas", + "count": 5, + "group": "storage.k8s.io", + "resource": "storageclasses", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" } }, @@ -21441,14 +20701,13 @@ "9000000": 0 }, "count": 3, - "sum": 1413001212.8630002 + "sum": 1368003098.8530002 } }, - "group": "discovery.k8s.io", "longrunning": { "count": 1 }, - "resource": "endpointslices", + "resource": "podtemplates", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -21487,13 +20746,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 21 - } - }, "request": { - "resource": "jobs.batch" + "code": "201", + "component": "apiserver", + "count": 54, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "resource", + "verb": "POST", + "version": "v1" } }, "Index": "", @@ -21595,58 +20856,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "201", - "component": "apiserver", - "count": 54, - "group": "rbac.authorization.k8s.io", - "resource": "clusterrolebindings", - "scope": "resource", - "verb": "POST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 5, - "group": "storage.k8s.io", - "resource": "storageclasses", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -21696,13 +20905,14 @@ "9000000": 0 }, "count": 3, - "sum": 1368003098.8530002 + "sum": 1413001212.8630002 } }, + "group": "discovery.k8s.io", "longrunning": { "count": 1 }, - "resource": "podtemplates", + "resource": "endpointslices", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -21742,13 +20952,191 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "0", "component": "apiserver", - "count": 15, - "group": "rbac.authorization.k8s.io", - "resource": "roles", + "count": 7, + "resource": "resourcequotas", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 5614.563999999999 + } + }, + "group": "apps", + "resource": "daemonsets", + "scope": "cluster", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 0, + "10000": 1, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 38547 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 21 + } + }, + "request": { + "resource": "jobs.batch" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "certificates.k8s.io", + "version": "v1" + }, + "watch": { + "events": { + "kind": "CertificateSigningRequest", + "size": { + "bytes": { + "bucket": { + "+Inf": 27, + "1024": 18, + "131072": 27, + "16384": 27, + "2048": 22, + "32768": 27, + "4096": 27, + "65536": 27, + "8192": 27 + }, + "count": 27, + "sum": 19209 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 837, + "resource": "endpoints", "scope": "resource", - "verb": "POST", + "verb": "GET", "version": "v1" } }, @@ -21768,12 +21156,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", - "count": 32, - "resource": "services", - "scope": "cluster", - "verb": "LIST", + "count": 184, + "resource": "events", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -21793,12 +21181,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "201", "component": "apiserver", - "count": 1, - "resource": "configmaps", + "count": 58, + "resource": "serviceaccounts", "scope": "resource", - "verb": "PUT", + "subresource": "token", + "verb": "POST", "version": "v1" } }, @@ -21818,75 +21207,10 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 116, - "100000": 115, - "1000000": 116, - "10000000": 116, - "1250000": 116, - "150000": 116, - "1500000": 116, - "15000000": 116, - "1750000": 116, - "200000": 116, - "2000000": 116, - "20000000": 116, - "250000": 116, - "2500000": 116, - "25000000": 116, - "300000": 116, - "3000000": 116, - "30000000": 116, - "350000": 116, - "3500000": 116, - "400000": 116, - "4000000": 116, - "40000000": 116, - "450000": 116, - "4500000": 116, - "50000": 115, - "500000": 116, - "5000000": 116, - "50000000": 116, - "600000": 116, - "6000000": 116, - "60000000": 116, - "700000": 116, - "7000000": 116, - "800000": 116, - "8000000": 116, - "900000": 116, - "9000000": 116 - }, - "count": 116, - "sum": 469104.2889999999 - } - }, - "resource": "pods", - "scope": "resource", - "verb": "GET", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 116, - "1000": 29, - "10000": 116, - "100000": 116, - "1000000": 116, - "10000000": 116, - "100000000": 116, - "1000000000": 116 - }, - "count": 116, - "sum": 385613 - } - } + "code": "0", + "count": 14, + "subresource": "/readyz", + "verb": "GET" } }, "Index": "", @@ -21904,13 +21228,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 1 - } - }, "request": { - "resource": "statefulsets.apps" + "code": "200", + "component": "apiserver", + "count": 178, + "resource": "configmaps", + "scope": "resource", + "verb": "GET", + "version": "v1" } }, "Index": "", @@ -21929,13 +21254,57 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 9, - "group": "apps", - "resource": "statefulsets", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 54, + "100000": 54, + "1000000": 54, + "10000000": 54, + "1250000": 54, + "150000": 54, + "1500000": 54, + "15000000": 54, + "1750000": 54, + "200000": 54, + "2000000": 54, + "20000000": 54, + "250000": 54, + "2500000": 54, + "25000000": 54, + "300000": 54, + "3000000": 54, + "30000000": 54, + "350000": 54, + "3500000": 54, + "400000": 54, + "4000000": 54, + "40000000": 54, + "450000": 54, + "4500000": 54, + "50000": 54, + "500000": 54, + "5000000": 54, + "50000000": 54, + "600000": 54, + "6000000": 54, + "60000000": 54, + "700000": 54, + "7000000": 54, + "800000": 54, + "8000000": 54, + "900000": 54, + "9000000": 54 + }, + "count": 54, + "sum": 84032.587 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "clusterrolebindings", + "scope": "resource", + "verb": "POST", "version": "v1" } }, @@ -21998,33 +21367,112 @@ "900000": 1, "9000000": 1 }, - "count": 1, - "sum": 1386.749 + "count": 1, + "sum": 5679.247 + } + }, + "group": "apps", + "resource": "controllerrevisions", + "scope": "resource", + "verb": "DELETE", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 28, + "group": "batch", + "resource": "jobs", + "scope": "resource", + "subresource": "status", + "verb": "PUT", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 135, + "100000": 135, + "1000000": 135, + "10000000": 135, + "1250000": 135, + "150000": 135, + "1500000": 135, + "15000000": 135, + "1750000": 135, + "200000": 135, + "2000000": 135, + "20000000": 135, + "250000": 135, + "2500000": 135, + "25000000": 135, + "300000": 135, + "3000000": 135, + "30000000": 135, + "350000": 135, + "3500000": 135, + "400000": 135, + "4000000": 135, + "40000000": 135, + "450000": 135, + "4500000": 135, + "50000": 135, + "500000": 135, + "5000000": 135, + "50000000": 135, + "600000": 135, + "6000000": 135, + "60000000": 135, + "700000": 135, + "7000000": 135, + "800000": 135, + "8000000": 135, + "900000": 135, + "9000000": 135 + }, + "count": 135, + "sum": 293881.7489999998 } }, - "group": "apps", - "resource": "controllerrevisions", + "group": "authentication.k8s.io", + "resource": "tokenreviews", "scope": "resource", - "verb": "GET", + "verb": "POST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1000": 0, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 - }, - "count": 1, - "sum": 3262 - } - } } }, "Index": "", @@ -22047,7 +21495,7 @@ "duration": { "us": { "bucket": { - "+Inf": 3, + "+Inf": 6, "100000": 0, "1000000": 0, "10000000": 0, @@ -22086,16 +21534,16 @@ "900000": 0, "9000000": 0 }, - "count": 3, - "sum": 1155003339.1 + "count": 6, + "sum": 2591004700.7980003 } }, - "group": "coordination.k8s.io", + "group": "storage.k8s.io", "longrunning": { - "count": 1 + "count": 2 }, - "resource": "leases", - "scope": "namespace", + "resource": "csinodes", + "scope": "cluster", "verb": "WATCH", "version": "v1" }, @@ -22103,16 +21551,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 3, + "count": 6, "sum": 0 } } @@ -22134,29 +21582,58 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "version": "v1" - }, - "watch": { - "events": { - "kind": "PersistentVolume", - "size": { - "bytes": { - "bucket": { - "+Inf": 31, - "1024": 18, - "131072": 31, - "16384": 31, - "2048": 31, - "32768": 31, - "4096": 31, - "65536": 31, - "8192": 31 - }, - "count": 31, - "sum": 22753 - } + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 5292.259 } - } + }, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "resource", + "verb": "DELETE", + "version": "v1" } }, "Index": "", @@ -22179,70 +21656,72 @@ "duration": { "us": { "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 3, - "sum": 6648.844999999999 + "count": 6, + "sum": 2441004443.3759995 } }, - "group": "apps", - "resource": "deployments", + "longrunning": { + "count": 2 + }, + "resource": "serviceaccounts", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 3, - "1000": 0, - "10000": 1, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 }, - "count": 3, - "sum": 35850 + "count": 6, + "sum": 0 } } } @@ -22263,12 +21742,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "0", "component": "apiserver", - "count": 5, - "resource": "namespaces", - "scope": "resource", - "verb": "GET", + "count": 8, + "group": "admissionregistration.k8s.io", + "resource": "validatingwebhookconfigurations", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -22290,11 +21770,10 @@ "request": { "code": "200", "component": "apiserver", - "count": 90, - "group": "apps", - "resource": "replicasets", - "scope": "resource", - "verb": "GET", + "count": 2, + "resource": "configmaps", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -22313,13 +21792,31 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 4 - } - }, "request": { - "resource": "endpoints" + "group": "apiregistration.k8s.io", + "version": "v1" + }, + "watch": { + "events": { + "kind": "APIService", + "size": { + "bytes": { + "bucket": { + "+Inf": 53, + "1024": 53, + "131072": 53, + "16384": 53, + "2048": 53, + "32768": 53, + "4096": 53, + "65536": 53, + "8192": 53 + }, + "count": 53, + "sum": 22136 + } + } + } } }, "Index": "", @@ -22338,10 +21835,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "count": 2, - "subresource": "/healthz", - "verb": "GET" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 9, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 9, + "sum": 4046010432.816 + } + }, + "group": "apps", + "longrunning": { + "count": 4 + }, + "resource": "statefulsets", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 9, + "1000": 9, + "10000": 9, + "100000": 9, + "1000000": 9, + "10000000": 9, + "100000000": 9, + "1000000000": 9 + }, + "count": 9, + "sum": 0 + } + } } }, "Index": "", @@ -22364,69 +21930,73 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 3, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 }, - "count": 1, - "sum": 1708.7269999999999 + "count": 3, + "sum": 1309002203.2310002 } }, - "resource": "serviceaccounts", - "scope": "namespace", - "verb": "LIST", - "version": "v1" + "group": "policy", + "longrunning": { + "count": 1 + }, + "resource": "podsecuritypolicies", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 }, - "count": 1, - "sum": 97 + "count": 3, + "sum": 0 } } } @@ -22446,13 +22016,41 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } - }, "request": { - "resource": "daemonsets.apps" + "code": "0", + "component": "apiserver", + "count": 7, + "group": "storage.k8s.io", + "resource": "volumeattachments", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 5, + "group": "storage.k8s.io", + "resource": "csistoragecapacities", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" } }, "Index": "", @@ -22586,15 +22184,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "code": "0", - "component": "apiserver", - "count": 5, - "group": "storage.k8s.io", - "resource": "csistoragecapacities", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" + "resource": "daemonsets.apps" } }, "Index": "", @@ -22613,14 +22209,75 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 7, - "group": "storage.k8s.io", - "resource": "volumeattachments", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 1708.7269999999999 + } + }, + "resource": "serviceaccounts", + "scope": "namespace", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 97 + } + } } }, "Index": "", @@ -22639,79 +22296,34 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 3, - "sum": 1309002203.2310002 - } - }, - "group": "policy", - "longrunning": { - "count": 1 - }, - "resource": "podsecuritypolicies", - "scope": "cluster", - "verb": "WATCH", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 0 - } + "code": "200", + "count": 2, + "subresource": "/healthz", + "verb": "GET" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 4 } + }, + "request": { + "resource": "endpoints" } }, "Index": "", @@ -22730,79 +22342,39 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 9, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 9, - "sum": 4046010432.816 - } - }, - "group": "apps", - "longrunning": { - "count": 4 - }, - "resource": "statefulsets", - "scope": "cluster", - "verb": "WATCH", + "count": 90, + "group": "apps", + "resource": "replicasets", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "404", + "component": "apiserver", + "count": 5, + "resource": "namespaces", + "scope": "resource", + "verb": "GET", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 9, - "1000": 9, - "10000": 9, - "100000": 9, - "1000000": 9, - "10000000": 9, - "100000000": 9, - "1000000000": 9 - }, - "count": 9, - "sum": 0 - } - } } }, "Index": "", @@ -22821,27 +22393,26 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "apiregistration.k8s.io", "version": "v1" }, "watch": { "events": { - "kind": "APIService", + "kind": "PersistentVolume", "size": { "bytes": { "bucket": { - "+Inf": 53, - "1024": 53, - "131072": 53, - "16384": 53, - "2048": 53, - "32768": 53, - "4096": 53, - "65536": 53, - "8192": 53 + "+Inf": 31, + "1024": 18, + "131072": 31, + "16384": 31, + "2048": 31, + "32768": 31, + "4096": 31, + "65536": 31, + "8192": 31 }, - "count": 53, - "sum": 22136 + "count": 31, + "sum": 22753 } } } @@ -22863,28 +22434,74 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 + }, + "count": 3, + "sum": 6648.844999999999 + } + }, "group": "apps", + "resource": "deployments", + "scope": "cluster", + "verb": "LIST", "version": "v1" }, - "watch": { - "events": { - "kind": "DaemonSet", - "size": { - "bytes": { - "bucket": { - "+Inf": 52, - "1024": 23, - "131072": 52, - "16384": 52, - "2048": 23, - "32768": 52, - "4096": 37, - "65536": 52, - "8192": 52 - }, - "count": 52, - "sum": 165667 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 0, + "10000": 1, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 35850 } } } @@ -22949,17 +22566,17 @@ "9000000": 0 }, "count": 3, - "sum": 1173002223.382 + "sum": 1155003339.1 } }, - "group": "extensions", + "group": "coordination.k8s.io", "longrunning": { "count": 1 }, - "resource": "ingresses", - "scope": "cluster", + "resource": "leases", + "scope": "namespace", "verb": "WATCH", - "version": "v1beta1" + "version": "v1" }, "response": { "size": { @@ -22974,95 +22591,8 @@ "100000000": 3, "1000000000": 3 }, - "count": 3, - "sum": 0 - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 470, - "100000": 462, - "1000000": 469, - "10000000": 470, - "1250000": 470, - "150000": 463, - "1500000": 470, - "15000000": 470, - "1750000": 470, - "200000": 463, - "2000000": 470, - "20000000": 470, - "250000": 463, - "2500000": 470, - "25000000": 470, - "300000": 463, - "3000000": 470, - "30000000": 470, - "350000": 463, - "3500000": 470, - "400000": 463, - "4000000": 470, - "40000000": 470, - "450000": 463, - "4500000": 470, - "50000": 462, - "500000": 463, - "5000000": 470, - "50000000": 470, - "600000": 466, - "6000000": 470, - "60000000": 470, - "700000": 466, - "7000000": 470, - "800000": 468, - "8000000": 470, - "900000": 468, - "9000000": 470 - }, - "count": 470, - "sum": 10186391.616000004 - } - }, - "resource": "nodes", - "scope": "cluster", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 470, - "1000": 2, - "10000": 35, - "100000": 470, - "1000000": 470, - "10000000": 470, - "100000000": 470, - "1000000000": 470 - }, - "count": 470, - "sum": 6116278 + "count": 3, + "sum": 0 } } } @@ -23127,11 +22657,11 @@ "9000000": 1 }, "count": 1, - "sum": 1171.6280000000002 + "sum": 1386.749 } }, "group": "apps", - "resource": "statefulsets", + "resource": "controllerrevisions", "scope": "resource", "verb": "GET", "version": "v1" @@ -23141,7 +22671,7 @@ "bytes": { "bucket": { "+Inf": 1, - "1000": 1, + "1000": 0, "10000": 1, "100000": 1, "1000000": 1, @@ -23150,7 +22680,7 @@ "1000000000": 1 }, "count": 1, - "sum": 210 + "sum": 3262 } } } @@ -23171,14 +22701,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 46, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", - "scope": "resource", - "verb": "GET", - "version": "v1beta1" + "count": 9, + "group": "apps", + "resource": "statefulsets", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -23197,13 +22727,99 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 4, - "resource": "events", + "duration": { + "us": { + "bucket": { + "+Inf": 116, + "100000": 115, + "1000000": 116, + "10000000": 116, + "1250000": 116, + "150000": 116, + "1500000": 116, + "15000000": 116, + "1750000": 116, + "200000": 116, + "2000000": 116, + "20000000": 116, + "250000": 116, + "2500000": 116, + "25000000": 116, + "300000": 116, + "3000000": 116, + "30000000": 116, + "350000": 116, + "3500000": 116, + "400000": 116, + "4000000": 116, + "40000000": 116, + "450000": 116, + "4500000": 116, + "50000": 115, + "500000": 116, + "5000000": 116, + "50000000": 116, + "600000": 116, + "6000000": 116, + "60000000": 116, + "700000": 116, + "7000000": 116, + "800000": 116, + "8000000": 116, + "900000": 116, + "9000000": 116 + }, + "count": 116, + "sum": 469104.2889999999 + } + }, + "resource": "pods", "scope": "resource", - "verb": "PATCH", + "verb": "GET", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 116, + "1000": 29, + "10000": 116, + "100000": 116, + "1000000": 116, + "10000000": 116, + "100000000": 116, + "1000000000": 116 + }, + "count": 116, + "sum": 385613 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 1 + } + }, + "request": { + "resource": "statefulsets.apps" } }, "Index": "", @@ -23222,79 +22838,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 5, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 5, - "sum": 2201003244.6959996 - } - }, - "group": "networking.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "ingressclasses", - "scope": "cluster", - "verb": "WATCH", + "count": 1, + "resource": "configmaps", + "scope": "resource", + "verb": "PUT", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 5, - "1000": 5, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 - }, - "count": 5, - "sum": 0 - } - } } }, "Index": "", @@ -23313,13 +22863,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 15, - "group": "storage.k8s.io", - "resource": "csidrivers", - "scope": "cluster", - "verb": "WATCH", + "count": 1, + "resource": "persistentvolumeclaims", + "scope": "resource", + "subresource": "status", + "verb": "PUT", "version": "v1" } }, @@ -23341,10 +22891,10 @@ "request": { "code": "201", "component": "apiserver", - "count": 3, - "group": "apps", - "resource": "replicasets", + "count": 38, + "resource": "pods", "scope": "resource", + "subresource": "binding", "verb": "POST", "version": "v1" } @@ -23460,14 +23010,131 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "201", + "component": "apiserver", + "count": 3, + "group": "apps", + "resource": "replicasets", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 15, + "group": "storage.k8s.io", + "resource": "csidrivers", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "component": "apiserver", - "count": 38, - "resource": "pods", - "scope": "resource", - "subresource": "binding", - "verb": "POST", + "duration": { + "us": { + "bucket": { + "+Inf": 5, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 5, + "sum": 2201003244.6959996 + } + }, + "group": "networking.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "ingressclasses", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 5, + "1000": 5, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 + }, + "count": 5, + "sum": 0 + } + } } }, "Index": "", @@ -23488,12 +23155,12 @@ "request": { "code": "200", "component": "apiserver", - "count": 1, - "resource": "persistentvolumeclaims", + "count": 46, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", "scope": "resource", - "subresource": "status", - "verb": "PUT", - "version": "v1" + "verb": "GET", + "version": "v1beta1" } }, "Index": "", @@ -23512,13 +23179,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "404", "component": "apiserver", - "count": 2, - "group": "rbac.authorization.k8s.io", - "resource": "roles", - "scope": "cluster", - "verb": "LIST", + "count": 4, + "resource": "events", + "scope": "resource", + "verb": "PATCH", "version": "v1" } }, @@ -23537,13 +23203,76 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 1 - } - }, "request": { - "resource": "cronjobs.batch" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 470, + "100000": 462, + "1000000": 469, + "10000000": 470, + "1250000": 470, + "150000": 463, + "1500000": 470, + "15000000": 470, + "1750000": 470, + "200000": 463, + "2000000": 470, + "20000000": 470, + "250000": 463, + "2500000": 470, + "25000000": 470, + "300000": 463, + "3000000": 470, + "30000000": 470, + "350000": 463, + "3500000": 470, + "400000": 463, + "4000000": 470, + "40000000": 470, + "450000": 463, + "4500000": 470, + "50000": 462, + "500000": 463, + "5000000": 470, + "50000000": 470, + "600000": 466, + "6000000": 470, + "60000000": 470, + "700000": 466, + "7000000": 470, + "800000": 468, + "8000000": 470, + "900000": 468, + "9000000": 470 + }, + "count": 470, + "sum": 10186391.616000004 + } + }, + "resource": "nodes", + "scope": "cluster", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 470, + "1000": 2, + "10000": 35, + "100000": 470, + "1000000": 470, + "10000000": 470, + "100000000": 470, + "1000000000": 470 + }, + "count": 470, + "sum": 6116278 + } + } } }, "Index": "", @@ -23606,13 +23335,13 @@ "9000000": 1 }, "count": 1, - "sum": 222.078 + "sum": 1171.6280000000002 } }, "group": "apps", - "resource": "controllerrevisions", - "scope": "cluster", - "verb": "LIST", + "resource": "statefulsets", + "scope": "resource", + "verb": "GET", "version": "v1" }, "response": { @@ -23629,7 +23358,7 @@ "1000000000": 1 }, "count": 1, - "sum": 54 + "sum": 210 } } } @@ -23650,37 +23379,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 6, - "resource": "serviceaccounts", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 3 - } + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 3, + "sum": 1173002223.382 + } + }, + "group": "extensions", + "longrunning": { + "count": 1 + }, + "resource": "ingresses", + "scope": "cluster", + "verb": "WATCH", + "version": "v1beta1" }, - "request": { - "resource": "deployments.apps" + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 0 + } + } } }, "Index": "", @@ -23699,27 +23470,27 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "batch", + "group": "apps", "version": "v1" }, "watch": { "events": { - "kind": "CronJob", + "kind": "DaemonSet", "size": { "bytes": { "bucket": { - "+Inf": 74, - "1024": 35, - "131072": 74, - "16384": 74, - "2048": 39, - "32768": 74, - "4096": 63, - "65536": 74, - "8192": 74 + "+Inf": 52, + "1024": 23, + "131072": 52, + "16384": 52, + "2048": 23, + "32768": 52, + "4096": 37, + "65536": 52, + "8192": 52 }, - "count": 74, - "sum": 142786 + "count": 52, + "sum": 165667 } } } @@ -23743,8 +23514,8 @@ "request": { "code": "200", "component": "apiserver", - "count": 1, - "resource": "persistentvolumes", + "count": 75, + "resource": "serviceaccounts", "scope": "resource", "verb": "GET", "version": "v1" @@ -23766,65 +23537,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 448, - "resource": "nodes", - "scope": "resource", - "verb": "GET", + "duration": { + "us": { + "bucket": { + "+Inf": 13, + "100000": 0, + "1000000": 0, + "10000000": 1, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 1, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 1, + "250000": 0, + "2500000": 0, + "25000000": 1, + "300000": 0, + "3000000": 1, + "30000000": 1, + "350000": 0, + "3500000": 1, + "400000": 0, + "4000000": 1, + "40000000": 1, + "450000": 0, + "4500000": 1, + "50000": 0, + "500000": 0, + "5000000": 1, + "50000000": 1, + "600000": 0, + "6000000": 1, + "60000000": 1, + "700000": 0, + "7000000": 1, + "800000": 0, + "8000000": 1, + "900000": 0, + "9000000": 1 + }, + "count": 13, + "sum": 5649540567.557001 + } + }, + "group": "node.k8s.io", + "longrunning": { + "count": 5 + }, + "resource": "runtimeclasses", + "scope": "cluster", + "verb": "WATCH", "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 14 - } }, - "request": { - "code": "500", - "host": "[::1]:6443", - "method": "GET" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", - "component": "apiserver", - "count": 2, - "group": "rbac.authorization.k8s.io", - "resource": "roles", - "scope": "namespace", - "verb": "LIST", - "version": "v1" + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 13, + "1000": 13, + "10000": 13, + "100000": 13, + "1000000": 13, + "10000000": 13, + "100000000": 13, + "1000000000": 13 + }, + "count": 13, + "sum": 0 + } + } } }, "Index": "", @@ -23843,14 +23628,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "group": "apiextensions.k8s.io", - "resource": "customresourcedefinitions", + "duration": { + "us": { + "bucket": { + "+Inf": 13, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 13, + "sum": 5965009865.233 + } + }, + "group": "storage.k8s.io", + "longrunning": { + "count": 5 + }, + "resource": "storageclasses", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 13, + "1000": 13, + "10000": 13, + "100000": 13, + "1000000": 13, + "10000000": 13, + "100000000": 13, + "1000000000": 13 + }, + "count": 13, + "sum": 0 + } + } } }, "Index": "", @@ -23869,75 +23719,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 48, - "100000": 47, - "1000000": 48, - "10000000": 48, - "1250000": 48, - "150000": 47, - "1500000": 48, - "15000000": 48, - "1750000": 48, - "200000": 47, - "2000000": 48, - "20000000": 48, - "250000": 48, - "2500000": 48, - "25000000": 48, - "300000": 48, - "3000000": 48, - "30000000": 48, - "350000": 48, - "3500000": 48, - "400000": 48, - "4000000": 48, - "40000000": 48, - "450000": 48, - "4500000": 48, - "50000": 47, - "500000": 48, - "5000000": 48, - "50000000": 48, - "600000": 48, - "6000000": 48, - "60000000": 48, - "700000": 48, - "7000000": 48, - "800000": 48, - "8000000": 48, - "900000": 48, - "9000000": 48 - }, - "count": 48, - "sum": 341344.43299999996 - } - }, - "resource": "pods", - "scope": "cluster", - "verb": "LIST", + "count": 1, + "resource": "persistentvolumeclaims", + "scope": "resource", + "verb": "PUT", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 48, - "1000": 2, - "10000": 4, - "100000": 48, - "1000000": 48, - "10000000": 48, - "100000000": 48, - "1000000000": 48 - }, - "count": 48, - "sum": 2583812 - } - } } }, "Index": "", @@ -23956,13 +23744,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 6, - "resource": "persistentvolumes", - "scope": "cluster", - "verb": "LIST", + "group": "apiextensions.k8s.io", "version": "v1" + }, + "watch": { + "events": { + "kind": "CustomResourceDefinition", + "size": { + "bytes": { + "bucket": { + "+Inf": 20, + "1024": 20, + "131072": 20, + "16384": 20, + "2048": 20, + "32768": 20, + "4096": 20, + "65536": 20, + "8192": 20 + }, + "count": 20, + "sum": 1836 + } + } + } } }, "Index": "", @@ -23981,13 +23786,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 104, - "resource": "nodes", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" + "count": 46, + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", + "scope": "resource", + "verb": "GET", + "version": "v1beta1" } }, "Index": "", @@ -24094,80 +23900,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 46, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", - "scope": "resource", - "verb": "GET", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "group": "apiextensions.k8s.io", - "version": "v1" - }, - "watch": { - "events": { - "kind": "CustomResourceDefinition", - "size": { - "bytes": { - "bucket": { - "+Inf": 20, - "1024": 20, - "131072": 20, - "16384": 20, - "2048": 20, - "32768": 20, - "4096": 20, - "65536": 20, - "8192": 20 - }, - "count": 20, - "sum": 1836 - } - } - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 1, - "resource": "persistentvolumeclaims", - "scope": "resource", - "verb": "PUT", + "count": 104, + "resource": "nodes", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -24185,81 +23923,15 @@ { "RootFields": {}, "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 13, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 13, - "sum": 5965009865.233 - } - }, - "group": "storage.k8s.io", - "longrunning": { - "count": 5 - }, - "resource": "storageclasses", + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 6, + "resource": "persistentvolumes", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 13, - "1000": 13, - "10000": 13, - "100000": 13, - "1000000": 13, - "10000000": 13, - "100000000": 13, - "1000000000": 13 - }, - "count": 13, - "sum": 0 - } - } } }, "Index": "", @@ -24280,10 +23952,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 75, - "resource": "serviceaccounts", - "scope": "resource", - "verb": "GET", + "count": 2, + "group": "apiextensions.k8s.io", + "resource": "customresourcedefinitions", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -24307,73 +23980,69 @@ "duration": { "us": { "bucket": { - "+Inf": 13, - "100000": 0, - "1000000": 0, - "10000000": 1, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 1, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 1, - "250000": 0, - "2500000": 0, - "25000000": 1, - "300000": 0, - "3000000": 1, - "30000000": 1, - "350000": 0, - "3500000": 1, - "400000": 0, - "4000000": 1, - "40000000": 1, - "450000": 0, - "4500000": 1, - "50000": 0, - "500000": 0, - "5000000": 1, - "50000000": 1, - "600000": 0, - "6000000": 1, - "60000000": 1, - "700000": 0, - "7000000": 1, - "800000": 0, - "8000000": 1, - "900000": 0, - "9000000": 1 + "+Inf": 48, + "100000": 47, + "1000000": 48, + "10000000": 48, + "1250000": 48, + "150000": 47, + "1500000": 48, + "15000000": 48, + "1750000": 48, + "200000": 47, + "2000000": 48, + "20000000": 48, + "250000": 48, + "2500000": 48, + "25000000": 48, + "300000": 48, + "3000000": 48, + "30000000": 48, + "350000": 48, + "3500000": 48, + "400000": 48, + "4000000": 48, + "40000000": 48, + "450000": 48, + "4500000": 48, + "50000": 47, + "500000": 48, + "5000000": 48, + "50000000": 48, + "600000": 48, + "6000000": 48, + "60000000": 48, + "700000": 48, + "7000000": 48, + "800000": 48, + "8000000": 48, + "900000": 48, + "9000000": 48 }, - "count": 13, - "sum": 5649540567.557001 + "count": 48, + "sum": 341344.43299999996 } }, - "group": "node.k8s.io", - "longrunning": { - "count": 5 - }, - "resource": "runtimeclasses", + "resource": "pods", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 13, - "1000": 13, - "10000": 13, - "100000": 13, - "1000000": 13, - "10000000": 13, - "100000000": 13, - "1000000000": 13 + "+Inf": 48, + "1000": 2, + "10000": 4, + "100000": 48, + "1000000": 48, + "10000000": 48, + "100000000": 48, + "1000000000": 48 }, - "count": 13, - "sum": 0 + "count": 48, + "sum": 2583812 } } } @@ -24394,79 +24063,40 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 2, - "sum": 1065001554.3879999 - } - }, - "group": "autoscaling", - "longrunning": { - "count": 1 - }, - "resource": "horizontalpodautoscalers", - "scope": "cluster", - "verb": "WATCH", - "version": "v2beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 0 - } + "count": 2, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "namespace", + "verb": "LIST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 14 } + }, + "request": { + "code": "500", + "host": "[::1]:6443", + "method": "GET" } }, "Index": "", @@ -24485,13 +24115,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 6, - "group": "scheduling.k8s.io", - "resource": "priorityclasses", - "scope": "cluster", - "verb": "WATCH", + "count": 448, + "resource": "nodes", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -24511,78 +24140,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 80, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 80, - "sum": 36404069758.69201 - } - }, - "longrunning": { - "count": 41 - }, - "resource": "namespaces", - "scope": "cluster", - "verb": "WATCH", + "count": 1, + "resource": "persistentvolumes", + "scope": "resource", + "verb": "GET", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 80, - "1000": 80, - "10000": 80, - "100000": 80, - "1000000": 80, - "10000000": 80, - "100000000": 80, - "1000000000": 80 - }, - "count": 80, - "sum": 0 - } - } } }, "Index": "", @@ -24600,80 +24164,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "100000": 0, - "1000000": 0, - "10000000": 0, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 0, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 0, - "250000": 0, - "2500000": 0, - "25000000": 0, - "300000": 0, - "3000000": 0, - "30000000": 0, - "350000": 0, - "3500000": 0, - "400000": 0, - "4000000": 0, - "40000000": 0, - "450000": 0, - "4500000": 0, - "50000": 0, - "500000": 0, - "5000000": 0, - "50000000": 0, - "600000": 0, - "6000000": 0, - "60000000": 0, - "700000": 0, - "7000000": 0, - "800000": 0, - "8000000": 0, - "900000": 0, - "9000000": 0 - }, - "count": 6, - "sum": 2620003788.506 - } - }, - "group": "apiregistration.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "apiservices", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 6, - "1000": 6, - "10000": 6, - "100000": 6, - "1000000": 6, - "10000000": 6, - "100000000": 6, - "1000000000": 6 - }, - "count": 6, - "sum": 0 - } + "etcd": { + "object": { + "count": 1 } + }, + "request": { + "resource": "cronjobs.batch" } }, "Index": "", @@ -24696,54 +24193,72 @@ "duration": { "us": { "bucket": { - "+Inf": 37, - "100000": 37, - "1000000": 37, - "10000000": 37, - "1250000": 37, - "150000": 37, - "1500000": 37, - "15000000": 37, - "1750000": 37, - "200000": 37, - "2000000": 37, - "20000000": 37, - "250000": 37, - "2500000": 37, - "25000000": 37, - "300000": 37, - "3000000": 37, - "30000000": 37, - "350000": 37, - "3500000": 37, - "400000": 37, - "4000000": 37, - "40000000": 37, - "450000": 37, - "4500000": 37, - "50000": 37, - "500000": 37, - "5000000": 37, - "50000000": 37, - "600000": 37, - "6000000": 37, - "60000000": 37, - "700000": 37, - "7000000": 37, - "800000": 37, - "8000000": 37, - "900000": 37, - "9000000": 37 + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 }, - "count": 37, - "sum": 92443.478 + "count": 1, + "sum": 222.078 } }, - "group": "apiregistration.k8s.io", - "resource": "apiservices", - "scope": "resource", - "verb": "POST", + "group": "apps", + "resource": "controllerrevisions", + "scope": "cluster", + "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 54 + } + } } }, "Index": "", @@ -24765,8 +24280,7 @@ "code": "0", "component": "apiserver", "count": 6, - "group": "rbac.authorization.k8s.io", - "resource": "roles", + "resource": "serviceaccounts", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -24790,11 +24304,11 @@ "request": { "code": "200", "component": "apiserver", - "count": 2617, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "resource", - "verb": "GET", + "count": 2, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -24813,74 +24327,53 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 3 + } + }, "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "1250000": 3, - "150000": 3, - "1500000": 3, - "15000000": 3, - "1750000": 3, - "200000": 3, - "2000000": 3, - "20000000": 3, - "250000": 3, - "2500000": 3, - "25000000": 3, - "300000": 3, - "3000000": 3, - "30000000": 3, - "350000": 3, - "3500000": 3, - "400000": 3, - "4000000": 3, - "40000000": 3, - "450000": 3, - "4500000": 3, - "50000": 3, - "500000": 3, - "5000000": 3, - "50000000": 3, - "600000": 3, - "6000000": 3, - "60000000": 3, - "700000": 3, - "7000000": 3, - "800000": 3, - "8000000": 3, - "900000": 3, - "9000000": 3 - }, - "count": 3, - "sum": 919.3489999999999 - } - }, - "resource": "resourcequotas", - "scope": "cluster", - "verb": "LIST", + "resource": "deployments.apps" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "batch", "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 - }, - "count": 3, - "sum": 132 + "watch": { + "events": { + "kind": "CronJob", + "size": { + "bytes": { + "bucket": { + "+Inf": 74, + "1024": 35, + "131072": 74, + "16384": 74, + "2048": 39, + "32768": 74, + "4096": 63, + "65536": 74, + "8192": 74 + }, + "count": 74, + "sum": 142786 + } } } } @@ -24901,13 +24394,29 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", - "component": "apiserver", - "count": 12, - "resource": "persistentvolumeclaims", - "scope": "cluster", - "verb": "WATCH", "version": "v1" + }, + "watch": { + "events": { + "kind": "LimitRange", + "size": { + "bytes": { + "bucket": { + "+Inf": 27, + "1024": 27, + "131072": 27, + "16384": 27, + "2048": 27, + "32768": 27, + "4096": 27, + "65536": 27, + "8192": 27 + }, + "count": 27, + "sum": 1458 + } + } + } } }, "Index": "", @@ -24930,54 +24439,96 @@ "duration": { "us": { "bucket": { - "+Inf": 16, - "100000": 16, - "1000000": 16, - "10000000": 16, - "1250000": 16, - "150000": 16, - "1500000": 16, - "15000000": 16, - "1750000": 16, - "200000": 16, - "2000000": 16, - "20000000": 16, - "250000": 16, - "2500000": 16, - "25000000": 16, - "300000": 16, - "3000000": 16, - "30000000": 16, - "350000": 16, - "3500000": 16, - "400000": 16, - "4000000": 16, - "40000000": 16, - "450000": 16, - "4500000": 16, - "50000": 16, - "500000": 16, - "5000000": 16, - "50000000": 16, - "600000": 16, - "6000000": 16, - "60000000": 16, - "700000": 16, - "7000000": 16, - "800000": 16, - "8000000": 16, - "900000": 16, - "9000000": 16 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 16, - "sum": 78117.859 + "count": 2, + "sum": 3102.872 + } + }, + "resource": "persistentvolumes", + "scope": "resource", + "verb": "GET", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 1, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 1639 } - }, - "group": "apps", - "resource": "deployments", + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "404", + "component": "apiserver", + "count": 72, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", "scope": "resource", - "subresource": "status", - "verb": "PUT", + "verb": "GET", "version": "v1" } }, @@ -24996,15 +24547,13 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { + "etcd": { + "object": { + "count": 0 + } + }, "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "group": "discovery.k8s.io", - "resource": "endpointslices", - "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" + "resource": "mutatingwebhookconfigurations.admissionregistration.k8s.io" } }, "Index": "", @@ -25110,13 +24659,15 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "mutatingwebhookconfigurations.admissionregistration.k8s.io" + "code": "200", + "component": "apiserver", + "count": 3, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" } }, "Index": "", @@ -25135,55 +24686,59 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", "component": "apiserver", - "count": 72, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "duration": { + "us": { + "bucket": { + "+Inf": 16, + "100000": 16, + "1000000": 16, + "10000000": 16, + "1250000": 16, + "150000": 16, + "1500000": 16, + "15000000": 16, + "1750000": 16, + "200000": 16, + "2000000": 16, + "20000000": 16, + "250000": 16, + "2500000": 16, + "25000000": 16, + "300000": 16, + "3000000": 16, + "30000000": 16, + "350000": 16, + "3500000": 16, + "400000": 16, + "4000000": 16, + "40000000": 16, + "450000": 16, + "4500000": 16, + "50000": 16, + "500000": 16, + "5000000": 16, + "50000000": 16, + "600000": 16, + "6000000": 16, + "60000000": 16, + "700000": 16, + "7000000": 16, + "800000": 16, + "8000000": 16, + "900000": 16, + "9000000": 16 + }, + "count": 16, + "sum": 78117.859 + } + }, + "group": "apps", + "resource": "deployments", "scope": "resource", - "verb": "GET", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { + "subresource": "status", + "verb": "PUT", "version": "v1" - }, - "watch": { - "events": { - "kind": "LimitRange", - "size": { - "bytes": { - "bucket": { - "+Inf": 27, - "1024": 27, - "131072": 27, - "16384": 27, - "2048": 27, - "32768": 27, - "4096": 27, - "65536": 27, - "8192": 27 - }, - "count": 27, - "sum": 1458 - } - } - } } }, "Index": "", @@ -25206,69 +24761,69 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "1250000": 3, + "150000": 3, + "1500000": 3, + "15000000": 3, + "1750000": 3, + "200000": 3, + "2000000": 3, + "20000000": 3, + "250000": 3, + "2500000": 3, + "25000000": 3, + "300000": 3, + "3000000": 3, + "30000000": 3, + "350000": 3, + "3500000": 3, + "400000": 3, + "4000000": 3, + "40000000": 3, + "450000": 3, + "4500000": 3, + "50000": 3, + "500000": 3, + "5000000": 3, + "50000000": 3, + "600000": 3, + "6000000": 3, + "60000000": 3, + "700000": 3, + "7000000": 3, + "800000": 3, + "8000000": 3, + "900000": 3, + "9000000": 3 }, - "count": 2, - "sum": 3102.872 + "count": 3, + "sum": 919.3489999999999 } }, - "resource": "persistentvolumes", - "scope": "resource", - "verb": "GET", + "resource": "resourcequotas", + "scope": "cluster", + "verb": "LIST", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 2, - "1000": 1, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 }, - "count": 2, - "sum": 1639 + "count": 3, + "sum": 132 } } } @@ -25284,6 +24839,31 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 12, + "resource": "persistentvolumeclaims", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -25291,12 +24871,103 @@ "request": { "code": "200", "component": "apiserver", - "count": 1, - "group": "discovery.k8s.io", - "resource": "endpointslices", + "count": 2617, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 6, + "sum": 2620003788.506 + } + }, + "group": "apiregistration.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "apiservices", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 6, + "1000": 6, + "10000": 6, + "100000": 6, + "1000000": 6, + "10000000": 6, + "100000000": 6, + "1000000000": 6 + }, + "count": 6, + "sum": 0 + } + } } }, "Index": "", @@ -25319,7 +24990,7 @@ "duration": { "us": { "bucket": { - "+Inf": 3, + "+Inf": 80, "100000": 0, "1000000": 0, "10000000": 0, @@ -25358,15 +25029,14 @@ "900000": 0, "9000000": 0 }, - "count": 3, - "sum": 1277001273.351 + "count": 80, + "sum": 36404069758.69201 } }, - "group": "apps", "longrunning": { - "count": 1 + "count": 41 }, - "resource": "controllerrevisions", + "resource": "namespaces", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -25375,16 +25045,16 @@ "size": { "bytes": { "bucket": { - "+Inf": 3, - "1000": 3, - "10000": 3, - "100000": 3, - "1000000": 3, - "10000000": 3, - "100000000": 3, - "1000000000": 3 + "+Inf": 80, + "1000": 80, + "10000": 80, + "100000": 80, + "1000000": 80, + "10000000": 80, + "100000000": 80, + "1000000000": 80 }, - "count": 3, + "count": 80, "sum": 0 } } @@ -25401,6 +25071,32 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 6, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -25410,72 +25106,80 @@ "duration": { "us": { "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 + "+Inf": 37, + "100000": 37, + "1000000": 37, + "10000000": 37, + "1250000": 37, + "150000": 37, + "1500000": 37, + "15000000": 37, + "1750000": 37, + "200000": 37, + "2000000": 37, + "20000000": 37, + "250000": 37, + "2500000": 37, + "25000000": 37, + "300000": 37, + "3000000": 37, + "30000000": 37, + "350000": 37, + "3500000": 37, + "400000": 37, + "4000000": 37, + "40000000": 37, + "450000": 37, + "4500000": 37, + "50000": 37, + "500000": 37, + "5000000": 37, + "50000000": 37, + "600000": 37, + "6000000": 37, + "60000000": 37, + "700000": 37, + "7000000": 37, + "800000": 37, + "8000000": 37, + "900000": 37, + "9000000": 37 }, - "count": 2, - "sum": 1879.065 + "count": 37, + "sum": 92443.478 } }, - "group": "storage.k8s.io", - "resource": "csistoragecapacities", + "group": "apiregistration.k8s.io", + "resource": "apiservices", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 6, + "group": "scheduling.k8s.io", + "resource": "priorityclasses", "scope": "cluster", - "verb": "LIST", - "version": "v1beta1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 138 - } - } + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -25498,7 +25202,7 @@ "duration": { "us": { "bucket": { - "+Inf": 8, + "+Inf": 2, "100000": 0, "1000000": 0, "10000000": 0, @@ -25537,33 +25241,33 @@ "900000": 0, "9000000": 0 }, - "count": 8, - "sum": 3344005906.8700004 + "count": 2, + "sum": 1065001554.3879999 } }, - "group": "admissionregistration.k8s.io", + "group": "autoscaling", "longrunning": { - "count": 3 + "count": 1 }, - "resource": "validatingwebhookconfigurations", + "resource": "horizontalpodautoscalers", "scope": "cluster", "verb": "WATCH", - "version": "v1" + "version": "v2beta1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 8, - "1000": 8, - "10000": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "100000000": 8, - "1000000000": 8 + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 }, - "count": 8, + "count": 2, "sum": 0 } } @@ -25585,30 +25289,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "networking.k8s.io", + "code": "200", + "component": "apiserver", + "count": 4, + "group": "apps", + "resource": "replicasets", + "scope": "cluster", + "verb": "LIST", "version": "v1" - }, - "watch": { - "events": { - "kind": "NetworkPolicy", - "size": { - "bytes": { - "bucket": { - "+Inf": 16, - "1024": 16, - "131072": 16, - "16384": 16, - "2048": 16, - "32768": 16, - "4096": 16, - "65536": 16, - "8192": 16 - }, - "count": 16, - "sum": 1232 - } - } - } } }, "Index": "", @@ -25629,9 +25317,8 @@ "request": { "code": "200", "component": "apiserver", - "count": 4, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "count": 2, + "resource": "serviceaccounts", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -25653,12 +25340,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "404", + "code": "0", "component": "apiserver", - "count": 2, - "resource": "endpoints", - "scope": "resource", - "verb": "GET", + "count": 7, + "group": "apps", + "resource": "deployments", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -25678,14 +25366,126 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 1, - "group": "apps", - "resource": "controllerrevisions", + "count": 7, + "resource": "limitranges", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "code": "0", + "component": "apiserver", + "count": 3, + "resource": "podtemplates", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "1250000": 5, + "150000": 5, + "1500000": 5, + "15000000": 5, + "1750000": 5, + "200000": 5, + "2000000": 5, + "20000000": 5, + "250000": 5, + "2500000": 5, + "25000000": 5, + "300000": 5, + "3000000": 5, + "30000000": 5, + "350000": 5, + "3500000": 5, + "400000": 5, + "4000000": 5, + "40000000": 5, + "450000": 5, + "4500000": 5, + "50000": 5, + "500000": 5, + "5000000": 5, + "50000000": 5, + "600000": 5, + "6000000": 5, + "60000000": 5, + "700000": 5, + "7000000": 5, + "800000": 5, + "8000000": 5, + "900000": 5, + "9000000": 5 + }, + "count": 5, + "sum": 7218.701000000001 + } + }, + "group": "storage.k8s.io", + "resource": "storageclasses", "scope": "cluster", "verb": "LIST", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 5, + "1000": 4, + "10000": 5, + "100000": 5, + "1000000": 5, + "10000000": 5, + "100000000": 5, + "1000000000": 5 + }, + "count": 5, + "sum": 3009 + } + } } }, "Index": "", @@ -25703,13 +25503,77 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "etcd": { - "object": { - "count": 0 - } - }, "request": { - "resource": "ingressclasses.networking.k8s.io" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 + }, + "count": 2, + "sum": 2948.476 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "roles", + "scope": "namespace", + "verb": "LIST", + "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 226 + } + } } }, "Index": "", @@ -25728,76 +25592,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 4, - "100000": 4, - "1000000": 4, - "10000000": 4, - "1250000": 4, - "150000": 4, - "1500000": 4, - "15000000": 4, - "1750000": 4, - "200000": 4, - "2000000": 4, - "20000000": 4, - "250000": 4, - "2500000": 4, - "25000000": 4, - "300000": 4, - "3000000": 4, - "30000000": 4, - "350000": 4, - "3500000": 4, - "400000": 4, - "4000000": 4, - "40000000": 4, - "450000": 4, - "4500000": 4, - "50000": 4, - "500000": 4, - "5000000": 4, - "50000000": 4, - "600000": 4, - "6000000": 4, - "60000000": 4, - "700000": 4, - "7000000": 4, - "800000": 4, - "8000000": 4, - "900000": 4, - "9000000": 4 - }, - "count": 4, - "sum": 4491.235 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "clusterroles", + "count": 14, + "resource": "endpoints", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 4, - "1000": 3, - "10000": 3, - "100000": 4, - "1000000": 4, - "10000000": 4, - "100000000": 4, - "1000000000": 4 - }, - "count": 4, - "sum": 44225 - } - } } }, "Index": "", @@ -25919,114 +25720,25 @@ "Index": "", "ID": "", "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "0", - "component": "apiserver", - "count": 14, - "resource": "endpoints", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 2, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 2, - "250000": 2, - "2500000": 2, - "25000000": 2, - "300000": 2, - "3000000": 2, - "30000000": 2, - "350000": 2, - "3500000": 2, - "400000": 2, - "4000000": 2, - "40000000": 2, - "450000": 2, - "4500000": 2, - "50000": 2, - "500000": 2, - "5000000": 2, - "50000000": 2, - "600000": 2, - "6000000": 2, - "60000000": 2, - "700000": 2, - "7000000": 2, - "800000": 2, - "8000000": 2, - "900000": 2, - "9000000": 2 - }, - "count": 2, - "sum": 2948.476 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "roles", - "scope": "namespace", - "verb": "LIST", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2, - "1000": 2, - "10000": 2, - "100000": 2, - "1000000": 2, - "10000000": 2, - "100000000": 2, - "1000000000": 2 - }, - "count": 2, - "sum": 226 - } + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 0 } + }, + "request": { + "resource": "ingressclasses.networking.k8s.io" } }, "Index": "", @@ -26049,51 +25761,51 @@ "duration": { "us": { "bucket": { - "+Inf": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "1250000": 5, - "150000": 5, - "1500000": 5, - "15000000": 5, - "1750000": 5, - "200000": 5, - "2000000": 5, - "20000000": 5, - "250000": 5, - "2500000": 5, - "25000000": 5, - "300000": 5, - "3000000": 5, - "30000000": 5, - "350000": 5, - "3500000": 5, - "400000": 5, - "4000000": 5, - "40000000": 5, - "450000": 5, - "4500000": 5, - "50000": 5, - "500000": 5, - "5000000": 5, - "50000000": 5, - "600000": 5, - "6000000": 5, - "60000000": 5, - "700000": 5, - "7000000": 5, - "800000": 5, - "8000000": 5, - "900000": 5, - "9000000": 5 + "+Inf": 4, + "100000": 4, + "1000000": 4, + "10000000": 4, + "1250000": 4, + "150000": 4, + "1500000": 4, + "15000000": 4, + "1750000": 4, + "200000": 4, + "2000000": 4, + "20000000": 4, + "250000": 4, + "2500000": 4, + "25000000": 4, + "300000": 4, + "3000000": 4, + "30000000": 4, + "350000": 4, + "3500000": 4, + "400000": 4, + "4000000": 4, + "40000000": 4, + "450000": 4, + "4500000": 4, + "50000": 4, + "500000": 4, + "5000000": 4, + "50000000": 4, + "600000": 4, + "6000000": 4, + "60000000": 4, + "700000": 4, + "7000000": 4, + "800000": 4, + "8000000": 4, + "900000": 4, + "9000000": 4 }, - "count": 5, - "sum": 7218.701000000001 + "count": 4, + "sum": 4491.235 } }, - "group": "storage.k8s.io", - "resource": "storageclasses", + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", "scope": "cluster", "verb": "LIST", "version": "v1" @@ -26102,17 +25814,17 @@ "size": { "bytes": { "bucket": { - "+Inf": 5, - "1000": 4, - "10000": 5, - "100000": 5, - "1000000": 5, - "10000000": 5, - "100000000": 5, - "1000000000": 5 + "+Inf": 4, + "1000": 3, + "10000": 3, + "100000": 4, + "1000000": 4, + "10000000": 4, + "100000000": 4, + "1000000000": 4 }, - "count": 5, - "sum": 3009 + "count": 4, + "sum": 44225 } } } @@ -26133,12 +25845,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 7, - "resource": "limitranges", + "count": 4, + "group": "rbac.authorization.k8s.io", + "resource": "clusterroles", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" } }, @@ -26158,12 +25871,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 3, - "resource": "podtemplates", + "count": 1, + "group": "apps", + "resource": "controllerrevisions", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" } }, @@ -26183,13 +25897,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "404", "component": "apiserver", - "count": 7, - "group": "apps", - "resource": "deployments", - "scope": "cluster", - "verb": "WATCH", + "count": 2, + "resource": "endpoints", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -26209,14 +25922,121 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "group": "networking.k8s.io", + "version": "v1" + }, + "watch": { + "events": { + "kind": "NetworkPolicy", + "size": { + "bytes": { + "bucket": { + "+Inf": 16, + "1024": 16, + "131072": 16, + "16384": 16, + "2048": 16, + "32768": 16, + "4096": 16, + "65536": 16, + "8192": 16 + }, + "count": 16, + "sum": 1232 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "component": "apiserver", - "count": 4, + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 3, + "sum": 1277001273.351 + } + }, "group": "apps", - "resource": "replicasets", + "longrunning": { + "count": 1 + }, + "resource": "controllerrevisions", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1000": 3, + "10000": 3, + "100000": 3, + "1000000": 3, + "10000000": 3, + "100000000": 3, + "1000000000": 3 + }, + "count": 3, + "sum": 0 + } + } } }, "Index": "", @@ -26235,13 +26055,79 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 2, - "resource": "serviceaccounts", + "duration": { + "us": { + "bucket": { + "+Inf": 8, + "100000": 0, + "1000000": 0, + "10000000": 0, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 0, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 0, + "250000": 0, + "2500000": 0, + "25000000": 0, + "300000": 0, + "3000000": 0, + "30000000": 0, + "350000": 0, + "3500000": 0, + "400000": 0, + "4000000": 0, + "40000000": 0, + "450000": 0, + "4500000": 0, + "50000": 0, + "500000": 0, + "5000000": 0, + "50000000": 0, + "600000": 0, + "6000000": 0, + "60000000": 0, + "700000": 0, + "7000000": 0, + "800000": 0, + "8000000": 0, + "900000": 0, + "9000000": 0 + }, + "count": 8, + "sum": 3344005906.8700004 + } + }, + "group": "admissionregistration.k8s.io", + "longrunning": { + "count": 3 + }, + "resource": "validatingwebhookconfigurations", "scope": "cluster", - "verb": "LIST", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 8, + "1000": 8, + "10000": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "100000000": 8, + "1000000000": 8 + }, + "count": 8, + "sum": 0 + } + } } }, "Index": "", @@ -26264,53 +26150,72 @@ "duration": { "us": { "bucket": { - "+Inf": 31, - "100000": 31, - "1000000": 31, - "10000000": 31, - "1250000": 31, - "150000": 31, - "1500000": 31, - "15000000": 31, - "1750000": 31, - "200000": 31, - "2000000": 31, - "20000000": 31, - "250000": 31, - "2500000": 31, - "25000000": 31, - "300000": 31, - "3000000": 31, - "30000000": 31, - "350000": 31, - "3500000": 31, - "400000": 31, - "4000000": 31, - "40000000": 31, - "450000": 31, - "4500000": 31, - "50000": 31, - "500000": 31, - "5000000": 31, - "50000000": 31, - "600000": 31, - "6000000": 31, - "60000000": 31, - "700000": 31, - "7000000": 31, - "800000": 31, - "8000000": 31, - "900000": 31, - "9000000": 31 + "+Inf": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 2, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 2, + "250000": 2, + "2500000": 2, + "25000000": 2, + "300000": 2, + "3000000": 2, + "30000000": 2, + "350000": 2, + "3500000": 2, + "400000": 2, + "4000000": 2, + "40000000": 2, + "450000": 2, + "4500000": 2, + "50000": 2, + "500000": 2, + "5000000": 2, + "50000000": 2, + "600000": 2, + "6000000": 2, + "60000000": 2, + "700000": 2, + "7000000": 2, + "800000": 2, + "8000000": 2, + "900000": 2, + "9000000": 2 }, - "count": 31, - "sum": 134097.76899999997 + "count": 2, + "sum": 1879.065 } }, - "resource": "events", - "scope": "resource", - "verb": "PATCH", - "version": "v1" + "group": "storage.k8s.io", + "resource": "csistoragecapacities", + "scope": "cluster", + "verb": "LIST", + "version": "v1beta1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2, + "1000": 2, + "10000": 2, + "100000": 2, + "1000000": 2, + "10000000": 2, + "100000000": 2, + "1000000000": 2 + }, + "count": 2, + "sum": 138 + } + } } }, "Index": "", @@ -26329,12 +26234,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "200", "component": "apiserver", - "count": 4, - "resource": "endpoints", - "scope": "resource", - "verb": "POST", + "count": 1, + "group": "discovery.k8s.io", + "resource": "endpointslices", + "scope": "cluster", + "verb": "LIST", "version": "v1" } }, @@ -26354,14 +26260,78 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", "component": "apiserver", - "count": 214, - "group": "batch", - "resource": "jobs", - "scope": "resource", - "verb": "GET", + "duration": { + "us": { + "bucket": { + "+Inf": 62, + "100000": 0, + "1000000": 0, + "10000000": 1, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 1, + "1750000": 1, + "200000": 0, + "2000000": 1, + "20000000": 1, + "250000": 0, + "2500000": 1, + "25000000": 1, + "300000": 0, + "3000000": 1, + "30000000": 1, + "350000": 0, + "3500000": 1, + "400000": 0, + "4000000": 1, + "40000000": 1, + "450000": 0, + "4500000": 1, + "50000": 0, + "500000": 0, + "5000000": 1, + "50000000": 1, + "600000": 0, + "6000000": 1, + "60000000": 1, + "700000": 0, + "7000000": 1, + "800000": 0, + "8000000": 1, + "900000": 0, + "9000000": 1 + }, + "count": 62, + "sum": 27628720569.026997 + } + }, + "longrunning": { + "count": 30 + }, + "resource": "pods", + "scope": "cluster", + "verb": "WATCH", "version": "v1" + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 62, + "1000": 62, + "10000": 62, + "100000": 62, + "1000000": 62, + "10000000": 62, + "100000000": 62, + "1000000000": 62 + }, + "count": 62, + "sum": 0 + } + } } }, "Index": "", @@ -26380,14 +26350,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", + "code": "0", "component": "apiserver", - "count": 7, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "prioritylevelconfigurations", - "scope": "resource", - "verb": "POST", - "version": "v1beta1" + "count": 6, + "group": "apiextensions.k8s.io", + "resource": "customresourcedefinitions", + "scope": "cluster", + "verb": "WATCH", + "version": "v1" } }, "Index": "", @@ -26406,83 +26376,29 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 11, - "100000": 11, - "1000000": 11, - "10000000": 11, - "1250000": 11, - "150000": 11, - "1500000": 11, - "15000000": 11, - "1750000": 11, - "200000": 11, - "2000000": 11, - "20000000": 11, - "250000": 11, - "2500000": 11, - "25000000": 11, - "300000": 11, - "3000000": 11, - "30000000": 11, - "350000": 11, - "3500000": 11, - "400000": 11, - "4000000": 11, - "40000000": 11, - "450000": 11, - "4500000": 11, - "50000": 11, - "500000": 11, - "5000000": 11, - "50000000": 11, - "600000": 11, - "6000000": 11, - "60000000": 11, - "700000": 11, - "7000000": 11, - "800000": 11, - "8000000": 11, - "900000": 11, - "9000000": 11 - }, - "count": 11, - "sum": 25375.327000000005 + "version": "v1" + }, + "watch": { + "events": { + "kind": "Event", + "size": { + "bytes": { + "bucket": { + "+Inf": 68, + "1024": 0, + "131072": 68, + "16384": 68, + "2048": 68, + "32768": 68, + "4096": 68, + "65536": 68, + "8192": 68 + }, + "count": 68, + "sum": 75222 + } } - }, - "group": "flowcontrol.apiserver.k8s.io", - "resource": "flowschemas", - "scope": "resource", - "subresource": "status", - "verb": "PATCH", - "version": "v1beta1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "etcd": { - "object": { - "count": 2 } - }, - "request": { - "resource": "priorityclasses.scheduling.k8s.io" } }, "Index": "", @@ -26503,8 +26419,9 @@ "request": { "code": "0", "component": "apiserver", - "count": 80, - "resource": "namespaces", + "count": 7, + "group": "admissionregistration.k8s.io", + "resource": "mutatingwebhookconfigurations", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -26530,70 +26447,114 @@ "duration": { "us": { "bucket": { - "+Inf": 2626, - "100000": 2605, - "1000000": 2620, - "10000000": 2626, - "1250000": 2622, - "150000": 2610, - "1500000": 2626, - "15000000": 2626, - "1750000": 2626, - "200000": 2611, - "2000000": 2626, - "20000000": 2626, - "250000": 2612, - "2500000": 2626, - "25000000": 2626, - "300000": 2612, - "3000000": 2626, - "30000000": 2626, - "350000": 2612, - "3500000": 2626, - "400000": 2614, - "4000000": 2626, - "40000000": 2626, - "450000": 2614, - "4500000": 2626, - "50000": 2603, - "500000": 2616, - "5000000": 2626, - "50000000": 2626, - "600000": 2617, - "6000000": 2626, - "60000000": 2626, - "700000": 2619, - "7000000": 2626, - "800000": 2619, - "8000000": 2626, - "900000": 2620, - "9000000": 2626 + "+Inf": 34, + "100000": 0, + "1000000": 0, + "10000000": 1, + "1250000": 0, + "150000": 0, + "1500000": 0, + "15000000": 1, + "1750000": 0, + "200000": 0, + "2000000": 0, + "20000000": 1, + "250000": 0, + "2500000": 0, + "25000000": 1, + "300000": 0, + "3000000": 1, + "30000000": 1, + "350000": 0, + "3500000": 1, + "400000": 0, + "4000000": 1, + "40000000": 1, + "450000": 0, + "4500000": 1, + "50000": 0, + "500000": 0, + "5000000": 1, + "50000000": 1, + "600000": 0, + "6000000": 1, + "60000000": 1, + "700000": 0, + "7000000": 1, + "800000": 0, + "8000000": 1, + "900000": 0, + "9000000": 1 }, - "count": 2626, - "sum": 20702689.795999948 + "count": 34, + "sum": 14462572341.869 } }, - "group": "coordination.k8s.io", - "resource": "leases", - "scope": "resource", - "verb": "GET", + "longrunning": { + "count": 13 + }, + "resource": "services", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 2626, - "1000": 2626, - "10000": 2626, - "100000": 2626, - "1000000": 2626, - "10000000": 2626, - "100000000": 2626, - "1000000000": 2626 + "+Inf": 34, + "1000": 34, + "10000": 34, + "100000": 34, + "1000000": 34, + "10000000": 34, + "100000000": 34, + "1000000000": 34 }, - "count": 2626, - "sum": 1508318 + "count": 34, + "sum": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "group": "discovery.k8s.io", + "version": "v1beta1" + }, + "watch": { + "events": { + "kind": "EndpointSlice", + "size": { + "bytes": { + "bucket": { + "+Inf": 39, + "1024": 35, + "131072": 39, + "16384": 39, + "2048": 39, + "32768": 39, + "4096": 39, + "65536": 39, + "8192": 39 + }, + "count": 39, + "sum": 8380 + } } } } @@ -26609,6 +26570,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "etcd": { + "object": { + "count": 13 + } + }, + "request": { + "resource": "rolebindings.rbac.authorization.k8s.io" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -26634,6 +26619,76 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 22, + "100000": 22, + "1000000": 22, + "10000000": 22, + "1250000": 22, + "150000": 22, + "1500000": 22, + "15000000": 22, + "1750000": 22, + "200000": 22, + "2000000": 22, + "20000000": 22, + "250000": 22, + "2500000": 22, + "25000000": 22, + "300000": 22, + "3000000": 22, + "30000000": 22, + "350000": 22, + "3500000": 22, + "400000": 22, + "4000000": 22, + "40000000": 22, + "450000": 22, + "4500000": 22, + "50000": 22, + "500000": 22, + "5000000": 22, + "50000000": 22, + "600000": 22, + "6000000": 22, + "60000000": 22, + "700000": 22, + "7000000": 22, + "800000": 22, + "8000000": 22, + "900000": 22, + "9000000": 22 + }, + "count": 22, + "sum": 77986.433 + } + }, + "resource": "nodes", + "scope": "resource", + "subresource": "status", + "verb": "PATCH", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -26727,57 +26782,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "0", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 22, - "100000": 22, - "1000000": 22, - "10000000": 22, - "1250000": 22, - "150000": 22, - "1500000": 22, - "15000000": 22, - "1750000": 22, - "200000": 22, - "2000000": 22, - "20000000": 22, - "250000": 22, - "2500000": 22, - "25000000": 22, - "300000": 22, - "3000000": 22, - "30000000": 22, - "350000": 22, - "3500000": 22, - "400000": 22, - "4000000": 22, - "40000000": 22, - "450000": 22, - "4500000": 22, - "50000": 22, - "500000": 22, - "5000000": 22, - "50000000": 22, - "600000": 22, - "6000000": 22, - "60000000": 22, - "700000": 22, - "7000000": 22, - "800000": 22, - "8000000": 22, - "900000": 22, - "9000000": 22 - }, - "count": 22, - "sum": 77986.433 - } - }, - "resource": "nodes", - "scope": "resource", - "subresource": "status", - "verb": "PATCH", + "count": 80, + "resource": "namespaces", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -26797,28 +26807,74 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "discovery.k8s.io", - "version": "v1beta1" + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 2626, + "100000": 2605, + "1000000": 2620, + "10000000": 2626, + "1250000": 2622, + "150000": 2610, + "1500000": 2626, + "15000000": 2626, + "1750000": 2626, + "200000": 2611, + "2000000": 2626, + "20000000": 2626, + "250000": 2612, + "2500000": 2626, + "25000000": 2626, + "300000": 2612, + "3000000": 2626, + "30000000": 2626, + "350000": 2612, + "3500000": 2626, + "400000": 2614, + "4000000": 2626, + "40000000": 2626, + "450000": 2614, + "4500000": 2626, + "50000": 2603, + "500000": 2616, + "5000000": 2626, + "50000000": 2626, + "600000": 2617, + "6000000": 2626, + "60000000": 2626, + "700000": 2619, + "7000000": 2626, + "800000": 2619, + "8000000": 2626, + "900000": 2620, + "9000000": 2626 + }, + "count": 2626, + "sum": 20702689.795999948 + } + }, + "group": "coordination.k8s.io", + "resource": "leases", + "scope": "resource", + "verb": "GET", + "version": "v1" }, - "watch": { - "events": { - "kind": "EndpointSlice", - "size": { - "bytes": { - "bucket": { - "+Inf": 39, - "1024": 35, - "131072": 39, - "16384": 39, - "2048": 39, - "32768": 39, - "4096": 39, - "65536": 39, - "8192": 39 - }, - "count": 39, - "sum": 8380 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 2626, + "1000": 2626, + "10000": 2626, + "100000": 2626, + "1000000": 2626, + "10000000": 2626, + "100000000": 2626, + "1000000000": 2626 + }, + "count": 2626, + "sum": 1508318 } } } @@ -26840,11 +26896,11 @@ "MetricSetFields": { "etcd": { "object": { - "count": 13 + "count": 2 } }, "request": { - "resource": "rolebindings.rbac.authorization.k8s.io" + "resource": "priorityclasses.scheduling.k8s.io" } }, "Index": "", @@ -26867,74 +26923,55 @@ "duration": { "us": { "bucket": { - "+Inf": 34, - "100000": 0, - "1000000": 0, - "10000000": 1, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 1, - "1750000": 0, - "200000": 0, - "2000000": 0, - "20000000": 1, - "250000": 0, - "2500000": 0, - "25000000": 1, - "300000": 0, - "3000000": 1, - "30000000": 1, - "350000": 0, - "3500000": 1, - "400000": 0, - "4000000": 1, - "40000000": 1, - "450000": 0, - "4500000": 1, - "50000": 0, - "500000": 0, - "5000000": 1, - "50000000": 1, - "600000": 0, - "6000000": 1, - "60000000": 1, - "700000": 0, - "7000000": 1, - "800000": 0, - "8000000": 1, - "900000": 0, - "9000000": 1 + "+Inf": 11, + "100000": 11, + "1000000": 11, + "10000000": 11, + "1250000": 11, + "150000": 11, + "1500000": 11, + "15000000": 11, + "1750000": 11, + "200000": 11, + "2000000": 11, + "20000000": 11, + "250000": 11, + "2500000": 11, + "25000000": 11, + "300000": 11, + "3000000": 11, + "30000000": 11, + "350000": 11, + "3500000": 11, + "400000": 11, + "4000000": 11, + "40000000": 11, + "450000": 11, + "4500000": 11, + "50000": 11, + "500000": 11, + "5000000": 11, + "50000000": 11, + "600000": 11, + "6000000": 11, + "60000000": 11, + "700000": 11, + "7000000": 11, + "800000": 11, + "8000000": 11, + "900000": 11, + "9000000": 11 }, - "count": 34, - "sum": 14462572341.869 + "count": 11, + "sum": 25375.327000000005 } }, - "longrunning": { - "count": 13 - }, - "resource": "services", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 34, - "1000": 34, - "10000": 34, - "100000": 34, - "1000000": 34, - "10000000": 34, - "100000000": 34, - "1000000000": 34 - }, - "count": 34, - "sum": 0 - } - } + "group": "flowcontrol.apiserver.k8s.io", + "resource": "flowschemas", + "scope": "resource", + "subresource": "status", + "verb": "PATCH", + "version": "v1beta1" } }, "Index": "", @@ -26953,55 +26990,14 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "201", "component": "apiserver", "count": 7, - "group": "admissionregistration.k8s.io", - "resource": "mutatingwebhookconfigurations", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "version": "v1" - }, - "watch": { - "events": { - "kind": "Event", - "size": { - "bytes": { - "bucket": { - "+Inf": 68, - "1024": 0, - "131072": 68, - "16384": 68, - "2048": 68, - "32768": 68, - "4096": 68, - "65536": 68, - "8192": 68 - }, - "count": 68, - "sum": 75222 - } - } - } + "group": "flowcontrol.apiserver.k8s.io", + "resource": "prioritylevelconfigurations", + "scope": "resource", + "verb": "POST", + "version": "v1beta1" } }, "Index": "", @@ -27018,80 +27014,16 @@ { "RootFields": {}, "ModuleFields": null, - "MetricSetFields": { - "request": { - "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 62, - "100000": 0, - "1000000": 0, - "10000000": 1, - "1250000": 0, - "150000": 0, - "1500000": 0, - "15000000": 1, - "1750000": 1, - "200000": 0, - "2000000": 1, - "20000000": 1, - "250000": 0, - "2500000": 1, - "25000000": 1, - "300000": 0, - "3000000": 1, - "30000000": 1, - "350000": 0, - "3500000": 1, - "400000": 0, - "4000000": 1, - "40000000": 1, - "450000": 0, - "4500000": 1, - "50000": 0, - "500000": 0, - "5000000": 1, - "50000000": 1, - "600000": 0, - "6000000": 1, - "60000000": 1, - "700000": 0, - "7000000": 1, - "800000": 0, - "8000000": 1, - "900000": 0, - "9000000": 1 - }, - "count": 62, - "sum": 27628720569.026997 - } - }, - "longrunning": { - "count": 30 - }, - "resource": "pods", - "scope": "cluster", - "verb": "WATCH", - "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 62, - "1000": 62, - "10000": 62, - "100000": 62, - "1000000": 62, - "10000000": 62, - "100000000": 62, - "1000000000": 62 - }, - "count": 62, - "sum": 0 - } - } + "MetricSetFields": { + "request": { + "code": "200", + "component": "apiserver", + "count": 214, + "group": "batch", + "resource": "jobs", + "scope": "resource", + "verb": "GET", + "version": "v1" } }, "Index": "", @@ -27110,13 +27042,56 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", "component": "apiserver", - "count": 6, - "group": "apiextensions.k8s.io", - "resource": "customresourcedefinitions", - "scope": "cluster", - "verb": "WATCH", + "duration": { + "us": { + "bucket": { + "+Inf": 31, + "100000": 31, + "1000000": 31, + "10000000": 31, + "1250000": 31, + "150000": 31, + "1500000": 31, + "15000000": 31, + "1750000": 31, + "200000": 31, + "2000000": 31, + "20000000": 31, + "250000": 31, + "2500000": 31, + "25000000": 31, + "300000": 31, + "3000000": 31, + "30000000": 31, + "350000": 31, + "3500000": 31, + "400000": 31, + "4000000": 31, + "40000000": 31, + "450000": 31, + "4500000": 31, + "50000": 31, + "500000": 31, + "5000000": 31, + "50000000": 31, + "600000": 31, + "6000000": 31, + "60000000": 31, + "700000": 31, + "7000000": 31, + "800000": 31, + "8000000": 31, + "900000": 31, + "9000000": 31 + }, + "count": 31, + "sum": 134097.76899999997 + } + }, + "resource": "events", + "scope": "resource", + "verb": "PATCH", "version": "v1" } }, @@ -27136,55 +27111,10 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 15, - "100000": 15, - "1000000": 15, - "10000000": 15, - "1250000": 15, - "150000": 15, - "1500000": 15, - "15000000": 15, - "1750000": 15, - "200000": 15, - "2000000": 15, - "20000000": 15, - "250000": 15, - "2500000": 15, - "25000000": 15, - "300000": 15, - "3000000": 15, - "30000000": 15, - "350000": 15, - "3500000": 15, - "400000": 15, - "4000000": 15, - "40000000": 15, - "450000": 15, - "4500000": 15, - "50000": 15, - "500000": 15, - "5000000": 15, - "50000000": 15, - "600000": 15, - "6000000": 15, - "60000000": 15, - "700000": 15, - "7000000": 15, - "800000": 15, - "8000000": 15, - "900000": 15, - "9000000": 15 - }, - "count": 15, - "sum": 24698.454 - } - }, - "group": "rbac.authorization.k8s.io", - "resource": "roles", + "count": 4, + "resource": "endpoints", "scope": "resource", "verb": "POST", "version": "v1" @@ -27206,13 +27136,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "409", "component": "apiserver", - "count": 2, - "group": "apps", - "resource": "daemonsets", + "count": 4, + "resource": "pods", "scope": "resource", - "verb": "GET", + "verb": "POST", "version": "v1" } }, @@ -27234,8 +27163,9 @@ "request": { "code": "0", "component": "apiserver", - "count": 15, - "resource": "persistentvolumes", + "count": 6, + "group": "apiregistration.k8s.io", + "resource": "apiservices", "scope": "cluster", "verb": "WATCH", "version": "v1" @@ -27257,73 +27187,53 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "201", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 13, - "100000": 13, - "1000000": 13, - "10000000": 13, - "1250000": 13, - "150000": 13, - "1500000": 13, - "15000000": 13, - "1750000": 13, - "200000": 13, - "2000000": 13, - "20000000": 13, - "250000": 13, - "2500000": 13, - "25000000": 13, - "300000": 13, - "3000000": 13, - "30000000": 13, - "350000": 13, - "3500000": 13, - "400000": 13, - "4000000": 13, - "40000000": 13, - "450000": 13, - "4500000": 13, - "50000": 13, - "500000": 13, - "5000000": 13, - "50000000": 13, - "600000": 13, - "6000000": 13, - "60000000": 13, - "700000": 13, - "7000000": 13, - "800000": 13, - "8000000": 13, - "900000": 13, - "9000000": 13 - }, - "count": 13, - "sum": 52356.55500000001 - } - }, - "resource": "configmaps", - "scope": "namespace", - "verb": "LIST", + "count": 3, + "group": "apps", + "resource": "deployments", + "scope": "resource", + "verb": "POST", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { "version": "v1" }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 13, - "1000": 4, - "10000": 13, - "100000": 13, - "1000000": 13, - "10000000": 13, - "100000000": 13, - "1000000000": 13 - }, - "count": 13, - "sum": 16435 + "watch": { + "events": { + "kind": "ConfigMap", + "size": { + "bytes": { + "bucket": { + "+Inf": 104, + "1024": 92, + "131072": 104, + "16384": 104, + "2048": 102, + "32768": 104, + "4096": 104, + "65536": 104, + "8192": 104 + }, + "count": 104, + "sum": 23673 + } } } } @@ -27344,13 +27254,30 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", - "component": "apiserver", - "count": 3, - "resource": "resourcequotas", - "scope": "cluster", - "verb": "LIST", + "group": "apps", "version": "v1" + }, + "watch": { + "events": { + "kind": "ReplicaSet", + "size": { + "bytes": { + "bucket": { + "+Inf": 64, + "1024": 37, + "131072": 64, + "16384": 64, + "2048": 37, + "32768": 64, + "4096": 64, + "65536": 64, + "8192": 64 + }, + "count": 64, + "sum": 90936 + } + } + } } }, "Index": "", @@ -27369,13 +27296,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "200", + "code": "0", "component": "apiserver", - "count": 1, - "group": "apps", - "resource": "controllerrevisions", - "scope": "resource", - "verb": "DELETE", + "count": 4, + "group": "batch", + "resource": "cronjobs", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, @@ -27399,69 +27326,73 @@ "duration": { "us": { "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "1250000": 1, - "150000": 1, - "1500000": 1, - "15000000": 1, - "1750000": 1, - "200000": 1, - "2000000": 1, - "20000000": 1, - "250000": 1, - "2500000": 1, - "25000000": 1, - "300000": 1, - "3000000": 1, - "30000000": 1, - "350000": 1, - "3500000": 1, - "400000": 1, - "4000000": 1, - "40000000": 1, - "450000": 1, - "4500000": 1, - "50000": 1, - "500000": 1, - "5000000": 1, - "50000000": 1, - "600000": 1, - "6000000": 1, - "60000000": 1, - "700000": 1, - "7000000": 1, - "800000": 1, - "8000000": 1, - "900000": 1, - "9000000": 1 + "+Inf": 8, + "100000": 2, + "1000000": 2, + "10000000": 3, + "1250000": 2, + "150000": 2, + "1500000": 2, + "15000000": 3, + "1750000": 2, + "200000": 2, + "2000000": 2, + "20000000": 3, + "250000": 2, + "2500000": 2, + "25000000": 3, + "300000": 2, + "3000000": 3, + "30000000": 3, + "350000": 2, + "3500000": 3, + "400000": 2, + "4000000": 3, + "40000000": 3, + "450000": 2, + "4500000": 3, + "50000": 2, + "500000": 2, + "5000000": 3, + "50000000": 3, + "600000": 2, + "6000000": 3, + "60000000": 3, + "700000": 2, + "7000000": 3, + "800000": 2, + "8000000": 3, + "900000": 2, + "9000000": 3 }, - "count": 1, - "sum": 1118.0890000000002 + "count": 8, + "sum": 2145525049.725 } }, - "resource": "secrets", - "scope": "resource", - "verb": "GET", + "group": "certificates.k8s.io", + "longrunning": { + "count": 2 + }, + "resource": "certificatesigningrequests", + "scope": "cluster", + "verb": "WATCH", "version": "v1" }, "response": { "size": { "bytes": { "bucket": { - "+Inf": 1, - "1000": 1, - "10000": 1, - "100000": 1, - "1000000": 1, - "10000000": 1, - "100000000": 1, - "1000000000": 1 + "+Inf": 8, + "1000": 8, + "10000": 8, + "100000": 8, + "1000000": 8, + "10000000": 8, + "100000000": 8, + "1000000000": 8 }, - "count": 1, - "sum": 218 + "count": 8, + "sum": 0 } } } @@ -27477,31 +27408,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "request": { - "code": "404", - "component": "apiserver", - "count": 1, - "resource": "persistentvolumes", - "scope": "resource", - "verb": "GET", - "version": "v1" - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -27686,28 +27592,98 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "group": "apps", + "code": "404", + "component": "apiserver", + "count": 1, + "resource": "persistentvolumes", + "scope": "resource", + "verb": "GET", + "version": "v1" + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "1250000": 1, + "150000": 1, + "1500000": 1, + "15000000": 1, + "1750000": 1, + "200000": 1, + "2000000": 1, + "20000000": 1, + "250000": 1, + "2500000": 1, + "25000000": 1, + "300000": 1, + "3000000": 1, + "30000000": 1, + "350000": 1, + "3500000": 1, + "400000": 1, + "4000000": 1, + "40000000": 1, + "450000": 1, + "4500000": 1, + "50000": 1, + "500000": 1, + "5000000": 1, + "50000000": 1, + "600000": 1, + "6000000": 1, + "60000000": 1, + "700000": 1, + "7000000": 1, + "800000": 1, + "8000000": 1, + "900000": 1, + "9000000": 1 + }, + "count": 1, + "sum": 1118.0890000000002 + } + }, + "resource": "secrets", + "scope": "resource", + "verb": "GET", "version": "v1" }, - "watch": { - "events": { - "kind": "ReplicaSet", - "size": { - "bytes": { - "bucket": { - "+Inf": 64, - "1024": 37, - "131072": 64, - "16384": 64, - "2048": 37, - "32768": 64, - "4096": 64, - "65536": 64, - "8192": 64 - }, - "count": 64, - "sum": 90936 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1000": 1, + "10000": 1, + "100000": 1, + "1000000": 1, + "10000000": 1, + "100000000": 1, + "1000000000": 1 + }, + "count": 1, + "sum": 218 } } } @@ -27728,13 +27704,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 4, - "group": "batch", - "resource": "cronjobs", - "scope": "cluster", - "verb": "WATCH", + "count": 1, + "group": "apps", + "resource": "controllerrevisions", + "scope": "resource", + "verb": "DELETE", "version": "v1" } }, @@ -27754,79 +27730,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "code": "200", "component": "apiserver", - "duration": { - "us": { - "bucket": { - "+Inf": 8, - "100000": 2, - "1000000": 2, - "10000000": 3, - "1250000": 2, - "150000": 2, - "1500000": 2, - "15000000": 3, - "1750000": 2, - "200000": 2, - "2000000": 2, - "20000000": 3, - "250000": 2, - "2500000": 2, - "25000000": 3, - "300000": 2, - "3000000": 3, - "30000000": 3, - "350000": 2, - "3500000": 3, - "400000": 2, - "4000000": 3, - "40000000": 3, - "450000": 2, - "4500000": 3, - "50000": 2, - "500000": 2, - "5000000": 3, - "50000000": 3, - "600000": 2, - "6000000": 3, - "60000000": 3, - "700000": 2, - "7000000": 3, - "800000": 2, - "8000000": 3, - "900000": 2, - "9000000": 3 - }, - "count": 8, - "sum": 2145525049.725 - } - }, - "group": "certificates.k8s.io", - "longrunning": { - "count": 2 - }, - "resource": "certificatesigningrequests", + "count": 3, + "resource": "resourcequotas", "scope": "cluster", - "verb": "WATCH", + "verb": "LIST", "version": "v1" - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 8, - "1000": 8, - "10000": 8, - "100000": 8, - "1000000": 8, - "10000000": 8, - "100000000": 8, - "1000000000": 8 - }, - "count": 8, - "sum": 0 - } - } } }, "Index": "", @@ -27845,27 +27755,73 @@ "ModuleFields": null, "MetricSetFields": { "request": { + "component": "apiserver", + "duration": { + "us": { + "bucket": { + "+Inf": 13, + "100000": 13, + "1000000": 13, + "10000000": 13, + "1250000": 13, + "150000": 13, + "1500000": 13, + "15000000": 13, + "1750000": 13, + "200000": 13, + "2000000": 13, + "20000000": 13, + "250000": 13, + "2500000": 13, + "25000000": 13, + "300000": 13, + "3000000": 13, + "30000000": 13, + "350000": 13, + "3500000": 13, + "400000": 13, + "4000000": 13, + "40000000": 13, + "450000": 13, + "4500000": 13, + "50000": 13, + "500000": 13, + "5000000": 13, + "50000000": 13, + "600000": 13, + "6000000": 13, + "60000000": 13, + "700000": 13, + "7000000": 13, + "800000": 13, + "8000000": 13, + "900000": 13, + "9000000": 13 + }, + "count": 13, + "sum": 52356.55500000001 + } + }, + "resource": "configmaps", + "scope": "namespace", + "verb": "LIST", "version": "v1" }, - "watch": { - "events": { - "kind": "ConfigMap", - "size": { - "bytes": { - "bucket": { - "+Inf": 104, - "1024": 92, - "131072": 104, - "16384": 104, - "2048": 102, - "32768": 104, - "4096": 104, - "65536": 104, - "8192": 104 - }, - "count": 104, - "sum": 23673 - } + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 13, + "1000": 4, + "10000": 13, + "100000": 13, + "1000000": 13, + "10000000": 13, + "100000000": 13, + "1000000000": 13 + }, + "count": 13, + "sum": 16435 } } } @@ -27886,11 +27842,55 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "201", "component": "apiserver", - "count": 3, - "group": "apps", - "resource": "deployments", + "duration": { + "us": { + "bucket": { + "+Inf": 15, + "100000": 15, + "1000000": 15, + "10000000": 15, + "1250000": 15, + "150000": 15, + "1500000": 15, + "15000000": 15, + "1750000": 15, + "200000": 15, + "2000000": 15, + "20000000": 15, + "250000": 15, + "2500000": 15, + "25000000": 15, + "300000": 15, + "3000000": 15, + "30000000": 15, + "350000": 15, + "3500000": 15, + "400000": 15, + "4000000": 15, + "40000000": 15, + "450000": 15, + "4500000": 15, + "50000": 15, + "500000": 15, + "5000000": 15, + "50000000": 15, + "600000": 15, + "6000000": 15, + "60000000": 15, + "700000": 15, + "7000000": 15, + "800000": 15, + "8000000": 15, + "900000": 15, + "9000000": 15 + }, + "count": 15, + "sum": 24698.454 + } + }, + "group": "rbac.authorization.k8s.io", + "resource": "roles", "scope": "resource", "verb": "POST", "version": "v1" @@ -27912,13 +27912,13 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "0", + "code": "200", "component": "apiserver", - "count": 6, - "group": "apiregistration.k8s.io", - "resource": "apiservices", - "scope": "cluster", - "verb": "WATCH", + "count": 2, + "group": "apps", + "resource": "daemonsets", + "scope": "resource", + "verb": "GET", "version": "v1" } }, @@ -27938,12 +27938,12 @@ "ModuleFields": null, "MetricSetFields": { "request": { - "code": "409", + "code": "0", "component": "apiserver", - "count": 4, - "resource": "pods", - "scope": "resource", - "verb": "POST", + "count": 15, + "resource": "persistentvolumes", + "scope": "cluster", + "verb": "WATCH", "version": "v1" } }, diff --git a/metricbeat/module/kubernetes/fields.go b/metricbeat/module/kubernetes/fields.go index 3cbfdbde396..6cc7a4fe5bd 100644 --- a/metricbeat/module/kubernetes/fields.go +++ b/metricbeat/module/kubernetes/fields.go @@ -32,5 +32,5 @@ func init() { // AssetKubernetes returns asset data. // This is the base64 encoded zlib format compressed contents of module/kubernetes. func AssetKubernetes() string { - return "eJzsfV1z47aS9v38CpRvXuctR7XXU1unKvGcbLxJJlp7JrnY2tJAJCQhJgEGAO3Rqf3xW/ggCJEAP0RQ1tjSRSpjW90PGo1Gd6PR+B48ov178FiuESNIIP4OAIFFht6Dq1/sD6/eAZAinjBcCEzJe/CPdwAAUP8ByJFgOJHfZihDkKP3YAvfAcCREJhs+Xvw31ecZ1c34GonRHH1P/J3O8rEKqFkg7fvwQZmHL0DYINRlvL3isH3gMAcNeDJj9gXkgOjZWF+4oEnP3dkQ1kO5Y8BJCngAgrMBU44oBtQ0JSDHBK4RSlY7x0+C0OhQmMJVpBggTliT4jZ3/hQdSBrCPCH5R3QBB1ZVp9DmVYfV1JNeAz9XSIuFgxxWrIEHfxRhfQR7Z8pSxu/68ArP/eaMkqBl3YTAC/Xc2IIkW/BSGgRHwBQZMF1kpVcIHajmPICJujGSue7TlxPiK3jwfr506claJFs8kxoGlEUimeLZJsnEYiIlWQUfxoMBsUCtFg0saRsv2IliQfjTyR2iAGxQxUPUHLEQcr2oMmoCeYRkya3CUh+wSSVhs1Q75mSvKAEERGP/W1FEuwgSTNMtq5QOtE0reZEJNKcKpJgQ6uZGWAmnhDjmEZUDUPQomgPswlBSe5gW5kIoVokPsJN5jkSOxpRH9XC9BBtDZryiGpoR9ykWrEtGE0Q516OPkX07bQuvaQoFxwlrd9XNFNarrOm3WsN5Hb5GXCUUJI2kdWccpRTtpfbOk4REYv1vnaK2nwzSraeX2qX6D0IffkA1Y/yjwAmoOJpMPRBfMJMlDA7JULDsg/gJuULWiCySGjZsn690A5YfyzzNWLS4kqCYIMzZP+AsvA0cgGZQGkEpXnQCgM4JglSJsYod8XDuwCeoUh20dQfPSEi+ILjfyE93Yt1mTwisfj/wcHR9V8o8cle/2I1fAr+lEPREIBEAFLMBcPrUvn8mAR0KIydl/ms6vpQ5lJhnmvcXAHnx4CNqcIuoj4IHrcF9BjtFue24QbKeOt9GjwaX0bqtAMtsI/wghLudy2PUemX0eWgRNTgOtRb+RcIJjs92JvK71D/s66DkRs3YLox4YuMi60zuBgikhMtkWpWB6+PmRZGjUPQymXhXj1MMixlWLvYbRBBAEHmmh+A3JDv8qTiuTRR5ecRmcssLZlK0SzKo3TrgG3l/FU0pcrnUnVynDDa51+5SKaLoI2FuA6D/uEwMCe0QtbeZFAgkuwPTM4N2GEu6JbBHGhMYfxJyZhcDtMFeUc2Gd7uRL8qSWqsJASTbWQbUC3DROAnpL4NDKNum4BEki70JEQxCHWS0kwtB1AoLl72sEyxWKitMwp7Rc/nJRwyZEhCQ2lEnhXJJvPaZBEBMZmWknWka+lFycgqd3wlcO53UlIomr/ocQ0eJEHQIujEpIM3g760zvIzKDncIo8gQsN2oajvBtehD1AX1YNBUuYj3E+8j4HLxGOhm2yCsVr1GeDmVZ9bq3ZS7reUISN8Aklw/zrACwmVggnBHgB5IFytGCjtYWmB0RQtCu8mVePiCcxQutpkFIb+sPIlC8SSdv7yqDFI+UIOYEVT/tvEHoIKmCnsAGYZTaCA6wzJ73UONsM5Ft/eaFO0wQSlGr5NW9am8Fr+JCgRgDegJOq7KP1uAe42ja/Lv1G/5gAyBHLMudxAZQgi//CLJPpF/fMLF1Cglf6BsTvIfG1NxU56JZJtCigBYgeFAnQDxA5Xx5HgGWcZWNdsEBGYoWy/8FrMjG6HpwR75P0r3cp4ZUNHmkr4BHEG/QtzurkMBV9gmFXoi+HAcD1U8rGDBQksYILFvj/Eq/7yLchHr7PhspGm+C3IRW05w8WCpWEIp6Cn+R/+CANE3WY/KT2oV0twQE6Om6FuxygeLslqCKSAds4BSSmIB9LhEUW0XMlbMdpNPew5Z5nP7T83kWhBBAd85h7wbw76kU5wQAPA2fvBQ8Y8wRU2CtHnDRsU5+YQu9PHWsfk4JUt4fuHh+4FbA9NKXvEZMtROKf4OiTypx4o4EgMN23nuc5DQznRmg/qUgG3aAPLzJPJHnf+7x96nTqVjECAk3WH4F+UnQyR4hbEZe0OpWITsULnbYSN95QKVYXC91ygfHQE+VY8Wb+c3AjrEmr7ZWRCq5cLuU8SRn72BJDuMROjWYaYvjkw6bjp1hIz9xDiHDadsqz8lOXkp65PjVuXqrgFi1Llf+Px+ghzNKz2+V+UROR7RzYMcsHKRJQMtYmfdwmuTR8xfVtIW77b5Wd1zgp4gYiQ1u9SpjsB4bdTpish5PBrBAS/2njixQqFbblAFevYQmFVOlwS/BWggia7kIIfFrlFW7ldxXLjhFxPs7K0tmRHUOd63Q1YM/qICEjps3Rj1JXAkqs958bsBWrxe2y/5y5RxMo1W/VoYFflV43atdYA5M58HOIZCqRs0ZpT4NYzAcfjP2lRXGNWmnW4rbK4ieM8YbmtHZsqMDblkuqb8cYwRy1ePHQvoUjeau54WqRrOOebAlMSHRHf/GrulpPH0fP2KF6gUHcGXXJz3n+XqIx3s0IODMkAQdfoTndsfqbPMnbeVz4L2EGu/BvDyVbpGn+HMrBGiFQ/bgnFDtkXkTl5CLLBBPNdFOesNQa6UTjUWFJKkD7Qwcp/LhjdMum4qZmDnPw/oUeUUCJ9f6YzNJ0iOHbUME1jGJI/LTeYprqK4lhEKSrELiokU7auKR8LiyHBcBSjWwMjjvlV1MeAOziCTmiWoURQ/zXj4+4A4kS5ZTF3GXXGUlFuj9aTuXDX5w7BTOz2URFZqgrbSEixRTOSvUYeOKIbjmF5cGg2Uhx2F0AwRWyB+SqHXASuu68pzRBs3sbva8awq7sxJO3sKiZcQBnvYm5AWArvmiCb9w1HZ3c/7ZDb48Vc9rRn98AsQ/sbZeQhQ2CLiAyedFea6paHMeIHHLCy+HIifmn2yAEjMsdhDQ3oReck3EoqmgtgKKEs1Rtybb8EzpH+WQGZwEmZQWbu8ModjybKBqcehOqbAuaFB2XbbnXlyDeYcbEyrEigPc34axmfKoBynIoHqHnIn4VvsWZwdkCSRQ+eOkHIW4f+GoNAX8VwbfhN0zGagNK6FwZ+QsQjjoQW+5WgPgT17gp5o01HOGfdie5eURoKzmphs8fMkdw/7Qubjuvm6Engh5S+m6Myi1WbFoYKyoTu04K5Zy66FtCsDWQ2jObgeYeTnRKOtg2Y15bRCynuec1H6X5IwoCSoVickyqYQgGnz9hvhhKAnNMEq13hGYtd5xrqmje/CR3v/Fk9YKg1IaDLYA04hj0wWoqBSil2rZQaUDUvq7hHav9hyBqV2NTK4He045/nDeKp+o/FZaxIyphSLwK9AJ5h32qsjh1X0dsq/WHaKrkC6T7lLHHEY+PPBP9dIqDO2fAGS2+TOkA8GR5rxlG2WWWYPEYEc/+rtOMMcYnGtNwKbSOYPNHsCaUrD8a5rFPF0yeXLjsFCxxfc35Y3tmmXEZ7OqYrbnc2ydvtatLBOK7xcA1WB9P51mtFeYTo4y7Yz3cfeni7+ZEpMZ9zgVylLy53xy93xwOf+HfHlcf6rV8bv9zS8v/N5ZZW6xPvltblvksL8uW+Swj65fZGz+0NgoTUnmi2m3195Sp4jxKEn1S+XzV2ItVtJCljgIlAbAMTpO4Qtn4KsPQ1RXV56cZe89PpPbnRUiH9HYYSAZ5gViLw5d++dIoGMearSxwsm6Hj/mo4vdCQbU7stSvYJwYJz7EQb0/HPr2gjtnDpstVtuozcNZ+utxiGy2iywU299MSz9u4u+YUqwTaoDRhnaaLTY3rXPrX1IhCPWys/1mSYPbtGBuOc+mvz9STKLw/9DPoYwIGrnQwPL01ZMWDcWmwu1zFJ+N3EDBwFwFvW5AD9hkwxuy9SSH6dyObYji4kTrlFKKg6Td5CHHJIVSfo3II5xB52ej+EneLc5qXT955eVOnf2dz2tUCdo4t4sY0SX5TjZHl5mq7Q/FmeyjTEZkSBCgDOWXI/ePqGjZNVc13o1Nc/5cwr79zHh2UI5/YXo4mW8DP0jpcGkjGMxmDukh+S7YBvMHE7MGiDg+6cdC+ev0n7Vowz63z9m/QAMTpLDnNGIRj3VdfxaI1yTY7krOgLsH3VDsVcItWMxZKaFiDyzZWp8ETLtpw2nF93U9JODnXHBWtmI/ZXzrMjeIWbOZwyq6Al/5uIGrzkkt/tw7Wl/5ul/5ul/5ul/5u9efS3+3S3+3S323KFFz6u72F/m58T5qOx9GHfY/lGunYz0SAe5Icee7HygzxuJvvniRLCetekrZWfszb4G1QMVdcAOCAZ8LbuE6oowHYvboaHI0p+1BN7mCeY7KdwwkzXIDDJuSPHYs0arevDrgDNKQH6QnV5WPHQIbrjLVeyQ6lZTbtCQYnc2XpfXOPMJwyjfSa03HhXqdHsXvQCiW1vE3ZFv202rnE4hluFFMwusGtpEIcrj7ajkdVZhEH+4MQKC+EoSsD0WoNNyooZ+3LM+idjdO0PKxNWEenQ3BJ1HqxXRK1PoCXRO0lUTtOyJdE7SVReziES6L2kqgdgu6SqL0kai+JWs8ILw9xhMZxeYgjMOLLQxz5OT/EwW3GJNqSLhBJ5VouaBTlqHeZaiYMAyAZtMYs9VyPWTTbox+AZAjlisNCveyRnzYBXffWsjiAwTHh1MIzqKlRyLKNz0eyA0FMDWhLawgSqNNzMaCYytoaRkW7MrFJVnKBGOAUbGAzu+YYzgrSSx2Y1YlSA2VCJGNSrWoD8qZWe8YdKVLm4TH1xcxTRxBTx9vDGIW3Ph8x9fzvmnCOu8Bv6UU5lTq6rXJLjrcWF/Zn2nVCJ97utoM8fHPIP4DmILpugNrhKEbg2vqlzxAL9T8CsRwT2H31AsE03JvLn98fiLJGqJj45XsQFAnIOi4WYCLQtnUQcQQYzSfQR8gRTPPNFhfMpPn7pA5f1Esu1btPRjN55btkyhaZqQTXFv6telxCzu4tg3z3K6XFjzB5pJvNDfgnY6p5x7LMshsvY/tr853vAGWOmkg+eZEhgdKbWmK3kBAq7kuiOMgY4Pfff/sFZxlKv1OTisJX6NQbQTWD1dxSVQ8GeUX7DPXWWw9WQR82ZCmmetD+28Rj+hD0BrvqDlno9r2mG7o6Nmox3C4/q87iXLMckGw/CSTDDqXgZP22tcjnP87qG765OKfv3fV2f6vm5eVx11NWXf0L9QpKGCV/0XUsd0NTi+JsTDlrvzU4+gLoyQy8dBxnzjyW5l8ZQ/jUJEBBM9ygZN3bROAn5HVog0oXcGQ1KRWl29qEtpI4PiFf8ZLL4L7VqGtwWcLBu4tGsliGrD66teaqp6M8ibuOpN0B23+qg9IqW6dPUF0IcpfyPVB1sJ9WGhANhxS62jkrGKwk/gWCvs7EXlLuZZ8imGaYhDn36dwHQ8CyhhsVg1dFOBJJlQ2VftcG4syZiSH/0/3P9v/YsUGUU3J4p35KceAHRe9BXfc+sWWsN6ciwwkcHlL1bDje0RkmR1Zu97d4GBKTh/3ROvVaNyGsxAIKxOqBBCGmiGPW0f12GkBD/SBHPApedwAZS3o6ghwJrSSnm16HVx9M5wQio/t84qO9jitUE4yy5gvo6YQ5oe7vFy9SzcWXHJgpL9OvEwOj0P/1qsWHemg/WI24pSTFKk9qqoauBSvRDdjAjKveOCV5JPSZhPM01eFd+/xlNG4H4VJTlVvdcRBPYOodXbELC5MNHTntfWZ0UnbJEWltEirTalFf8wIl4SnuV8xYGNumapINjQXLZ0PDwIrU+4xrdFCaTxtQBWRIKOs3vsMcOX9wO1cY63mQe3f4hKxy0Lsqx2UcF8sOLOtuwDY0bIaFA0y+CjBn8AG8MWwQRiOamAOGZtENg5dJglA7do6LRHHhfFNmbTQVklFN6ofvGFJD7avRYyOC0PPQNrj1PRA92GFUddRQOM9zd0X9B7iqNPVJkfm5NjB5LvPFmsaaA+BICEy2Y+dz3vApoWSDtyVTmWoLVSXFXHsFrh9aW3/tZjOYZSjDvHm4HUuIDoezl6KL1dlwOuRHn0ngdtJ0ySnayttkuTrDHyk2b6lXtMMud1e2Txargj/6TLhuftneLGt0nueiI6Krno7uQAau0XYBrm4ZJf9J11dh1xjzVUKJYDTLvC5dBMi/P1cHsJYRuL6SMdDVDbhSUdDVjYyDrv6dUIL+ceXXxpHB6jh1NJHZ8fpYmfN5ROjm1A82j4AgTUTZMe89HlNUtMZ1GgrVLvHzfIA7ZsakO8U3aRLUC9Buecj4zEhJTPq+M0adVMmiUB7w6Stm0Wegq4Ihzkvvw92xhKc7Oy8No6OlmGL+eAq4HzB/nAyWlmJFNyuJeUaov5fi943Ee3zSDqenkOny7sNkkZqeG6sh+Z7piE1fjc9OwueYrGPMkhunefF8VS7SL3K7JNflN3QDoN4AlJsEGXKydDKSUKfjwSJ8Rybm1bCeQUwI8aunIuz7ZKd7E9+Zo5eqeGlOoal2qeevqnuxV28mzuNLDfSj9kbU6LqfonMSf7NMtWoxPpcmu3PZmTazEzIrHNVhvfkkYn1hhnHMBSLiiWZlHsvvrMkCTbdOuTKaq7/8XhVLfv/SRVZ/aHiSRKAIs2vVDKsRMTy871J21XaPHYQu24ZJQpm6pCSoMycBt54yuEWrJIOBDigDuD9oIkARsTmqlj6BIUUsIb1MMojz2ZQzyeAZq+jyj9sO/dRDWE1h8CMmKUorYYRZmYLMldGaCSvivq7GrZZX/FUh5aYI+GlDdZqwyic08/pBkQCShJ/HjOtr+cdts0i+vYrO7g3NHeVihZtbtzlfPT6VJeFJ0uBuGSN9MY6xiTOOKxeb8U5PA6a51HNfXepZmruyi8Wxd3liopuWsanKLWdK7DUnvOLmw3vTRtssaZlWkemsyqpSkUeqyZyx5saFGi7QOqfyyoOau3v9j5erqjwe14uVUw7ARteqE9NcQtsigqoeUIZTdU+/Bgc6zoHqIvk1mqfQ4lCKmzLL9hW3Xmk69xzVedjfJRUwmmlxaMZ5xGi2qw73But/Kax9Fx6aUhqDQHPQp2UoBdc7yFK1QXGUfjesC+YUR/1woMF7QZ7uE4NZuCPUK0d+9QZ8kUP9Isf6RQ72S2D/8Az8iPHpc2jdTkPCgUWRYcSBoO2Isfuf4QhTmgOcxEp4GGovfmfsweDoyGfoLhEhJ3wAjzsiECMwA3dLq/Jm/H6W6Kv+wqQgtRpZRQx8+PgQXgKW5fHDbDEMxBYZhelqDTNIkkli/ZXCFPxo6FiFCjCdssSrgbVo2NoIogrDJ6mI7gsVQF8xkCHbFJ2o2Pzso9NdfhcscPOKStGQxvDgC250iTZlFs+xryhG8+y7hNCXrPEX8FqR2LpIcK2atup98MGMoOn9nSDUOBCe9aGOijZm9k9rx8+6pwc+X0iI4AXCjtbdg6EAXyz+6FPBOjqYWwmdOOT4SquZddFqoAP2PHSw0rwBwBp512badZpJdrOwL+7nHaAJe3sFo0+YYxoqaB1xuFRTqr0+F0XozEAd3aw89/5HBQaKiukeoPinewJznEAZMJvdzZxg+I+6zDnJGqus56S0/2801SfvKVKvCdeyUZ2zSAoMl/j+yMG093gl6smAWNqv3x9wXuqO865xu1HYqJloG426fUjQIVTNmlbBmyJ9c+B5+sM2tPePckRNUd/olp/NI+vHnTao7wbN9JSH0RPqLUjrJ97HwGXieeGpyabz+XUwvBkaMNK+pQwZkRNIgk9iHaCEhIZKpQYCHQhSqwNKAyxnqpmaT4nO7XV9U6vkH7Dd4Vonu+CVCeP+4WGYKJ4pe8Rkyz2u4uuSyJ96oCY8HyCZAm61rxDWlWH9ufsuSUpGIMDJ2gP4F2UnQ6S4eXEdumaRPJXDerMXc9DbUnEqzbzcNhGfoPJVmvUR7SIMznIV/oQzZBxTVUHZU1QKRh0jv1IR1aXDvTLy9GoBr108ypsKSsYdROHthl0PgScwQ+kqVNrvDqRALGm/YzVyKEtNRJpZugGmwEJFi8EJxoSmHYXgU6Y4oDsgqvv7WU9WYBCOZWWoOzaJAeYnhtAQMKF+3XHRaP91AJxvQI3NKP4vAAD//w1E8rA=" + return "eJzsfV1zG7eS9r1/BUo3r/2Wotpr19apSuRz9miTOFrJTi62tmhwBiQRzQATACOZp/bHb+FzwBlgPjgYSrbIi1Qsid0PGo1Gd6PR+AE8oP178FCvESNIIP4GAIFFgd6Di5/dDy/eAJAjnjFcCUzJe/C3NwAA0PwBKJFgOJPfZqhAkKP3YAvfAMCREJhs+Xvw3xecFxeX4GInRHXxP/J3O8rEKqNkg7fvwQYWHL0BYINRkfP3isEPgMASteDJj9hXkgOjdWV+EoAnPzdkQ1kJ5Y8BJDngAgrMBc44oBtQ0ZyDEhK4RTlY7z0+V4aCReMIWkiwwhyxR8Tcb0KoepC1BPjj7Q3QBD1Z2s+hTO3Hl1QbHkN/1YiLK4Y4rVmGDv7IIn1A+yfK8tbvevDKz52mjHIQpN0GwOv1khhi5DswMlqlBwAUWfA2K2ouELtUTHkFM3TppPOuF9cjYut0sP756dMt6JBs88xonlAUimeHZJcnEYiIlWSUfhoMBsUCdFi0seRsv2I1SQfjDyR2iAGxQ5YHqDniIGd70GbUBvOASZvbDCQ/Y5JLw2aoD0xJWVGCiEjH/tqSBDtI8gKTrS+UXjRtqzkTiTSniiTYUDszI8zEI2Ic04SqYQg6FN1htiEoyR1sKzMh2EUSItxmXiKxown1US3MANHOoClPqIZuxG2qlm3FaIY4D3IMKWJop/XpZVV9xVHW+b2lmdN6XbTtXmcg17efAUcZJXkbWcOpRCVle7mt4xwRcbXeN05Rl29ByTbwS+0SvQexLx+g+kn+EcAEWJ4GwxDER8xEDYtTIjQshwBucn5FK0SuMlp3rN8gtAPWH+tyjZi0uJIg2OACuT+gLD6NXEAmUJ5Aae61wgCOSYaUiTHKbXkEF8ATFNkumfqjR0QEv+L4X0hP99W6zh6QuPr/0cHR9Z8oC8le/2I1fgr+kEPREIBEAHLMBcPrWvn8mER0KI6d1+Wi6npfl1JhnhrcXAHnx4BNqcI+oiEIAbcFDBjtDueu4QbKeOt9GjwYX0bqtActso/wihIedi2PUenn0eWoRNTgetRb+RcIZjs92Evrd6j/WTfByKUfMF2a8EXGxc4ZvBojkhMtETuro9fHQgujwSGodVl4UA+zAksZNi52F0QUQJS55gcgN+T7PKl0Lk1S+QVE5jPLa6ZSNFf1Ubp1wNY6f5amVPlSqk6JM0aH/CsfyXwRdLEQ32HQPxwH5oRWyNmbAgpEsv2BybkEO8wF3TJYAo0pjj+rGZPLYb4gb8imwNudGFYlSY3VhGCyTWwD7DLMBH5E6tvAMOq3CUhk+ZWehCQGoUlSmqnlAArFJcge1jkWV2rrTMJe0Qt5CYcMGZLQUJ6QpyXZZt6YLCIgJvNSsp50Hb0kGVnljq8ELsNOSg5F+xcDrsG9JAg6BL2YdPRmMJTWuf0Mag63KCCI2LB9KOq70XUYAtRH9WCQlIUIDxMfYuAzCVjoNptorGY/I9w8+7l2aiflfk0ZMsInkET3rwO8kFApmBjsEZBHwtWKgfIBlg4YzdFVFdykGlw8gwXKV5uCwtgfWl+yQizr5i+PGoOUL+QAWpry3yb2EFTAQmEHsChoBgVcF0h+r3ewBS6x+PZGm6MNJijX8F3asjGFb+VPohIBeANqor6L8ndX4GbT+rr8G/VrDiBDoMScyw1UhiDyD79Iol/UP79wAQVa6R8Yu4PM19ZU7KRXItnmgBIgdlAoQJdA7LA9jgRPuCjAumGDiMAMFfuroMUs6HZ8SnBA3r/QrYxXNnSiqYSPEBcwvDDnm8tY8AXGWYWhGA6M10MlHzdYkMEKZljsh0M8+5evQT56nY2XjTTFr0EuassZLxYsDUM8BT3P/whHGCDpNvtJ6UGzWqID8nLcDPU7RulwSVZjIEW0cwlISkECkA6PKJLlSl6L0W7r4cA5y3Ju/0sTiRZEdMAv3AP+1UM/0QmOaAB48X7wmDHPcIWNQgx5wwbFS3OI/eljnWNy8J0t4bv7+/4F7A5NKXvAZMtRPKf4fUjkDz1QwJEYb9pe5jqPDeVEaz6qSxXcog2si0Ame9r5f3joTepUMgIRTs4dgn9SdjJEilsUl7M7lIpNwgqd1xE23lEqVBUK33OByskR5GvxZMNy8iOsc6gdlpEJrZ4v5D5JGPk5EED6x0yMFgVi+ubArOOma0fM3ENIc9h0yrLyU5aTn7o+NW1dquIWLUqV/03H6yMs0bja539RkpDvDdkwyAWrM1Ez1CX+sktwXfqI6dtC2vJd335W56yAV4gIaf3OZbozEH47ZboSQgm/JkDwi4snnq1Q2JUL2FjHFQqr0uGa4K8AVTTbxRT8sMgt2crtK5abJuRmmpWldSU7gnrX6y7BmtEHREBOn6Qbo64E1lztOZdmL1CLP2D7A3eJElauuapHA9uWX7Vq1zoDkDvzcYgXKJByRWtegdvABByP/6RFca1ZadfhdsriZo7zhOW2bmyqwNiUS6pvphvDErV46dA9hyIFq7nTaZGu4VxuCkxJdEJ8y6u5X06eRs+7o3iGQt0FdMnPef9VozrdzQo5MCQDBF2jO9+x+Sd9krHz3vosYAe58m8MJ1ela/wdysAaIWJ/3BGKG3IoIvPyEGSDCea7JM5ZZwx0o3CoseSUIH2gg5X/XDG6ZdJxUzMHOfl/Qo8oo0T6/kxnaHpFcOyoYZ6nMCR/OG4wz3UVxbGIclSJXVJIpmxdUz4WFkOC4SRGtwFGPPOrqE8Bd3AEndGiQJmg4WvGx90BxJlyy1LuMuqMxVLujjaQufDX5w7BQuz2SRE5qgrbREipRTORvUYeOaIbj+H24NBsojjcLoBgjtgV5qsSchG57r6mtECwfRt/qBnDrunGkHWzq5hwAWW8i7kB4Si8aYNs3zecnN39tEN+jxdz2dOd3QOzDN1vlJGHDIEtIjJ40l1p7C0PY8QPOGBl8eVE/NzukQMmZI7jGhrRi95JuJZUNBfAUEZZrjfkxn4JXCL9swoygbO6gMzc4ZU7Hs2UDc4DCNU3BSyrAMqu3erLkW8w42JlWJFIe5rp1zI+WYBynIoHaHjIn8VvsRZwcUCSxQCeJkHIO4f+GoNAX8V4bfhV0zGagPKmFwZ+RCQgjoxW+5WgIQTN7gp5q01HPGfdi+5OURoLzmlhu8fMkdw/7SuXjuvnGEjgx5S+n6Myi7ZNC0MVZUL3acE8MBd9C2jRBjIbRkvwtMPZTglH2wbMG8sYhJT2vOajdD8kYUDJWCzeSRXMoYDzZ+xXQwlAzmmG1a7whMWudw31zVvYhE53/pweMNSZENBnsEYcwx4YLcVApRT7VkoDyM7LKu2R2n8YskYlNo0yhB3t9Od5o3iq/mNpGSuSMqbUi0AvgCc4tBrtseMqeVul301bJV8g/aecNU54bPyZ4L9qBNQ5G95g6W1SD0ggw+PMOCo2qwKTh4Rg7n6RdpwhLtGYlluxbQSTR1o8onwVwLiUdbI8Q3Lps1Owwuk158fbG9eUy2hPz3Sl7c4meftdTXoYpzUevsHqYbrcerWUJ4g+7YL9fPNhgLefH5kT83kXyFX64nx3/Hx3PPJJf3dceazf+rXx8y2t8N+cb2l1PuluaZ3vu3Qgn++7xKCfb28M3N4gSEjtSWa72dfvXAXvUIbwo8r3q8ZOxN5GkjIGmAjENjBD6g5h56cAS19T2MtLl+6an07vyY2WCunvMJQJ8AiLGoEv//alVzSIsVBd4mjZjB33V8PpmYbscmLfu4J9YpDwEgvx+nTs0zPqmDtsOl9ls5+Rs/aP8y22ySI6X2DzPx3xvI67a16xSqQNShvWabrYNLheSv+aBlGsh43zP2sSzb4dY8NxKf31hXoSxfeHYQZDTMDIlQ7Gp7fGrHgwLQ12U6r4ZPoOAkbuIuB1C3LEPgOmmL1XKcTwbuRSDAc3UuecQlQ0/yYPIc45BPs5KofwEiIvF92f427xkublU3BeXtXp34s57eoAe4kt4qY0SX5VjZHl5uq6Q/F2eyjTEZkSBCgDJWXI/2N7DZvmqua71Slu+EuYN995GR2UE5/Yno8mO8BfpHU4N5BMZzJGdZH8lmwDeIWJ2YNFHR9066B99f2ftGvBPHXO279BA5Cms+Q8YxCPdb/7KhatSa7ZkZwFdQl+oNqpglu0WrBQQsMaXbaxOg2eeNGG147r635Owsm75qhopXzM/txhbhK3aDOHU3YFPPd3A0mbl5z7u/WwPvd3O/d3O/d3O/d3az7n/m7n/m7n/m5zpuDc3+019Hfje9J2PI4+7Huo10jHfiYC3JPsyHM/VheIp9189yS7lbDuJGln5ae8Dd4FlXLFRQCOeCa8i+uEOhqBPair0dGYsg/V5A6WJSbbJZwwwwV4bGL+2LFIk3b76oE7QkMGkJ5QXT72DGS8zjjrle1QXhfznmDwMleO3jf3CMMp00jfczou3uv0KHb3WqGklncpu6KfTjuXVDzjjWIqRje4k1RIwzVE2/Oo6iLhYH8UApWVMHRlIGrXcKuCctG+PKPe2ThNy8PGhPV0OgTnRG0Q2zlRGwJ4TtSeE7XThHxO1J4TtYdDOCdqz4naMejOidpzovacqA2M8PwQR2wc54c4IiM+P8RRvuSHOLjLmCRb0hUiuVzLFU2iHM0uY2fCMACSQWfMUs/1mEW7PfoBSIZQqThcqZc9ytMmoJveWg4HMDhmnFoEBjU3Crnt4guR7EGQUgO60hqDBOr0XAooprK2gWFpWxObFTUXiAFOwQa2s2ue4bSQnuvArEmUGigzIhmTalUbUDC1OjDuRJEyj49pKGaeO4KUOt4dxiS8zfmIqed/04Zz3AV+Ry/JqdTRbZU7crx2uHA4064TOul2tx3k8ZtD4QG0B9F3A9QNRzECb51f+gSxUP8jECsxgf1XLxDM4725wvn9kSgbhIpJWL4HQZGArOdiASYCbTsHEUeA0XwifYQ8wbTfbPHBzJq/T+rwRb3kYt99MprJre9SKFtkphK8dfCv1eMScnavGeS7XyitfoLZA91sLsHfGVPNO27rorgMMna/Nt95Byjz1ETyKasCCZRfNhK7hoRQcVcTxUHGAL/99uvPuChQ/k5NKopfoVNvBDUMVktLVT0YFBTtE9RbbzNYBX3ckKWYmkGHbxNP6UMwGOyqO2Sx2/eabuzq2KTFcH37WXUW55rliGT7SSAZdigHJ+u3rUW+/HHW0PDNxTl9726w+5udl+fH3UyZvfoX6xWUMUr+pOtU7oamlsTZmHPWfm1wDAXQsxkE6XjOnHksLbwyxvBpSICKFrhFybm3mcCPKOjQRpUu4shqUipKd7UJXSXxfEK+4jWXwX2nUdfosoSDdxeNZLEMWUN0G81VT0cFEnc9SbsDtn9XB6U2W6dPUH0IcpcKPVB1sJ9aDUiGQwpd7ZwWBqtJeIGgrwuxl5QH2ecI5gUmcc5DOvfBEHCs4UbF4LYIRyKx2VDpd20gLryZGPM//f/s/o8bG0QlJYd36ucUB35Q9O7Vde8TW8Zmc6oKnMHxIdXAhhMcnWFyZOX2cIuHMTF53B9tUq9NE0IrFlAh1gwkCjFHHLOe7rfzABrqBzniSfD6A8hU0tMR5ERoNTnd9Hq8hmB6JxAF3ZczH+31XKGGYJI1X8FAJ8wZdX8/B5FqLqHkwEJ5mWGdGBmF/m9QLT40Q/vRacQ1JTlWeVJTNfRWsBpdgg0suOqNU5MHQp9IPE9jD++65y+TcXsIbzVVudUdB/EEpt7TFbewMNnQidM+ZEZnZZc8kTYmwZpWh/otr1AWn+JhxUyFsWuqZtnQVLBCNjQOrMqDz7gmB6X5dAFZIGNC2bDxHefIhYPbpcLYwIPcu8MnZJWD3lc5LuO4VHbgtukG7ELDdlg4wuSrAHMBHyAYw0ZhtKKJJWBoFv0weJ1lCHVj57RIFBfON3XRRWORTGpSP37HkBrqXo2eGhHEnod2wW3ogejRDqOqo4bCe567L+o/wGXT1CdFFubawhS4zJdqGhsOgCMhMNlOnc9lw6eMkg3e1kxlqh1UlRTz7RV4e9/Z+hs3m8GiQAXm7cPtVEL0OLx4KfpYvQ2nR370iURuJ82XnKKtvE1WqjP8iWILlnolO+zyd2X3ZLEq+KNPhOvml93NskEXeC46ITr7dHQPMvAWba/AxTWj5D/p+iLuGmO+yigRjBZF0KVLAPm3J3sA6xiBtxcyBrq4BBcqCrq4lHHQxb8TStDfLsLaODFYnaaOJjI7Xh+tOV9GhH5O/WDziAjSRJQ98z7gMSVFa1ynsVD9CUcr+f+8gtnwW9xzQgHHxfrEVyMjgvkHF4FHygn+qgnLLc/5W+HD8dQ5nH6HfmTZiq8BjWgxt868yoDI6Vea8C5e5WCLCvqSM3MxeTziwNy+8zJfhU+pAv1551mWQT1L7tcsTU/X1cScKfUmTmaVVymUB3yGKqz0wfyqYojzOviafCrh6Xbjt4bR0VLMMX84BdwPmD/MBktrsaKblcS8INTfavHbRuI9PpOM81PI9Pbmw2yRmkYwqzFJyPmITbOXz14W8phUeMo6MK+j9nKlV9JZ91t3NzVhdAOg3gCU7w4Z8lLHMrxVJRvRmyGeTMxTdgODmJF3su+XuEfzTlY45s/Rc5VhtafQlGA182eLsdx9sJnz+FwD/ai9ETW6/vcRvWz0IlOt+t4vpcn+XPbmct2ELApHtf1vv9PZ3OJiHHOBiHikRV2m8jsbskDTbc4BGC3VX/6gYq8fnrvy73cNT5KIVAb3rZpxhUuGR/Cx1L4LB1MHoe8SwCyjTN2cE9Sbk4hbTxncolVWwEhbnhHc7zURoIi4xGlHn8CYyqqYXmYFxOViypkV8AWr6O3v1z36qYewmsPgJ0xylFthxFmZKuGV0ZoZK+KuKRG3yyv9qpByUwTCtKE64lqVMzrM/ahIAEkiljlZbH3d/n7dzml0V9GLe9h1R7lY4fbWbQ79j8+vSniSNLi5TZG+mMbYxBnH1TAueNGsBdPcNLuzN81uzQXuq6tjL5ilRDcvY2NrgBfKNrcn3HIL4b3som3XWc0rE/ZWpS2f5YkKhRcsBPOhxqsGX1LN70Eh6J3+x/OV+h6P69lqfEdgo2vVHmwpoW0RQbYxmeFkm0c04EDP4WRzc2ONlqn+OZTipi6KveU2KE3v8q06pP2rpgImMy0ezTQvay12/+bOYP0vhXXoFk5bSlMQaA76CBfl4O0OslxtUBzl78a1Zp3jqB8ONHpZLdASZTQLf4TmcHBfoUvwRQ71ixzrFznYL5H9IzDwI8aniyN0jxcJB1ZVgREHgnYjxv5/xiNMaQ7wiCPfccvFUHv2i4z3BkdPPkO3Lok54SN43BCBGIEFuLl1Km/GH2aJvuovzApS7cgsMfDh4318CTiWxw+zwzASWxQU5qs1LCDJZon1Fwpz8JOh4xQqwnTOErcD69BwBTtE3VaYpSK6WVkEvWUgQ7Y5OmHZ/DNEp78mNFp1GRSVq5Q4+MJBFcmmLtI59pZiMs++TwhDyZpwVXm3eAS8VZ2E9T54b0bQ9v5OEGocCM/5UEdFGwv7p43j59zTA58vJkTwDGFH50LMWIDPFn8MqWATHSythF4ccnz538K66DTQA/sydNBq3ghgrbxrO+06zyT7Wdhn9/MO0MS9vYrRR8wxjVVZTzhcaig1Xp+PInZmoI5uVoFmFJMCA0XFtLRQ/PM9gSXOoAyYze5mTjDCR13mnGSNVdZzVtr/V5rrk/ccqSeuG9modm4kB4ZLen/kYNoHvBL1jkUq7dePYnjPx6d5bLvbvW7STHSNRtPTJuoQqg5iq+j1paE5CLxH415ZCI9yQk3R0OhuP5uX/487bVDfjZrpOa/1ZzRYkDZMfIiBzyTw7FibTbT1sv2M2HTsR0r7mjJkRE4gib7TdoASEhorlRoJdCRIrQ4oj7BcqGZqOSWK1RaBcVIbKlEC4yWrO8CaWqXwgN0O1znZBd+ZMO7u78eJ4omyB0y2POAqfl8S+UMP1ITnIyRTwa32FeK6Mq5p/NDNXckIRDg5ewD/pOxkiBS3IK5D1yyRp3JYb/ZsDnpXKl6lWZDbJuG7aKFKsyGifYTBi1yF/8AFMo6pqqAcKCoFk46Rv1MRNaXDgzIKNBAC37t4lDcVlYw/iCrYor0ZAs9ggfJVrLTfH0iFWNZ9XG3iUG41EWlm6QaYAgsVLUYnGBOa9xSCz5niiO6ApO7vZz1ZkUF4lpWh/tgkBZh/MITGgIk1kU+LRvuvI+B8A2psRvF/AQAA//814aFq" } diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/data.json b/metricbeat/module/kubernetes/state_namespace/_meta/data.json new file mode 100644 index 00000000000..74a0918857c --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/data.json @@ -0,0 +1,28 @@ +{ + "@timestamp": "2019-03-01T08:05:34.853Z", + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } +} \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml b/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml new file mode 100644 index 00000000000..f0d2c2f7ffa --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml @@ -0,0 +1,19 @@ +- name: state_namespace + type: group + release: ga + description: > + Kubernetes namespace metrics. + fields: + - name: created.sec + type: double + description: > + Unix creation timestamp. + - name: status + type: group + fields: + - name: active + type: boolean + description: Whether the namespace is active (true or false). + - name: terminating + type: boolean + description: Whether the namespace is terminating (true or false). diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected new file mode 100644 index 00000000000..3f0f990707b --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1673879561 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1673879567 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected new file mode 100644 index 00000000000..4469033344a --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected new file mode 100644 index 00000000000..4469033344a --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml new file mode 100644 index 00000000000..a44a8c52469 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml @@ -0,0 +1,4 @@ +type: http +url: "/metrics" +suffix: plain +path: "../_meta/test" diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json new file mode 100644 index 00000000000..db10ea298f3 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1673879561 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1673879567 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/docs.asciidoc b/metricbeat/module/kubernetes/state_namespace/docs.asciidoc new file mode 100644 index 00000000000..cccfc7c4f20 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/docs.asciidoc @@ -0,0 +1 @@ +This is the `state_namespace` metricset of the Kubernetes module. diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace.go b/metricbeat/module/kubernetes/state_namespace/state_namespace.go new file mode 100644 index 00000000000..8459f446d43 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace.go @@ -0,0 +1,48 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package state_namespace + +import ( + "github.com/elastic/beats/v7/metricbeat/helper/kubernetes" + p "github.com/elastic/beats/v7/metricbeat/helper/prometheus" + "github.com/elastic/beats/v7/metricbeat/mb" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/util" +) + +// mapping stores the state metrics we want to fetch and will be used by this metricset +var mapping = &p.MetricsMapping{ + Metrics: map[string]p.MetricMap{ + "kube_namespace_created": p.Metric("created.sec"), + + "kube_namespace_status_phase": p.BooleanMetric("status", p.OpFilterMap( + "phase", map[string]string{ + "Active": "active", + "Terminating": "terminating", + }, + )), + }, + + Labels: map[string]p.LabelMap{ + "namespace": p.KeyLabel(mb.ModuleDataKey + ".namespace"), + }, +} + +// Register metricset +func init() { + kubernetes.Init(util.NamespaceResource, mapping) +} diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go b/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go new file mode 100644 index 00000000000..138b15fde07 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go @@ -0,0 +1,39 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +//go:build integration && linux + +package state_namespace + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/test" +) + +func TestFetchMetricset(t *testing.T) { + config := test.GetKubeStateMetricsConfig(t, "state_namespace") + metricSet := mbtest.NewFetcher(t, config) + events, errs := metricSet.FetchEvents() + if len(errs) > 0 { + t.Fatalf("Expected 0 error, had %d. %v\n", len(errs), errs) + } + assert.NotEmpty(t, events) +} diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go b/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go new file mode 100644 index 00000000000..d8d2bd462a5 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go @@ -0,0 +1,50 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +//go:build !integration + +package state_namespace + +import ( + "testing" + + k "github.com/elastic/beats/v7/metricbeat/helper/kubernetes/ktest" + "github.com/elastic/beats/v7/metricbeat/helper/prometheus/ptest" + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/util" +) + +var files = []string{ + "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", +} + +const name = util.NamespaceResource + +func TestEventMapping(t *testing.T) { + ptest.TestMetricSet(t, "kubernetes", name, k.GetTestCases(files)) +} + +func TestData(t *testing.T) { + mbtest.TestDataFiles(t, "kubernetes", name) +} + +func TestMetricsFamily(t *testing.T) { + k.TestMetricsFamily(t, files, mapping) +} diff --git a/metricbeat/module/kubernetes/util/kubernetes.go b/metricbeat/module/kubernetes/util/kubernetes.go index d87ff71f208..26728fccdae 100644 --- a/metricbeat/module/kubernetes/util/kubernetes.go +++ b/metricbeat/module/kubernetes/util/kubernetes.go @@ -93,6 +93,7 @@ const ( PersistentVolumeResource = "persistentvolume" PersistentVolumeClaimResource = "persistentvolumeclaim" StorageClassResource = "storageclass" + NamespaceResource = "state_namespace" ) func getResource(resourceName string) kubernetes.Resource { @@ -121,6 +122,8 @@ func getResource(resourceName string) kubernetes.Resource { return &kubernetes.StorageClass{} case NodeResource: return &kubernetes.Node{} + case NamespaceResource: + return &kubernetes.Namespace{} default: return nil } @@ -238,7 +241,7 @@ func NewResourceMetadataEnricher( case *kubernetes.StatefulSet: m[id] = metaGen.Generate(StatefulSetResource, r) case *kubernetes.Namespace: - m[id] = metaGen.Generate("namespace", r) + m[id] = metaGen.Generate(NamespaceResource, r) case *kubernetes.ReplicaSet: m[id] = metaGen.Generate(ReplicaSetResource, r) case *kubernetes.DaemonSet: diff --git a/metricbeat/module/openmetrics/collector/_meta/data.json b/metricbeat/module/openmetrics/collector/_meta/data.json index 425e2d297c0..000809b8da9 100644 --- a/metricbeat/module/openmetrics/collector/_meta/data.json +++ b/metricbeat/module/openmetrics/collector/_meta/data.json @@ -11,16 +11,14 @@ }, "openmetrics": { "labels": { - "job": "openmetrics", - "listener_name": "http" + "job": "openmetrics" }, "metrics": { - "net_conntrack_listener_conn_accepted_total": 3, - "net_conntrack_listener_conn_closed_total": 0 + "up": 1 } }, "service": { "address": "127.0.0.1:55555", "type": "openmetrics" } -} \ No newline at end of file +} diff --git a/metricbeat/module/openmetrics/collector/_meta/samelabeltestdata/docs.plain-expected.json b/metricbeat/module/openmetrics/collector/_meta/samelabeltestdata/docs.plain-expected.json index b6dc70083a1..a92f4af7dbf 100644 --- a/metricbeat/module/openmetrics/collector/_meta/samelabeltestdata/docs.plain-expected.json +++ b/metricbeat/module/openmetrics/collector/_meta/samelabeltestdata/docs.plain-expected.json @@ -11,7 +11,7 @@ }, "openmetrics": { "labels": { - "instance": "127.0.0.1:42911", + "instance": "127.0.0.1:45871", "job": "openmetrics" }, "metrics": { @@ -35,7 +35,7 @@ }, "openmetrics": { "labels": { - "instance": "127.0.0.1:42911", + "instance": "127.0.0.1:45871", "job": "openmetrics", "listener_name": "http" }, diff --git a/metricbeat/module/openmetrics/collector/_meta/testdata/docs.plain-expected.json b/metricbeat/module/openmetrics/collector/_meta/testdata/docs.plain-expected.json index 9f8a858a1ef..6fa7a45fe26 100644 --- a/metricbeat/module/openmetrics/collector/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/openmetrics/collector/_meta/testdata/docs.plain-expected.json @@ -10,16 +10,14 @@ "period": 10000 }, "openmetrics": { - "help": "Total number of connections opened to the listener of a given name.", "labels": { - "instance": "127.0.0.1:37409", - "job": "openmetrics", - "listener_name": "http" + "instance": "127.0.0.1:43241", + "job": "openmetrics" }, "metrics": { - "net_conntrack_listener_conn_accepted_total": 3 + "up": 1 }, - "type": "counter" + "type": "gauge" }, "service": { "address": "127.0.0.1:55555", @@ -37,14 +35,16 @@ "period": 10000 }, "openmetrics": { + "help": "Total number of connections closed that were made to the listener of a given name.", "labels": { - "instance": "127.0.0.1:37409", - "job": "openmetrics" + "instance": "127.0.0.1:43241", + "job": "openmetrics", + "listener_name": "http" }, "metrics": { - "up": 1 + "net_conntrack_listener_conn_closed_total": 0 }, - "type": "gauge" + "type": "counter" }, "service": { "address": "127.0.0.1:55555", @@ -62,14 +62,14 @@ "period": 10000 }, "openmetrics": { - "help": "Total number of connections closed that were made to the listener of a given name.", + "help": "Total number of connections opened to the listener of a given name.", "labels": { - "instance": "127.0.0.1:37409", + "instance": "127.0.0.1:43241", "job": "openmetrics", "listener_name": "http" }, "metrics": { - "net_conntrack_listener_conn_closed_total": 0 + "net_conntrack_listener_conn_accepted_total": 3 }, "type": "counter" }, diff --git a/metricbeat/module/openmetrics/collector/_meta/testdata/openmetrics-features.plain-expected.json b/metricbeat/module/openmetrics/collector/_meta/testdata/openmetrics-features.plain-expected.json index a7bdbd98902..bd72665ae2b 100644 --- a/metricbeat/module/openmetrics/collector/_meta/testdata/openmetrics-features.plain-expected.json +++ b/metricbeat/module/openmetrics/collector/_meta/testdata/openmetrics-features.plain-expected.json @@ -11,13 +11,13 @@ }, "openmetrics": { "labels": { - "instance": "127.0.0.1:33419", + "instance": "127.0.0.1:33401", "job": "openmetrics", "name": "metrics collector", "version": "8.2.7" }, "metrics": { - "collector_info": 1 + "collector": 1 }, "type": "info" }, @@ -37,15 +37,25 @@ "period": 10000 }, "openmetrics": { + "exemplar": { + "labels": { + "trace_id": "0d482-ac43e-d9320-debfe" + }, + "process_cpu_seconds_total": 17, + "timestamp": 1622302012000 + }, + "help": "Total user and system CPU time spent in seconds. Exemplar with timestamp and labels.", "labels": { - "category": "shirts", - "instance": "127.0.0.1:33419", + "build": "8.2.7", + "entity": "controller", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "enable_category": 1 + "process_cpu_seconds_total": 11111 }, - "type": "stateset" + "type": "counter", + "unit": "seconds" }, "service": { "address": "127.0.0.1:55555", @@ -64,14 +74,13 @@ }, "openmetrics": { "labels": { - "category": "shoes", - "instance": "127.0.0.1:33419", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "enable_category": 0 + "connection_errors": 42 }, - "type": "stateset" + "type": "unknown" }, "service": { "address": "127.0.0.1:55555", @@ -89,20 +98,16 @@ "period": 10000 }, "openmetrics": { - "exemplar": { - "cnt_rulefires_deployment_total": 0.67, - "labels": { - "trace_id": "KOO5S4vxi0o" - } - }, + "help": "When my_counter was last incremented", "labels": { - "instance": "127.0.0.1:33419", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "cnt_rulefires_deployment_total": 66666 + "my_counter_last_increment_timestamp_milliseconds": 123 }, - "type": "counter" + "type": "gauge", + "unit": "milliseconds" }, "service": { "address": "127.0.0.1:55555", @@ -121,7 +126,7 @@ }, "openmetrics": { "labels": { - "instance": "127.0.0.1:33419", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { @@ -145,16 +150,16 @@ "period": 10000 }, "openmetrics": { + "help": "Count total disk errors", "labels": { - "instance": "127.0.0.1:33419", + "instance": "127.0.0.1:33401", "job": "openmetrics", - "name": "open metrics collector", - "version": "6.3.9" + "type": "netapp" }, "metrics": { - "app_info": 1 + "disk_errors_total": 17 }, - "type": "info" + "type": "counter" }, "service": { "address": "127.0.0.1:55555", @@ -172,16 +177,16 @@ "period": 10000 }, "openmetrics": { - "help": "When my_counter was last incremented", "labels": { - "instance": "127.0.0.1:33419", - "job": "openmetrics" + "instance": "127.0.0.1:33401", + "job": "openmetrics", + "name": "open metrics collector", + "version": "6.3.9" }, "metrics": { - "my_counter_last_increment_timestamp_milliseconds": 123 + "app": 1 }, - "type": "gauge", - "unit": "milliseconds" + "type": "info" }, "service": { "address": "127.0.0.1:55555", @@ -199,14 +204,18 @@ "period": 10000 }, "openmetrics": { - "help": "Count total disk errors", + "exemplar": { + "cnt_rulefires_deployment_total": 0.67, + "labels": { + "trace_id": "KOO5S4vxi0o" + } + }, "labels": { - "instance": "127.0.0.1:33419", - "job": "openmetrics", - "type": "netapp" + "instance": "127.0.0.1:33401", + "job": "openmetrics" }, "metrics": { - "disk_errors_total": 17 + "cnt_rulefires_deployment_total": 66666 }, "type": "counter" }, @@ -226,25 +235,15 @@ "period": 10000 }, "openmetrics": { - "exemplar": { - "labels": { - "trace_id": "0d482-ac43e-d9320-debfe" - }, - "process_cpu_seconds_total": 17, - "timestamp": 1622302012000 - }, - "help": "Total user and system CPU time spent in seconds. Exemplar with timestamp and labels.", "labels": { - "build": "8.2.7", - "entity": "controller", - "instance": "127.0.0.1:33419", + "category": "shoes", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "process_cpu_seconds_total": 11111 + "enable_category": 0 }, - "type": "counter", - "unit": "seconds" + "type": "stateset" }, "service": { "address": "127.0.0.1:55555", @@ -263,12 +262,12 @@ }, "openmetrics": { "labels": { - "category": "shades", - "instance": "127.0.0.1:33419", + "category": "shirts", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "enable_category": 0 + "enable_category": 1 }, "type": "stateset" }, @@ -289,13 +288,14 @@ }, "openmetrics": { "labels": { - "instance": "127.0.0.1:33419", + "category": "shades", + "instance": "127.0.0.1:33401", "job": "openmetrics" }, "metrics": { - "connection_errors": 42 + "enable_category": 0 }, - "type": "unknown" + "type": "stateset" }, "service": { "address": "127.0.0.1:55555", diff --git a/metricbeat/module/prometheus/collector/_meta/data.json b/metricbeat/module/prometheus/collector/_meta/data.json index dba9f7771c4..fffa17833ec 100644 --- a/metricbeat/module/prometheus/collector/_meta/data.json +++ b/metricbeat/module/prometheus/collector/_meta/data.json @@ -11,16 +11,14 @@ }, "prometheus": { "labels": { - "job": "prometheus", - "listener_name": "http" + "job": "prometheus" }, "metrics": { - "net_conntrack_listener_conn_accepted_total": 3, - "net_conntrack_listener_conn_closed_total": 0 + "up": 1 } }, "service": { "address": "127.0.0.1:55555", "type": "prometheus" } -} \ No newline at end of file +} diff --git a/metricbeat/module/prometheus/collector/_meta/testdata/docs.plain-expected.json b/metricbeat/module/prometheus/collector/_meta/testdata/docs.plain-expected.json index 0abc4c113cc..bcf2489c878 100644 --- a/metricbeat/module/prometheus/collector/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/prometheus/collector/_meta/testdata/docs.plain-expected.json @@ -11,7 +11,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:33379", + "instance": "127.0.0.1:41103", "job": "prometheus" }, "metrics": { @@ -35,7 +35,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:33379", + "instance": "127.0.0.1:41103", "job": "prometheus", "listener_name": "http" }, diff --git a/metricbeat/module/prometheus/collector/_meta/testdata/duplicate-metrics.plain-expected.json b/metricbeat/module/prometheus/collector/_meta/testdata/duplicate-metrics.plain-expected.json index bc547c74444..4380af72d6f 100644 --- a/metricbeat/module/prometheus/collector/_meta/testdata/duplicate-metrics.plain-expected.json +++ b/metricbeat/module/prometheus/collector/_meta/testdata/duplicate-metrics.plain-expected.json @@ -11,12 +11,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:44753", + "instance": "127.0.0.1:44633", "job": "prometheus", - "name": "PS MarkSweep" + "name": "PS Scavenge" }, "metrics": { - "base_gc_total_total": 4 + "base_gc_total_total": 34 } }, "service": { @@ -36,12 +36,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:44753", + "instance": "127.0.0.1:44633", "job": "prometheus", - "name": "PS Scavenge" + "name": "PS MarkSweep" }, "metrics": { - "base_gc_total_total": 34 + "base_gc_total_total": 4 } }, "service": { @@ -61,7 +61,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:44753", + "instance": "127.0.0.1:44633", "job": "prometheus" }, "metrics": { diff --git a/metricbeat/module/prometheus/collector/_meta/testdata/etcd-3.3.10-partial.plain-expected.json b/metricbeat/module/prometheus/collector/_meta/testdata/etcd-3.3.10-partial.plain-expected.json index 85a7c125ddf..a811dc351ac 100644 --- a/metricbeat/module/prometheus/collector/_meta/testdata/etcd-3.3.10-partial.plain-expected.json +++ b/metricbeat/module/prometheus/collector/_meta/testdata/etcd-3.3.10-partial.plain-expected.json @@ -11,32 +11,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:42999", - "job": "prometheus", - "server_version": "3.3.10" - }, - "metrics": { - "etcd_server_version": 1 - } - }, - "service": { - "address": "127.0.0.1:55555", - "type": "prometheus" - } - }, - { - "event": { - "dataset": "prometheus.collector", - "duration": 115000, - "module": "prometheus" - }, - "metricset": { - "name": "collector", - "period": 10000 - }, - "prometheus": { - "labels": { - "instance": "127.0.0.1:42999", + "instance": "127.0.0.1:37991", "job": "prometheus", "server_go_version": "go1.10.4" }, @@ -61,12 +36,12 @@ }, "prometheus": { "labels": { - "action": "getRecursive", - "instance": "127.0.0.1:42999", - "job": "prometheus" + "instance": "127.0.0.1:37991", + "job": "prometheus", + "server_version": "3.3.10" }, "metrics": { - "etcd_debugging_store_reads_total": 1 + "etcd_server_version": 1 } }, "service": { @@ -87,7 +62,7 @@ "prometheus": { "labels": { "action": "create", - "instance": "127.0.0.1:42999", + "instance": "127.0.0.1:37991", "job": "prometheus" }, "metrics": { @@ -111,12 +86,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:42999", + "instance": "127.0.0.1:37991", "job": "prometheus", - "version": "go1.10.4" + "server_id": "8e9e05c52164694d" }, "metrics": { - "go_info": 1 + "etcd_server_id": 1 } }, "service": { @@ -136,12 +111,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:42999", + "instance": "127.0.0.1:37991", "job": "prometheus", - "server_id": "8e9e05c52164694d" + "version": "go1.10.4" }, "metrics": { - "etcd_server_id": 1 + "go_info": 1 } }, "service": { @@ -161,12 +136,12 @@ }, "prometheus": { "labels": { - "action": "set", - "instance": "127.0.0.1:42999", + "action": "getRecursive", + "instance": "127.0.0.1:37991", "job": "prometheus" }, "metrics": { - "etcd_debugging_store_writes_total": 2 + "etcd_debugging_store_reads_total": 1 } }, "service": { @@ -186,7 +161,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:42999", + "instance": "127.0.0.1:37991", "job": "prometheus" }, "metrics": { @@ -262,5 +237,30 @@ "address": "127.0.0.1:55555", "type": "prometheus" } + }, + { + "event": { + "dataset": "prometheus.collector", + "duration": 115000, + "module": "prometheus" + }, + "metricset": { + "name": "collector", + "period": 10000 + }, + "prometheus": { + "labels": { + "action": "set", + "instance": "127.0.0.1:37991", + "job": "prometheus" + }, + "metrics": { + "etcd_debugging_store_writes_total": 2 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "prometheus" + } } -] +] \ No newline at end of file diff --git a/metricbeat/module/prometheus/collector/_meta/testdata/metrics-with-naninf.plain-expected.json b/metricbeat/module/prometheus/collector/_meta/testdata/metrics-with-naninf.plain-expected.json index 54f0e0d102e..9b65de2c6a1 100644 --- a/metricbeat/module/prometheus/collector/_meta/testdata/metrics-with-naninf.plain-expected.json +++ b/metricbeat/module/prometheus/collector/_meta/testdata/metrics-with-naninf.plain-expected.json @@ -11,12 +11,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "listener_name": "http" + "le": "3" }, "metrics": { - "net_conntrack_listener_conn_accepted_total": 1568652315554 + "http_request_duration_seconds_bucket": 3 } }, "service": { @@ -36,12 +36,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "method": "GET" + "le": "+Inf" }, "metrics": { - "http_failures": 2 + "http_request_duration_seconds_bucket": 3 } }, "service": { @@ -61,7 +61,7 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", "quantile": "0.75" }, @@ -86,12 +86,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "le": "2" + "le": "5" }, "metrics": { - "http_request_duration_seconds_bucket": 2 + "http_request_duration_seconds_bucket": 3 } }, "service": { @@ -111,12 +111,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "le": "5" + "le": "2" }, "metrics": { - "http_request_duration_seconds_bucket": 3 + "http_request_duration_seconds_bucket": 2 } }, "service": { @@ -136,15 +136,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", - "job": "prometheus" + "instance": "127.0.0.1:43755", + "job": "prometheus", + "quantile": "1" }, "metrics": { - "go_gc_duration_seconds_count": 13118, - "go_gc_duration_seconds_sum": 3.451780079, - "http_request_duration_seconds_count": 3, - "http_request_duration_seconds_sum": 6, - "up": 1 + "go_gc_duration_seconds": 0.011689149 } }, "service": { @@ -164,12 +161,15 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", - "job": "prometheus", - "le": "+Inf" + "instance": "127.0.0.1:43755", + "job": "prometheus" }, "metrics": { - "http_request_duration_seconds_bucket": 3 + "go_gc_duration_seconds_count": 13118, + "go_gc_duration_seconds_sum": 3.451780079, + "http_request_duration_seconds_count": 3, + "http_request_duration_seconds_sum": 6, + "up": 1 } }, "service": { @@ -189,12 +189,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "le": "1" + "listener_name": "http" }, "metrics": { - "http_request_duration_seconds_bucket": 1 + "net_conntrack_listener_conn_accepted_total": 1568652315554 } }, "service": { @@ -215,7 +215,7 @@ "prometheus": { "labels": { "client_id": "consumer4", - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus" }, "metrics": { @@ -239,12 +239,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "le": "3" + "le": "1" }, "metrics": { - "http_request_duration_seconds_bucket": 3 + "http_request_duration_seconds_bucket": 1 } }, "service": { @@ -264,12 +264,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:41287", + "instance": "127.0.0.1:43755", "job": "prometheus", - "quantile": "1" + "method": "GET" }, "metrics": { - "go_gc_duration_seconds": 0.011689149 + "http_failures": 2 } }, "service": { @@ -277,4 +277,4 @@ "type": "prometheus" } } -] +] \ No newline at end of file diff --git a/metricbeat/module/prometheus/collector/_meta/testdata/prometheus-2.6.0-partial.plain-expected.json b/metricbeat/module/prometheus/collector/_meta/testdata/prometheus-2.6.0-partial.plain-expected.json index 0b3f3b12dd6..30ff0fee745 100644 --- a/metricbeat/module/prometheus/collector/_meta/testdata/prometheus-2.6.0-partial.plain-expected.json +++ b/metricbeat/module/prometheus/collector/_meta/testdata/prometheus-2.6.0-partial.plain-expected.json @@ -11,47 +11,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", - "job": "prometheus" + "instance": "127.0.0.1:35567", + "job": "prometheus", + "quantile": "1" }, "metrics": { - "go_gc_duration_seconds_count": 4, - "go_gc_duration_seconds_sum": 0.004534198, - "go_goroutines": 35, - "go_memstats_alloc_bytes": 10558112, - "go_memstats_alloc_bytes_total": 14087760, - "go_memstats_buck_hash_sys_bytes": 1447018, - "go_memstats_frees_total": 15673, - "go_memstats_gc_cpu_fraction": 0.0008429952574435172, - "go_memstats_gc_sys_bytes": 2379776, - "go_memstats_heap_alloc_bytes": 10558112, - "go_memstats_heap_idle_bytes": 54042624, - "go_memstats_heap_inuse_bytes": 12214272, - "go_memstats_heap_objects": 61771, - "go_memstats_heap_released_bytes": 0, - "go_memstats_heap_sys_bytes": 66256896, - "go_memstats_last_gc_time_seconds": 1553430316.1488917, - "go_memstats_lookups_total": 0, - "go_memstats_mallocs_total": 77444, - "go_memstats_mcache_inuse_bytes": 6912, - "go_memstats_mcache_sys_bytes": 16384, - "go_memstats_mspan_inuse_bytes": 127984, - "go_memstats_mspan_sys_bytes": 131072, - "go_memstats_next_gc_bytes": 18390112, - "go_memstats_other_sys_bytes": 1201294, - "go_memstats_stack_inuse_bytes": 851968, - "go_memstats_stack_sys_bytes": 851968, - "go_memstats_sys_bytes": 72284408, - "go_threads": 14, - "process_cpu_seconds_total": 0.14, - "process_max_fds": 1048576, - "process_open_fds": 13, - "process_resident_memory_bytes": 35934208, - "process_start_time_seconds": 1553430305.4, - "process_virtual_memory_bytes": 150646784, - "process_virtual_memory_max_bytes": -1, - "prometheus_api_remote_read_queries": 0, - "up": 1 + "go_gc_duration_seconds": 0.004392391 } }, "service": { @@ -71,12 +36,14 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", - "job": "prometheus", - "quantile": "0" + "dialer_name": "default", + "instance": "127.0.0.1:35567", + "job": "prometheus" }, "metrics": { - "go_gc_duration_seconds": 0.000038386 + "net_conntrack_dialer_conn_attempted_total": 0, + "net_conntrack_dialer_conn_closed_total": 0, + "net_conntrack_dialer_conn_established_total": 0 } }, "service": { @@ -96,14 +63,13 @@ }, "prometheus": { "labels": { - "dialer_name": "default", - "instance": "127.0.0.1:39775", - "job": "prometheus" + "instance": "127.0.0.1:35567", + "job": "prometheus", + "listener_name": "http" }, "metrics": { - "net_conntrack_dialer_conn_attempted_total": 0, - "net_conntrack_dialer_conn_closed_total": 0, - "net_conntrack_dialer_conn_established_total": 0 + "net_conntrack_listener_conn_accepted_total": 3, + "net_conntrack_listener_conn_closed_total": 0 } }, "service": { @@ -123,12 +89,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", + "instance": "127.0.0.1:35567", "job": "prometheus", - "version": "go1.11.3" + "quantile": "0.75" }, "metrics": { - "go_info": 1 + "go_gc_duration_seconds": 0.004392391 } }, "service": { @@ -148,12 +114,47 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", - "job": "prometheus", - "quantile": "0.75" + "instance": "127.0.0.1:35567", + "job": "prometheus" }, "metrics": { - "go_gc_duration_seconds": 0.004392391 + "go_gc_duration_seconds_count": 4, + "go_gc_duration_seconds_sum": 0.004534198, + "go_goroutines": 35, + "go_memstats_alloc_bytes": 10558112, + "go_memstats_alloc_bytes_total": 14087760, + "go_memstats_buck_hash_sys_bytes": 1447018, + "go_memstats_frees_total": 15673, + "go_memstats_gc_cpu_fraction": 0.0008429952574435172, + "go_memstats_gc_sys_bytes": 2379776, + "go_memstats_heap_alloc_bytes": 10558112, + "go_memstats_heap_idle_bytes": 54042624, + "go_memstats_heap_inuse_bytes": 12214272, + "go_memstats_heap_objects": 61771, + "go_memstats_heap_released_bytes": 0, + "go_memstats_heap_sys_bytes": 66256896, + "go_memstats_last_gc_time_seconds": 1553430316.1488917, + "go_memstats_lookups_total": 0, + "go_memstats_mallocs_total": 77444, + "go_memstats_mcache_inuse_bytes": 6912, + "go_memstats_mcache_sys_bytes": 16384, + "go_memstats_mspan_inuse_bytes": 127984, + "go_memstats_mspan_sys_bytes": 131072, + "go_memstats_next_gc_bytes": 18390112, + "go_memstats_other_sys_bytes": 1201294, + "go_memstats_stack_inuse_bytes": 851968, + "go_memstats_stack_sys_bytes": 851968, + "go_memstats_sys_bytes": 72284408, + "go_threads": 14, + "process_cpu_seconds_total": 0.14, + "process_max_fds": 1048576, + "process_open_fds": 13, + "process_resident_memory_bytes": 35934208, + "process_start_time_seconds": 1553430305.4, + "process_virtual_memory_bytes": 150646784, + "process_virtual_memory_max_bytes": -1, + "prometheus_api_remote_read_queries": 0, + "up": 1 } }, "service": { @@ -173,13 +174,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", + "instance": "127.0.0.1:35567", "job": "prometheus", - "listener_name": "http" + "quantile": "0.5" }, "metrics": { - "net_conntrack_listener_conn_accepted_total": 3, - "net_conntrack_listener_conn_closed_total": 0 + "go_gc_duration_seconds": 0.000060618 } }, "service": { @@ -199,12 +199,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", + "instance": "127.0.0.1:35567", "job": "prometheus", - "quantile": "1" + "version": "go1.11.3" }, "metrics": { - "go_gc_duration_seconds": 0.004392391 + "go_info": 1 } }, "service": { @@ -224,14 +224,12 @@ }, "prometheus": { "labels": { - "dialer_name": "prometheus", - "instance": "127.0.0.1:39775", - "job": "prometheus" + "instance": "127.0.0.1:35567", + "job": "prometheus", + "quantile": "0" }, "metrics": { - "net_conntrack_dialer_conn_attempted_total": 1, - "net_conntrack_dialer_conn_closed_total": 0, - "net_conntrack_dialer_conn_established_total": 1 + "go_gc_duration_seconds": 0.000038386 } }, "service": { @@ -251,12 +249,14 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", - "job": "prometheus", - "quantile": "0.25" + "dialer_name": "prometheus", + "instance": "127.0.0.1:35567", + "job": "prometheus" }, "metrics": { - "go_gc_duration_seconds": 0.000042803 + "net_conntrack_dialer_conn_attempted_total": 1, + "net_conntrack_dialer_conn_closed_total": 0, + "net_conntrack_dialer_conn_established_total": 1 } }, "service": { @@ -277,7 +277,7 @@ "prometheus": { "labels": { "dialer_name": "alertmanager", - "instance": "127.0.0.1:39775", + "instance": "127.0.0.1:35567", "job": "prometheus" }, "metrics": { @@ -303,12 +303,12 @@ }, "prometheus": { "labels": { - "instance": "127.0.0.1:39775", + "instance": "127.0.0.1:35567", "job": "prometheus", - "quantile": "0.5" + "quantile": "0.25" }, "metrics": { - "go_gc_duration_seconds": 0.000060618 + "go_gc_duration_seconds": 0.000042803 } }, "service": { @@ -316,4 +316,4 @@ "type": "prometheus" } } -] +] \ No newline at end of file diff --git a/metricbeat/module/system/fields.go b/metricbeat/module/system/fields.go index 13bc793b2b3..e53fbea4708 100644 --- a/metricbeat/module/system/fields.go +++ b/metricbeat/module/system/fields.go @@ -32,5 +32,5 @@ func init() { // AssetSystem returns asset data. // This is the base64 encoded zlib format compressed contents of module/system. func AssetSystem() string { - return "eJzsfXtvG7my5//5FEQWB+PclRU7M5M7138skEnO7BqbjI04OecAi4VMdZckHrPJHpItWfPpL/joN/sltWR5YONi7oktFX9VLBarisXiOXqA7RWSW6kgeoWQIorCFXp9Z37x+hVCIchAkFgRzq7Q/3qFEEL2j0gqrBKJIlCCBHKCKHkA9PH2O8IsRBFEXGxRIvESJkitsEJYAAo4pRAoCNFC8AipFSAeg8CKsKVDMX2FkFxxoWYBZwuyvEJKJPAKIQEUsIQrtMSvEFoQoKG8MoDOEcMRXKFY8ACkNL9DSG1j/WHBk9j9xsOL/rm1X0s5mbo/FEcojqL5huy36TgPsN1wERZ+3zCa/vm2ghSsJTdFv3GB4BFHsZG/SBgjbPl6Whs9iJNpHKja+DLAFMLZgnJc/OOCiwirKxSDCICpAfDsF/ASEF+YaVUkAiRjYArNt2bqMhYIC8D8hmKpEKyBqWmFIpFojWkCiEjENChK/oQwpcSSaA4iHSngAqRRI6KQwGwJskTN6M4FUhxd+gUkFRZqpgHX5BSWJ69DCobnzQpYid8NNtMmFIT18a3mP8EcuSVXBMqDIIkJhIgwFGH9H/uZs68fvryZltZOZgLQkKVzb792jwLOFCZMIsoDTB21vitKz3dNWMXRO2ThUJxrOgUoWpUcAi1jhLWiLimY8bTEMIoSqoj5XsH6pD9lg5PNVoWJIiMkLP06ZYVytqz8oYUb/aOhf9So7MLIUZU++T/QbaYB0gtIcYVpRRdRlz6iVp3sgf6bHhXhQJE1eMxGabq9sBMJ4viou6weYQYYkjEOoGFKShwoEjzIcTRCg8MRT5jaE5hT81MU7gMIBnQIFyMKuFPCA9AxEsDpSZgzRPnmPBaEC6K26SYBsg83R5P0rihJSE9Q5gZVD+DHU+QegPgGE3WCsmRIA0NnnKGQyIc3/fg4po0Yhk/8cXpCliDWJNDRmHa/V5iFVP9jhUW40QEcYQqESGLVuR7FH8cT/WioJV+o5zQvGu9uHD713OyAXMFT+LI9zBJha04TprDYWhPgHN01ESrB1HxjsyLUxsirbaxFIrmoDWYCy4K8uFqBSLdALqa1L3xYY0LxnALijG715vmdkcdegjymXXxmAop4CHRmQy+vhOrJnh5CMuGoppwGdehGQ8IWoQaIPhOWPPbChkupjfGQ4Qh2xLX60wvItyB7wDEheZAIoTUooDx42A2WpjNrCMt3llW82koSYGpRXn/S0FxWISLLlXL/hUcIEgU2yRAb5RaAQzlBK2ABoEh/Qa0wqw3CGaRJjakmOyXhPQowQ3KFhV0kEkeVzzhW73cTVMrT6MIyYskkZoXVCq+QyHtVRTEkKRTESS0vpQFJhYt7zS55HpOgHNF2+tKfsQDpAiJjFLlUU/thzs7zDGqNXr5ZSbQhlKIVXgPCKMKPJEoil4XlC3R/eXHxN/Qfdrh7Q7tGrJCpLdLFVCvyFin8oLUxz+0yxREOArMT2O1+XSfqwaKh7Jzkeg7ZInTD6slGOamR3fLELHQzaUWRZ0coSwFYgTCGw8qteHYwQWSBfqyRdRl1AQgr9P7ibxraROuVVa7MjsTJNJXmvdWeOaDLXxon56+VVfpr5W2eb0bkr5KAeEaB5Euo7OHwJeAcJ556olOoHoI0h+8SWbbNjnodUjCKc33zT22FmpyS33PPqJd/oj2pkxTB0JOjk2Vk6EZ/mozstdufJkv9t/wTxb/Dvn+anIy++T8rNnf1AE6TyefqBpyaNPt4AZM0ESJ9JWsmuPbwXvEYvtUS7s+lWOSUyyyeR2HCCZ7vn/S5+FOfTu6+Iz418l03uZfjwKJMtJ4S/qoqiiHHD5pE4fxB/xNd32QFqT0r4dOf4WcUA48Is9pzGeLL4dNt2DOnhx3KBoLg8c9WUwg/SDdCdsZqKs8jvEWMKzQ3pdFrEtptHFOaC71G0+XoOxgSgMOpOfAYcfEYT6ngYZhjQxRwPUNaZWQSaA1fJJRuO/BtBFFwcIBmlB0RGgnOt6r/iVrqCvq+tAN4Q8bAKMNGN+5o0h5xkepQqOIHSggUF46SO/QlTtMYwlImkZaM+RSS5E/jh/58+a7XDD69gDQOBWwcGaXEeoqpRrVbbEatKldAWoW2g2AiQnVMEHAWyrzGXZsVs2J7TeyTQbRrttNZPDRAP8aQ633w+u2NLG/iTSB5PKbzUsWocWjHJRZ8KUDKusMATAkeb/fxGHLfxN2eqdMc7gXglOhsTtSo/l2GVhPWQqrDLVSXPHm8n+N1OCdamtheUeH21hTnNLPLP1381/vaLC8IhdJFKbSTa5iTqRWo5H8ao04lY/pIG4fxAk3oXpC34tquJywWZE0oLCG0CQjC7DBTL/QQ1iSAkQvdyp5q+c7l/dsQ1m/1Xy/vvYj0uAeAomlUocCj+ul+iq4ZkjwCFGAJ5gbbPwkL+UaimzsbL5nymbRM4z5hmdDvEZYIm33aarfem5mdXcKZvYSp9DbANxCiM3icInhUIBimBpZ8458WE9XNYk4a3MmdZWEIa5tvaNfmxj8lZrWMZdQqNp8wHoJMy6/smpzosDRYZSLH2uOdE2aFyhcW0AQtOA1ByAmS24gS9iAnJki3Ot2g8Nwg83Ozs1Qd0WoxWcHKGLn7ES0EPKnhaDcQGt1sVAUoOaqafKoDJJeaJzSvJLiP6qMX5NYurUTCcYMsPeBAeE/vJFRAt+X0MzWUep/eyx1wKmUpFTyC4ip1WSO8XApY4ixtpP14s4IrhaD5V/eudN01cfB7vpTydSPRgicsbFk+eyzpI1pw9Ds3xtRtyG38aIdywNLyq09duiCNEuSiRSEPZDXj6Zta1G7iW+Xdhb6Gs77qULbXGhNbWWhVgHpFPhlAYw46APps/vEQWtt6ZoDGNJFGpm/q4SnlONzHRn28/W5oILwGgZewp1V5ffl6qKXXfyJsOVvgQHFxhS4vLoZZ+88F+MaZzvqVRIQlCvxr+PXPp4T0Z4e1weC8vjwptJceuH7cpibgqXTCowsoJNkhQb+z/jo7TzUVfoUZg6Mn064GrdqTJ/MhP0eHvcVTs862K89ePqQlUUsnuX4/I6SSjhbbmH3NNVFqn8GjxjTf9RbbC9YRw2YbBOZH7cajcnOeBVzF5lshB5v5ISygSZh9OODMHrvMt6k7GeBgZbtw1YaeJ4sFCInOJGQBsRMNDlSC6bTihvhDCz1A74ZJe6vURzNcyjBntUj+5APTXtpnJ2C3oKKO5IOhlnfzg9CEQXp6u0KNVpfeu2zREdxmx1BBnoWFcq2QAGexpbHXIdGabm7rzkFtwN2Xc+uOheZfecbKzZD3KqX+qX4ShRADC7MY9ebOJj7NzeAQFCZUTlBsbDUKVhA8ZNmCwkK7b1AJ9PSBnhO33y5dK0QkCjANEmpSGnOsp6Ugi/Lhcjnd/QWi/MTMJEPexoIHbyOICFvwSV0W+oeL4oDma0VwJobKLV9m6ciiTD1LoKcI6gGi/rlh6ObuX4gYRjGSSVS10qkOEebapaUqdJMlFybu+/BHfWG7WeSZWriv91WLBvOG+pg41GnmUM9Qtn5YV1ulXWVFG1y1bM02LxawII9X6PX/M2z9/6oPWE4qac0zVHLfSrtTRCoSSHuGCGF6hKhxlHqflrNPQ9MzT5xcyJnpq0pPZdaNdzYM71NZxPyUf7h4T2+lJo2Cz+oQQW24eNgrunE0CuGN+02xorLU4jP9u6mCXVQyeMcrpgS1GhjwmkCyCr5PZSVP1FEPeKrlYbLU9NcLkbAnRSggALIu9uxtFGSMgwcYtV4mB+No9xTY4ZCIDElPwRA2BSG4OIxYLGlX920REbbsMVfHwiSBhd2ICJuGgsdx/8h2ECLCAh6ZMgk3d6YvyAZ0vGCH7SGxQwLkiVrydoCVbuCYbvC2vpteaNfpExYbwoyX/OvdJzSHACcSnEOsHXABMRcqzwE219BX9qOZTKII98i6ZZvFHBTut199cTuSLTBjS+0dLimfY5qZduPtE7Xtuf+QePof3uni839DzSnomLDrW3usC6KhaXQw5mjfPnYMl4RjDvf9U/dwM0oUjDzmZ6KgfWASRKPO4scvHk6zgsvSUwhoJ6/L0Sh4XXH+UgIOscKTYo/1SfHhh0rndzSu14UpwVWLEWO1yvieer4akaXAllH3okR9xOrbDmj/EqyB7zwU0cQNvdi62a9/sw/38R4DYqHdmR3HXe4+bv2rfUYMopASNvJMLxJKUcCjCLPwXJO30ZHi9rGI4ssME5eAN5uDJ1mIxTKJTBZSQowFdjuctxaBLBkXMMNzvoYr9O7ip1/8dk+C2GFB2eYlu62mYLPrtOo9krDlLCTC3APZ7jA6sHV/Y2t/OdtTA4CtieBMzxxaY0F0nC+btcD289OG1HdxBhfuKqLfBMCvd58mNh9qTe3NHfqX33CUWyei8bJhH2+/n8sYArIgQTENFufXLofmuBovv6OubEzPhIXnJmrp8Zq2W/FVsLaFgXFdD4Q2a4mowdoUon1ex2iPsxdNsu5uuYSeOF806CGhJA7NnnmtCuGCJBGhWLiMq3fYv+lRMkEWBwiJjCne5vGC4nFqstPbwPWLn37hNjSyeFYS9jzVlFMe88mmjOn86aZSy8+qiFs6T6Aj2wV/R4oqYKsTh8RrDx1bp7dFnr4XscrowrrrOwRd/5eyUFvpC+p/XP3FfHfoftS133XtV556XnSMI5lMA9IuCZ73vlZYFk8O7bFp5Uj7I48iotDHFRZLQGfKU0aSUcbWXUljOszwEoQexdhMoswZqkm7u0AmRfImawjscq+2hIvIbk0VUj7ZMZIW8leQJNRL6w4UuiN/wrRiLQa/s9Y1I2mbc+f0IgnKaNmk4dJEVVqntwft9hSdjz/T8PyJNMGMHfqYSWTjrSR/xLND6c1vhEL2GS6cL5jmVez2rDXFiNvmG4ksBA0LT78UW0yhd2kXT4xtHHkM9W72Q7a/yiWssgykod97z6MkImoq+aJ5eey3I2vSdpT0mL8DeuY9eUmWosIC7QAzNAcUrLRbFVY9OqwQZluz/3aJYoVrQe1YotCkDyWKAm0tCtO5Zw5I4LQdm+C84Qpj4Ft4Oy/JNK+vF5DBI/PmPXYk0wvFXDAy+yqWD7byJ4LyM47pj/tWdr1LQH6iUXOm9L5rCckVibUhxTWCjLNzLQ5H2QhQQmkAXnh+gebvLwyN22t5N9SRQeshYOS06fqTcTC0JnFzx81yIxGWkgfEpMM2RK3sdqrF7I9hrk30J3QEw35Q9rKXpnr9ySZlXCeMlLqhZvhOq8y8VPG85ei2KKIYq9XhhKSpp3VHTo+qHQ3cr2Uyt/HUD9LeFrR3rAeJzIx2DKE5urM1CEn4/ruJo2OuBTjI2RJLLxZUT0uawdUSa6jVoNQQNU9nECf5RCEZrCBMKNhXbN1NfgMXy4fsRrJb5F6aH+x30s2DMyU4pc7sbniWWM6GEnKCPv52Z6zb129+ovrvUmEWWjBpvye6RQtMRE7KGcFYcC1pwhmmtBrlOemYOxwuNElj27TWNp2wrDB0A2S5UlP09VsBhpeuAExdoFwBJUHJwhsk3jSA11lGec/H8gQYIbsSehQmwjSjQ0uyBqYdY8LDhrXGbJaPhSAyXv/xblIkTbTNF8vU4EV6r3dJLWfUm/MsQZzgIFCmkQQOQ6InYqIRnecyKe4MS85MyPaPpt5KjnbDzoC6dgfUw/ih6oq5/pTyW9X2VgANtncnCP5Fq39ud7HBjdR8trmVSXOvp5XLJqNU49HCXL9rpdk286iU08dLmNaaWdThNRjxFoQSrd+5WIgwxDDjrnFUT1D+YLmMqila7gWrr3Cas8fjgClkbMu4egAEccDJ0xudOWtJ2y8Pm0TvW091cLuKrYSup6iOOJV+eJ0407cbDjapzm3ZZUob346qg9tVgAV0vUV1xEn1wWu1+8FCTp1jkbTb/5bp7LvFmXHMHuwmNyKBSGfXuIErvkEClgnFQoeWjaQs9z8UO1Np/0eA5IkIQCK54gkNTXAPmFIeYNVY0OiTyR8JV/jwIvlWyZc3CsY6nJj6r+0YSKk7j4u+pEhY6kdql8xONTrDEoWwIDZ30izlonI0XcL0Sc/kOw8tuw/MlLUvQbgjAnPK4M5wQDvmmQNlH7ssOOaNREvN5tLMS0ms08LhejpY6Lz4ZknGiROKzWFFiTQ9hN8hrfRkuSqmdFrFK9QJr9dsXTbLt2G9mrOMoQtVqKlImMlXnoIwzFk4Z0uQykTJhCU8kW7NNRImrJLnKy9i++amX2pDfHunNYcWU96ryZkac/Nkjak0Rqe0YPSiKJuYZuOml7YRBVAcy94aYllXK8GVohAeXQhaV2TTrM7tJWCHDZ0ZJonnKc/0p9hoUXFj29M6drWCrRPQ4wonpqWTaUq+aLVLBXOntbo0QzapTgQye2Ff81+V+OG30OzY2bAQJracD51Vluibwj6aT0iHh+GbqIkWU/G2gHPF1u8GCabRgz6GYApe9Why8Wem8jJykDLxnsCi4TmGW0cNnaXG0FhcYPrPb+pdSoo/fVMPkrf4CX0Q11DfpW5IuoU4r04hClgq26LVzoH+oFTYpFk5y3KAKbctI3axV2Tx8qIjMEG9gxPUqwag+OOfUL4GgS4vUFfMV2Tj/Ymy8X4YGz9enCgfP14MY6TpsnmdjY4cwZ5cWOt3p1dVan76Re6LpCXQGnXpU2oOWklIe658JEmUUIUZ8EQ2nIQ4wb0YglNh48UQdLHRwxB4lvZvCaUNS7tGrHDwioOWOrdeh6/uKDXtNO65o5b+vBxxZT9PfMTlau2Pk9IrPgpZcLZL7dG08S8ewnf43IPYbDYfvao5B/CbcVpSPPNqQKWWU5sQzXP6jWHz1p5FPx2uJpUbDvZOQ8KUq7QkEi0SFqSlDOalItfzNHUPbEE+1rGr1g1T2OBesxuW82k/fxum8ZlEiiqcqa85SYp42HdSC/jGntTs/kVqTOrXsia+iSzfivCO1Fvkh1DWcfhqVs8hE9d1Cji6ap3ZuzNvhutY56HgbrPxrWk2ipd8hujZAKkfQrvG4mdf/dK0vaVxqP3abfpTun67/26eqWYta5bpKmcIcLAyH63s6i35bCK7t/XWq01omMdqrzilxca2v8KL03ogp3W4cxpBNLXlPE1XTVAfs9p1X2UA48X2ya5Mar5trFs8Sy8Y9T0nyBmO8OPpML2CrJyz2Kp2bM7tLYpT5DqvRbAuXbnVquY27TaxILXX4PIf0/n0jbv4Vy80NlmuwlFWIvtu6lp6C0xocvgCg/INIneUV7nJaC+TnFXm9A3a1NpS5D8CTAPpIerCN0dWlpQ9vkFqJUCuVpz6LWkR54osV08DVI88BOnxjU529fWxC2cneHPXfqRq3bqCF0r8BVKCxDGEWRrabgQU1tCU1+t7vEb5piXhN7yEMFfVJrkWR9f6MurwBQXsM36EH0cdPlerPqNzHo06OjdX1waMPnsgPU5YhkLQRLXO9kaiN5JRUWiCekerIeht6+Xm1PzAFaTtxtPr5SWn0DQ6N3177RNSzl9qpDemH5UJ61R9yNpdfx141YVVEkpL0LivsE7e7UzL6JzCVYXWfi3iIM6mltrz8L7k5vn4X3Jzch5YD8gnFHdUra5Z2Y0Uz2rL30Qo9UikmfcXn9PDyIvP+eJzPgOf0wfj4VQzju684WCJx4fTzzxWRdCZgGykOlwyJ+8i8kVFPm1uXyPhndzBh9NMPlbnbczso6Y9U0F8kqaiZCN06PDt423+0Fat49kQRk/VNBRtQpVjj41opLmP9TRieg52wgmrKqeaweiS0s7xYyat0zQa1Ylsvn/lDRZaWbcVC9VHCsoMtx7kl1i2LxjmLfSub1q6S1Qg9FDSEYH0QGTf55thxv2vGJWxHWcBfWCcbSOeyDzZYo7wTAm6fU/Q3FE5FxAAU3R7bkzQ2eev35u1hhKpSv3po3gh0ZlcRRC98fWk7C+8BaHH3o1+IxTO5zh4KL396oTz+ev3jN0duDKyPjI/t3rXNAOPPUcrAgKLYEUCTGdWVLPT2i+K1TBZ0jGF7VzK7K2SgvG0G0LzDc1RxCU3pymtPOfUW26NJMvy3E1u6Uunz8eSZm+zFs1FaeU1p/CqK3InST2B2WyWlN+gemW0g3ZEOI4hPC2O78ifha7G5xYicv9PI5XNpnhcmxPjJcwWOKEdOd0DXIbXNgJnrUjLIbsSZLkEYZK/cdtZj4E+UB/+zcXsGfBtgHYwjl5/0Z96bf8p0UqrEMsbvboMiX39mG5Nw1fF23IC9vFo84KM6fgXkmIr1J4aJWeNuagDNJjQA5r/mi4TvPBmur1mgdNHzXbggyft5dWHYoQnhch1X1baGuD3YuUY26KrKNQrRGAm7fNfaJUswcjlzQQx3nyyNa7jKqSc6ZFPRmq/Vx6e5QuEM0F65TXsbsQGxyfD6112wr/j7CUM1iRQ5hH9U2HqSyFHHWDGuLI9yQKKSQRhL05TLuf0gfhs+IBbAL9SHhSfun4p/h+7+H+H2n97wfFUNNam1qsvXhtbswAhbApU23DjJmBK0dwoVagXX+PgqOUEa5CYCD/OBd5cANdvb9LHgDkz7by0tF13Bkr3YNz0W4L8HQrXSse8fsMpCbbNzzDsawgcgH+808bgS/rsqoCY4kCPb2zNi3U4jnXwsTBu/jwGcW71VM+3ewywdwJ9ZxQ1QqPm4vdkqtOUHBrJ82uJdby+OC8tsV464bx0wumDa+cmV8frb5fdiH5Zwi9LeF8+/hqLMvcB7PNkMokiXLrjr4iioDm0+eK7+ge8C7TFd3UksodaKm8Wgcze3nQPr624LHmpAvSmrAct9gf1Lc02CTdKtMPtrsZlOWwDl8ga3kKnaMvYSEjyrFzlsdJeWEhYuze9PxDTQHAICkkB4kOIJCU8DI3icQz+Fy/3AmPpDsLyJ4/mZPwZsmQHIQkBjy8STbQJBbpWP0i0BrFFCaPkAahLXRJln2TDcQxYoHliWsMY59w0jMYUSaISlyIhCkV46w6l/Kxt8AN46vH3Zy8lfK4DnkZxoxtGt2jBE/tYO6chCPem6f+1R2fusbeGx1n1KAeBfljYMRYPB1hlluxY0CeIi/QlMxAKE/Mimn1zrIGvhD0wvqkePY7AWMZLoUf2ysb2OrxOaMh+cBl9JQistV8rEJEpIj9ctRKAaz5KZcP/5v9Qo1de7qjFE6bMcVGhfZwb1nrerpdUhUjXU53+fbRV2H5shevEdJttow5hc9rTpJprGrzj+Kk8HFE036LrtzfTmo8mcCmhOdjvqnx/uBel/+vVA38as0u9cd7W0CatmvZkrGrd+/cY15T1ELV1dqIHAt+Vvz0AfFuZp35DS7cMwC+BLQtm2LRqHA/FR3eJXhNHlvgEEYvl64frTwgLgbf2QZQwYSFmCvm9AyIf0nrYkSxfwfS5Iiw7SMv4h/TwzQiFSTI914g0hq0NkzkUH18khmzYLRJ7IW/88d1Fv87xzfqqnx20JLVLTfN20moUYfNktcAbg8JukdKL0tjbcTWnUCdhiBeVZsVpaOrq0OXFu5/O51sFKYQ2eHp9HsBXcvhchO0g2towYXJmetwOtJl9AlGxXf69Kdtx5qBwvz2rmCNIHxK2o8kjbFrmHkthm6ozWrzTjcOZ0bZ9RtNUUGljahtz7+HSvXDAkMl8fy5lMj8fxuRMElZLzNoxwzqY2oCm9FHhKE4HpOZQx7rPK8yWMHXvhKdQTLWb3XswC1PPcGIjCf1/SqIkLrePLqKGRwhmAQ/3ktPd9f/++H8+f0KaTv4wv0P4g0SRDkqqT32jUkBClC093n/OivOl6dYb79VHXQMLuZjFAiRUjf2g0UMwFaZDUGTPk+0Wujhrk70mXXun36+13bFLECfTlueEBwQQt9/7vRtc7t/acYW2//ila6+16wDVwc3Jy9SUj+41auFeoT3L6T0xhT0B1IaLh0YcvUpXHJH8RZSmrkC9SlWOfXHEllM1lEkXUMU4eIDdi9QH43LjdSHjidoXmnfYpnrr4rh7TZRnEopj1n0rroHtE/Z/+3jrqMjcwbNb236HKiER0ByUYkpqt/9jrFbZwpk2fT8iS1vkdoWUSBo6k+dtTCJSe36oLwL9uX0GpzzAdEqqpsIOX/s1POIopnCFLv/r3fRi+m56ibhA7y4uLq8uPv36y9WHX//+6eqXn398f3V1Ocyt/6xxoOtbhMNQgJSuYD/ADM21/4Kub9c/6cGub9fvsw/14S3mwr9ve1Q84+9d9QXCXvD1UB2YBERcwQkI/KsBMrLEHXdHEbljoL/MV1wOceAyYP/5/vzd5eX55eV/nv/4fso2U/eXacBrWd8OzLffviIBARehd9MX6ZxM0bXSLjqfK2yell4TjASsQcj69nx9iyjnD40lnRUxgKLhLKaJnHE2xJ3O5LEz+9oLhsUCAlfXGZ/b9GHITRRwBt8+f3qTesZOFnrS7HVZzgBFvF7jR/Ec6BT9xkWKbGIIaGr/89KE3a8XnE/nWEyXnGK2nHKxnL7W8n1d/EUtV/4tu8bFBQpBgYiIS65b8ijgEUhXvs0QRHMIQwhRwONtlhTFqvYEqPnCSqn46u3bOJlTEshksSCPBkdvXZ6BELXrbXsknv6uybkPzVM27Zu42ZwYDXTqhlwrjg7EaV1GXKtl7trjmr85aItLyQQ8ijDbFYQnCbMbiiikZNDC65g283Kb4w2VSLfigEc/hm5JwCMEibkbtI88zOs+g1XC/63hAzem1DqGXiSUzgaoQtkHbq5NujN/R56/71uaxBeIx8Ay/5nkBUkuQbCXB40bCg86kxN1Rf5g9Jgx61FXJ6EzJ9EalhOmYAm+u8A9bihoYEaGzegKTieRClpPdvfGkg1hnB9/2kwFfg9zx3nREdjuc9Px6k6zQLpi7x4C+1Ju/VcMJdOEzwTNsbR1tHlqBlMdPmj3zF4qNndtbUItNpcSyJ8wRR+5ECBj8yCh4umbQBJMUc9bbTHfyq18y0C9JfH6p7cqiGcRRK6GI38znjNbwTFtvrNYX2loWLanWaHaZxf1TABxEa9w+6X15pnuidYgtmvdTZIbFkKt8unUNsu3lYMmGzI2A6k96ZZ7P7tyAHwaWpudqcIDqT0CIlfekpKRAeZngIVhB0kzoFzCbIMbOz0fBG0FobYRsxzJzHsYVsatSHQasDMgfVDLLZvJ5kr5o4FOcfTFLCBYnwJmjaMP5gVhZk6qqaCjg86ADEFdzf88Gep3fVBTLNUMB74TmKOCTnH0waxtzVF2kG6TR9jShzgL0sJR3dfvn/4i7qtm5And1yQ8Rfe1fXZRT/f12M5fE+qW/5GtjrhyLXFwluDekrgvt2Z0vRnYMlUV+ymXS9jzqC2xCZJp5K9m8BwNpMsn/Wrlz4TFiZqlH4oIpcRfPtCjmPXmLuWVsBKpeqlYIkHITtnvUCj2mS+XEJ5nz1CDlISzagK5TcYN6bSdS3zznhEOjHdUCbWbhnuM+4EVj0YoXxJtuapDtLSn2JPnT78m0lVxGup9JOA5hN0Thf56ViNU0IaGCfDViuwzB5ny9S1NKR9PeJHMOadQyw90ItFfM1cvAmuZcHoy1CqRfUrF/DOSvthWKfprwRDwsbWiMBvWQIeeUfKSfxzWNqud68lXgATnCt32swl2jmYDj1w7t9APpWNBdyadP3VWAZT/j/8OAAD//+0wZoU=" + return "eJzsfXtvG7my5//5FEQWB+PclRU7M5M7138skEnO7BqbjI04OecAi4VMdZckHrPJHpItWfPpL/joN/sltWR5YONi7oktFX9VLBarisXiOXqA7RWSW6kgeoWQIorCFXp9Z37x+hVCIchAkFgRzq7Q/3qFEEL2j0gqrBKJIlCCBHKCKHkA9PH2O8IsRBFEXGxRIvESJkitsEJYAAo4pRAoCNFC8AipFSAeg8CKsKVDMX2FkFxxoWYBZwuyvEJKJPAKIQEUsIQrtMSvEFoQoKG8MoDOEcMRXKFY8ACkNL9DSG1j/WHBk9j9xsOL/rm1X0s5mbo/FEcojqL5huy36TgPsN1wERZ+3zCa/vm2ghSsJTdFv3GB4BFHsZG/SBgjbPl6Whs9iJNpHKja+DLAFMLZgnJc/OOCiwirKxSDCICpAfDsF/ASEF+YaVUkAiRjYArNt2bqMhYIC8D8hmKpEKyBqWmFIpFojWkCiEjENChK/oQwpcSSaA4iHSngAqRRI6KQwGwJskTN6M4FUhxd+gUkFRZqpgHX5BSWJ69DCobnzQpYid8NNtMmFIT18a3mP8EcuSVXBMqDIIkJhIgwFGH9H/uZs68fvryZltZOZgLQkKVzb792jwLOFCZMIsoDTB21vitKz3dNWMXRO2ThUJxrOgUoWpUcAi1jhLWiLimY8bTEMIoSqoj5XsH6pD9lg5PNVoWJIiMkLP06ZYVytqz8oYUb/aOhf9So7MLIUZU++T/QbaYB0gtIcYVpRRdRlz6iVp3sgf6bHhXhQJE1eMxGabq9sBMJ4viou6weYQYYkjEOoGFKShwoEjzIcTRCg8MRT5jaE5hT81MU7gMIBnQIFyMKuFPCA9AxEsDpSZgzRPnmPBaEC6K26SYBsg83R5P0rihJSE9Q5gZVD+DHU+QegPgGE3WCsmRIA0NnnKGQyIc3/fg4po0Yhk/8cXpCliDWJNDRmHa/V5iFVP9jhUW40QEcYQqESGLVuR7FH8cT/WioJV+o5zQvGu9uHD713OyAXMFT+LI9zBJha04TprDYWhPgHN01ESrB1HxjsyLUxsirbaxFIrmoDWYCy4K8uFqBSLdALqa1L3xYY0LxnALijG715vmdkcdegjymXXxmAop4CHRmQy+vhOrJnh5CMuGoppwGdehGQ8IWoQaIPhOWPPbChkupjfGQ4Qh2xLX60wvItyB7wDEheZAIoTUooDx42A2WpjNrCMt3llW82koSYGpRXn/S0FxWISLLlXL/hUcIEgU2yRAb5RaAQzlBK2ABoEh/Qa0wqw3CGaRJjakmOyXhPQowQ3KFhV0kEkeVzzhW73cTVMrT6MIyYskkZoXVCq+QyHtVRTEkKRTESS0vpQFJhYt7zS55HpOgHNF2+tKfsQDpAiJjFLlUU/thzs7zDGqNXr5ZSbQhlKIVXgPCKMKPJEoil4XlC3R/eXHxN/Qfdrh7Q7tGrJCpLdLFVCvyFin8oLUxz+0yxREOArMT2O1+XSfqwaKh7Jzkeg7ZInTD6slGOamR3fLELHQzaUWRZ0coSwFYgTCGw8qteHYwQWSBfqyRdRl1AQgr9P7ibxraROuVVa7MjsTJNJXmvdWeOaDLXxon56+VVfpr5W2eb0bkr5KAeEaB5Euo7OHwJeAcJ556olOoHoI0h+8SWbbNjnodUjCKc33zT22FmpyS33PPqJd/oj2pkxTB0JOjk2Vk6EZ/mozstdufJkv9t/wTxb/Dvn+anIy++T8rNnf1AE6TyefqBpyaNPt4AZM0ESJ9JWsmuPbwXvEYvtUS7s+lWOSUyyyeR2HCCZ7vn/S5+FOfTu6+Iz418l03uZfjwKJMtJ4S/qoqiiHHD5pE4fxB/xNd32QFqT0r4dOf4WcUA48Is9pzGeLL4dNt2DOnhx3KBoLg8c9WUwg/SDdCdsZqKs8jvEWMKzQ3pdFrEtptHFOaC71G0+XoOxgSgMOpOfAYcfEYT6ngYZhjQxRwPUNaZWQSaA1fJJRuO/BtBFFwcIBmlB0RGgnOt6r/iVrqCvq+tAN4Q8bAKMNGN+5o0h5xkepQqOIHSggUF46SO/QlTtMYwlImkZaM+RSS5E/jh/58+a7XDD69gDQOBWwcGaXEeoqpRrVbbEatKldAWoW2g2AiQnVMEHAWyrzGXZsVs2J7TeyTQbRrttNZPDRAP8aQ633w+u2NLG/iTSB5PKbzUsWocWjHJRZ8KUDKusMATAkeb/fxGHLfxN2eqdMc7gXglOhsTtSo/l2GVhPWQqrDLVSXPHm8n+N1OCdamtheUeH21hTnNLPLP1381/vaLC8IhdJFKbSTa5iTqRWo5H8ao04lY/pIG4fxAk3oXpC34tquJywWZE0oLCG0CQjC7DBTL/QQ1iSAkQvdyp5q+c7l/dsQ1m/1Xy/vvYj0uAeAomlUocCj+ul+iq4ZkjwCFGAJ5gbbPwkL+UaimzsbL5nymbRM4z5hmdDvEZYIm33aarfem5mdXcKZvYSp9DbANxCiM3icInhUIBimBpZ8458WE9XNYk4a3MmdZWEIa5tvaNfmxj8lZrWMZdQqNp8wHoJMy6/smpzosDRYZSLH2uOdE2aFyhcW0AQtOA1ByAmS24gS9iAnJki3Ot2g8Nwg83Ozs1Qd0WoxWcHKGLn7ES0EPKnhaDcQGt1sVAUoOaqafKoDJJeaJzSvJLiP6qMX5NYurUTCcYMsPeBAeE/vJFRAt+X0MzWUep/eyx1wKmUpFTyC4ip1WSO8XApY4ixtpP14s4IrhaD5V/eudN01cfB7vpTydSPRgicsbFk+eyzpI1pw9Ds3xtRtyG38aIdywNLyq09duiCNEuSiRSEPZDXj6Zta1G7iW+Xdhb6Gs77qULbXGhNbWWhVgHpFPhlAYw46APps/vEQWtt6ZoDGNJFGpm/q4SnlONzHRn28/W5oILwGgZewp1V5ffl6qKXXfyJsOVvgQHFxhS4vLoZZ+88F+MaZzvqVRIQlCvxr+PXPp4T0Z4e1weC8vjwptJceuH7cpibgqXTCowsoJNkhQb+z/jo7TzUVfoUZg6Mn064GrdqTJ/MhP0eHvcVTs862K89ePqQlUUsnuX4/I6SSjhbbmH3NNVFqn8GjxjTf9RbbC9YRw2YbBOZH7cajcnOeBVzF5lshB5v5ISygSZh9OODMHrvMt6k7GeBgZbtw1YaeJ4sFCInOJGQBsRMNDlSC6bTihvhDCz1A74ZJe6vURzNcyjBntUj+5APTXtpnJ2C3oKKO5IOhlnfzg9CEQXp6u0KNVpfeu2zREdxmx1BBnoWFcq2QAGexpbHXIdGabm7rzkFtwN2Xc+uOheZfecbKzZD3KqX+qX4ShRADC7MY9ebOJj7NzeAQFCZUTlBsbDUKVhA8ZNmCwkK7b1AJ9PSBnhO33y5dK0QkCjANEmpSGnOsp6Ugi/Lhcjnd/QWi/MTMJEPexoIHbyOICFvwSV0W+oeL4oDma0VwJobKLV9m6ciiTD1LoKcI6gGi/rlh6ObuX4gYRjGSSVS10qkOEebapaUqdJMlFybu+/BHfWG7WeSZWriv91WLBvOG+pg41GnmUM9Qtn5YV1ulXWVFG1y1bM02LxawII9X6PX/M2z9/6oPWE4qac0zVHLfSrtTRCoSSHuGCGF6hKhxlHqflrNPQ9MzT5xcyJnpq0pPZdaNdzYM71NZxPyUf7h4T2+lJo2Cz+oQQW24eNgrunE0CuGN+02xorLU4jP9u6mCXVQyeMcrpgS1GhjwmkCyCr5PZSVP1FEPeKrlYbLU9NcLkbAnRSggALIu9uxtFGSMgwcYtV4mB+No9xTY4ZCIDElPwRA2BSG4OIxYLGlX920REbbsMVfHwiSBhd2ICJuGgsdx/8h2ECLCAh6ZMgk3d6YvyAZ0vGCH7SGxQwLkiVrydoCVbuCYbvC2vpteaNfpExYbwoyX/OvdJzSHACcSnEOsHXABMRcqzwE219BX9qOZTKII98i6ZZvFHBTut199cTuSLTBjS+0dLimfY5qZduPtE7Xtuf+QePof3uni839DzSnomLDrW3usC6KhaXQw5mjfPnYMl4RjDvf9U/dwM0oUjDzmZ6KgfWASRKPO4scvHk6zgsvSUwhoJ6/L0Sh4XXH+UgIOscKTYo/1SfHhh0rndzSu14UpwVWLEWO1yvieer4akaXAllH3okR9xOrbDmj/EqyB7zwU0cQNvdi62a9/sw/38R4DYqHdmR3HXe4+bv2rfUZkSTRz3fi8A2vPe1m7oNQx23nFiyOdFo7VF2MhCx6FlLCRdW6RUIoCHkWYheeavI3TFLfPVhRBTdxRgNmmPGlLLJZJZPKhEmIssNtrvVURZMm4gBme8zVcoXcXP/3it8ASxA5L27ZR2W1dB5tdFUzv1oQtZyER5kbKdofRga37m337y9meGgBsTQRneubQGguC5xRksxbYzoLapPuu8ODCrUn0mwD49e7TxGZmrdG/uUP/8puwchNHNF5e7uPt93MZQ0AWJCgm5OL8AujQbFvjNXzUlRfqmTrx3IktPaPTdj+/CtY2UzBO9IHQZs0ZNVibzLQP/RjtcfaiSdbdzZ/QE2euBj1plMSh2b2vVSFwkSQiFAuX+/UO+zc9SibI4gAhkTHF2zxyUTxOTXZ6L7l+BdUv3IaWGs9Kwp5Ho3LKYz4elTGdPyJVaj5aFXFLDwx0ZLvg741RBWx14pB47fFn6/S2yNP3NlcZXVh3woeg6/9mF2orwkH9D86/mO8O3Y+69ruu/cpTWYyOcTiUaUDar8Hz8tgKy+IZpj3ArRyuf+RRRBT6uMJiCehMeQpaMsrYuitpdIkZXoLQoxibSZQ5zTUHAC6kSpG8yVoTuyywLSYjsltThZRPdqClhfwVJAn10roDhe7InzCtWIvBL751zUjacN05vUiCMlo2abi+UZXW6e1Buz2K5+PPtF5/Ik0wY4c+ZhLZeD/KH/HsUAT0G6GQfYYL5wumGR67PWtNMeK2mU8iC0HDwtO5xZZ16F3axRNjG0ceQ72v/pDtr3IdrCwDaej33vMoiYiaSr5oXh777ciatB0lLTjogJ55T16SpaiwQDvADM0BBSvtVoVVjw4rhNnW7L9doljhWlA7lig06UOJokBbi8L0EJoDEjhtDCc4b7hMGfgW3s5LMj1h0AvI4JF5GyE7kunKYq46mX0VywdbgxRB+UHJ9Md9K7toJiA/W6k5U3rftYTkisTakOIaQcbZuRaHo2wEKKE0AC88BEHzlyCGxu21DCDqyKD1EDBy2nT9yTgYWpO4uW1nuZEIS8kDYtJhG6JWdjvVYvbHMNcm+hM6gmE/KHvtTFO9/mSTMq4nR0rdUDN8p/VuXqp43nKIXBRRjNXqcELS1NMKKKdH1d4K7tcymdt46gdp7y3a296DRGZGO4bQHN3ZGoQkfP/dxNExFxQc5GyJpVccqqniZnC1xBpqNSg1RM3TGcRJPlFIBisIEwr2PV3XU8DAxfIhS3G7Re6l+cF+J908OFOCU+rM7oZnieVsKCEn6ONvd8a6ff3mJ6r/LhVmoQWTdp6iW7TAROSknBGMBdeSJpxhSqtRnpOOuU3iQpM0tk2rftMJy0pUN0CWKzVFX78VYHjpCsDUBcoVUBKULLyG4k0DeJ1llHefLE+AEbIr5kdhIkxbPLQka2DaMSY8bFhrzGb5WAgi4/Uf7yZF0kTbfLFMDV6k93qX1HJGvTnPEsQJDgJlWlrgMCR6IiYa0Xkuk+LOsOTMhGz/aOry5Gg37Ayoa3dAPYwfqq6Y608pv1VtbwXQYHt3guBftPrndhcb3EjNZ5tbmTQ3jFq5bDJKNR4tzPW7VpptM49KOX28hGmtrUYdXoMRb0Eo0fqdi4UIQwwz7lpY9QTlD5bLqJqi5V6w+gqnOXs8DphCxraMqwdAEAecPL3RmbOWtBH0sEn0vjpVB7er2EroeorqiFPph9eJM31F4mCT6tyWXaa08RWrOrhdBVhA11tUR5xUH7xWux8s5NQ5Fkm7/W+Zzr5bnBnH7MFuciMSiHR2jRu44hskYJlQLHRo2UjKcv9DsUeW9n8ESJ6IACSSK57Q0AT3gCnlAVaNpZU+mfyRcIUPL5JvlXx5o2Csw4mp/wKRgZS687joS4qEpX6kdsnsVKMzLFEIC2JzJ81SLipH03VQn/RMvvPQsvvA0jIfd0RgThncGQ5oxzxzoOyzmwXHvJFoqe1dmnkpiXVaOFxPBwudF98syThxQrE5rCiRppvxO6SVnixXxZROq3iFOuH1mq3LZvk2rFdzljF0oQo1FQkz+cpTEIY5C+dsCVKZKJmwhCfSrblGwoRV8nzlRWxf//RLbYhv77Tm0GLKa+icqTF3YNaYSmN0SgtGL4qyiWk2bnppG1EAxbHsrSGWdbUSXCkK4dGFoHVFNs3q3F5HdtjQmWGSeB4VTX+KLR8VN7Y9rahXK9g6AT2ucGKaS5n26ItWu1Qwd1qrSzNkk+pEILMX9jX/VYkffgvNjp0NC2Fiy/nQWWWJvinso/mEdHgYvomaaDEV7y04V2z9bpBgGj3oYwim4FWPJhd/ZiovaAcpE+8JLBqeY7h11NBZagyNxQWm//ym3i+l+NM39SB5i5/QB3EN9V3qhqRbiPPqFKKApbLNYu0c6A9KhU2albMsB5hy2zJiF3tFFi8vOgIT1Ds4Qb1qAIo//gnlaxDo8gJ1xXxFNt6fKBvvh7Hx48WJ8vHjxTBGmq6919noyBHsyYW1fnd6VaXmp1/kvkhaAq1Rlz6l5qCVhLTnykeSRAlVmAFPZMNJiBPciyE4FTZeDEEXGz0MgWdp/5ZQ2rC0a8QKB684aKlz63X46o5S057nntty6c/LEVf288RHXK7W/jgpveLzlAVnu9SoTRv/4iF8h889iM1m89GrmnMAvxmnJcUz7xdUajm1CdE8p98YNm/tWfTT4WpSueFg7zQkTLlKSyLRImFBWspg3kxy3VdT98AW5GMdu2rdMIUN7l29YTmf9vO3YRqfSaSowpn6mpOkiId9J7WAb+xJze5fpMakfi1r4pvI8q2I4WI+hIKOw0uzSg7hsuvkb3R1OrP3Zd4M16vOg8DdZuNb02wUL/aMrFv9DhGflp999UvT9pbDofartulP6crt/jt4ppq1TFmmq5whwMHKfLSyk7fksIns3spbrzOhYV6qvdaUFhjb7g4vjuqBHNXhDmkE0dSW8DRdL0F9zGrXHZUBjBebN7vSqPm2sVbxLL1U1PdsIGc4wo+nw/QKshLOYqPcsTm3NydOkeu8/sC6ceVGr5rbtMPEgtTeost/TN/VN+6yX7242GS2CsdXiey7qWvpLTChyeGLCsq3htzxXeX2or1AclaZ0zdoU2tFkf8IMO2rh6gL3xxZWVL2+MY0QJGrFad+S1rEuSLL1dMA1SMPQXp8o5Ndd3304ewEbO7Uj1SVW1fqQim/QEqQOIYwSzdb409hDU35u77HaJRvWhJ7w0sFc/VsmvPi6FpHRh2+oHR9xo/w46jD56rUZ3TOo1FH5+aK2oDRZw+kx0nKUAiaqNbZ3kj05jEqCk1Q72I1BL0Xt9ycmu+3grTBeXqNvOQImtbqplOwfbTK+UiN9Mb0nTJhnarfWLvTr4OturBKQmkJFPcV1sm7mmm5nFO4qtDarz8cxMHUUnseHpfcPB+fS26endclN6cUa1StrlnZjRTPasvfRCX16KOZ9xef08PIi8/54nM+A5/TB+PhVLOM7ozhYMnGh9PPNlZF0Jl0bKQ6XDIn7yLyRUU+bW5fI+Gd3MGH00w4VudtzIyjpj1TQXySpqJkI3To8O3jbf60V62z2RBGT9U0FG1ClWOPjWikuY/1NGJ6DnbCCasqp5rB6JLSzvFjJq3TNBrViWy+Z+UNFlpZt1UK1WcRygy3Ht6XWLZvJuat8q5vWrpIVCD0UNIRgfRAZF8EnGHG/e8mlbEdZwF9YJxtI57IPNliju1Mqbl9wdDcRTkXEABTdHtuTNDZ56/fm7WGEqlKfeijeCHRmVxFEL3x9Z7sL7wFocfejX4jFM7nOHgovTbrhPP56/eM3R24MrI+Mj+3etc0A489RysCAotgRQJMZ1ZUs9PaL4oVMFnSMYXtXMrsdZSC8bQbQvNNzFHEJTenKa0859Rbbo0ky/LcTW7p26rPx5Jmr8EWzUVp5TWn8KorcidJPYHZbJaU36B6ZbSDdkQ4jiE8LY7vyJ+F7sXnFiJy/08jlc2meFybE+MlzBY4oR053QNcetc2AmctR8shuxJkuQRhkr9x21mPgT5QH/7NxewZ8G2AdjCOXn/Rn3pt/ynRSqsQyxu6ugyJfW+Zbk1jV8XbcgL2uWrzUozp7BeSYsvTnholZ425qAM0ktADmv+abhK88Eq7vU6B02fUduCDJ+0l1YdihCeFyHVfVtoa3fdi5Rjboqsi1CtEYCbtg2NolSzByOXNBDHefLI1ruMqpJzpkU9Gar9XnrrlC4QzQXrlNew+xAbHJ8PrXXbCv+PsJQzWJFDm2f5TYepLIUcdYMa4sr3HAopJBGEvTlMu5/SB+Gz4gMr/XykPio9rvxT8j13wv0O9v73IeCoaa1Pr1Te2ja1ZgBA2BaptuHETMKVobpQq1IuvcXDUcoI1SEyEH+eibi6A67c36fPDnJm2XVrargsDpXswbvoqQf7ehGuZY1654ZQE2+bnFvY1BA7AP95pY/AlfehVQExxoMc3tubFOhzHOvhYGDd/HoM4t3qq59s9+tc7gb4zihqhUXPxezLVaUoOjeT5tb46Xv+bl9ZXLx1vXjre9MG1czOr4/Wxy25BvyzhlyW8Lx9/jUWZ+wD2GTKZRBEu3etXRFHQHNp88V39A94F2uK7OhLZgyyVt4lAZm9sugfWVlyWvFQBelPWgxb7gPqWZpuEGyXa4XZX47IctoFLZA1voSO0ZWwkJHlWrvIoaS8sJKzdld4fiGkUOASFpADxIUSSEh6GRvE4Bv/LlnuBsXQHYfmTR3My/gxZsoOQhIDHF4km2oQCXasfJFqD2KKEUfIA1KUuibJPr+E4BizQPDHtYIxzbhpDY4okUYlLkRCFIrx1h1J+1jb4ATz1+PuzlxI+1wFPo7jRDaNbtOCJfZSd0xCEe7v0/9qjM/eoW8MjrHqUg0A/LOwYi4cDrDJLdizoE8RF+mIZCIWJefnMvi3WwFfCHhjfVI8eR2As46XQC3tlY3sdXic0ZD+4jL4SBNbarxWIyBSRH65aCcA1H6Wy4X/zf6jRKy930eIJU+a4qNAmzg1rPW/XP6pCpOtJTv8+2ipsP7bCdWK6zbZRh7A57WlSzTUN3nH8VB6OKJpv0fXbm2nNRxO4lNAc7HdVvj/ci9L/9eqBP43Zpd44b19ok1ZNezJWtS79e4xrynqI2jo70QOB78rfHgC+rcyTvqGlWwbgl8CWBTNsWjKOh+Kju0SviSNLfIKIxfL1w/UnhIXAW/vwSZiwEDOF/N4BkQ9pPexIlq9g+lwRlh2kZfxDevhmhMIkmT5rRBrD1obJHIqPLxJDNuwWib2QN/747qJf5/hmfdXPDlqS2qVGeTtpNYqweZpa4I1BYbdI6UVp7O24mlOokzDEi0qz4jQ0dXXo8uLdT+fzrYIUQhs8vT4P4Cs5fC7CdhBtbZgwOTM9bgfazD6BqNgu/96U7ThzULjfnlXMEaQPBtvR5BE2LXOPpbBN1Rkt3unG4cxo2z6jaSqotDG1jbn3cOleOGDIZL4/lzKZnw9jciYJqyVm7ZhhHUxtQFP6qHAUpwNSc6hj3ecVZkuYuvfAUyim2s3uPZiFqWc4sZGE/j8lURKX20QXUcMjBLOAh3vJ6e76f3/8P58/IU0nf4DfIfxBokgHJdUnvVEpICHKlh7vP2fF+dJ068326qOugYVczGIBEqrGftDoIZgK0yEosmfIdgtdnLXJXo2uvcfv19ru2CWIk2nLs8EDAojb7/3eBy73bO24Qtt//NK119p1gOrg5uRlaspH9xq1cK/QnuX0npjCngBqw8VDI45epSuOSP7ySVNXoF6lKse+OGLLqRrKpAuoYhw8wO5F6oNxufG6kPFE7QvNO2xTvXVx3L0myjMJxTHrvhXXwPYJ+799vHVUZO7g2a1tv0OVkAhoDkoxJbXb/zFWq2zhTJu+H5GlLXK7QkokDd3I8zYmEak9M9QXgf7cPoNTHmA6JVVTYYev/RoecRRTuEKX//VuejF9N71EXKB3FxeXVxeffv3l6sOvf/909cvPP76/uroc5tZ/1jjQ9S3CYShASlewH2CG5tp/Qde365/0YNe36/fZh/rwFnPh37c9Kp7x96760mAv+HqoDkwCIq7gBAT+1QAZWeKOu6OI3DHQX+YrLoc4cBmw/3x//u7y8vzy8j/Pf3w/ZZup+8s04LWsbwfm229fkYCAi9C76Yt0TqboWmkXnc8VNk9IrwlGAtYgZH17vr5FlPOHxpLOihhA0XAW00TOOBviTmfy2Jl97QXDYgGBq+uMz236MOQmCjiDb58/vUk9YycLPWn2uixngCJer/GjeA50in7jIkU2MQQ0tf95acLu1wvOp3MspktOMVtOuVhOX2v5vi7+opYr/5Zd4+IChaBARMQl1y15FPAIpCvfZgiiOYQhhCjg8TZLimJVe+rTfGGlVHz19m2czCkJZLJYkEeDo7cuz0CI2vW2PRJPf9fk3IfmKZv27dtsTowGOnVDrhVHB+K0LiOu1TJ37XHN3xy0xaVkAh5FmO0KwpOE2Q1FFFIyaOF1TJt5oc3xhkqkW3HAox9DtyTgEYLE3A3aRx7mRZ/BKuH/1vCBG1NqHUMvEkpnA1Sh7AM31ybdmb8jz9/3LU3iC8RjYJn/TPKCJJcg2MuDxg2FB53JiboifzB6zJj1qKuT0JmTaA3LCVOwBN9d4B43FDQwI8NmdAWnk0gFrSe7e2PJhjDOjz9tpgK/h7njvOgIbPe56Xhpp1kgXbF3D4F9Kbf+K4aSacJnguZY2jraPDWDqQ4ftHtmLxWbu7Y2oRabSwnkT5iij1wIkLF5eFDx9B0gCaao5622mG/lVr5loN6SeP3TWxXEswgiV8ORvw3Pma3gmDbfWayvNDQs29OsUO2zi3omgLiIV7j90nrzTPdEaxDbte4myQ0LoVb5dGqb5dvKQZMNGZuB1J50y72fXTkAPg2tzc5U4YHUHgGRK29JycgA8zPAwrCDpBlQLmG2wY2dng+CtoJQ24hZjmTmPQwr41YkOg3YGZA+qOWWzWRzpfzRQKc4+mIWEKxPAbPG0QfzgjAzJ9VU0NFBZ0CGoK7mf54M9bs+qCmWaoYD3wnMUUGnOPpg1rbmKDtIt8kjbOlDnAVp4aju6/dPfxH3VTPyhO5rEp6i+9o+u6in+3ps568Jdcv/yFZHXLmWODhLcG9J3JdbM7reDGyZqor9lMsl7HnUltgEyTTyVzN4jgbS5ZN+tfJnwuJEzdIPRYRS4i8f6FHMenOX8kpYiVS9VCyRIGSn7HcoFPvMl0sIz7Onp0FKwlk1gdwm44Z02s4lvnnPCAfGO6qE2k3DPcb9wIpHI5QvibZc1SFa2lPsyfOnXxPpqjgN9T4S8BzC7olCfz2rESpoQ8ME+GpF9pmDTPn6lqaUjye8SOacU6jlBzqR6K+ZqxeBtUw4PRlqlcg+pWL+GUlfbKsU/bVgCPjYWlGYDWugQ88oeck/Dmub1c715CtAgnOFbvvZBDtHs4FHrp1b6IfSsaA7k86fOqsAyv/HfwcAAP//GsyHtQ==" } diff --git a/metricbeat/module/system/process/_meta/data.json b/metricbeat/module/system/process/_meta/data.json index ed81cf1ec1e..807d76eb878 100644 --- a/metricbeat/module/system/process/_meta/data.json +++ b/metricbeat/module/system/process/_meta/data.json @@ -250,10 +250,11 @@ "share": 14946304, "size": 1725992960 }, - "state": "sleeping" + "state": "sleeping", + "num_threads": 42 } }, "user": { "name": "alexk" } -} \ No newline at end of file +} diff --git a/metricbeat/module/system/process/_meta/fields.yml b/metricbeat/module/system/process/_meta/fields.yml index 65d96ee839d..0ed69326f93 100644 --- a/metricbeat/module/system/process/_meta/fields.yml +++ b/metricbeat/module/system/process/_meta/fields.yml @@ -24,6 +24,10 @@ type: alias path: process.pgid migration: true + - name: num_threads + type: integer + description: > + Number of threads in the process - name: cmdline type: keyword description: > @@ -345,7 +349,7 @@ - name: stats.user.pct type: scaled_float description: time the cgroup spent in user space, as a percentage of total CPU time - + - name: stats.user.norm.pct type: scaled_float description: time the cgroup spent in user space, as a percentage of total CPU time, normalized by CPU count. @@ -419,7 +423,7 @@ type: long format: bytes description: memory max threshhold - + - name: mem.events type: group description: number of times the controller tripped a given usage level diff --git a/metricbeat/module/system/process/process.go b/metricbeat/module/system/process/process.go index 2274f1846d6..b67ce137bd9 100644 --- a/metricbeat/module/system/process/process.go +++ b/metricbeat/module/system/process/process.go @@ -32,7 +32,7 @@ import ( "github.com/elastic/elastic-agent-system-metrics/metric/system/resolve" ) -var debugf = logp.MakeDebug("system.process") +var debugf = logp.NewLogger("system.process").Debugf func init() { mb.Registry.MustAddMetricSet("system", "process", New, diff --git a/metricbeat/module/system/process/process_test.go b/metricbeat/module/system/process/process_test.go index f1a29648477..d9f57f2e3fe 100644 --- a/metricbeat/module/system/process/process_test.go +++ b/metricbeat/module/system/process/process_test.go @@ -24,6 +24,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" _ "github.com/elastic/beats/v7/metricbeat/module/system" @@ -32,7 +33,9 @@ import ( ) func TestFetch(t *testing.T) { - logp.DevelopmentSetup() + err := logp.DevelopmentSetup() + require.NoError(t, err, "could not set the logger to DevelopmentSetup") + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) events, errs := mbtest.ReportingFetchV2Error(f) assert.Empty(t, errs) @@ -44,6 +47,7 @@ func TestFetch(t *testing.T) { assert.Empty(t, errs) assert.NotEmpty(t, events) + t.Logf("fetched %d events, showing events[0]:", len(events)) t.Logf("%s/%s event: %+v", f.Module().Name(), f.Name(), events[0].BeatEvent("system", "process").Fields.StringToPrint()) } diff --git a/metricbeat/module/system/test_system.py b/metricbeat/module/system/test_system.py index 9bf15c82444..039e7299a8a 100644 --- a/metricbeat/module/system/test_system.py +++ b/metricbeat/module/system/test_system.py @@ -112,7 +112,7 @@ # for some kernel level processes. fd is also part of the system process, but # is not available on all OSes and requires root to read for all processes. # cgroup is only available on linux. -SYSTEM_PROCESS_FIELDS = ["cpu", "memory", "state"] +SYSTEM_PROCESS_FIELDS = ["cpu", "memory", "state", "num_threads"] class Test(metricbeat.BaseTest): @@ -439,7 +439,7 @@ def test_process(self): @unittest.skipUnless(re.match("(?i)linux|darwin|freebsd", sys.platform), "os") def test_process_unix(self): """ - Test system/process output for fields specific of unix systems. + Test system/process output checking it has got all expected fields specific of unix systems and no extra ones. """ self.render_config_template( diff --git a/packetbeat/docs/getting-started.asciidoc b/packetbeat/docs/getting-started.asciidoc index 0ee45527534..bb17e343107 100644 --- a/packetbeat/docs/getting-started.asciidoc +++ b/packetbeat/docs/getting-started.asciidoc @@ -49,6 +49,10 @@ system: include::{libbeat-dir}/tab-widgets/install-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[other-installation-options]] ==== Other installation options diff --git a/packetbeat/docs/index.asciidoc b/packetbeat/docs/index.asciidoc index 0f66d2dde5d..a63b828dc1d 100644 --- a/packetbeat/docs/index.asciidoc +++ b/packetbeat/docs/index.asciidoc @@ -22,6 +22,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :linux_os: :docker_platform: :win_os: +:no_cache_processor: :no_decode_cef_processor: :no_decode_csv_fields_processor: :no_parse_aws_vpc_flow_log_processor: diff --git a/packetbeat/packetbeat.reference.yml b/packetbeat/packetbeat.reference.yml index 7442b7f6a0f..aebeb1947a6 100644 --- a/packetbeat/packetbeat.reference.yml +++ b/packetbeat/packetbeat.reference.yml @@ -916,8 +916,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1803,6 +1804,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is packetbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "packetbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/packetbeat/protos/amqp/amqp_structs.go b/packetbeat/protos/amqp/amqp_structs.go index 7abba4fc914..de31fce6af3 100644 --- a/packetbeat/protos/amqp/amqp_structs.go +++ b/packetbeat/protos/amqp/amqp_structs.go @@ -27,7 +27,7 @@ import ( type amqpMethod func(*amqpMessage, []byte) (bool, bool) const ( - transactionsHashSize = 2 ^ 16 + transactionsHashSize = 1 << 16 transactionTimeout = 10 * 1e9 ) diff --git a/packetbeat/protos/protos.go b/packetbeat/protos/protos.go index 23c79750370..3841db8f91b 100644 --- a/packetbeat/protos/protos.go +++ b/packetbeat/protos/protos.go @@ -33,7 +33,7 @@ import ( ) const ( - DefaultTransactionHashSize = 2 ^ 16 + DefaultTransactionHashSize = 1 << 16 DefaultTransactionExpiration time.Duration = 10 * time.Second ) diff --git a/testing/environments/latest.yml b/testing/environments/latest.yml index 8b21daa6fe8..ff0074f3a06 100644 --- a/testing/environments/latest.yml +++ b/testing/environments/latest.yml @@ -3,7 +3,7 @@ version: '2.3' services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.9.1 + image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2 healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200/_cat/health?h=status | grep -q green"] retries: 300 @@ -19,7 +19,7 @@ services: - "script.context.template.cache_max_size=2000" logstash: - image: docker.elastic.co/logstash/logstash:8.9.1 + image: docker.elastic.co/logstash/logstash:8.10.2 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9600/_node/stats"] retries: 300 @@ -29,7 +29,7 @@ services: - ./docker/logstash/pki:/etc/pki:ro kibana: - image: docker.elastic.co/kibana/kibana:8.9.1 + image: docker.elastic.co/kibana/kibana:8.10.2 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5601"] retries: 300 diff --git a/testing/environments/snapshot.yml b/testing/environments/snapshot.yml index 95b12616908..c2ae942fcbf 100644 --- a/testing/environments/snapshot.yml +++ b/testing/environments/snapshot.yml @@ -3,7 +3,7 @@ version: '2.3' services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0-2b227d89-SNAPSHOT + image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0-867cd584-SNAPSHOT # When extend is used it merges healthcheck.tests, see: # https://github.com/docker/compose/issues/8962 # healthcheck: @@ -31,7 +31,7 @@ services: - "./docker/elasticsearch/users_roles:/usr/share/elasticsearch/config/users_roles" logstash: - image: docker.elastic.co/logstash/logstash:8.11.0-2b227d89-SNAPSHOT + image: docker.elastic.co/logstash/logstash:8.11.0-867cd584-SNAPSHOT healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9600/_node/stats"] retries: 600 @@ -44,7 +44,7 @@ services: - 5055:5055 kibana: - image: docker.elastic.co/kibana/kibana:8.11.0-2b227d89-SNAPSHOT + image: docker.elastic.co/kibana/kibana:8.11.0-867cd584-SNAPSHOT environment: - "ELASTICSEARCH_USERNAME=kibana_system_user" - "ELASTICSEARCH_PASSWORD=testing" diff --git a/winlogbeat/docs/index.asciidoc b/winlogbeat/docs/index.asciidoc index 80ed3ef2345..2d41512a9bc 100644 --- a/winlogbeat/docs/index.asciidoc +++ b/winlogbeat/docs/index.asciidoc @@ -18,6 +18,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :ignores_max_retries: :win_os: :win_only: +:no_cache_processor: :no_decode_cef_processor: :no_decode_csv_fields_processor: :no_parse_aws_vpc_flow_log_processor: diff --git a/winlogbeat/sys/wineventlog/format_message.go b/winlogbeat/sys/wineventlog/format_message.go index 98640ed2f2c..e6502d384fa 100644 --- a/winlogbeat/sys/wineventlog/format_message.go +++ b/winlogbeat/sys/wineventlog/format_message.go @@ -21,7 +21,6 @@ package wineventlog import ( "fmt" - "unsafe" "golang.org/x/sys/windows" @@ -70,10 +69,10 @@ func getEventXML(metadata *PublisherMetadata, eventHandle EvtHandle) (string, er func evtFormatMessage(metadataHandle EvtHandle, eventHandle EvtHandle, messageID uint32, values []EvtVariant, messageFlag EvtFormatMessageFlag) (string, error) { var ( valuesCount = uint32(len(values)) - valuesPtr uintptr + valuesPtr *EvtVariant ) - if len(values) > 0 { - valuesPtr = uintptr(unsafe.Pointer(&values[0])) + if len(values) != 0 { + valuesPtr = &values[0] } // Determine the buffer size needed (given in WCHARs). diff --git a/winlogbeat/sys/wineventlog/renderer.go b/winlogbeat/sys/wineventlog/renderer.go index bd458f6d998..4471b7b6aff 100644 --- a/winlogbeat/sys/wineventlog/renderer.go +++ b/winlogbeat/sys/wineventlog/renderer.go @@ -53,12 +53,12 @@ type Renderer struct { // NewRenderer returns a new Renderer. func NewRenderer(session EvtHandle, log *logp.Logger) (*Renderer, error) { - systemContext, err := _EvtCreateRenderContext(0, 0, EvtRenderContextSystem) + systemContext, err := _EvtCreateRenderContext(0, nil, EvtRenderContextSystem) if err != nil { return nil, fmt.Errorf("failed in EvtCreateRenderContext for system context: %w", err) } - userContext, err := _EvtCreateRenderContext(0, 0, EvtRenderContextUser) + userContext, err := _EvtCreateRenderContext(0, nil, EvtRenderContextUser) if err != nil { return nil, fmt.Errorf("failed in EvtCreateRenderContext for user context: %w", err) } diff --git a/winlogbeat/sys/wineventlog/syscall_windows.go b/winlogbeat/sys/wineventlog/syscall_windows.go index f18bbeb2087..14cbf560e6f 100644 --- a/winlogbeat/sys/wineventlog/syscall_windows.go +++ b/winlogbeat/sys/wineventlog/syscall_windows.go @@ -649,14 +649,14 @@ func EvtClearLog(session EvtHandle, channelPath string, targetFilePath string) e //sys _EvtSubscribe(session EvtHandle, signalEvent uintptr, channelPath *uint16, query *uint16, bookmark EvtHandle, context uintptr, callback syscall.Handle, flags EvtSubscribeFlag) (handle EvtHandle, err error) = wevtapi.EvtSubscribe //sys _EvtCreateBookmark(bookmarkXML *uint16) (handle EvtHandle, err error) = wevtapi.EvtCreateBookmark //sys _EvtUpdateBookmark(bookmark EvtHandle, event EvtHandle) (err error) = wevtapi.EvtUpdateBookmark -//sys _EvtCreateRenderContext(ValuePathsCount uint32, valuePaths uintptr, flags EvtRenderContextFlag) (handle EvtHandle, err error) = wevtapi.EvtCreateRenderContext +//sys _EvtCreateRenderContext(ValuePathsCount uint32, valuePaths **uint16, flags EvtRenderContextFlag) (handle EvtHandle, err error) = wevtapi.EvtCreateRenderContext //sys _EvtRender(context EvtHandle, fragment EvtHandle, flags EvtRenderFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32, propertyCount *uint32) (err error) = wevtapi.EvtRender //sys _EvtClose(object EvtHandle) (err error) = wevtapi.EvtClose //sys _EvtSeek(resultSet EvtHandle, position int64, bookmark EvtHandle, timeout uint32, flags uint32) (success bool, err error) [!success] = wevtapi.EvtSeek //sys _EvtNext(resultSet EvtHandle, eventArraySize uint32, eventArray *EvtHandle, timeout uint32, flags uint32, numReturned *uint32) (err error) = wevtapi.EvtNext //sys _EvtOpenChannelEnum(session EvtHandle, flags uint32) (handle EvtHandle, err error) = wevtapi.EvtOpenChannelEnum //sys _EvtNextChannelPath(channelEnum EvtHandle, channelPathBufferSize uint32, channelPathBuffer *uint16, channelPathBufferUsed *uint32) (err error) = wevtapi.EvtNextChannelPath -//sys _EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageID uint32, valueCount uint32, values uintptr, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) (err error) = wevtapi.EvtFormatMessage +//sys _EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageID uint32, valueCount uint32, values *EvtVariant, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) (err error) = wevtapi.EvtFormatMessage //sys _EvtOpenPublisherMetadata(session EvtHandle, publisherIdentity *uint16, logFilePath *uint16, locale uint32, flags uint32) (handle EvtHandle, err error) = wevtapi.EvtOpenPublisherMetadata //sys _EvtGetPublisherMetadataProperty(publisherMetadata EvtHandle, propertyID EvtPublisherMetadataPropertyID, flags uint32, bufferSize uint32, variant *EvtVariant, bufferUsed *uint32) (err error) = wevtapi.EvtGetPublisherMetadataProperty //sys _EvtGetEventMetadataProperty(eventMetadata EvtHandle, propertyID EvtEventMetadataPropertyID, flags uint32, bufferSize uint32, variant *EvtVariant, bufferUsed *uint32) (err error) = wevtapi.EvtGetEventMetadataProperty diff --git a/winlogbeat/sys/wineventlog/wineventlog_windows.go b/winlogbeat/sys/wineventlog/wineventlog_windows.go index 545b7940878..6b4abfaf5d1 100644 --- a/winlogbeat/sys/wineventlog/wineventlog_windows.go +++ b/winlogbeat/sys/wineventlog/wineventlog_windows.go @@ -333,19 +333,17 @@ func CreateBookmarkFromXML(bookmarkXML string) (EvtHandle, error) { // CreateRenderContext creates a render context. Close must be called on // returned EvtHandle when finished with the handle. func CreateRenderContext(valuePaths []string, flag EvtRenderContextFlag) (EvtHandle, error) { - paths := make([]uintptr, 0, len(valuePaths)) + paths := make([]*uint16, 0, len(valuePaths)) for _, path := range valuePaths { - utf16, err := syscall.UTF16FromString(path) + utf16, err := syscall.UTF16PtrFromString(path) if err != nil { return 0, err } - - paths = append(paths, reflect.ValueOf(&utf16[0]).Pointer()) + paths = append(paths, utf16) } - - var pathsAddr uintptr - if len(paths) > 0 { - pathsAddr = reflect.ValueOf(&paths[0]).Pointer() + var pathsAddr **uint16 + if len(paths) != 0 { + pathsAddr = &paths[0] } context, err := _EvtCreateRenderContext(uint32(len(paths)), pathsAddr, flag) @@ -409,7 +407,7 @@ func FormatEventString( // Determine the buffer size needed (given in WCHARs). var bufferUsed uint32 - err := _EvtFormatMessage(ph, eventHandle, 0, 0, 0, messageFlag, 0, nil, &bufferUsed) + err := _EvtFormatMessage(ph, eventHandle, 0, 0, nil, messageFlag, 0, nil, &bufferUsed) if err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // This is an errno. return fmt.Errorf("failed in EvtFormatMessage: %w", err) } @@ -423,7 +421,7 @@ func FormatEventString( // https://docs.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtformatmessage bb.Reserve(int(bufferUsed * 2)) - err = _EvtFormatMessage(ph, eventHandle, 0, 0, 0, messageFlag, bufferUsed, bb.PtrAt(0), &bufferUsed) + err = _EvtFormatMessage(ph, eventHandle, 0, 0, nil, messageFlag, bufferUsed, bb.PtrAt(0), &bufferUsed) if err != nil { return fmt.Errorf("failed in EvtFormatMessage: %w", err) } diff --git a/winlogbeat/sys/wineventlog/zsyscall_windows.go b/winlogbeat/sys/wineventlog/zsyscall_windows.go index 62e455f09a0..3cf625d77c1 100644 --- a/winlogbeat/sys/wineventlog/zsyscall_windows.go +++ b/winlogbeat/sys/wineventlog/zsyscall_windows.go @@ -119,8 +119,8 @@ func _EvtCreateBookmark(bookmarkXML *uint16) (handle EvtHandle, err error) { return } -func _EvtCreateRenderContext(ValuePathsCount uint32, valuePaths uintptr, flags EvtRenderContextFlag) (handle EvtHandle, err error) { - r0, _, e1 := syscall.Syscall(procEvtCreateRenderContext.Addr(), 3, uintptr(ValuePathsCount), uintptr(valuePaths), uintptr(flags)) +func _EvtCreateRenderContext(ValuePathsCount uint32, valuePaths **uint16, flags EvtRenderContextFlag) (handle EvtHandle, err error) { + r0, _, e1 := syscall.Syscall(procEvtCreateRenderContext.Addr(), 3, uintptr(ValuePathsCount), uintptr(unsafe.Pointer(valuePaths)), uintptr(flags)) handle = EvtHandle(r0) if handle == 0 { err = errnoErr(e1) @@ -128,8 +128,8 @@ func _EvtCreateRenderContext(ValuePathsCount uint32, valuePaths uintptr, flags E return } -func _EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageID uint32, valueCount uint32, values uintptr, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) (err error) { - r1, _, e1 := syscall.Syscall9(procEvtFormatMessage.Addr(), 9, uintptr(publisherMetadata), uintptr(event), uintptr(messageID), uintptr(valueCount), uintptr(values), uintptr(flags), uintptr(bufferSize), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(bufferUsed))) +func _EvtFormatMessage(publisherMetadata EvtHandle, event EvtHandle, messageID uint32, valueCount uint32, values *EvtVariant, flags EvtFormatMessageFlag, bufferSize uint32, buffer *byte, bufferUsed *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procEvtFormatMessage.Addr(), 9, uintptr(publisherMetadata), uintptr(event), uintptr(messageID), uintptr(valueCount), uintptr(unsafe.Pointer(values)), uintptr(flags), uintptr(bufferSize), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(bufferUsed))) if r1 == 0 { err = errnoErr(e1) } diff --git a/winlogbeat/winlogbeat.reference.yml b/winlogbeat/winlogbeat.reference.yml index 64377c0fc6d..5619e9a6375 100644 --- a/winlogbeat/winlogbeat.reference.yml +++ b/winlogbeat/winlogbeat.reference.yml @@ -332,8 +332,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1219,6 +1220,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is winlogbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "winlogbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/auditbeat/auditbeat.reference.yml b/x-pack/auditbeat/auditbeat.reference.yml index e9ecd33ae39..999f0416354 100644 --- a/x-pack/auditbeat/auditbeat.reference.yml +++ b/x-pack/auditbeat/auditbeat.reference.yml @@ -506,8 +506,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1393,6 +1394,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is auditbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "auditbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/filebeat/docs/inputs/input-azure-blob-storage.asciidoc b/x-pack/filebeat/docs/inputs/input-azure-blob-storage.asciidoc index ec91b25aaf9..91d21c6c4ff 100644 --- a/x-pack/filebeat/docs/inputs/input-azure-blob-storage.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-azure-blob-storage.asciidoc @@ -27,6 +27,8 @@ even though it can get expensive with dealing with a very large number of files. 3. If any major error occurs which stops the main thread, the logs will be appropriately generated, describing said error. +NOTE: In the latest update the partial save mechanism has been removed for now due to concurrency issues, but will be added back in the future. + [id="supported-types"] NOTE: NOTE: Currently only `JSON` and `NDJSON` are supported blob/file formats. Blobs/files may be also be gzip compressed. As for authentication types, we currently have support for `shared access keys` and `connection strings`. @@ -138,6 +140,9 @@ Now let's explore the configuration attributes a bit more elaborately. 7. <> 8. <> 9. <> + 10. <> + 11. <> + 12. <> [id="attrib-account-name"] @@ -214,6 +219,88 @@ Example : `10s` would mean we would like the polling to occur every 10 seconds. This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. +[id="attrib-file_selectors"] +[float] +==== `file_selectors` + +If the Azure blob storage container will have blobs that correspond to files that {beatname_uc} shouldn't process, `file_selectors` can be used to limit +the files that are downloaded. This is a list of selectors which are based on a `regex` pattern. The `regex` should match the blob name or should be a part of the blob name (ideally a prefix). The `regex` syntax is the same as used in the Go programming language. Files that don't match any configured regex won't be processed.This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. + +[source, yml] +---- +filebeat.inputs: +- type: azure-blob-storage + id: my-azureblobstorage-id + enabled: true + account_name: some_account + auth.shared_credentials.account_key: some_key + containers: + - name: container_1 + file_selectors: + - regex: '/Monitoring/' + - regex: 'docs/' + - regex: '/Security-Logs/' +---- + +[id="attrib-expand_event_list_from_field"] +[float] +==== `expand_event_list_from_field` + +If the file-set using this input expects to receive multiple messages bundled under a specific field or an array of objects then the config option for `expand_event_list_from_field` can be specified. This setting will be able to split the messages under the group value into separate events. For example, if +you have logs that are in JSON format and events are found under the JSON object "Records". To split the events into separate events, the config option `expand_event_list_from_field` can be set to "Records". This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. +["source","json"] +---- +{ + "Records": [ + { + "eventVersion": "1.07", + "eventTime": "2019-11-14T00:51:00Z", + "region": "us-east-1", + "eventID": "EXAMPLE8-9621-4d00-b913-beca2EXAMPLE", + }, + { + "eventVersion": "1.07", + "eventTime": "2019-11-14T00:52:00Z", + "region": "us-east-1", + "eventID": "EXAMPLEc-28be-486c-8928-49ce6EXAMPLE", + } + ] +} +---- + +["source","yaml",subs="attributes"] +---- +filebeat.inputs: +- type: azure-blob-storage + id: my-azureblobstorage-id + enabled: true + account_name: some_account + auth.shared_credentials.account_key: some_key + containers: + - name: container_1 + expand_event_list_from_field: Records +---- + +NOTE: This attribute is only applicable for JSON file formats. You do not require to specify this attribute if the file has an array of objects at the root level. Root level array of objects are automatically split into separate events. If failures occur or the input crashes due to some unexpected error, the processing will resume from the last successfully processed file/blob. + +[id="attrib-timestamp_epoch"] +[float] +==== `timestamp_epoch` + +This attribute can be used to filter out files/blobs which have a timestamp older than the specified value. The value of this attribute should be in unix `epoch` (seconds) format. The timestamp value is compared with the `LastModified Timestamp` obtained from the blob metadata. This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. + +["source","yaml",subs="attributes"] +---- +filebeat.inputs: +- type: azure-blob-storage + id: my-azureblobstorage-id + enabled: true + account_name: some_account + auth.shared_credentials.account_key: some_key + containers: + - name: container_1 + timestamp_epoch: 1627233600 +---- [id="container-overrides"] *The sample configs below will explain the container level overriding of attributes a bit further :-* @@ -277,4 +364,4 @@ In this configuration even though we have specified `max_workers = 10`, `poll = will override these values with their own respective values which are defined as part of their sub attibutes. -NOTE: Since this is a beta input, any feedback is welcome, which will help us optimise and make it better going forward. \ No newline at end of file +NOTE: Since this is a beta input, any feedback is welcome, which will help us optimise and make it better going forward. diff --git a/x-pack/filebeat/docs/inputs/input-cel.asciidoc b/x-pack/filebeat/docs/inputs/input-cel.asciidoc index 6bfee14a7f6..35fbc4654f2 100644 --- a/x-pack/filebeat/docs/inputs/input-cel.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-cel.asciidoc @@ -1,7 +1,7 @@ [role="xpack"] :type: cel -:mito_version: v1.5.0 +:mito_version: v1.6.0 :mito_docs: https://pkg.go.dev/github.com/elastic/mito@{mito_version} [id="{beatname_lc}-input-{type}"] @@ -234,6 +234,9 @@ As noted above the `cel` input provides functions, macros, and global variables ** {mito_docs}/lib#hdr-Try[Try] ** {mito_docs}/lib#hdr-Is_Error[Is Error] +* {mito_docs}/lib#Debug[Debug] — the debug handler registers a logger with the name extension `cel_debug` and calls to the CEL `debug` function are emitted to that logger. +** {mito_docs}/lib#hdr-Debug[Debug] + In addition to the extensions provided in the packages listed above, a global variable `useragent` is also provided which gives the user CEL program access to the {beatname_lc} user-agent string. Additionally, it supports authentication via Basic auth, HTTP Headers or oauth2. @@ -690,7 +693,8 @@ filebeat.inputs: user: user@domain.tld password: P@$$W0₹D redact: - fields: password + fields: + - password delete: true ---- diff --git a/x-pack/filebeat/docs/inputs/input-gcs.asciidoc b/x-pack/filebeat/docs/inputs/input-gcs.asciidoc index 83ba2084c89..3f8061739c7 100644 --- a/x-pack/filebeat/docs/inputs/input-gcs.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-gcs.asciidoc @@ -76,8 +76,7 @@ which will in turn use the `max_workers` value to initialize an in-memory worker one per bucket, each having 3 workers. These `workers` will be responsible for performing `jobs` that process a file (in this case read and output the contents of a file). NOTE: The scheduler is responsible for scheduling jobs, and uses the `maximum available workers` in the pool, at each iteration, to decide the number of files to retrieve and -process. This keeps work distribution efficient. The scheduler uses `poll_interval` attribute value to decide how long to wait after each iteration. The `bucket_timeout` value is used to timeout -calls to the bucket list api if it exceeds the given value. Each iteration consists of processing a certain number of files, decided by the `maximum available workers` value. +process. This keeps work distribution efficient. The scheduler uses `poll_interval` attribute value to decide how long to wait after each iteration. The `bucket_timeout` value is used to timeout calls to the bucket list api if it exceeds the given value. Each iteration consists of processing a certain number of files, decided by the `maximum available workers` value. *A Sample Response :-* ["source","json"] @@ -167,6 +166,9 @@ Now let's explore the configuration attributes a bit more elaborately. 8. <> 9. <> 10. <> + 11. <> + 12. <> + 13. <> [id="attrib-project-id"] @@ -252,6 +254,94 @@ highly nested json data. If this is set to `false` the *gcs.storage.object.json_ applicable for json objects and has no effect on other types of objects. This attribute can be specified both at the root level of the configuration as well at the bucket level. The bucket level values will always take priority and override the root level values if both are specified. +[id="attrib-file_selectors-gcs"] +[float] +==== `file_selectors` + +If the GCS buckets have objects that correspond to files that {beatname_uc} shouldn't process, `file_selectors` can be used to limit the files that are downloaded. This is a list of selectors which are based on a regular expression pattern. The regular expression should match the object name or should be a part of the object name (ideally a prefix). The regular expression syntax used is [RE2](https://github.com/google/re2/wiki/Syntax). Files that don't match any configured expression won't be processed.This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. + +[source, yml] +---- +filebeat.inputs: +- type: gcs + project_id: my_project_id + auth.credentials_file.path: {{file_path}}/{{creds_file_name}}.json + buckets: + - name: obs-bucket + max_workers: 3 + poll: true + poll_interval: 15s + bucket_timeout: 60s + file_selectors: + - regex: '/Monitoring/' + - regex: 'docs/' + - regex: '/Security-Logs/' +---- + +[id="attrib-expand_event_list_from_field-gcs"] +[float] +==== `expand_event_list_from_field` + +If the file-set using this input expects to receive multiple messages bundled under a specific field or an array of objects then the config option for `expand_event_list_from_field` can be specified. This setting will be able to split the messages under the group value into separate events. For example, if you have logs that are in JSON format and events are found under the JSON object "Records". To split the events into separate events, the config option `expand_event_list_from_field` can be set to "Records". This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. + +[source, json] +---- +{ + "Records": [ + { + "eventVersion": "1.07", + "eventTime": "2019-11-14T00:51:00Z", + "region": "us-east-1", + "eventID": "EXAMPLE8-9621-4d00-b913-beca2EXAMPLE", + }, + { + "eventVersion": "1.07", + "eventTime": "2019-11-14T00:52:00Z", + "region": "us-east-1", + "eventID": "EXAMPLEc-28be-486c-8928-49ce6EXAMPLE", + } + ] +} +---- + +[source,yml] +---- +filebeat.inputs: +- type: gcs + project_id: my_project_id + auth.credentials_file.path: {{file_path}}/{{creds_file_name}}.json + buckets: + - name: obs-bucket + max_workers: 3 + poll: true + poll_interval: 15s + bucket_timeout: 60s + expand_event_list_from_field: Records +---- + +NOTE: The `parse_json` setting is incompatible with `expand_event_list_from_field`. If enabled it will be ignored. This attribute is only applicable for JSON file formats. You do not need to specify this attribute if the file has an array of objects at the root level. Root level array of objects are automatically split into separate events. If failures occur or the input crashes due to some unexpected error, the processing will resume from the last successfully processed file or object. + + +[id="attrib-timestamp_epoch-gcs"] +[float] +==== `timestamp_epoch` + +This attribute can be used to filter out files and objects that have a timestamp older than the specified value. The value of this attribute should be in unix `epoch` (seconds) format. The timestamp value is compared with the `object.Updated` field obtained from the object metadata. This attribute can be specified both at the root level of the configuration as well at the container level. The container level values will always take priority and override the root level values if both are specified. + +[source, yml] +---- +filebeat.inputs: +- type: gcs + project_id: my_project_id + auth.credentials_file.path: {{file_path}}/{{creds_file_name}}.json + buckets: + - name: obs-bucket + max_workers: 3 + poll: true + poll_interval: 15s + bucket_timeout: 60s + timestamp_epoch: 1630444800 +---- [id="bucket-overrides"] *The sample configs below will explain the bucket level overriding of attributes a bit further :-* @@ -260,7 +350,7 @@ The bucket level values will always take priority and override the root level va Here `bucket_1` is using root level attributes while `bucket_2` overrides the values : -["source","yaml",subs="attributes"] +[source, yml] ---- filebeat.inputs: - type: gcs @@ -288,7 +378,7 @@ of using the root values. Here both `bucket_1` and `bucket_2` overrides the root values : -["source","yaml",subs="attributes"] +[source, yml] ---- filebeat.inputs: - type: gcs diff --git a/x-pack/filebeat/docs/inputs/input-http-endpoint.asciidoc b/x-pack/filebeat/docs/inputs/input-http-endpoint.asciidoc index ed25c5f719d..036ab9b2781 100644 --- a/x-pack/filebeat/docs/inputs/input-http-endpoint.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-http-endpoint.asciidoc @@ -279,6 +279,12 @@ This option defines the provider of the webhook that uses CRC (Challenge-Respons The secret token provided by the webhook owner for the CRC validation. It is required when a `crc.provider` is set. +[float] +==== `method` + +The HTTP method handled by the endpoint. If specified, `method` must be `POST`, `PUT` or `PATCH`. +The default method is `POST`. If `PUT` or `PATCH` are specified, requests using those method types are accepted, but are treated as `POST` requests and are expected to have a request body containing the request data. + [float] === Metrics diff --git a/x-pack/filebeat/filebeat.reference.yml b/x-pack/filebeat/filebeat.reference.yml index 9ea0dabfb0b..29704a80ad4 100644 --- a/x-pack/filebeat/filebeat.reference.yml +++ b/x-pack/filebeat/filebeat.reference.yml @@ -3916,8 +3916,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -4803,6 +4804,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is filebeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "filebeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/filebeat/input/azureblobstorage/config.go b/x-pack/filebeat/input/azureblobstorage/config.go index 22e8efd7ec2..a780e60216d 100644 --- a/x-pack/filebeat/input/azureblobstorage/config.go +++ b/x-pack/filebeat/input/azureblobstorage/config.go @@ -6,27 +6,41 @@ package azureblobstorage import ( "time" + + "github.com/elastic/beats/v7/libbeat/common/match" ) -// MaxWorkers, Poll & PollInterval can be configured at a global level, -// which applies to all containers, as well as at the container level. +// MaxWorkers, Poll, PollInterval, FileSelectors, TimeStampEpoch & ExpandEventListFromField can +// be configured at a global level, which applies to all containers. They can also be configured at individual container levels. // Container level configurations will always override global level values. type config struct { - AccountName string `config:"account_name" validate:"required"` - StorageURL string `config:"storage_url,omitempty"` - Auth authConfig `config:"auth" validate:"required"` - MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` - Poll *bool `config:"poll,omitempty"` - PollInterval *time.Duration `config:"poll_interval,omitempty"` - Containers []container `config:"containers" validate:"required"` + AccountName string `config:"account_name" validate:"required"` + StorageURL string `config:"storage_url"` + Auth authConfig `config:"auth" validate:"required"` + MaxWorkers *int `config:"max_workers" validate:"max=5000"` + Poll *bool `config:"poll"` + PollInterval *time.Duration `config:"poll_interval"` + Containers []container `config:"containers" validate:"required"` + FileSelectors []fileSelectorConfig `config:"file_selectors"` + TimeStampEpoch *int64 `config:"timestamp_epoch"` + ExpandEventListFromField string `config:"expand_event_list_from_field"` } // container contains the config for each specific blob storage container in the root account type container struct { - Name string `config:"name" validate:"required"` - MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` - Poll *bool `config:"poll,omitempty"` - PollInterval *time.Duration `config:"poll_interval,omitempty"` + Name string `config:"name" validate:"required"` + MaxWorkers *int `config:"max_workers" validate:"max=5000"` + Poll *bool `config:"poll"` + PollInterval *time.Duration `config:"poll_interval"` + FileSelectors []fileSelectorConfig `config:"file_selectors"` + TimeStampEpoch *int64 `config:"timestamp_epoch"` + ExpandEventListFromField string `config:"expand_event_list_from_field"` +} + +// fileSelectorConfig helps filter out azure blobs based on a regex pattern +type fileSelectorConfig struct { + Regex *match.Matcher `config:"regex" validate:"required"` + // TODO: Add support for reader config in future } type authConfig struct { diff --git a/x-pack/filebeat/input/azureblobstorage/input.go b/x-pack/filebeat/input/azureblobstorage/input.go index 3cca206174d..28484c037f7 100644 --- a/x-pack/filebeat/input/azureblobstorage/input.go +++ b/x-pack/filebeat/input/azureblobstorage/input.go @@ -23,6 +23,12 @@ type azurebsInput struct { serviceURL string } +// defines the valid range for Unix timestamps for 64 bit integers +var ( + minTimestamp = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC).Unix() + maxTimestamp = time.Date(3000, time.January, 1, 0, 0, 0, 0, time.UTC).Unix() +) + const ( inputName string = "azure-blob-storage" ) @@ -53,12 +59,18 @@ func configure(cfg *conf.C) ([]cursor.Source, cursor.Input, error) { var sources []cursor.Source for _, c := range config.Containers { container := tryOverrideOrDefault(config, c) + if container.TimeStampEpoch != nil && !isValidUnixTimestamp(*container.TimeStampEpoch) { + return nil, nil, fmt.Errorf("invalid timestamp epoch: %d", *container.TimeStampEpoch) + } sources = append(sources, &Source{ - AccountName: config.AccountName, - ContainerName: c.Name, - MaxWorkers: *container.MaxWorkers, - Poll: *container.Poll, - PollInterval: *container.PollInterval, + AccountName: config.AccountName, + ContainerName: c.Name, + MaxWorkers: *container.MaxWorkers, + Poll: *container.Poll, + PollInterval: *container.PollInterval, + TimeStampEpoch: container.TimeStampEpoch, + ExpandEventListFromField: container.ExpandEventListFromField, + FileSelectors: container.FileSelectors, }) } @@ -85,7 +97,6 @@ func tryOverrideOrDefault(cfg config, c container) container { } c.MaxWorkers = &maxWorkers } - if c.Poll == nil { var poll bool if cfg.Poll != nil { @@ -93,7 +104,6 @@ func tryOverrideOrDefault(cfg config, c container) container { } c.Poll = &poll } - if c.PollInterval == nil { interval := time.Second * 300 if cfg.PollInterval != nil { @@ -101,9 +111,24 @@ func tryOverrideOrDefault(cfg config, c container) container { } c.PollInterval = &interval } + if c.TimeStampEpoch == nil { + c.TimeStampEpoch = cfg.TimeStampEpoch + } + if c.ExpandEventListFromField == "" { + c.ExpandEventListFromField = cfg.ExpandEventListFromField + } + if len(c.FileSelectors) == 0 && len(cfg.FileSelectors) != 0 { + c.FileSelectors = cfg.FileSelectors + } return c } +// isValidUnixTimestamp checks if the timestamp is a valid Unix timestamp +func isValidUnixTimestamp(timestamp int64) bool { + // checks if the timestamp is within the valid range + return minTimestamp <= timestamp && timestamp <= maxTimestamp +} + func (input *azurebsInput) Name() string { return inputName } diff --git a/x-pack/filebeat/input/azureblobstorage/input_stateless.go b/x-pack/filebeat/input/azureblobstorage/input_stateless.go index a2cfc487081..73ae14a62e5 100644 --- a/x-pack/filebeat/input/azureblobstorage/input_stateless.go +++ b/x-pack/filebeat/input/azureblobstorage/input_stateless.go @@ -7,6 +7,8 @@ package azureblobstorage import ( "context" + "golang.org/x/sync/errgroup" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" @@ -43,14 +45,18 @@ func (pub statelessPublisher) Publish(event beat.Event, _ interface{}) error { func (in *statelessInput) Run(inputCtx v2.Context, publisher stateless.Publisher) error { pub := statelessPublisher{wrapped: publisher} var source cursor.Source + var g errgroup.Group for _, c := range in.config.Containers { container := tryOverrideOrDefault(in.config, c) source = &Source{ - AccountName: in.config.AccountName, - ContainerName: c.Name, - MaxWorkers: *container.MaxWorkers, - Poll: *container.Poll, - PollInterval: *container.PollInterval, + AccountName: in.config.AccountName, + ContainerName: c.Name, + MaxWorkers: *container.MaxWorkers, + Poll: *container.Poll, + PollInterval: *container.PollInterval, + TimeStampEpoch: container.TimeStampEpoch, + ExpandEventListFromField: container.ExpandEventListFromField, + FileSelectors: container.FileSelectors, } st := newState() @@ -73,10 +79,13 @@ func (in *statelessInput) Run(inputCtx v2.Context, publisher stateless.Publisher } scheduler := newScheduler(pub, containerClient, credential, currentSource, &in.config, st, in.serviceURL, log) - err = scheduler.schedule(ctx) - if err != nil { - return err - } + // allows multiple containers to be scheduled concurrently while testing + // the stateless input is triggered only while testing and till now it did not mimic + // the real world concurrent execution of multiple containers. This fix allows it to do so. + g.Go(func() error { + return scheduler.schedule(ctx) + }) + } - return nil + return g.Wait() } diff --git a/x-pack/filebeat/input/azureblobstorage/input_test.go b/x-pack/filebeat/input/azureblobstorage/input_test.go index b313f6fabd9..d4b004980b8 100644 --- a/x-pack/filebeat/input/azureblobstorage/input_test.go +++ b/x-pack/filebeat/input/azureblobstorage/input_test.go @@ -35,6 +35,7 @@ const ( beatsJSONContainer = "beatsjsoncontainer" beatsNdJSONContainer = "beatsndjsoncontainer" beatsGzJSONContainer = "beatsgzjsoncontainer" + beatsJSONWithArrayContainer = "beatsjsonwitharraycontainer" ) func Test_StorageClient(t *testing.T) { @@ -316,6 +317,160 @@ func Test_StorageClient(t *testing.T) { mock.BeatsFilesContainer_multiline_json_gz[1]: true, }, }, + { + name: "ReadJSONWithRootAsArray", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "max_workers": 1, + "poll": true, + "poll_interval": "10s", + "containers": []map[string]interface{}{ + { + "name": beatsJSONWithArrayContainer, + }, + }, + }, + mockHandler: mock.AzureStorageFileServer, + expected: map[string]bool{ + mock.BeatsFilesContainer_json_array[0]: true, + mock.BeatsFilesContainer_json_array[1]: true, + mock.BeatsFilesContainer_json_array[2]: true, + mock.BeatsFilesContainer_json_array[3]: true, + }, + }, + { + name: "FilterByTimeStampEpoch", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "timestamp_epoch": 1663157564, + "max_workers": 2, + "poll": false, + "poll_interval": "10s", + "containers": []map[string]interface{}{ + { + "name": beatsContainer, + }, + }, + }, + mockHandler: mock.AzureStorageServer, + expected: map[string]bool{ + mock.Beatscontainer_blob_data3_json: true, + mock.Beatscontainer_blob_docs_ata_json: true, + }, + }, + { + name: "FilterByFileSelectorRegexSingle", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "max_workers": 2, + "poll": false, + "poll_interval": "10s", + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + }, + "containers": []map[string]interface{}{ + { + "name": beatsContainer, + }, + }, + }, + mockHandler: mock.AzureStorageServer, + expected: map[string]bool{ + mock.Beatscontainer_blob_docs_ata_json: true, + }, + }, + { + name: "FilterByFileSelectorRegexMulti", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "max_workers": 2, + "poll": false, + "poll_interval": "10s", + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + { + "regex": "data", + }, + }, + "containers": []map[string]interface{}{ + { + "name": beatsContainer, + }, + }, + }, + mockHandler: mock.AzureStorageServer, + expected: map[string]bool{ + mock.Beatscontainer_blob_data3_json: true, + mock.Beatscontainer_blob_docs_ata_json: true, + }, + }, + { + name: "ExpandEventListFromField", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "max_workers": 2, + "poll": true, + "poll_interval": "10s", + "expand_event_list_from_field": "Events", + "file_selectors": []map[string]interface{}{ + { + "regex": "events-array", + }, + }, + "containers": []map[string]interface{}{ + { + "name": beatsJSONContainer, + }, + }, + }, + mockHandler: mock.AzureStorageFileServer, + expected: map[string]bool{ + mock.BeatsFilesContainer_events_array_json[0]: true, + mock.BeatsFilesContainer_events_array_json[1]: true, + }, + }, + { + name: "MultiContainerWithMultiFileSelectors", + baseConfig: map[string]interface{}{ + "account_name": "beatsblobnew", + "auth.shared_credentials.account_key": "7pfLm1betGiRyyABEM/RFrLYlafLZHbLtGhB52LkWVeBxE7la9mIvk6YYAbQKYE/f0GdhiaOZeV8+AStsAdr/Q==", + "max_workers": 2, + "poll": true, + "poll_interval": "10s", + "containers": []map[string]interface{}{ + { + "name": beatsContainer, + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + }, + }, + { + "name": beatsContainer2, + "file_selectors": []map[string]interface{}{ + { + "regex": "data_3", + }, + }, + }, + }, + }, + mockHandler: mock.AzureStorageServer, + expected: map[string]bool{ + mock.Beatscontainer_blob_docs_ata_json: true, + mock.Beatscontainer_2_blob_data3_json: true, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/x-pack/filebeat/input/azureblobstorage/job.go b/x-pack/filebeat/input/azureblobstorage/job.go index 07698a6b0cf..ae1c2c1e617 100644 --- a/x-pack/filebeat/input/azureblobstorage/job.go +++ b/x-pack/filebeat/input/azureblobstorage/job.go @@ -12,9 +12,11 @@ import ( "crypto/sha256" "encoding/hex" "encoding/json" + "errors" "fmt" "io" "time" + "unicode" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" @@ -29,16 +31,26 @@ import ( const jobErrString = "job with jobId %s encountered an error: %w" type job struct { - client *blob.Client - blob *azcontainer.BlobItem - blobURL string - hash string - offset int64 + // client is an azure blob handle + client *blob.Client + // blob is an azure blob item handle + blob *azcontainer.BlobItem + // azure blob url for the resource + blobURL string + // object hash, used in setting event id + hash string + // flag to denote if object is gzip compressed or not isCompressed bool - state *state - src *Source - publisher cursor.Publisher - log *logp.Logger + // flag to denote if object's root element is of an array type + isRootArray bool + // blob state + state *state + // container source struct used for storing container related data + src *Source + // publisher is used to publish a beat event to the output stream + publisher cursor.Publisher + // custom logger + log *logp.Logger } // newJob, returns an instance of a job, which is a unit of work that can be assigned to a go routine @@ -107,18 +119,14 @@ func (j *job) timestamp() *time.Time { } func (j *job) processAndPublishData(ctx context.Context, id string) error { - var err error - downloadOptions := &blob.DownloadStreamOptions{} - if !j.isCompressed { - downloadOptions.Range.Offset = j.offset - } - - get, err := j.client.DownloadStream(ctx, downloadOptions) + get, err := j.client.DownloadStream(ctx, &blob.DownloadStreamOptions{}) if err != nil { return fmt.Errorf("failed to download data from blob with error: %w", err) } - - reader := get.NewRetryReader(context.Background(), &azblob.RetryReaderOptions{}) + const maxRetries = 3 + reader := get.NewRetryReader(ctx, &azblob.RetryReaderOptions{ + MaxRetries: maxRetries, + }) defer func() { err = reader.Close() if err != nil { @@ -126,8 +134,7 @@ func (j *job) processAndPublishData(ctx context.Context, id string) error { } }() - updatedReader, err := j.addGzipDecoderIfNeeded(reader) - err = j.readJsonAndPublish(ctx, updatedReader, id) + err = j.readJsonAndPublish(ctx, reader, id) if err != nil { return fmt.Errorf("failed to read data from blob with error: %w", err) } @@ -135,6 +142,121 @@ func (j *job) processAndPublishData(ctx context.Context, id string) error { return err } +func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) error { + r, err := j.addGzipDecoderIfNeeded(bufio.NewReader(r)) + if err != nil { + return fmt.Errorf("failed to add gzip decoder to blob: %s, with error: %w", *j.blob.Name, err) + } + + // checks if the root element is an array or not + r, j.isRootArray, err = evaluateJSON(bufio.NewReader(r)) + if err != nil { + return fmt.Errorf("failed to evaluate json for blob: %s, with error: %w", *j.blob.Name, err) + } + + dec := json.NewDecoder(r) + dec.UseNumber() + // If array is present at root then read json token and advance decoder + if j.isRootArray { + _, err := dec.Token() + if err != nil { + return fmt.Errorf("failed to read JSON token for object: %s, with error: %w", *j.blob.Name, err) + } + } + + for dec.More() && ctx.Err() == nil { + var item json.RawMessage + offset := dec.InputOffset() + if err := dec.Decode(&item); err != nil { + return fmt.Errorf("failed to decode json: %w", err) + } + // if expand_event_list_from_field is set, then split the event list + if j.src.ExpandEventListFromField != "" { + if err := j.splitEventList(j.src.ExpandEventListFromField, item, offset, j.hash, id); err != nil { + return err + } + continue + } + + data, err := item.MarshalJSON() + if err != nil { + return err + } + evt := j.createEvent(string(data), offset) + + if !dec.More() { + // if this is the last object, then perform a complete state save + cp, done := j.state.saveForTx(*j.blob.Name, *j.blob.Properties.LastModified) + if err := j.publisher.Publish(evt, cp); err != nil { + j.log.Errorf(jobErrString, id, err) + } + done() + } else { + // since we don't update the cursor checkpoint, lack of a lock here should be fine + if err := j.publisher.Publish(evt, nil); err != nil { + j.log.Errorf(jobErrString, id, err) + } + } + } + return nil +} + +// splitEventList splits the event list into individual events and publishes them +func (j *job) splitEventList(key string, raw json.RawMessage, offset int64, objHash string, id string) error { + var jsonObject map[string]json.RawMessage + if err := json.Unmarshal(raw, &jsonObject); err != nil { + return err + } + + raw, found := jsonObject[key] + if !found { + return fmt.Errorf("expand_event_list_from_field key <%v> is not in event", key) + } + + dec := json.NewDecoder(bytes.NewReader(raw)) + dec.UseNumber() + + tok, err := dec.Token() + if err != nil { + return err + } + delim, ok := tok.(json.Delim) + if !ok || delim != '[' { + return fmt.Errorf("expand_event_list_from_field <%v> is not an array", key) + } + + for dec.More() { + arrayOffset := dec.InputOffset() + + var item json.RawMessage + if err := dec.Decode(&item); err != nil { + return fmt.Errorf("failed to decode array item at offset %d: %w", offset+arrayOffset, err) + } + + data, err := item.MarshalJSON() + if err != nil { + return err + } + evt := j.createEvent(string(data), offset+arrayOffset) + + if !dec.More() { + // if this is the last object, then save checkpoint + cp, done := j.state.saveForTx(*j.blob.Name, *j.blob.Properties.LastModified) + if err := j.publisher.Publish(evt, cp); err != nil { + j.log.Errorf(jobErrString, id, err) + } + done() + } else { + // since we don't update the cursor checkpoint, lack of a lock here should be fine + if err := j.publisher.Publish(evt, nil); err != nil { + j.log.Errorf(jobErrString, id, err) + } + } + } + + return nil +} + // addGzipDecoderIfNeeded determines whether the given stream of bytes (encapsulated in a buffered reader) // represents gzipped content or not and adds gzipped decoder if needed. A buffered reader is used // so the function can peek into the byte stream without consuming it. This makes it convenient for @@ -161,53 +283,38 @@ func (j *job) addGzipDecoderIfNeeded(body io.Reader) (io.Reader, error) { return gzip.NewReader(bufReader) } -func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) error { - dec := json.NewDecoder(r) - dec.UseNumber() - var offset int64 - var relativeOffset int64 - // uncompressed files use the client to directly set the offset, this - // in turn causes the offset to reset to 0 for the new stream, hence why - // we need to keep relative offsets to keep track of the actual offset - if !j.isCompressed { - relativeOffset = j.offset - } - for dec.More() && ctx.Err() == nil { - var item json.RawMessage - offset = dec.InputOffset() - if err := dec.Decode(&item); err != nil { - return fmt.Errorf("failed to decode json: %w", err) +// evaluateJSON uses a bufio.NewReader & reader.Peek to evaluate if the +// data stream contains a json array as the root element or not, without +// advancing the reader. If the data stream contains an array as the root +// element, the value of the boolean return type is set to true. +func evaluateJSON(reader *bufio.Reader) (io.Reader, bool, error) { + eof := false + // readSize is the constant value in the incremental read operation, this value is arbitrary + // but works well for our use case + const readSize = 5 + for i := 0; ; i++ { + b, err := reader.Peek((i + 1) * readSize) + if errors.Is(err, io.EOF) { + eof = true } - // manually seek offset only if file is compressed - if j.isCompressed && offset < j.offset { - continue + startByte := i * readSize + for j := 0; j < len(b[startByte:]); j++ { + char := b[startByte+j : startByte+j+1] + switch { + case bytes.Equal(char, []byte("[")): + return reader, true, nil + case bytes.Equal(char, []byte("{")): + return reader, false, nil + case unicode.IsSpace(bytes.Runes(char)[0]): + continue + default: + return nil, false, fmt.Errorf("unexpected error: JSON data is malformed") + } } - - data, err := item.MarshalJSON() - if err != nil { - return err - } - evt := j.createEvent(string(data), offset+relativeOffset) - // updates the offset after reading the file - // this avoids duplicates for the last read when resuming operation - offset = dec.InputOffset() - var ( - cp *Checkpoint - done func() - ) - if !dec.More() { - // if this is the last object, then peform a complete state save - cp, done = j.state.saveForTx(*j.blob.Name, *j.blob.Properties.LastModified) - } else { - // partially saves read state using offset - cp, done = j.state.savePartialForTx(*j.blob.Name, offset+relativeOffset) - } - if err := j.publisher.Publish(evt, cp); err != nil { - j.log.Errorf(jobErrString, id, err) + if eof { + return nil, false, fmt.Errorf("unexpected error: JSON data is malformed") } - done() } - return nil } func (j *job) createEvent(message string, offset int64) beat.Event { @@ -227,8 +334,8 @@ func (j *job) createEvent(message string, offset int64) beat.Event { "name": j.src.ContainerName, }, "blob": mapstr.M{ - "name": j.blob.Name, - "content_type": j.blob.Properties.ContentType, + "name": *j.blob.Name, + "content_type": *j.blob.Properties.ContentType, }, }, }, diff --git a/x-pack/filebeat/input/azureblobstorage/mock/data.go b/x-pack/filebeat/input/azureblobstorage/mock/data.go index a566e4bbc03..1132df16900 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/data.go +++ b/x-pack/filebeat/input/azureblobstorage/mock/data.go @@ -47,7 +47,7 @@ var fetchContainer = map[string]string{ ata.json - Wed, 14 Sep 2022 12:12:28 GMT + Wed, 12 Sep 2022 12:12:28 GMT 0x8DA964A64516C82 643 application/json @@ -83,7 +83,7 @@ var fetchContainer = map[string]string{ docs/ata.json - Wed, 14 Sep 2022 12:13:07 GMT + Wed, 15 Sep 2022 12:13:07 GMT 0x8DA964A7B8D8862 643 application/json diff --git a/x-pack/filebeat/input/azureblobstorage/mock/data_files.go b/x-pack/filebeat/input/azureblobstorage/mock/data_files.go index ed6f3ad7bb3..3273d329412 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/data_files.go +++ b/x-pack/filebeat/input/azureblobstorage/mock/data_files.go @@ -9,6 +9,7 @@ const ( beatsJSONContainer = "beatsjsoncontainer" beatsNdJSONContainer = "beatsndjsoncontainer" beatsGzJSONContainer = "beatsgzjsoncontainer" + beatsJSONWithArrayContainer = "beatsjsonwitharraycontainer" ) var fileContainers = map[string]bool{ @@ -16,6 +17,7 @@ var fileContainers = map[string]bool{ beatsJSONContainer: true, beatsNdJSONContainer: true, beatsGzJSONContainer: true, + beatsJSONWithArrayContainer: true, } var availableFileBlobs = map[string]map[string]bool{ @@ -32,6 +34,10 @@ var availableFileBlobs = map[string]map[string]bool{ beatsGzJSONContainer: { "multiline.json.gz": true, }, + beatsJSONWithArrayContainer: { + "array-at-root.json": true, + "nested-arrays.json": true, + }, } var fetchFilesContainer = map[string]string{ @@ -125,6 +131,48 @@ var fetchFilesContainer = map[string]string{ `, + beatsJSONWithArrayContainer: ` + + + + array-at-root.json + + Wed, 14 Sep 2022 12:12:28 GMT + 0x8DA964A64516C82 + 643 + application/json + + + UjQX73kQRTHx+UyXZDvVkg== + + + BlockBlob + unlocked + available + + + + + nested-arrays.json + + Wed, 14 Sep 2022 12:12:28 GMT + 0x8DA964A64516C83 + 643 + application/json + + + UjQX73kQRTHx+UyXZDvVkg== + + + BlockBlob + unlocked + available + + + + + + `, beatsGzJSONContainer: ` @@ -167,6 +215,18 @@ var BeatsFilesContainer_log_ndjson = []string{ `{"@timestamp":"2021-05-25T17:25:51.391Z","log.level":"info","message":"available space is 44.3gb"}`, } +var BeatsFilesContainer_events_array_json = []string{ + "{\n \"time\": \"2021-05-25 18:20:58 UTC\",\n \"msg\": \"hello\"\n }", + "{\n \"time\": \"2021-05-26 22:21:40 UTC\",\n \"msg\": \"world\"\n }", +} + +var BeatsFilesContainer_json_array = []string{ + "{\n \"time\": \"2021-05-25 18:20:58 UTC\",\n \"msg\": \"hello\"\n }", + "{\n \"time\": \"2021-05-26 22:21:40 UTC\",\n \"msg\": \"world\"\n }", + "[\n {\n \"time\": \"2021-05-25 18:20:58 UTC\",\n \"msg\": \"hello\"\n },\n {\n \"time\": \"2021-05-26 22:21:40 UTC\",\n \"msg\": \"world\"\n }\n ]", + "[\n {\n \"time\": \"2021-05-25 18:20:58 UTC\",\n \"msg\": \"hi\"\n },\n {\n \"time\": \"2021-05-26 22:21:40 UTC\",\n \"msg\": \"seoul\"\n }\n ]", +} + var BeatsFilesContainer_multiline_json_gz = []string{ "{\n \"@timestamp\": \"2021-05-25T17:25:42.806Z\",\n \"log.level\": \"error\",\n \"message\": \"error making http request\"\n}", "{\n \"@timestamp\": \"2021-05-25T17:25:51.391Z\",\n \"log.level\": \"info\",\n \"message\": \"available disk space 44.3gb\"\n}", diff --git a/x-pack/filebeat/input/azureblobstorage/mock/data_random.go b/x-pack/filebeat/input/azureblobstorage/mock/data_random.go index f52fe2fdbdb..b4d92735e69 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/data_random.go +++ b/x-pack/filebeat/input/azureblobstorage/mock/data_random.go @@ -66,7 +66,7 @@ func generateMetadata() []byte { // Helper function to create a random Blob func createRandomBlob(i int) Blob { - rand.Seed(time.Now().UnixNano()) + rand.New(rand.NewSource(12345)) return Blob{ Name: fmt.Sprintf("data_%d.json", i), @@ -104,7 +104,7 @@ func generateRandomBlob() []byte { } func createRandomData() MyData { - rand.Seed(time.Now().UnixNano()) + rand.New(rand.NewSource(12345)) return MyData{ ID: rand.Intn(1000) + 1, @@ -119,6 +119,7 @@ func getRandomString(options []string) string { if len(options) == 0 { return "" } - rand.Seed(time.Now().UnixNano()) + + rand.New(rand.NewSource(time.Now().UnixNano())) return options[rand.Intn(len(options))] } diff --git a/x-pack/filebeat/input/azureblobstorage/mock/testdata/array-at-root.json b/x-pack/filebeat/input/azureblobstorage/mock/testdata/array-at-root.json new file mode 100644 index 00000000000..8d22df6aeb8 --- /dev/null +++ b/x-pack/filebeat/input/azureblobstorage/mock/testdata/array-at-root.json @@ -0,0 +1,10 @@ +[ + { + "time": "2021-05-25 18:20:58 UTC", + "msg": "hello" + }, + { + "time": "2021-05-26 22:21:40 UTC", + "msg": "world" + } +] diff --git a/x-pack/filebeat/input/azureblobstorage/mock/testdata/log.json b/x-pack/filebeat/input/azureblobstorage/mock/testdata/log.json index f6aaf5ec64d..b88e0545284 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/testdata/log.json +++ b/x-pack/filebeat/input/azureblobstorage/mock/testdata/log.json @@ -1 +1 @@ -{"@timestamp":"2021-05-25T17:25:42.806Z","log.level":"error","message":"error making http request"}{"@timestamp":"2021-05-25T17:25:51.391Z","log.level":"info","message":"available disk space 44.3gb"} \ No newline at end of file +{"@timestamp":"2021-05-25T17:25:42.806Z","log.level":"error","message":"error making http request"}{"@timestamp":"2021-05-25T17:25:51.391Z","log.level":"info","message":"available disk space 44.3gb"} diff --git a/x-pack/filebeat/input/azureblobstorage/mock/testdata/multiline.json b/x-pack/filebeat/input/azureblobstorage/mock/testdata/multiline.json index 974d296762a..32d319af2bc 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/testdata/multiline.json +++ b/x-pack/filebeat/input/azureblobstorage/mock/testdata/multiline.json @@ -7,4 +7,4 @@ "@timestamp": "2021-05-25T17:25:51.391Z", "log.level": "info", "message": "available space 44.3gb" -} \ No newline at end of file +} diff --git a/x-pack/filebeat/input/azureblobstorage/mock/testdata/nested-arrays.json b/x-pack/filebeat/input/azureblobstorage/mock/testdata/nested-arrays.json new file mode 100644 index 00000000000..588e549867a --- /dev/null +++ b/x-pack/filebeat/input/azureblobstorage/mock/testdata/nested-arrays.json @@ -0,0 +1,23 @@ +[ + [ + { + "time": "2021-05-25 18:20:58 UTC", + "msg": "hello" + }, + { + "time": "2021-05-26 22:21:40 UTC", + "msg": "world" + } + ], + + [ + { + "time": "2021-05-25 18:20:58 UTC", + "msg": "hi" + }, + { + "time": "2021-05-26 22:21:40 UTC", + "msg": "seoul" + } + ] +] diff --git a/x-pack/filebeat/input/azureblobstorage/scheduler.go b/x-pack/filebeat/input/azureblobstorage/scheduler.go index b796a6f15b4..ba433b78f41 100644 --- a/x-pack/filebeat/input/azureblobstorage/scheduler.go +++ b/x-pack/filebeat/input/azureblobstorage/scheduler.go @@ -74,7 +74,6 @@ func newScheduler(publisher cursor.Publisher, client *azcontainer.Client, // schedule, is responsible for fetching & scheduling jobs using the workerpool model func (s *scheduler) schedule(ctx context.Context) error { - defer s.limiter.wait() if !s.src.Poll { return s.scheduleOnce(ctx) } @@ -93,16 +92,30 @@ func (s *scheduler) schedule(ctx context.Context) error { } func (s *scheduler) scheduleOnce(ctx context.Context) error { + defer s.limiter.wait() pager := s.fetchBlobPager(int32(s.src.MaxWorkers)) + fileSelectorLen := len(s.src.FileSelectors) + var numBlobs, numJobs int + for pager.More() { resp, err := pager.NextPage(ctx) if err != nil { return err } + numBlobs += len(resp.Segment.BlobItems) + s.log.Debugf("scheduler: %d blobs fetched for current batch", len(resp.Segment.BlobItems)) + var jobs []*job for _, v := range resp.Segment.BlobItems { - + // if file selectors are present, then only select the files that match the regex + if fileSelectorLen != 0 && !s.isFileSelected(*v.Name) { + continue + } + // date filter is applied on last modified time of the blob + if s.src.TimeStampEpoch != nil && v.Properties.LastModified.Unix() < *s.src.TimeStampEpoch { + continue + } blobURL := s.serviceURL + s.src.ContainerName + "/" + *v.Name blobCreds := &blobCredentials{ serviceCreds: s.credential, @@ -125,6 +138,8 @@ func (s *scheduler) scheduleOnce(ctx context.Context) error { jobs = s.moveToLastSeenJob(jobs) } + s.log.Debugf("scheduler: %d jobs scheduled for current batch", len(jobs)) + // distributes jobs among workers with the help of a limiter for i, job := range jobs { id := fetchJobID(i, s.src.ContainerName, job.name()) @@ -135,6 +150,11 @@ func (s *scheduler) scheduleOnce(ctx context.Context) error { job.do(ctx, id) }() } + + s.log.Debugf("scheduler: total objects read till now: %d\nscheduler: total jobs scheduled till now: %d", numBlobs, numJobs) + if len(jobs) != 0 { + s.log.Debugf("scheduler: first job in current batch: %s\nscheduler: last job in current batch: %s", jobs[0].name(), jobs[len(jobs)-1].name()) + } } return nil @@ -177,10 +197,7 @@ func (s *scheduler) moveToLastSeenJob(jobs []*job) []*job { ignore := false for _, job := range jobs { - switch offset, isPartial := s.state.cp.PartiallyProcessed[*job.blob.Name]; { - case isPartial: - job.offset = offset - latestJobs = append(latestJobs, job) + switch { case job.timestamp().After(s.state.checkpoint().LatestEntryTime): latestJobs = append(latestJobs, job) case job.name() == s.state.checkpoint().BlobName: @@ -200,12 +217,21 @@ func (s *scheduler) moveToLastSeenJob(jobs []*job) []*job { jobsToReturn = jobs } - // in a senario where there are some jobs which have a later time stamp + // in a senario where there are some jobs which have a greater timestamp // but lesser alphanumeric order and some jobs have greater alphanumeric order - // than the current checkpoint or partially completed jobs are present + // than the current checkpoint blob name, then we append the latest jobs if len(jobsToReturn) != len(jobs) && len(latestJobs) > 0 { jobsToReturn = append(latestJobs, jobsToReturn...) } return jobsToReturn } + +func (s *scheduler) isFileSelected(name string) bool { + for _, sel := range s.src.FileSelectors { + if sel.Regex == nil || sel.Regex.MatchString(name) { + return true + } + } + return false +} diff --git a/x-pack/filebeat/input/azureblobstorage/state.go b/x-pack/filebeat/input/azureblobstorage/state.go index de1873e9042..43fdf822f2d 100644 --- a/x-pack/filebeat/input/azureblobstorage/state.go +++ b/x-pack/filebeat/input/azureblobstorage/state.go @@ -25,15 +25,11 @@ type Checkpoint struct { BlobName string // timestamp to denote which is the latest blob LatestEntryTime time.Time - // map to contain offset data - PartiallyProcessed map[string]int64 } func newState() *state { return &state{ - cp: &Checkpoint{ - PartiallyProcessed: make(map[string]int64), - }, + cp: &Checkpoint{}, } } @@ -43,7 +39,6 @@ func newState() *state { // more than once. func (s *state) saveForTx(name string, lastModifiedOn time.Time) (cp *Checkpoint, done func()) { s.mu.Lock() - delete(s.cp.PartiallyProcessed, name) if len(s.cp.BlobName) == 0 { s.cp.BlobName = name } else if strings.ToLower(name) > strings.ToLower(s.cp.BlobName) { @@ -57,21 +52,8 @@ func (s *state) saveForTx(name string, lastModifiedOn time.Time) (cp *Checkpoint return s.cp, func() { s.mu.Unlock() } } -// savePartialForTx partially updates and returns the current state checkpoint, locks the state -// and returns an unlock function done(). The caller must call done when -// s and cp are no longer needed in a locked state. done may not be called -// more than once. -func (s *state) savePartialForTx(name string, offset int64) (cp *Checkpoint, done func()) { - s.mu.Lock() - s.cp.PartiallyProcessed[name] = offset - return s.cp, func() { s.mu.Unlock() } -} - // setCheckpoint sets checkpoint from source to current state instance func (s *state) setCheckpoint(chkpt *Checkpoint) { - if chkpt.PartiallyProcessed == nil { - chkpt.PartiallyProcessed = make(map[string]int64) - } s.cp = chkpt } diff --git a/x-pack/filebeat/input/azureblobstorage/types.go b/x-pack/filebeat/input/azureblobstorage/types.go index ef3e2480fc4..67012198423 100644 --- a/x-pack/filebeat/input/azureblobstorage/types.go +++ b/x-pack/filebeat/input/azureblobstorage/types.go @@ -13,11 +13,14 @@ import ( // Source, it is the cursor source type Source struct { - ContainerName string - AccountName string - MaxWorkers int - Poll bool - PollInterval time.Duration + ContainerName string + AccountName string + MaxWorkers int + Poll bool + PollInterval time.Duration + TimeStampEpoch *int64 + FileSelectors []fileSelectorConfig + ExpandEventListFromField string } func (s *Source) Name() string { diff --git a/x-pack/filebeat/input/cel/config.go b/x-pack/filebeat/input/cel/config.go index e37fe81eeec..5a62a3ad572 100644 --- a/x-pack/filebeat/input/cel/config.go +++ b/x-pack/filebeat/input/cel/config.go @@ -89,7 +89,7 @@ func (c config) Validate() error { if len(c.Regexps) != 0 { patterns = map[string]*regexp.Regexp{".": nil} } - _, err = newProgram(context.Background(), c.Program, root, client, nil, nil, patterns, c.XSDs) + _, err = newProgram(context.Background(), c.Program, root, client, nil, nil, patterns, c.XSDs, logp.L().Named("input.cel")) if err != nil { return fmt.Errorf("failed to check program: %w", err) } diff --git a/x-pack/filebeat/input/cel/input.go b/x-pack/filebeat/input/cel/input.go index 557ad5422e9..ea4958b9c30 100644 --- a/x-pack/filebeat/input/cel/input.go +++ b/x-pack/filebeat/input/cel/input.go @@ -150,7 +150,7 @@ func (i input) run(env v2.Context, src *source, cursor map[string]interface{}, p Password: cfg.Auth.Basic.Password, } } - prg, err := newProgram(ctx, cfg.Program, root, client, limiter, auth, patterns, cfg.XSDs) + prg, err := newProgram(ctx, cfg.Program, root, client, limiter, auth, patterns, cfg.XSDs, log) if err != nil { return err } @@ -861,7 +861,7 @@ var ( } ) -func newProgram(ctx context.Context, src, root string, client *http.Client, limiter *rate.Limiter, auth *lib.BasicAuth, patterns map[string]*regexp.Regexp, xsd map[string]string) (cel.Program, error) { +func newProgram(ctx context.Context, src, root string, client *http.Client, limiter *rate.Limiter, auth *lib.BasicAuth, patterns map[string]*regexp.Regexp, xsd map[string]string, log *logp.Logger) (cel.Program, error) { xml, err := lib.XML(nil, xsd) if err != nil { return nil, fmt.Errorf("failed to build xml type hints: %w", err) @@ -875,6 +875,7 @@ func newProgram(ctx context.Context, src, root string, client *http.Client, limi lib.Strings(), lib.Time(), lib.Try(), + lib.Debug(debug(log)), lib.File(mimetypes), lib.MIME(mimetypes), lib.Regexp(patterns), @@ -906,6 +907,17 @@ func newProgram(ctx context.Context, src, root string, client *http.Client, limi return prg, nil } +func debug(log *logp.Logger) func(string, any) { + log = log.Named("cel_debug") + return func(tag string, value any) { + level := "DEBUG" + if _, ok := value.(error); ok { + level = "ERROR" + } + log.Debugw(level, "tag", tag, "value", value) + } +} + func evalWith(ctx context.Context, prg cel.Program, state map[string]interface{}, now time.Time) (map[string]interface{}, error) { out, _, err := prg.ContextEval(ctx, map[string]interface{}{ // Replace global program "now" with current time. This is necessary diff --git a/x-pack/filebeat/input/cel/input_test.go b/x-pack/filebeat/input/cel/input_test.go index d9f87f103d4..bc0cf171471 100644 --- a/x-pack/filebeat/input/cel/input_test.go +++ b/x-pack/filebeat/input/cel/input_test.go @@ -1189,6 +1189,41 @@ var inputTests = []struct { }, }, + { + name: "debug", + config: map[string]interface{}{ + "interval": 1, + "program": `{"events":[{"message":{"value": 1+debug("partial sum", 2+3)}}]}`, + "state": nil, + "resource": map[string]interface{}{ + "url": "", + }, + }, + time: func() time.Time { return time.Date(2010, 2, 8, 0, 0, 0, 0, time.UTC) }, + want: []map[string]interface{}{{ + "message": map[string]interface{}{ + "value": 6.0, // float64 due to json encoding. + }, + }}, + }, + { + name: "debug_error", + config: map[string]interface{}{ + "interval": 1, + "program": `{"events":[{"message":{"value": try(debug("divide by zero", 0/0))}}]}`, + "state": nil, + "resource": map[string]interface{}{ + "url": "", + }, + }, + time: func() time.Time { return time.Date(2010, 2, 8, 0, 0, 0, 0, time.UTC) }, + want: []map[string]interface{}{{ + "message": map[string]interface{}{ + "value": "division by zero", + }, + }}, + }, + // not yet done from httpjson (some are redundant since they are compositional products). // // cursor/pagination (place above auth test block) @@ -1207,6 +1242,7 @@ func TestInput(t *testing.T) { "ndjson_log_file_simple_file_scheme": "Path handling on Windows is incompatible with url.Parse/url.URL.String. See go.dev/issue/6027.", } + logp.TestingSetup() for _, test := range inputTests { t.Run(test.name, func(t *testing.T) { if reason, skip := skipOnWindows[test.name]; runtime.GOOS == "windows" && skip { diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go index 7db004237c9..30514352eba 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go @@ -9,7 +9,6 @@ import ( "context" "errors" "fmt" - "strings" "time" "github.com/google/uuid" @@ -151,21 +150,22 @@ func (p *azure) runFullSync(inputCtx v2.Context, store *kvstore.Store, client be return err } - if len(state.users) != 0 || len(state.devices) != 0 { + wantUsers := p.conf.wantUsers() + wantDevices := p.conf.wantDevices() + if (len(state.users) != 0 && wantUsers) || (len(state.devices) != 0 && wantDevices) { tracker := kvstore.NewTxTracker(ctx) start := time.Now() p.publishMarker(start, start, inputCtx.ID, true, client, tracker) - if len(state.users) != 0 { + if len(state.users) != 0 && wantUsers { p.logger.Debugw("publishing users", "count", len(state.devices)) for _, u := range state.users { p.publishUser(u, state, inputCtx.ID, client, tracker) } - } - if len(state.devices) != 0 { + if len(state.devices) != 0 && wantDevices { p.logger.Debugw("publishing devices", "count", len(state.devices)) for _, d := range state.devices { p.publishDevice(d, state, inputCtx.ID, client, tracker) @@ -224,7 +224,6 @@ func (p *azure) runIncrementalUpdate(inputCtx v2.Context, store *kvstore.Store, } p.publishUser(u, state, inputCtx.ID, client, tracker) }) - } if updatedDevices.Len() != 0 { @@ -236,7 +235,6 @@ func (p *azure) runIncrementalUpdate(inputCtx v2.Context, store *kvstore.Store, } p.publishDevice(d, state, inputCtx.ID, client, tracker) }) - } tracker.Wait() @@ -269,32 +267,32 @@ func (p *azure) doFetch(ctx context.Context, state *stateStore, fullSync bool) ( } var ( + wantUsers = p.conf.wantUsers() changedUsers []*fetcher.User userLink string ) - switch strings.ToLower(p.conf.Dataset) { - case "", "all", "users": + if wantUsers { changedUsers, userLink, err = p.fetcher.Users(ctx, usersDeltaLink) if err != nil { return updatedUsers, updatedDevices, err } p.logger.Debugf("Received %d users from API", len(changedUsers)) - default: + } else { p.logger.Debugf("Skipping user collection from API: dataset=%s", p.conf.Dataset) } var ( + wantDevices = p.conf.wantDevices() changedDevices []*fetcher.Device deviceLink string ) - switch strings.ToLower(p.conf.Dataset) { - case "", "all", "devices": + if wantDevices { changedDevices, deviceLink, err = p.fetcher.Devices(ctx, devicesDeltaLink) if err != nil { return updatedUsers, updatedDevices, err } p.logger.Debugf("Received %d devices from API", len(changedDevices)) - default: + } else { p.logger.Debugf("Skipping device collection from API: dataset=%s", p.conf.Dataset) } @@ -337,6 +335,9 @@ func (p *azure) doFetch(ctx context.Context, state *stateStore, fullSync bool) ( for _, member := range g.Members { switch member.Type { case fetcher.MemberGroup: + if !wantUsers { + break + } for _, u := range state.users { if u.TransitiveMemberOf.Contains(member.ID) { updatedUsers.Add(u.ID) @@ -349,6 +350,9 @@ func (p *azure) doFetch(ctx context.Context, state *stateStore, fullSync bool) ( } case fetcher.MemberUser: + if !wantUsers { + break + } if u, ok := state.users[member.ID]; ok { updatedUsers.Add(u.ID) if member.Deleted { @@ -359,6 +363,9 @@ func (p *azure) doFetch(ctx context.Context, state *stateStore, fullSync bool) ( } case fetcher.MemberDevice: + if !wantDevices { + break + } if d, ok := state.devices[member.ID]; ok { updatedDevices.Add(d.ID) if member.Deleted { @@ -372,42 +379,46 @@ func (p *azure) doFetch(ctx context.Context, state *stateStore, fullSync bool) ( } // Expand user group memberships. - updatedUsers.ForEach(func(userID uuid.UUID) { - u, ok := state.users[userID] - if !ok { - p.logger.Errorf("Unable to find user %q in state", userID) - return - } - u.Modified = true - if u.Deleted { - p.logger.Debugw("not expanding membership for deleted user", "user", userID) - return - } + if wantUsers { + updatedUsers.ForEach(func(userID uuid.UUID) { + u, ok := state.users[userID] + if !ok { + p.logger.Errorf("Unable to find user %q in state", userID) + return + } + u.Modified = true + if u.Deleted { + p.logger.Debugw("not expanding membership for deleted user", "user", userID) + return + } - u.TransitiveMemberOf = u.MemberOf - state.relationships.ExpandFromSet(u.MemberOf).ForEach(func(elem uuid.UUID) { - u.TransitiveMemberOf.Add(elem) + u.TransitiveMemberOf = u.MemberOf + state.relationships.ExpandFromSet(u.MemberOf).ForEach(func(elem uuid.UUID) { + u.TransitiveMemberOf.Add(elem) + }) }) - }) + } // Expand device group memberships. - updatedDevices.ForEach(func(devID uuid.UUID) { - d, ok := state.devices[devID] - if !ok { - p.logger.Errorf("Unable to find device %q in state", devID) - return - } - d.Modified = true - if d.Deleted { - p.logger.Debugw("not expanding membership for deleted device", "device", devID) - return - } + if wantDevices { + updatedDevices.ForEach(func(devID uuid.UUID) { + d, ok := state.devices[devID] + if !ok { + p.logger.Errorf("Unable to find device %q in state", devID) + return + } + d.Modified = true + if d.Deleted { + p.logger.Debugw("not expanding membership for deleted device", "device", devID) + return + } - d.TransitiveMemberOf = d.MemberOf - state.relationships.ExpandFromSet(d.MemberOf).ForEach(func(elem uuid.UUID) { - d.TransitiveMemberOf.Add(elem) + d.TransitiveMemberOf = d.MemberOf + state.relationships.ExpandFromSet(d.MemberOf).ForEach(func(elem uuid.UUID) { + d.TransitiveMemberOf.Add(elem) + }) }) - }) + } return updatedUsers, updatedDevices, nil } diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/conf.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/conf.go index 105b05cbbbb..137951bcc78 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/conf.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/conf.go @@ -52,3 +52,21 @@ func defaultConf() conf { UpdateInterval: defaultUpdateInterval, } } + +func (c *conf) wantUsers() bool { + switch strings.ToLower(c.Dataset) { + case "", "all", "users": + return true + default: + return false + } +} + +func (c *conf) wantDevices() bool { + switch strings.ToLower(c.Dataset) { + case "", "all", "devices": + return true + default: + return false + } +} diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go b/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go index e344b56478f..eb0906e78d5 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go @@ -168,3 +168,21 @@ func (c *conf) Validate() error { return errors.New("dataset must be 'all', 'users', 'devices' or empty") } } + +func (c *conf) wantUsers() bool { + switch strings.ToLower(c.Dataset) { + case "", "all", "users": + return true + default: + return false + } +} + +func (c *conf) wantDevices() bool { + switch strings.ToLower(c.Dataset) { + case "", "all", "devices": + return true + default: + return false + } +} diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go b/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go index 4aff3cd3e59..d56ae757060 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go @@ -12,7 +12,6 @@ import ( "io" "net/http" "net/url" - "strings" "time" "github.com/hashicorp/go-retryablehttp" @@ -253,16 +252,22 @@ func (p *oktaInput) runFullSync(inputCtx v2.Context, store *kvstore.Store, clien return err } - if len(state.users) != 0 || len(state.devices) != 0 { + wantUsers := p.cfg.wantUsers() + wantDevices := p.cfg.wantDevices() + if (len(state.users) != 0 && wantUsers) || (len(state.devices) != 0 && wantDevices) { tracker := kvstore.NewTxTracker(ctx) start := time.Now() p.publishMarker(start, start, inputCtx.ID, true, client, tracker) - for _, u := range state.users { - p.publishUser(u, state, inputCtx.ID, client, tracker) + if wantUsers { + for _, u := range state.users { + p.publishUser(u, state, inputCtx.ID, client, tracker) + } } - for _, d := range state.devices { - p.publishDevice(d, state, inputCtx.ID, client, tracker) + if wantDevices { + for _, d := range state.devices { + p.publishDevice(d, state, inputCtx.ID, client, tracker) + } } end := time.Now() @@ -339,9 +344,7 @@ func (p *oktaInput) runIncrementalUpdate(inputCtx v2.Context, store *kvstore.Sto // any existing deltaLink will be ignored, forcing a full synchronization from Okta. // Returns a set of modified users by ID. func (p *oktaInput) doFetchUsers(ctx context.Context, state *stateStore, fullSync bool) ([]*User, error) { - switch strings.ToLower(p.cfg.Dataset) { - case "", "all", "users": - default: + if !p.cfg.wantUsers() { p.logger.Debugf("Skipping user collection from API: dataset=%s", p.cfg.Dataset) return nil, nil } @@ -426,9 +429,7 @@ func (p *oktaInput) doFetchUsers(ctx context.Context, state *stateStore, fullSyn // synchronization from Okta. // Returns a set of modified devices by ID. func (p *oktaInput) doFetchDevices(ctx context.Context, state *stateStore, fullSync bool) ([]*Device, error) { - switch strings.ToLower(p.cfg.Dataset) { - case "", "all", "devices": - default: + if !p.cfg.wantDevices() { p.logger.Debugf("Skipping device collection from API: dataset=%s", p.cfg.Dataset) return nil, nil } diff --git a/x-pack/filebeat/input/gcppubsub/input.go b/x-pack/filebeat/input/gcppubsub/input.go index 6547333a5e0..c6d088b237b 100644 --- a/x-pack/filebeat/input/gcppubsub/input.go +++ b/x-pack/filebeat/input/gcppubsub/input.go @@ -154,6 +154,11 @@ func NewInput(cfg *conf.C, connector channel.Connector, inputContext input.Conte } }), ), + Processing: beat.ProcessingConfig{ + // This input only produces events with basic types so normalization + // is not required. + EventNormalization: boolPtr(false), + }, }) if err != nil { return nil, err @@ -322,3 +327,6 @@ func (in *pubsubInput) newPubsubClient(ctx context.Context) (*pubsub.Client, err return pubsub.NewClient(ctx, in.ProjectID, opts...) } + +// boolPtr returns a pointer to b. +func boolPtr(b bool) *bool { return &b } diff --git a/x-pack/filebeat/input/gcs/config.go b/x-pack/filebeat/input/gcs/config.go index a22ee5fde8b..846fe1fc94e 100644 --- a/x-pack/filebeat/input/gcs/config.go +++ b/x-pack/filebeat/input/gcs/config.go @@ -6,39 +6,58 @@ package gcs import ( "time" + + "github.com/elastic/beats/v7/libbeat/common/match" ) -// MaxWorkers - Defines the maximum number of go routines that will be spawned. -// Poll - Defines if polling should be performed on the input bucket source. -// PollInterval - Defines the maximum amount of time to wait before polling for the -// next batch of objects from the bucket. -// BucketTimeOut - Defines the maximum time that the sdk will wait for a bucket api response before timing out. -// ParseJSON - Informs the publisher whether to parse & objectify json data or not. By default this is set to -// false, since it can get expensive dealing with highly nested json data. -// MaxWorkers, Poll, PollInterval, BucketTimeOut, ParseJSON can be configured at a global level, -// which applies to all buckets, as well as at the bucket level. +// MaxWorkers, Poll, PollInterval, BucketTimeOut, ParseJSON, FileSelectors, TimeStampEpoch & ExpandEventListFromField +// can be configured at a global level, which applies to all buckets, as well as at the bucket level. // Bucket level configurations will always override global level values. type config struct { - ProjectId string `config:"project_id" validate:"required"` - Auth authConfig `config:"auth" validate:"required"` - MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` - Poll *bool `config:"poll,omitempty"` - PollInterval *time.Duration `config:"poll_interval,omitempty"` - ParseJSON *bool `config:"parse_json,omitempty"` + // ProjectId - Defines the project id of the concerned gcs bucket in Google Cloud. + ProjectId string `config:"project_id" validate:"required"` + // Auth - Defines the authentication mechanism to be used for accessing the gcs bucket. + Auth authConfig `config:"auth" validate:"required"` + // MaxWorkers - Defines the maximum number of go routines that will be spawned. + MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` + // Poll - Defines if polling should be performed on the input bucket source. + Poll *bool `config:"poll,omitempty"` + // PollInterval - Defines the maximum amount of time to wait before polling for the next batch of objects from the bucket. + PollInterval *time.Duration `config:"poll_interval,omitempty"` + // ParseJSON - Informs the publisher whether to parse & objectify json data or not. By default this is set to + // false, since it can get expensive dealing with highly nested json data. + ParseJSON *bool `config:"parse_json,omitempty"` + // BucketTimeOut - Defines the maximum time that the sdk will wait for a bucket api response before timing out. BucketTimeOut *time.Duration `config:"bucket_timeout,omitempty"` - Buckets []bucket `config:"buckets" validate:"required"` + // Buckets - Defines a list of buckets that will be polled for objects. + Buckets []bucket `config:"buckets" validate:"required"` + // FileSelectors - Defines a list of regex patterns that can be used to filter out objects from the bucket. + FileSelectors []fileSelectorConfig `config:"file_selectors"` + // TimeStampEpoch - Defines the epoch time in seconds, which is used to filter out objects that are older than the specified timestamp. + TimeStampEpoch *int64 `config:"timestamp_epoch"` + // ExpandEventListFromField - Defines the field name that will be used to expand the event into separate events. + ExpandEventListFromField string `config:"expand_event_list_from_field"` // This field is only used for system test purposes, to override the HTTP endpoint. AlternativeHost string `config:"alternative_host,omitempty"` } // bucket contains the config for each specific object storage bucket in the root account type bucket struct { - Name string `config:"name" validate:"required"` - MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` - BucketTimeOut *time.Duration `config:"bucket_timeout,omitempty"` - Poll *bool `config:"poll,omitempty"` - PollInterval *time.Duration `config:"poll_interval,omitempty"` - ParseJSON *bool `config:"parse_json,omitempty"` + Name string `config:"name" validate:"required"` + MaxWorkers *int `config:"max_workers,omitempty" validate:"max=5000"` + BucketTimeOut *time.Duration `config:"bucket_timeout,omitempty"` + Poll *bool `config:"poll,omitempty"` + PollInterval *time.Duration `config:"poll_interval,omitempty"` + ParseJSON *bool `config:"parse_json,omitempty"` + FileSelectors []fileSelectorConfig `config:"file_selectors"` + TimeStampEpoch *int64 `config:"timestamp_epoch"` + ExpandEventListFromField string `config:"expand_event_list_from_field"` +} + +// fileSelectorConfig helps filter out gcs objects based on a regex pattern +type fileSelectorConfig struct { + Regex *match.Matcher `config:"regex" validate:"required"` + // TODO: Add support for reader config in future } type authConfig struct { diff --git a/x-pack/filebeat/input/gcs/input.go b/x-pack/filebeat/input/gcs/input.go index 81ed1b82210..ee9684d0213 100644 --- a/x-pack/filebeat/input/gcs/input.go +++ b/x-pack/filebeat/input/gcs/input.go @@ -6,6 +6,7 @@ package gcs import ( "context" + "fmt" "time" "cloud.google.com/go/storage" @@ -22,6 +23,12 @@ type gcsInput struct { config config } +// defines the valid range for Unix timestamps for 64 bit integers +var ( + minTimestamp = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC).Unix() + maxTimestamp = time.Date(3000, time.January, 1, 0, 0, 0, 0, time.UTC).Unix() +) + const ( inputName = "gcs" ) @@ -47,18 +54,23 @@ func configure(cfg *conf.C) ([]cursor.Source, cursor.Input, error) { if err := cfg.Unpack(&config); err != nil { return nil, nil, err } - - var sources []cursor.Source + sources := make([]cursor.Source, 0, len(config.Buckets)) for _, b := range config.Buckets { bucket := tryOverrideOrDefault(config, b) + if bucket.TimeStampEpoch != nil && !isValidUnixTimestamp(*bucket.TimeStampEpoch) { + return nil, nil, fmt.Errorf("invalid timestamp epoch: %d", *bucket.TimeStampEpoch) + } sources = append(sources, &Source{ - ProjectId: config.ProjectId, - BucketName: bucket.Name, - BucketTimeOut: *bucket.BucketTimeOut, - MaxWorkers: *bucket.MaxWorkers, - Poll: *bucket.Poll, - PollInterval: *bucket.PollInterval, - ParseJSON: *bucket.ParseJSON, + ProjectId: config.ProjectId, + BucketName: bucket.Name, + BucketTimeOut: *bucket.BucketTimeOut, + MaxWorkers: *bucket.MaxWorkers, + Poll: *bucket.Poll, + PollInterval: *bucket.PollInterval, + ParseJSON: *bucket.ParseJSON, + TimeStampEpoch: bucket.TimeStampEpoch, + ExpandEventListFromField: bucket.ExpandEventListFromField, + FileSelectors: bucket.FileSelectors, }) } @@ -76,7 +88,6 @@ func tryOverrideOrDefault(cfg config, b bucket) bucket { } b.MaxWorkers = &maxWorkers } - if b.Poll == nil { var poll bool if cfg.Poll != nil { @@ -84,7 +95,6 @@ func tryOverrideOrDefault(cfg config, b bucket) bucket { } b.Poll = &poll } - if b.PollInterval == nil { interval := time.Second * 300 if cfg.PollInterval != nil { @@ -92,7 +102,6 @@ func tryOverrideOrDefault(cfg config, b bucket) bucket { } b.PollInterval = &interval } - if b.ParseJSON == nil { parse := false if cfg.ParseJSON != nil { @@ -100,7 +109,6 @@ func tryOverrideOrDefault(cfg config, b bucket) bucket { } b.ParseJSON = &parse } - if b.BucketTimeOut == nil { timeOut := time.Second * 50 if cfg.BucketTimeOut != nil { @@ -108,10 +116,25 @@ func tryOverrideOrDefault(cfg config, b bucket) bucket { } b.BucketTimeOut = &timeOut } + if b.TimeStampEpoch == nil { + b.TimeStampEpoch = cfg.TimeStampEpoch + } + if b.ExpandEventListFromField == "" { + b.ExpandEventListFromField = cfg.ExpandEventListFromField + } + if len(b.FileSelectors) == 0 && len(cfg.FileSelectors) != 0 { + b.FileSelectors = cfg.FileSelectors + } return b } +// isValidUnixTimestamp checks if the timestamp is a valid Unix timestamp +func isValidUnixTimestamp(timestamp int64) bool { + // checks if the timestamp is within the valid range + return minTimestamp <= timestamp && timestamp <= maxTimestamp +} + func (input *gcsInput) Name() string { return inputName } diff --git a/x-pack/filebeat/input/gcs/input_stateless.go b/x-pack/filebeat/input/gcs/input_stateless.go index d31f0875262..04ec19de5dd 100644 --- a/x-pack/filebeat/input/gcs/input_stateless.go +++ b/x-pack/filebeat/input/gcs/input_stateless.go @@ -10,6 +10,7 @@ import ( "cloud.google.com/go/storage" gax "github.com/googleapis/gax-go/v2" + "golang.org/x/sync/errgroup" v2 "github.com/elastic/beats/v7/filebeat/input/v2" cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" @@ -47,16 +48,20 @@ func (pub statelessPublisher) Publish(event beat.Event, _ interface{}) error { func (in *statelessInput) Run(inputCtx v2.Context, publisher stateless.Publisher, client *storage.Client) error { pub := statelessPublisher{wrapped: publisher} var source cursor.Source + var g errgroup.Group for _, b := range in.config.Buckets { bucket := tryOverrideOrDefault(in.config, b) source = &Source{ - ProjectId: in.config.ProjectId, - BucketName: bucket.Name, - BucketTimeOut: *bucket.BucketTimeOut, - MaxWorkers: *bucket.MaxWorkers, - Poll: *bucket.Poll, - PollInterval: *bucket.PollInterval, - ParseJSON: *bucket.ParseJSON, + ProjectId: in.config.ProjectId, + BucketName: bucket.Name, + BucketTimeOut: *bucket.BucketTimeOut, + MaxWorkers: *bucket.MaxWorkers, + Poll: *bucket.Poll, + PollInterval: *bucket.PollInterval, + ParseJSON: *bucket.ParseJSON, + TimeStampEpoch: bucket.TimeStampEpoch, + ExpandEventListFromField: bucket.ExpandEventListFromField, + FileSelectors: bucket.FileSelectors, } st := newState() @@ -80,8 +85,12 @@ func (in *statelessInput) Run(inputCtx v2.Context, publisher stateless.Publisher ) scheduler := newScheduler(pub, bkt, currentSource, &in.config, st, log) - - return scheduler.schedule(ctx) + // allows multiple containers to be scheduled concurrently while testing + // the stateless input is triggered only while testing and till now it did not mimic + // the real world concurrent execution of multiple containers. This fix allows it to do so. + g.Go(func() error { + return scheduler.schedule(ctx) + }) } - return nil + return g.Wait() } diff --git a/x-pack/filebeat/input/gcs/input_test.go b/x-pack/filebeat/input/gcs/input_test.go index bd9028d6bf9..41e64c031f9 100644 --- a/x-pack/filebeat/input/gcs/input_test.go +++ b/x-pack/filebeat/input/gcs/input_test.go @@ -360,6 +360,164 @@ func Test_StorageClient(t *testing.T) { mock.BeatsFilesBucket_json_array[3]: true, }, }, + { + name: "FilterByTimeStampEpoch", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "timestamp_epoch": 1661385600, + "buckets": []map[string]interface{}{ + { + "name": bucketGcsTestNew, + }, + }, + }, + mockHandler: mock.GCSServer, + expected: map[string]bool{ + mock.Gcs_test_new_object_data3_json: true, + mock.Gcs_test_new_object_docs_ata_json: true, + }, + }, + { + name: "FilterByFileSelectorRegexSingle", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + }, + "buckets": []map[string]interface{}{ + { + "name": bucketGcsTestNew, + }, + }, + }, + mockHandler: mock.GCSServer, + expected: map[string]bool{ + mock.Gcs_test_new_object_docs_ata_json: true, + }, + }, + { + name: "FilterByFileSelectorRegexMulti", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + { + "regex": "data", + }, + }, + "buckets": []map[string]interface{}{ + { + "name": bucketGcsTestNew, + }, + }, + }, + mockHandler: mock.GCSServer, + expected: map[string]bool{ + mock.Gcs_test_new_object_docs_ata_json: true, + mock.Gcs_test_new_object_data3_json: true, + }, + }, + { + name: "ExpandEventListFromField", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "expand_event_list_from_field": "Events", + "file_selectors": []map[string]interface{}{ + { + "regex": "events-array", + }, + }, + "buckets": []map[string]interface{}{ + { + "name": beatsJSONBucket, + }, + }, + }, + mockHandler: mock.GCSFileServer, + expected: map[string]bool{ + mock.BeatsFilesBucket_events_array_json[0]: true, + mock.BeatsFilesBucket_events_array_json[1]: true, + }, + }, + { + name: "MultiContainerWithMultiFileSelectors", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "buckets": []map[string]interface{}{ + { + "name": bucketGcsTestNew, + "file_selectors": []map[string]interface{}{ + { + "regex": "docs/", + }, + }, + }, + { + "name": bucketGcsTestLatest, + "file_selectors": []map[string]interface{}{ + { + "regex": "data_3", + }, + }, + }, + }, + }, + mockHandler: mock.GCSServer, + expected: map[string]bool{ + mock.Gcs_test_new_object_docs_ata_json: true, + mock.Gcs_test_latest_object_data3_json: true, + }, + }, + { + name: "FilterByFileSelectorEmptyRegex", + baseConfig: map[string]interface{}{ + "project_id": "elastic-sa", + "auth.credentials_file.path": "/gcs_creds.json", + "max_workers": 1, + "poll": true, + "poll_interval": "5s", + "file_selectors": []map[string]interface{}{ + { + "regex": "", + }, + }, + "buckets": []map[string]interface{}{ + { + "name": bucketGcsTestNew, + }, + }, + }, + mockHandler: mock.GCSServer, + expected: map[string]bool{ + mock.Gcs_test_new_object_ata_json: true, + mock.Gcs_test_new_object_data3_json: true, + mock.Gcs_test_new_object_docs_ata_json: true, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/x-pack/filebeat/input/gcs/job.go b/x-pack/filebeat/input/gcs/job.go index edcb7fe976a..63e631e39be 100644 --- a/x-pack/filebeat/input/gcs/job.go +++ b/x-pack/filebeat/input/gcs/job.go @@ -35,9 +35,6 @@ type job struct { objectURI string // object hash, used in setting event id hash string - // offset value for an object, it points to the location inside the data stream - // from where we can start processing the object. - offset int64 // flag to denote if object is gZipped compressed or not. isCompressed bool // flag to denote if object's root element is of an array type @@ -86,13 +83,10 @@ func (j *job) do(ctx context.Context, id string) { if j.object.ContentType == gzType || j.object.ContentEncoding == encodingGzip { j.isCompressed = true } - if result, ok := j.state.cp.IsRootArray[j.object.Name]; ok { - j.isRootArray = result - } err := j.processAndPublishData(ctx, id) if err != nil { j.state.updateFailedJobs(j.object.Name) - j.log.Errorw("job encountered an error", "gcs.jobId", id, "error", err) + j.log.Errorw("job encountered an error while publishing data and has been added to a failed jobs list", "gcs.jobId", id, "error", err) return } @@ -109,7 +103,7 @@ func (j *job) do(ctx context.Context, id string) { // locks while data is being saved and published to avoid concurrent map read/writes cp, done := j.state.saveForTx(j.object.Name, j.object.Updated) if err := j.publisher.Publish(event, cp); err != nil { - j.log.Errorw("job encountered an error", "gcs.jobId", id, "error", err) + j.log.Errorw("job encountered an error while publishing event", "gcs.jobId", id, "error", err) } // unlocks after data is saved and published done() @@ -129,17 +123,10 @@ func (j *job) Timestamp() time.Time { } func (j *job) processAndPublishData(ctx context.Context, id string) error { - var err error - var offset int64 ctxWithTimeout, cancel := context.WithTimeout(ctx, j.src.BucketTimeOut) defer cancel() obj := j.bucket.Object(j.object.Name) - // if object is compressed or object root element is an array, then we cannot use an - // offset to read as it will produce an erroneous data stream. - if !j.isCompressed && !j.isRootArray { - offset = j.offset - } - reader, err := obj.NewRangeReader(ctxWithTimeout, offset, -1) + reader, err := obj.NewReader(ctxWithTimeout) if err != nil { return fmt.Errorf("failed to open reader for object: %s, with error: %w", j.object.Name, err) } @@ -159,23 +146,19 @@ func (j *job) processAndPublishData(ctx context.Context, id string) error { } func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) error { - var err error - r, err = j.addGzipDecoderIfNeeded(bufio.NewReader(r)) + r, err := j.addGzipDecoderIfNeeded(bufio.NewReader(r)) if err != nil { return fmt.Errorf("failed to add gzip decoder to object: %s, with error: %w", j.object.Name, err) } - // if offset == 0, then this is a new stream which has not been processed previously - if j.offset == 0 { - r, j.isRootArray, err = evaluateJSON(bufio.NewReader(r)) - if err != nil { - return fmt.Errorf("failed to evaluate json for object: %s, with error: %w", j.object.Name, err) - } - if j.isRootArray { - j.state.setRootArray(j.object.Name) - } + r, j.isRootArray, err = evaluateJSON(bufio.NewReader(r)) + if err != nil { + return fmt.Errorf("failed to evaluate json for object: %s, with error: %w", j.object.Name, err) } + dec := json.NewDecoder(r) + // UseNumber causes the Decoder to unmarshal a number into an interface{} as a Number instead of as a float64. + dec.UseNumber() // If array is present at root then read json token and advance decoder if j.isRootArray { _, err := dec.Token() @@ -184,24 +167,21 @@ func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) er } } - var offset, relativeOffset int64 - // uncompressed files use the client to directly set the offset, this - // in turn causes the offset to reset to 0 for the new stream, hence why - // we need to keep relative offsets to keep track of the actual offset - if !j.isCompressed && !j.isRootArray { - relativeOffset = j.offset - } - dec.UseNumber() for dec.More() && ctx.Err() == nil { var item json.RawMessage - offset = dec.InputOffset() + offset := dec.InputOffset() if err = dec.Decode(&item); err != nil { return fmt.Errorf("failed to decode json: %w", err) } - // manually seek offset only if file is compressed or if root element is an array - if (j.isCompressed || j.isRootArray) && offset < j.offset { + + // if expand_event_list_from_field is set, then split the event list + if j.src.ExpandEventListFromField != "" { + if err := j.splitEventList(j.src.ExpandEventListFromField, item, offset, j.hash, id); err != nil { + return err + } continue } + var parsedData []mapstr.M if j.src.ParseJSON { parsedData, err = decodeJSON(bytes.NewReader(item)) @@ -209,28 +189,78 @@ func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) er j.log.Errorw("job encountered an error", "gcs.jobId", id, "error", err) } } - evt := j.createEvent(item, parsedData, offset+relativeOffset) - // updates the offset after reading the file - // this avoids duplicates for the last read when resuming operation - offset = dec.InputOffset() - // locks while data is being saved and published to avoid concurrent map read/writes - var ( - done func() - cp *Checkpoint - ) + evt := j.createEvent(item, parsedData, offset) if !dec.More() { - // if this is the last object, then peform a complete state save - cp, done = j.state.saveForTx(j.object.Name, j.object.Updated) + // if this is the last object, then perform a complete state save + cp, done := j.state.saveForTx(j.object.Name, j.object.Updated) + if err := j.publisher.Publish(evt, cp); err != nil { + j.log.Errorw("job encountered an error while publishing event", "gcs.jobId", id, "error", err) + } + done() } else { - // partially saves read state using offset - cp, done = j.state.savePartialForTx(j.object.Name, offset+relativeOffset) + // since we don't update the cursor checkpoint, lack of a lock here is not a problem + if err := j.publisher.Publish(evt, nil); err != nil { + j.log.Errorw("job encountered an error while publishing event", "gcs.jobId", id, "error", err) + } + } + } + return nil +} + +// splitEventList splits the event list into individual events and publishes them +func (j *job) splitEventList(key string, raw json.RawMessage, offset int64, objHash string, id string) error { + var jsonObject map[string]json.RawMessage + if err := json.Unmarshal(raw, &jsonObject); err != nil { + return fmt.Errorf("job with job id %s encountered an unmarshaling error: %w", id, err) + } + + raw, found := jsonObject[key] + if !found { + return fmt.Errorf("expand_event_list_from_field key <%v> is not in event", key) + } + + dec := json.NewDecoder(bytes.NewReader(raw)) + // UseNumber causes the Decoder to unmarshal a number into an interface{} as a Number instead of as a float64. + dec.UseNumber() + + tok, err := dec.Token() + if err != nil { + return fmt.Errorf("failed to read JSON token for object: %s, with error: %w", j.object.Name, err) + } + delim, ok := tok.(json.Delim) + if !ok || delim != '[' { + return fmt.Errorf("expand_event_list_from_field <%v> is not an array", key) + } + + for dec.More() { + arrayOffset := dec.InputOffset() + + var item json.RawMessage + if err := dec.Decode(&item); err != nil { + return fmt.Errorf("failed to decode array item at offset %d: %w", offset+arrayOffset, err) } - if err := j.publisher.Publish(evt, cp); err != nil { - j.log.Errorw("job encountered an error", "gcs.jobId", id, "error", err) + + data, err := item.MarshalJSON() + if err != nil { + return fmt.Errorf("job with job id %s encountered a marshaling error: %w", id, err) + } + evt := j.createEvent(data, nil, offset+arrayOffset) + + if !dec.More() { + // if this is the last object, then perform a complete state save + cp, done := j.state.saveForTx(j.object.Name, j.object.Updated) + if err := j.publisher.Publish(evt, cp); err != nil { + j.log.Errorw("job encountered an error while publishing event", "gcs.jobId", id, "error", err) + } + done() + } else { + // since we don't update the cursor checkpoint, lack of a lock here is not a problem + if err := j.publisher.Publish(evt, nil); err != nil { + j.log.Errorw("job encountered an error while publishing event", "gcs.jobId", id, "error", err) + } } - // unlocks after data is saved and published - done() } + return nil } diff --git a/x-pack/filebeat/input/gcs/mock/data.go b/x-pack/filebeat/input/gcs/mock/data.go index 1bbe2c92e72..6bd9d6dcfbf 100644 --- a/x-pack/filebeat/input/gcs/mock/data.go +++ b/x-pack/filebeat/input/gcs/mock/data.go @@ -130,8 +130,8 @@ var objectList = map[string]string{ "crc32c": "hHW/Qw==", "etag": "CM7Ww6q73/kCEAE=", "timeCreated": "2022-08-24T12:20:36.713Z", - "updated": "2022-08-24T12:20:36.713Z", - "timeStorageClassUpdated": "2022-08-24T12:20:36.713Z" + "updated": "2022-08-25T12:20:36.713Z", + "timeStorageClassUpdated": "2022-08-25T12:20:36.713Z" }, { "kind": "storage#object", @@ -192,8 +192,8 @@ var objectList = map[string]string{ "crc32c": "hHW/Qw==", "etag": "CM7Ww6q73/kCEAE=", "timeCreated": "2022-08-24T12:20:36.713Z", - "updated": "2022-08-24T12:20:36.713Z", - "timeStorageClassUpdated": "2022-08-24T12:20:36.713Z" + "updated": "2022-08-25T12:20:36.713Z", + "timeStorageClassUpdated": "2022-08-25T12:20:36.713Z" } ] }`, diff --git a/x-pack/filebeat/input/gcs/mock/data_files.go b/x-pack/filebeat/input/gcs/mock/data_files.go index c6e546d56da..b19175b477e 100644 --- a/x-pack/filebeat/input/gcs/mock/data_files.go +++ b/x-pack/filebeat/input/gcs/mock/data_files.go @@ -358,3 +358,7 @@ var BeatsFilesBucket_multiline_json_gz = []string{ "{\n \"@timestamp\": \"2021-05-25T17:25:42.806Z\",\n \"log.level\": \"error\",\n \"message\": \"error making http request\"\n}", "{\n \"@timestamp\": \"2021-05-25T17:25:51.391Z\",\n \"log.level\": \"info\",\n \"message\": \"available disk space 44.3gb\"\n}", } +var BeatsFilesBucket_events_array_json = []string{ + "{\n \"time\": \"2021-05-25 18:20:58 UTC\",\n \"msg\": \"hello\"\n }", + "{\n \"time\": \"2021-05-26 22:21:40 UTC\",\n \"msg\": \"world\"\n }", +} diff --git a/x-pack/filebeat/input/gcs/mock/testdata/array-at-root.json b/x-pack/filebeat/input/gcs/mock/testdata/array-at-root.json index 68cd2b41e7b..8d22df6aeb8 100644 --- a/x-pack/filebeat/input/gcs/mock/testdata/array-at-root.json +++ b/x-pack/filebeat/input/gcs/mock/testdata/array-at-root.json @@ -7,4 +7,4 @@ "time": "2021-05-26 22:21:40 UTC", "msg": "world" } -] \ No newline at end of file +] diff --git a/x-pack/filebeat/input/gcs/mock/testdata/log.json b/x-pack/filebeat/input/gcs/mock/testdata/log.json index f6aaf5ec64d..b88e0545284 100644 --- a/x-pack/filebeat/input/gcs/mock/testdata/log.json +++ b/x-pack/filebeat/input/gcs/mock/testdata/log.json @@ -1 +1 @@ -{"@timestamp":"2021-05-25T17:25:42.806Z","log.level":"error","message":"error making http request"}{"@timestamp":"2021-05-25T17:25:51.391Z","log.level":"info","message":"available disk space 44.3gb"} \ No newline at end of file +{"@timestamp":"2021-05-25T17:25:42.806Z","log.level":"error","message":"error making http request"}{"@timestamp":"2021-05-25T17:25:51.391Z","log.level":"info","message":"available disk space 44.3gb"} diff --git a/x-pack/filebeat/input/gcs/mock/testdata/multiline.json b/x-pack/filebeat/input/gcs/mock/testdata/multiline.json index 974d296762a..32d319af2bc 100644 --- a/x-pack/filebeat/input/gcs/mock/testdata/multiline.json +++ b/x-pack/filebeat/input/gcs/mock/testdata/multiline.json @@ -7,4 +7,4 @@ "@timestamp": "2021-05-25T17:25:51.391Z", "log.level": "info", "message": "available space 44.3gb" -} \ No newline at end of file +} diff --git a/x-pack/filebeat/input/gcs/scheduler.go b/x-pack/filebeat/input/gcs/scheduler.go index d88112979b2..c68c3123cf2 100644 --- a/x-pack/filebeat/input/gcs/scheduler.go +++ b/x-pack/filebeat/input/gcs/scheduler.go @@ -141,9 +141,17 @@ func fetchJobID(workerId int, bucketName string, objectName string) string { } func (s *scheduler) createJobs(objects []*storage.ObjectAttrs, log *logp.Logger) []*job { + //nolint:prealloc // No need to preallocate the slice var jobs []*job - for _, obj := range objects { + // if file selectors are present, then only select the files that match the regex + if len(s.src.FileSelectors) != 0 && !s.isFileSelected(obj.Name) { + continue + } + // date filter is applied on last updated time of the object + if s.src.TimeStampEpoch != nil && obj.Updated.Unix() < *s.src.TimeStampEpoch { + continue + } // check required to ignore directories & sub folders, since there is no inbuilt option to // do so. In gcs all the directories are emulated and represented by a prefix, we can // define specific prefix's & delimiters to ignore known directories but there is no generic @@ -180,10 +188,7 @@ func (s *scheduler) moveToLastSeenJob(jobs []*job) []*job { ignore := false for _, job := range jobs { - switch offset, isPartial := s.state.cp.LastProcessedOffset[job.object.Name]; { - case isPartial: - job.offset = offset - latestJobs = append(latestJobs, job) + switch { case job.Timestamp().After(s.state.checkpoint().LatestEntryTime): latestJobs = append(latestJobs, job) case job.Name() == s.state.checkpoint().ObjectName: @@ -205,7 +210,7 @@ func (s *scheduler) moveToLastSeenJob(jobs []*job) []*job { // in a senario where there are some jobs which have a later time stamp // but lesser lexicographic order and some jobs have greater lexicographic order - // than the current checkpoint or if partially completed jobs are present + // than the current checkpoint object name, then we append the latest jobs if len(jobsToReturn) != len(jobs) && len(latestJobs) > 0 { jobsToReturn = append(latestJobs, jobsToReturn...) } @@ -239,3 +244,12 @@ func (s *scheduler) addFailedJobs(ctx context.Context, jobs []*job) []*job { } return jobs } + +func (s *scheduler) isFileSelected(name string) bool { + for _, sel := range s.src.FileSelectors { + if sel.Regex.MatchString(name) { + return true + } + } + return false +} diff --git a/x-pack/filebeat/input/gcs/state.go b/x-pack/filebeat/input/gcs/state.go index afa20e5d52d..59f79fce471 100644 --- a/x-pack/filebeat/input/gcs/state.go +++ b/x-pack/filebeat/input/gcs/state.go @@ -30,19 +30,12 @@ type Checkpoint struct { LatestEntryTime time.Time // list of failed jobs due to unexpected errors/download errors FailedJobs map[string]int - // a mapping from object name to whether the object is having an array type as it's root. - IsRootArray map[string]bool - // a mapping from object name to an array index that contains the last processed offset for that object. - // if isRootArray == true for object, then LastProcessedOffset will treat offset as an array index - LastProcessedOffset map[string]int64 } func newState() *state { return &state{ cp: &Checkpoint{ - FailedJobs: make(map[string]int), - LastProcessedOffset: make(map[string]int64), - IsRootArray: make(map[string]bool), + FailedJobs: make(map[string]int), }, } } @@ -53,8 +46,6 @@ func newState() *state { // more than once. func (s *state) saveForTx(name string, lastModifiedOn time.Time) (cp *Checkpoint, done func()) { s.mu.Lock() - delete(s.cp.LastProcessedOffset, name) - delete(s.cp.IsRootArray, name) if _, ok := s.cp.FailedJobs[name]; !ok { if len(s.cp.ObjectName) == 0 { s.cp.ObjectName = name @@ -74,23 +65,6 @@ func (s *state) saveForTx(name string, lastModifiedOn time.Time) (cp *Checkpoint return s.cp, func() { s.mu.Unlock() } } -// savePartialForTx partially updates and returns the current state checkpoint, locks the state -// and returns an unlock function, done. The caller must call done when -// s and cp are no longer needed in a locked state. done may not be called -// more than once. -func (s *state) savePartialForTx(name string, offset int64) (cp *Checkpoint, done func()) { - s.mu.Lock() - s.cp.LastProcessedOffset[name] = offset - return s.cp, func() { s.mu.Unlock() } -} - -// setRootArray, sets boolean true for objects that have their roots defined as an array type -func (s *state) setRootArray(name string) { - s.mu.Lock() - s.cp.IsRootArray[name] = true - s.mu.Unlock() -} - // updateFailedJobs, adds a job name to a failedJobs map, which helps // in keeping track of failed jobs during edge cases when the state might // move ahead in timestamp & objectName due to successful operations from other workers. @@ -98,10 +72,6 @@ func (s *state) setRootArray(name string) { // entry is removed from the map func (s *state) updateFailedJobs(jobName string) { s.mu.Lock() - // we do not store partially processed jobs as failed jobs - if _, ok := s.cp.LastProcessedOffset[jobName]; ok { - return - } s.cp.FailedJobs[jobName]++ if s.cp.FailedJobs[jobName] > maxFailedJobRetries { delete(s.cp.FailedJobs, jobName) @@ -116,12 +86,6 @@ func (s *state) setCheckpoint(chkpt *Checkpoint) { if chkpt.FailedJobs == nil { chkpt.FailedJobs = make(map[string]int) } - if chkpt.IsRootArray == nil { - chkpt.IsRootArray = make(map[string]bool) - } - if chkpt.LastProcessedOffset == nil { - chkpt.LastProcessedOffset = make(map[string]int64) - } s.cp = chkpt } diff --git a/x-pack/filebeat/input/gcs/types.go b/x-pack/filebeat/input/gcs/types.go index ced80531246..5934d119979 100644 --- a/x-pack/filebeat/input/gcs/types.go +++ b/x-pack/filebeat/input/gcs/types.go @@ -11,13 +11,16 @@ import ( // Source, it is the cursor source type Source struct { - BucketName string - BucketTimeOut time.Duration - ProjectId string - MaxWorkers int - Poll bool - PollInterval time.Duration - ParseJSON bool + BucketName string + BucketTimeOut time.Duration + ProjectId string + MaxWorkers int + Poll bool + PollInterval time.Duration + ParseJSON bool + TimeStampEpoch *int64 + FileSelectors []fileSelectorConfig + ExpandEventListFromField string } func (s *Source) Name() string { diff --git a/x-pack/filebeat/input/http_endpoint/config.go b/x-pack/filebeat/input/http_endpoint/config.go index d60ffdeb989..48fa51bd00b 100644 --- a/x-pack/filebeat/input/http_endpoint/config.go +++ b/x-pack/filebeat/input/http_endpoint/config.go @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "fmt" + "net/http" "net/textproto" "strings" @@ -20,8 +21,9 @@ var crcProviders = map[string]func(string) *crcValidator{ "zoom": newZoomCRC, } -// Config contains information about httpjson configuration +// Config contains information about http_endpoint configuration type config struct { + Method string `config:"method"` TLS *tlscommon.ServerConfig `config:"ssl"` BasicAuth bool `config:"basic_auth"` Username string `config:"username"` @@ -47,6 +49,7 @@ type config struct { func defaultConfig() config { return config{ + Method: http.MethodPost, BasicAuth: false, Username: "", Password: "", @@ -73,6 +76,12 @@ func (c *config) Validate() error { return errors.New("response_body must be valid JSON") } + switch c.Method { + case http.MethodPost, http.MethodPut, http.MethodPatch: + default: + return fmt.Errorf("method must be POST, PUT or PATCH: %s", c.Method) + } + if c.BasicAuth { if c.Username == "" || c.Password == "" { return errors.New("username and password required when basicauth is enabled") diff --git a/x-pack/filebeat/input/http_endpoint/input.go b/x-pack/filebeat/input/http_endpoint/input.go index 72454b3a81c..3b236aaec08 100644 --- a/x-pack/filebeat/input/http_endpoint/input.go +++ b/x-pack/filebeat/input/http_endpoint/input.go @@ -289,7 +289,7 @@ func newHandler(c config, pub stateless.Publisher, log *logp.Logger, metrics *in basicAuth: c.BasicAuth, username: c.Username, password: c.Password, - method: http.MethodPost, + method: c.Method, contentType: c.ContentType, secretHeader: c.SecretHeader, secretValue: c.SecretValue, diff --git a/x-pack/filebeat/input/http_endpoint/input_test.go b/x-pack/filebeat/input/http_endpoint/input_test.go index d172a0eed5f..c7c1b89bf3a 100644 --- a/x-pack/filebeat/input/http_endpoint/input_test.go +++ b/x-pack/filebeat/input/http_endpoint/input_test.go @@ -25,6 +25,7 @@ import ( var serverPoolTests = []struct { name string + method string cfgs []*httpEndpoint events []target want []mapstr.M @@ -55,6 +56,60 @@ var serverPoolTests = []struct { {"json": mapstr.M{"c": int64(3)}}, }, }, + { + name: "put", + method: http.MethodPut, + cfgs: []*httpEndpoint{{ + addr: "127.0.0.1:9001", + config: config{ + Method: http.MethodPut, + ResponseCode: 200, + ResponseBody: `{"message": "success"}`, + ListenAddress: "127.0.0.1", + ListenPort: "9001", + URL: "/", + Prefix: "json", + ContentType: "application/json", + }, + }}, + events: []target{ + {url: "http://127.0.0.1:9001/", event: `{"a":1}`}, + {url: "http://127.0.0.1:9001/", event: `{"b":2}`}, + {url: "http://127.0.0.1:9001/", event: `{"c":3}`}, + }, + want: []mapstr.M{ + {"json": mapstr.M{"a": int64(1)}}, + {"json": mapstr.M{"b": int64(2)}}, + {"json": mapstr.M{"c": int64(3)}}, + }, + }, + { + name: "patch", + method: http.MethodPatch, + cfgs: []*httpEndpoint{{ + addr: "127.0.0.1:9001", + config: config{ + Method: http.MethodPatch, + ResponseCode: 200, + ResponseBody: `{"message": "success"}`, + ListenAddress: "127.0.0.1", + ListenPort: "9001", + URL: "/", + Prefix: "json", + ContentType: "application/json", + }, + }}, + events: []target{ + {url: "http://127.0.0.1:9001/", event: `{"a":1}`}, + {url: "http://127.0.0.1:9001/", event: `{"b":2}`}, + {url: "http://127.0.0.1:9001/", event: `{"c":3}`}, + }, + want: []mapstr.M{ + {"json": mapstr.M{"a": int64(1)}}, + {"json": mapstr.M{"b": int64(2)}}, + {"json": mapstr.M{"c": int64(3)}}, + }, + }, { name: "distinct_ports", cfgs: []*httpEndpoint{ @@ -249,7 +304,7 @@ func TestServerPool(t *testing.T) { } } for i, e := range test.events { - resp, err := http.Post(e.url, "application/json", strings.NewReader(e.event)) + resp, err := doRequest(test.method, e.url, "application/json", strings.NewReader(e.event)) if err != nil { t.Fatalf("failed to post event #%d: %v", i, err) } @@ -288,6 +343,18 @@ func TestServerPool(t *testing.T) { } } +func doRequest(method, url, contentType string, body io.Reader) (*http.Response, error) { + if method == "" { + method = http.MethodPost + } + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", contentType) + return http.DefaultClient.Do(req) +} + // Is is included to simplify testing, but is not exposed to avoid unwanted error // matching outside tests. func (e invalidTLSStateErr) Is(err error) bool { diff --git a/x-pack/filebeat/input/httpjson/cursor.go b/x-pack/filebeat/input/httpjson/cursor.go index 92cd53a52a2..1a864361ee7 100644 --- a/x-pack/filebeat/input/httpjson/cursor.go +++ b/x-pack/filebeat/input/httpjson/cursor.go @@ -50,7 +50,7 @@ func (c *cursor) update(trCtx *transformContext) { } for k, cfg := range c.cfg { - v, _ := cfg.Value.Execute(trCtx, transformable{}, "", cfg.Default, c.log) + v, _ := cfg.Value.Execute(trCtx, transformable{}, k, cfg.Default, c.log) if v != "" || !cfg.mustIgnoreEmptyValue() { _, _ = c.state.Put(k, v) c.log.Debugf("cursor.%s stored with %s", k, v) diff --git a/x-pack/filebeat/input/httpjson/input_test.go b/x-pack/filebeat/input/httpjson/input_test.go index e4d94527e72..de4cc3f11e6 100644 --- a/x-pack/filebeat/input/httpjson/input_test.go +++ b/x-pack/filebeat/input/httpjson/input_test.go @@ -1248,6 +1248,8 @@ var testCases = []struct { } func TestInput(t *testing.T) { + logp.TestingSetup() + for _, test := range testCases { t.Run(test.name, func(t *testing.T) { if test.skipReason != "" { diff --git a/x-pack/filebeat/input/httpjson/rate_limiter.go b/x-pack/filebeat/input/httpjson/rate_limiter.go index dcbed7c1ac9..30c50ae3f05 100644 --- a/x-pack/filebeat/input/httpjson/rate_limiter.go +++ b/x-pack/filebeat/input/httpjson/rate_limiter.go @@ -104,7 +104,7 @@ func (r *rateLimiter) getRateLimit(resp *http.Response) (int64, error) { ctx := emptyTransformContext() ctx.updateLastResponse(response{header: resp.Header.Clone()}) - remaining, _ := r.remaining.Execute(ctx, tr, "", nil, r.log) + remaining, _ := r.remaining.Execute(ctx, tr, "rate-limit_remaining", nil, r.log) if remaining == "" { return 0, errors.New("remaining value is empty") } @@ -119,7 +119,7 @@ func (r *rateLimiter) getRateLimit(resp *http.Response) (int64, error) { if r.earlyLimit != nil { earlyLimit := *r.earlyLimit if earlyLimit > 0 && earlyLimit < 1 { - limit, _ := r.limit.Execute(ctx, tr, "", nil, r.log) + limit, _ := r.limit.Execute(ctx, tr, "early_limit", nil, r.log) if limit != "" { l, err := strconv.ParseInt(limit, 10, 64) if err == nil { @@ -141,7 +141,7 @@ func (r *rateLimiter) getRateLimit(resp *http.Response) (int64, error) { return 0, nil } - reset, _ := r.reset.Execute(ctx, tr, "", nil, r.log) + reset, _ := r.reset.Execute(ctx, tr, "rate-limit_reset", nil, r.log) if reset == "" { return 0, errors.New("reset value is empty") } diff --git a/x-pack/filebeat/input/httpjson/request.go b/x-pack/filebeat/input/httpjson/request.go index f70ab4094df..248918e8116 100644 --- a/x-pack/filebeat/input/httpjson/request.go +++ b/x-pack/filebeat/input/httpjson/request.go @@ -385,7 +385,7 @@ func evaluateResponse(expression *valueTpl, data []byte, log *logp.Logger) (bool lastResponse: &response{body: dataMap}, } - val, err := expression.Execute(paramCtx, tr, "", nil, log) + val, err := expression.Execute(paramCtx, tr, "response_evaluation", nil, log) if err != nil { return false, fmt.Errorf("error while evaluating expression: %w", err) } diff --git a/x-pack/filebeat/input/httpjson/value_tpl.go b/x-pack/filebeat/input/httpjson/value_tpl.go index 133271e726f..97bc75a62d9 100644 --- a/x-pack/filebeat/input/httpjson/value_tpl.go +++ b/x-pack/filebeat/input/httpjson/value_tpl.go @@ -96,7 +96,7 @@ func (t *valueTpl) Unpack(in string) error { func (t *valueTpl) Execute(trCtx *transformContext, tr transformable, targetName string, defaultVal *valueTpl, log *logp.Logger) (val string, err error) { fallback := func(err error) (string, error) { if defaultVal != nil { - log.Debugf("template execution: falling back to default value") + log.Debugw("template execution: falling back to default value", "target", targetName) return defaultVal.Execute(emptyTransformContext(), transformable{}, targetName, nil, log) } return "", err @@ -107,7 +107,7 @@ func (t *valueTpl) Execute(trCtx *transformContext, tr transformable, targetName val, err = fallback(errExecutingTemplate) } if err != nil { - log.Debugf("template execution failed: %v", err) + log.Debugw("template execution failed", "target", targetName, "error", err) } tryDebugTemplateValue(targetName, val, log) }() @@ -142,7 +142,7 @@ func tryDebugTemplateValue(target, val string, log *logp.Logger) { case "Authorization", "Proxy-Authorization": // ignore filtered headers default: - log.Debugf("template execution: evaluated template %q", val) + log.Debugw("evaluated template", "target", target, "value", val) } } diff --git a/x-pack/filebeat/input/httpjson/value_tpl_test.go b/x-pack/filebeat/input/httpjson/value_tpl_test.go index 37589cd8821..487451099ad 100644 --- a/x-pack/filebeat/input/httpjson/value_tpl_test.go +++ b/x-pack/filebeat/input/httpjson/value_tpl_test.go @@ -19,6 +19,8 @@ import ( ) func TestValueTpl(t *testing.T) { + logp.TestingSetup() + cases := []struct { name string value string @@ -764,7 +766,7 @@ func TestValueTpl(t *testing.T) { assert.NoError(t, defTpl.Unpack(tc.paramDefVal)) } - got, err := tpl.Execute(tc.paramCtx, tc.paramTr, "", defTpl, logp.NewLogger("")) + got, err := tpl.Execute(tc.paramCtx, tc.paramTr, tc.name, defTpl, logp.NewLogger("")) assert.Equal(t, tc.expectedVal, got) if tc.expectedError == "" { assert.NoError(t, err) diff --git a/x-pack/functionbeat/docs/getting-started.asciidoc b/x-pack/functionbeat/docs/getting-started.asciidoc index 01a5315fb22..adbf4ec6717 100644 --- a/x-pack/functionbeat/docs/getting-started.asciidoc +++ b/x-pack/functionbeat/docs/getting-started.asciidoc @@ -30,6 +30,10 @@ system. include::{libbeat-dir}/tab-widgets/install-linux-mac-win-short-widget.asciidoc[] +The commands shown are for AMD platforms, but ARM packages are also available. +Refer to the https://www.elastic.co/downloads/beats/{beatname_lc}[download page] +for the full list of available packages. + [float] [[set-connection]] === Step 2: Connect to the {stack} diff --git a/x-pack/functionbeat/docs/index.asciidoc b/x-pack/functionbeat/docs/index.asciidoc index 0ecfb31faee..a54cc91c4f4 100644 --- a/x-pack/functionbeat/docs/index.asciidoc +++ b/x-pack/functionbeat/docs/index.asciidoc @@ -25,6 +25,7 @@ include::{asciidoc-dir}/../../shared/attributes.asciidoc[] :mac_os: :win_os: :linux_os: +:no_cache_processor: :no_dashboards: :no_repos: :no_decode_cef_processor: diff --git a/x-pack/functionbeat/functionbeat.reference.yml b/x-pack/functionbeat/functionbeat.reference.yml index 7855538f621..b9a54bd88ec 100644 --- a/x-pack/functionbeat/functionbeat.reference.yml +++ b/x-pack/functionbeat/functionbeat.reference.yml @@ -574,8 +574,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1057,6 +1058,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is functionbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "functionbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/heartbeat/heartbeat.reference.yml b/x-pack/heartbeat/heartbeat.reference.yml index b8281727026..89fc08ef8e6 100644 --- a/x-pack/heartbeat/heartbeat.reference.yml +++ b/x-pack/heartbeat/heartbeat.reference.yml @@ -542,8 +542,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1429,6 +1430,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is heartbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "heartbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/heartbeat/scenarios/basics_test.go b/x-pack/heartbeat/scenarios/basics_test.go index a8b39dbfaf1..08794c12146 100644 --- a/x-pack/heartbeat/scenarios/basics_test.go +++ b/x-pack/heartbeat/scenarios/basics_test.go @@ -22,6 +22,7 @@ import ( "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer/jobsummary" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer/summarizertesthelper" + "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/x-pack/heartbeat/scenarios/framework" ) @@ -99,25 +100,22 @@ func TestLightweightUrls(t *testing.T) { func TestLightweightSummaries(t *testing.T) { t.Parallel() - scenarioDB.RunTag(t, "lightweight", func(t *testing.T, mtr *framework.MonitorTestRun, err error) { + scenarioDB.RunTagWithSeparateTwists(t, "lightweight", StdAttemptTwists, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { all := mtr.Events() - lastEvent, firstEvents := all[len(all)-1], all[:len(all)-1] + lastEvent := all[len(all)-1] testslike.Test(t, SummaryValidatorForStatus(mtr.Meta.Status), lastEvent.Fields) - for _, e := range firstEvents { - summary, _ := e.GetValue("summary") - require.Nil(t, summary) - } + requireOneSummaryPerAttempt(t, all) }) } func TestBrowserSummaries(t *testing.T) { t.Parallel() - scenarioDB.RunTag(t, "browser", func(t *testing.T, mtr *framework.MonitorTestRun, err error) { + scenarioDB.RunTagWithSeparateTwists(t, "browser", StdAttemptTwists, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { all := mtr.Events() - lastEvent, firstEvents := all[len(all)-1], all[:len(all)-1] + lastEvent := all[len(all)-1] testslike.Test(t, lookslike.Compose( @@ -126,13 +124,30 @@ func TestBrowserSummaries(t *testing.T) { ), lastEvent.Fields) - for _, e := range firstEvents { - summary, _ := e.GetValue("summary") - require.Nil(t, summary) - } + monStatus, _ := lastEvent.GetValue("monitor.status") + summaryIface, _ := lastEvent.GetValue("summary") + summary := summaryIface.(*jobsummary.JobSummary) + require.Equal(t, string(summary.Status), monStatus, "expected summary status and mon status to be equal in event: %v", lastEvent.Fields) + + requireOneSummaryPerAttempt(t, all) + }) } +func requireOneSummaryPerAttempt(t *testing.T, events []*beat.Event) { + attemptCounter := uint16(1) + // ensure we only have one summary per attempt + for _, e := range events { + summaryIface, _ := e.GetValue("summary") + if summaryIface != nil { + summary := summaryIface.(*jobsummary.JobSummary) + require.Equal(t, attemptCounter, summary.Attempt) + require.LessOrEqual(t, summary.Attempt, summary.MaxAttempts) + attemptCounter++ + } + } +} + func TestRunFromOverride(t *testing.T) { t.Parallel() scenarioDB.RunAllWithATwist(t, TwistAddRunFrom, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { diff --git a/x-pack/heartbeat/scenarios/browserscenarios.go b/x-pack/heartbeat/scenarios/browserscenarios.go index 1760ef58750..e15a150db5f 100644 --- a/x-pack/heartbeat/scenarios/browserscenarios.go +++ b/x-pack/heartbeat/scenarios/browserscenarios.go @@ -51,7 +51,7 @@ func init() { framework.Scenario{ Name: "failing-browser", Type: "browser", - Tags: []string{"browser", "browser-inline", "down"}, + Tags: []string{"browser", "browser-inline", "down", "browser-down"}, Runner: func(t *testing.T) (config mapstr.M, meta framework.ScenarioRunMeta, close func(), err error) { err = os.Setenv("ELASTIC_SYNTHETICS_CAPABLE", "true") if err != nil { diff --git a/x-pack/heartbeat/scenarios/framework/framework.go b/x-pack/heartbeat/scenarios/framework/framework.go index c4e3e54b5bc..c6dc0ae9ad6 100644 --- a/x-pack/heartbeat/scenarios/framework/framework.go +++ b/x-pack/heartbeat/scenarios/framework/framework.go @@ -214,6 +214,12 @@ func (sdb *ScenarioDB) RunTagWithATwist(t *testing.T, tagName string, twist *Twi } } +func (sdb *ScenarioDB) RunTagWithSeparateTwists(t *testing.T, tagName string, twists []*Twist, callback func(*testing.T, *MonitorTestRun, error)) { + for _, twist := range twists { + sdb.RunTagWithATwist(t, tagName, twist, callback) + } +} + type MonitorTestRun struct { StdFields stdfields.StdMonitorFields Meta ScenarioRunMeta diff --git a/x-pack/heartbeat/scenarios/twists.go b/x-pack/heartbeat/scenarios/twists.go index 5f4d1093020..ad24b8a42f9 100644 --- a/x-pack/heartbeat/scenarios/twists.go +++ b/x-pack/heartbeat/scenarios/twists.go @@ -36,6 +36,9 @@ func TwistMultiRun(times int) *framework.Twist { }) } +// StdAttemptTwists is a list of real world attempt numbers, that is to say both one and two twists. +var StdAttemptTwists = []*framework.Twist{TwistMaxAttempts(1), TwistMaxAttempts(2)} + func TwistMaxAttempts(maxAttempts int) *framework.Twist { return framework.MakeTwist(fmt.Sprintf("run with %d max_attempts", maxAttempts), func(s framework.Scenario) framework.Scenario { s.Tags = append(s.Tags, "retry") diff --git a/x-pack/metricbeat/docker-compose.yml b/x-pack/metricbeat/docker-compose.yml index f7080b602fb..b2b0f50020a 100644 --- a/x-pack/metricbeat/docker-compose.yml +++ b/x-pack/metricbeat/docker-compose.yml @@ -24,11 +24,11 @@ services: kibana: # Copied configuration from OSS metricbeat because services with depends_on # cannot be extended with extends - image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.9.1}-1 + image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.10.2}-1 build: context: ../../metricbeat/module/kibana/_meta args: - KIBANA_VERSION: ${KIBANA_VERSION:-8.9.1} + KIBANA_VERSION: ${KIBANA_VERSION:-8.10.2} depends_on: - elasticsearch ports: diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index fa15aca7fb6..63acc6f5245 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -1846,8 +1846,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -2733,6 +2734,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is metricbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "metricbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/osquerybeat/beater/action_handler.go b/x-pack/osquerybeat/beater/action_handler.go index 041c6e8c952..c4650ee9f16 100644 --- a/x-pack/osquerybeat/beater/action_handler.go +++ b/x-pack/osquerybeat/beater/action_handler.go @@ -26,7 +26,7 @@ type publisher interface { } type queryExecutor interface { - Query(ctx context.Context, sql string) ([]map[string]interface{}, error) + Query(ctx context.Context, sql string, timeout time.Duration) ([]map[string]interface{}, error) } type namespaceProvider interface { @@ -68,7 +68,7 @@ func (a *actionHandler) Execute(ctx context.Context, req map[string]interface{}) func (a *actionHandler) execute(ctx context.Context, req map[string]interface{}) (int, error) { ac, err := action.FromMap(req) if err != nil { - return 0, fmt.Errorf("%v: %w", err, ErrQueryExecution) + return 0, fmt.Errorf("%w: %w", err, ErrQueryExecution) } var namespace string @@ -95,7 +95,7 @@ func (a *actionHandler) executeQuery(ctx context.Context, index string, ac actio start := time.Now() - hits, err := a.queryExec.Query(ctx, ac.Query) + hits, err := a.queryExec.Query(ctx, ac.Query, ac.Timeout) if err != nil { a.log.Errorf("Failed to execute query, err: %v", err) diff --git a/x-pack/osquerybeat/beater/action_handler_test.go b/x-pack/osquerybeat/beater/action_handler_test.go index 81925fdbe4b..f3008e4ee76 100644 --- a/x-pack/osquerybeat/beater/action_handler_test.go +++ b/x-pack/osquerybeat/beater/action_handler_test.go @@ -7,6 +7,7 @@ package beater import ( "context" "testing" + "time" "github.com/gofrs/uuid" "github.com/google/go-cmp/cmp" @@ -23,7 +24,7 @@ type mockExecutor struct { receivedSql string } -func (e *mockExecutor) Query(ctx context.Context, sql string) ([]map[string]interface{}, error) { +func (e *mockExecutor) Query(ctx context.Context, sql string, to time.Duration) ([]map[string]interface{}, error) { e.receivedSql = sql return e.result, e.err diff --git a/x-pack/osquerybeat/beater/osquerybeat.go b/x-pack/osquerybeat/beater/osquerybeat.go index 35e396a7c69..35b42914570 100644 --- a/x-pack/osquerybeat/beater/osquerybeat.go +++ b/x-pack/osquerybeat/beater/osquerybeat.go @@ -44,7 +44,8 @@ const ( // osqueryd child process requests configuration from the configuration plugin implemented in osquerybeat configurationRefreshIntervalSecs = 60 - osqueryTimeout = 60 * time.Second + osqueryTimeout = 1 * time.Minute + osqueryMaxTimeout = 15 * time.Minute ) const ( @@ -271,6 +272,7 @@ func (bt *osquerybeat) runOsquery(ctx context.Context, b *beat.Beat, osq *osqd.O cli := osqdcli.New(socketPath, osqdcli.WithLogger(bt.log), osqdcli.WithTimeout(osqueryTimeout), + osqdcli.WithMaxTimeout(osqueryMaxTimeout), osqdcli.WithCache(cache, adhocOsqueriesTypesCacheSize), ) @@ -337,7 +339,7 @@ func runExtensionServer(ctx context.Context, socketPath string, configPlugin *Co // Register config and logger extensions extserver, err := osquery.NewExtensionManagerServer(extManagerServerName, socketPath, osquery.ServerTimeout(timeout)) if err != nil { - return + return err } // Register osquery configuration plugin diff --git a/x-pack/osquerybeat/internal/action/action.go b/x-pack/osquerybeat/internal/action/action.go index 3eaeeaee5d8..8cfa59abc41 100644 --- a/x-pack/osquerybeat/internal/action/action.go +++ b/x-pack/osquerybeat/internal/action/action.go @@ -7,7 +7,9 @@ package action import ( "errors" "fmt" + "strconv" "strings" + "time" "github.com/elastic/beats/v7/x-pack/osquerybeat/internal/ecs" ) @@ -17,8 +19,10 @@ var ( ) type Action struct { - Query string - ID string + Query string + ID string + // The optional action timeout + Timeout time.Duration ECSMapping ecs.Mapping } @@ -72,11 +76,24 @@ func FromMap(m map[string]interface{}) (a Action, err error) { return a, fmt.Errorf("missing query: %w", ErrActionRequest) } - return Action{ + a = Action{ Query: query, ID: id, ECSMapping: ecsm, - }, nil + } + + if v, ok := m["timeout"]; ok { + timeout, err := convertToInt64(v) + if err != nil { + return a, fmt.Errorf("invalid timeout value %v: %w", v, err) + } + if timeout > 0 { + // Convert from seconds to duration + a.Timeout = time.Duration(timeout) * time.Second + } + } + + return a, nil } func parseECSMapping(m map[string]interface{}) (ecsm ecs.Mapping, err error) { @@ -121,3 +138,31 @@ func parseECSMapping(m map[string]interface{}) (ecsm ecs.Mapping, err error) { } return ecsm, err } + +func convertToInt64(i interface{}) (int64, error) { + switch v := i.(type) { + case int8: + return int64(v), nil + case int16: + return int64(v), nil + case int32: + return int64(v), nil + case int64: + return v, nil + case uint8: + return int64(v), nil + case uint16: + return int64(v), nil + case uint32: + return int64(v), nil + case uint64: + return int64(v), nil + case float32: + return int64(v), nil + case float64: + return int64(v), nil + case string: + return strconv.ParseInt(v, 10, 64) + } + return 0, fmt.Errorf("unexpected type: %T", i) +} diff --git a/x-pack/osquerybeat/internal/osqdcli/client.go b/x-pack/osquerybeat/internal/osqdcli/client.go index a0a6c695904..ca9ce790580 100644 --- a/x-pack/osquerybeat/internal/osqdcli/client.go +++ b/x-pack/osquerybeat/internal/osqdcli/client.go @@ -21,7 +21,11 @@ import ( ) const ( - defaultTimeout = 30 * time.Second + // The default query timeout + defaultTimeout = 1 * time.Minute + + // The longest the query is allowed to run. Since queries are run one at a time, this will block all other queries until this query completes. + defaultMaxTimeout = 15 * time.Minute defaultConnectRetries = 10 ) @@ -50,8 +54,13 @@ func (e *ErrorQueryFailure) Error() string { } type Client struct { - socketPath string + socketPath string + + // Query timeout, currently can only be set at the transport level. + // This means that while the query will return with error the osqueryd internally continues to execute the query until completion. + // This is a known issue with osquery/osquery-go/thrift RPC implementation at the moment: there is effectively no way to cancel the long running query timeout time.Duration + maxTimeout time.Duration connectRetries int log *logp.Logger @@ -72,6 +81,13 @@ func WithTimeout(to time.Duration) Option { } } +// WithMaxTimeout allows to define the max timeout per query, default is defaultMaxTimeout +func WithMaxTimeout(maxTimeout time.Duration) Option { + return func(c *Client) { + c.maxTimeout = maxTimeout + } +} + func WithLogger(log *logp.Logger) Option { return func(c *Client) { c.log = log @@ -88,6 +104,7 @@ func New(socketPath string, opts ...Option) *Client { c := &Client{ socketPath: socketPath, timeout: defaultTimeout, + maxTimeout: defaultMaxTimeout, connectRetries: defaultConnectRetries, cache: &nullSafeCache{}, cliLimiter: semaphore.NewWeighted(limit), @@ -121,22 +138,31 @@ func (c *Client) Connect(ctx context.Context) error { func (c *Client) reconnect(ctx context.Context) error { c.close() + cli, err := c.connectWithRetry(ctx, c.timeout) + if err != nil { + return err + } + c.cli = cli + return nil +} +func (c *Client) connectWithRetry(ctx context.Context, timeout time.Duration) (cli *osquery.ExtensionManagerClient, err error) { r := retry{ maxRetry: c.connectRetries, retryWait: retryWait, log: c.log.With("context", "osquery client connect"), } - return r.Run(ctx, func(ctx context.Context) error { - cli, err := osquery.NewClient(c.socketPath, c.timeout) + err = r.Run(ctx, func(_ context.Context) error { + var err error + cli, err = osquery.NewClient(c.socketPath, timeout) if err != nil { r.log.Warnf("failed to connect, reconnect might be attempted, err: %v", err) return err } - c.cli = cli return nil }) + return cli, err } func (c *Client) Close() { @@ -153,12 +179,15 @@ func (c *Client) close() { } // Query executes a given query, resolves the types -func (c *Client) Query(ctx context.Context, sql string) ([]map[string]interface{}, error) { +// +// In order to workaround the issue https://github.com/elastic/beats/issues/36622 +// each query creates it's own RPC connection to osqueryd, allowing it to set a custom timeout per query. +// Current implementation of osqueryd RPC returns the error when the long running query times out, but this timeout is a transport timeout, +// that doesn't cancel the query execution itself. +// This also makes the client RPC unusable until the long running query finishes, returning errors for each subsequent query. +func (c *Client) Query(ctx context.Context, sql string, timeout time.Duration) ([]map[string]interface{}, error) { c.mx.Lock() defer c.mx.Unlock() - if c.cli == nil { - return nil, ErrClientClosed - } err := c.cliLimiter.Acquire(ctx, limit) if err != nil { @@ -166,11 +195,31 @@ func (c *Client) Query(ctx context.Context, sql string) ([]map[string]interface{ } defer c.cliLimiter.Release(limit) + // If query timeout is <= 0, then use client timeout (default is 1 minute) + if timeout <= 0 { + timeout = c.timeout + } + + // If query timeout is greater that the maxTimeout, set it to the max timeout value + if timeout > c.maxTimeout { + timeout = c.maxTimeout + } + + c.log.Debugf("osquery connect, query: %s, timeout: %v", sql, timeout) + + // Use a separate connection for queries in order to be able to recover from timed out queries + cli, err := c.connectWithRetry(ctx, timeout) + if err != nil { + return nil, err + } + defer cli.Close() + var res *genosquery.ExtensionResponse - res, err = c.cli.Client.Query(ctx, sql) + res, err = cli.QueryContext(ctx, sql) if err != nil { return nil, fmt.Errorf("osquery failed: %w", err) } + if res.Status.Code != int32(0) { return nil, &ErrorQueryFailure{ code: res.Status.Code, @@ -226,7 +275,7 @@ func (c *Client) queryColumnTypes(ctx context.Context, sql string) (map[string]s err error ) - exres, err = c.cli.Client.GetQueryColumns(ctx, sql) + exres, err = c.cli.GetQueryColumnsContext(ctx, sql) if err != nil { return nil, fmt.Errorf("osquery get query columns failed: %w", err) diff --git a/x-pack/osquerybeat/osquerybeat.reference.yml b/x-pack/osquerybeat/osquerybeat.reference.yml index 416462f3f47..d6770083e62 100644 --- a/x-pack/osquerybeat/osquerybeat.reference.yml +++ b/x-pack/osquerybeat/osquerybeat.reference.yml @@ -293,8 +293,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -776,6 +777,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is osquerybeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "osquerybeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/packetbeat/LICENSE-Npcap.txt b/x-pack/packetbeat/LICENSE-Npcap.txt index 893b6ff218a..bb51b2fbd6f 100644 --- a/x-pack/packetbeat/LICENSE-Npcap.txt +++ b/x-pack/packetbeat/LICENSE-Npcap.txt @@ -1,228 +1,237 @@ - -NPCAP COPYRIGHT / END USER LICENSE AGREEMENT - -Npcap is a Windows packet sniffing driver and library and is copyright -(c) 2013-2022 by Insecure.Com LLC ("The Nmap Project"). All rights -reserved. - -Even though Npcap source code is publicly available for review, it is -not open source software and may not be redistributed without special -permission from the Nmap Project. The standard version is also -limited to installation on five systems. We fund the Npcap project by -selling two types of commercial licenses to a special Npcap OEM -edition: - -1) Npcap OEM Redistribution License allows companies to redistribute -Npcap with their products. - -2) Npcap OEM Internal Use License allows companies to use Npcap OEM -internally in excess of the free/demo version's normal 5-system -limitation. - -Both of these licenses include updates and support as well as a -warranty. Npcap OEM also includes a silent installer for unattended -installation. Further details about Npcap OEM are available from -https://nmap.org/npcap/oem/, and you are also welcome to contact us at -sales@nmap.com to ask any questions or set up a license for your -organization. - -Free and open source software producers are also welcome to contact us -for redistribution requests. However, we normally recommend that such -authors instead ask your users to download and install Npcap themselves. - -If the Nmap Project (directly or through one of our commercial -licensing customers) has granted you additional rights to Npcap or -Npcap OEM, those additional rights take precedence where they conflict -with the terms of this license agreement. - -Since the Npcap source code is available for download and review, -users sometimes contribute code patches to fix bugs or add new -features. By sending these changes to the Nmap Project (including -through direct email or our mailing lists or submitting pull requests -through our source code repository), it is understood unless you -specify otherwise that you are offering the Nmap Project the -unlimited, non-exclusive right to reuse, modify, and relicence your -code contribution so that we may (but are not obligated to) -incorporate it into Npcap. If you wish to specify special license -conditions or restrictions on your contributions, just say so when you -send them. - -This copy of Npcap (the "Software") and accompanying documentation is -licensed and not sold. This Software is protected by copyright laws -and treaties, as well as laws and treaties related to other forms of -intellectual property. The Nmap Project owns intellectual property -rights in the Software. The Licensee's ("you" or "your") license to -download, use, copy, or change the Software is subject to these rights -and to all the terms and conditions of this End User License Agreement -("Agreement"). - -ACCEPTANCE - -By accepting this agreement or by downloading, installing, using, or -copying the Software, or by clicking "I Agree", you agree to be bound -by the terms of this EULA. If you do not agree to the terms of this -EULA, do not install, use, or copy the Software. - -LICENSE GRANT - -This Agreement entitles you to install and use five (5) copies of the -Software. In addition, you may make archival copies of the Software -which may only be used for the reinstallation of the Software. This -Agreement does not permit the installation or use of more than 5 -copies of the Software, or the installation of the Software on more -than five computer at any given time, on a system that allows shared -used of applications by more than five users, or on any configuration -or system of computers that allows more than five users. A user may -only have one instance of this Agreement active at once. For example, -downloading the software multiple times, downloading multiple versions -of the software, and/or executing the software installer multiple -times do not grant any additional rights such as using the software on -more machines. - -The terms "computer" and "machine" in this license include any -computing device, including software computing instances such as -virtual machines and Docker containers. - -Copies of Npcap do not count toward the five copy, five computer, or -five user limitations imposed by this section if they are installed -and used solely in conjunction with any of the following software: - -o The Nmap Security Scanner, as distributed from https://nmap.org - -o The Wireshark network protocol analyzer, as distributed from - https://www.wireshark.org/ - -o Microsoft Defender for Identity, as distributed from - https://www.microsoft.com/en-us/microsoft-365/security/identity-defender - -Users wishing to redistribute Npcap or exceed the usage limits imposed -by this free license or benefit from commercial support and features -such as a silent installer should contact sales@nmap.com to obtain an -appropriate commercial license agreement. More details on our OEM -edition is also available from https://nmap.org/npcap/oem/. - -DISCLAIMER OF WARRANTIES AND LIMITATION OF LIABILITY - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -RESTRICTIONS ON TRANSFER - -Without first obtaining the express written consent of the Nmap -Project, you may not assign your rights and obligations under this -Agreement, or redistribute, encumber, sell, rent, lease, sublicense, -or otherwise transfer your rights to the Software Product. - -RESTRICTIONS ON USE - -You may not use, copy, or install the Software Product on more than -five computers, or permit the use, copying, or installation of the -Software Product by more than five users or on more than five -computers. - -RESTRICTIONS ON COPYING - -You may not copy any part of the Software except to the extent that -licensed use inherently demands the creation of a temporary copy -stored in computer memory and not permanently affixed on storage -medium. You may make archival copies as well. - -DISCLAIMER OF WARRANTIES AND LIMITATION OF LIABILITY - -UNLESS OTHERWISE EXPLICITLY AGREED TO IN WRITING BY THE NMAP PROJECT, -THE NMAP PROJECT MAKES NO OTHER WARRANTIES, EXPRESS OR IMPLIED, IN -FACT OR IN LAW, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES -OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OTHER THAN AS -SET FORTH IN THIS AGREEMENT OR IN THE LIMITED WARRANTY DOCUMENTS -PROVIDED WITH THE SOFTWARE. - -The Nmap Project makes no warranty that the Software will meet your -requirements or operate under your specific conditions of use. The -Nmap Project makes no warranty that operation of the Software Product -will be secure, error free, or free from interruption. YOU MUST -DETERMINE WHETHER THE SOFTWARE SUFFICIENTLY MEETS YOUR REQUIREMENTS -FOR SECURITY AND UNINTERRUPTABILITY. YOU BEAR SOLE RESPONSIBILITY AND -ALL LIABILITY FOR ANY LOSS INCURRED DUE TO FAILURE OF THE SOFTWARE TO -MEET YOUR REQUIREMENTS. THE NMAP PROJECT WILL NOT, UNDER ANY -CIRCUMSTANCES, BE RESPONSIBLE OR LIABLE FOR THE LOSS OF DATA ON ANY -COMPUTER OR INFORMATION STORAGE DEVICE. - -UNDER NO CIRCUMSTANCES SHALL THE NMAP PROJECT, ITS DIRECTORS, -OFFICERS, EMPLOYEES OR AGENTS BE LIABLE TO YOU OR ANY OTHER PARTY FOR -INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, PUNITIVE, OR EXEMPLARY -DAMAGES OF ANY KIND (INCLUDING LOST REVENUES OR PROFITS OR LOSS OF -BUSINESS) RESULTING FROM THIS AGREEMENT, OR FROM THE FURNISHING, -PERFORMANCE, INSTALLATION, OR USE OF THE SOFTWARE, WHETHER DUE TO A -BREACH OF CONTRACT, BREACH OF WARRANTY, OR THE NEGLIGENCE OF THE NMAP -PROJECT OR ANY OTHER PARTY, EVEN IF THE NMAP PROJECT IS ADVISED -BEFOREHAND OF THE POSSIBILITY OF SUCH DAMAGES. TO THE EXTENT THAT THE -APPLICABLE JURISDICTION LIMITS THE NMAP PROJECT'S ABILITY TO DISCLAIM -ANY IMPLIED WARRANTIES, THIS DISCLAIMER SHALL BE EFFECTIVE TO THE -MAXIMUM EXTENT PERMITTED. - -LIMITATIONS OF REMEDIES AND DAMAGES - -Your remedy for a breach of this Agreement or of any warranty included -in this Agreement is the correction or replacement of the Software or -a refund of the purchase price of the Software, exclusive of any costs -for shipping and handling. Selection of whether to correct or replace -or refund shall be solely at the discretion of the Nmap Project. The -Nmap Project reserves the right to substitute a functionally -equivalent copy of the Software Product as a replacement. - -Any claim must be made within the applicable warranty period. All -warranties cover only defects arising under normal use and do not -include malfunctions or failure resulting from misuse, abuse, neglect, -alteration, problems with electrical power, acts of nature, unusual -temperatures or humidity, improper installation, or damage determined -by the Nmap Project to have been caused by you. All limited warranties -on the Software Product are granted only to you and are -non-transferable. - -You agree to indemnify and hold the Nmap Project harmless from all -claims, judgments, liabilities, expenses, or costs arising from your -breach of this Agreement and/or acts or omissions. - -GOVERNING LAW, JURISDICTION AND COSTS - -This Agreement is governed by the laws the United States of America -and Washington State, without regard to Washington's conflict or -choice of law provisions. - -SEVERABILITY - -If any provision of this Agreement shall be held to be invalid or -unenforceable, the remainder of this Agreement shall remain in full -force and effect. To the extent any express or implied restrictions -are not permitted by applicable laws, these express or implied -restrictions shall remain in force and effect to the maximum extent -permitted by such applicable laws. - -THIRD PARTY SOFTWARE ATTRIBUTION - -Npcap uses several 3rd party open source software libraries: - -* The libpcap portable packet capturing library from https://tcpdump.org -* The Winpcap packet capturing library. It has been abandoned, but is - currently still available from https://www.winpcap.org/. -* The ieee80211_radiotap.h header file from David Young - -All of these are open source with BSD-style licenses that allow for -unlimited use and royalty-free redistribution within other software -(including commercial/proprietary software). Some include a warranty -disclaimer (relating to the original authors) and require a small -amount of acknowledgment text be added somewhere in the documentation -of any software which includes them (including indirect inclusion -through Npcap). - -The required acknowledgement text as well as full license text and -source details for these libraries is available from: -https://npcap.org/src/docs/Npcap-Third-Party-Open-Source.pdf . - -Since Insecure.Com LLC is not the author of this 3rd party code, we -can not waive or modify it’s software copyright or license. Npcap -users and redistributors must comply with the relevant Npcap license -(either the free/demo license or a commercial Npcap OEM license they -may have purchased) as well as the minimal requirements of this 3rd -party open source software. + +NPCAP COPYRIGHT / END USER LICENSE AGREEMENT + +Npcap (https://npcap.com) is a Windows packet sniffing driver and +library and is copyright (c) 2013-2023 by Nmap Software LLC ("The Nmap +Project"). All rights reserved. + +Even though Npcap source code is publicly available for review, it is +not open source software and may not be redistributed or used in other +software without special permission from the Nmap Project. The +standard (free) version is usually limited to installation on five +systems. We fund the Npcap project by selling two types of commercial +licenses to a special Npcap OEM edition: + +1) The Npcap OEM Redistribution License allows companies distribute +Npcap OEM within their products. Licensees generally use the Npcap OEM +silent installer, ensuring a seamless experience for end +users. Licensees may choose between a perpetual unlimited license or +a quarterly term license, along with options for commercial support and +updates. Prices and details: https://npcap.com/oem/redist.html + +2) The Npcap OEM Internal-Use License is for organizations that wish +to use Npcap OEM internally, without redistribution outside their +organization. This allows them to bypass the 5-system usage cap of the +Npcap free edition. It includes commercial support and update options, +and provides the extra Npcap OEM features such as the silent installer +for automated deployment. Prices and details: +https://npcap.com/oem/internal.html + +Both of these licenses include updates and support as well as a +warranty. Npcap OEM also includes a silent installer for unattended +installation. Further details about Npcap OEM are available from +https://npcap.com/oem/, and you are also welcome to contact us at +sales@nmap.com to ask any questions or set up a license for your +organization. + +Free and open source software producers are also welcome to contact us +for redistribution requests. However, we normally recommend that such +authors instead ask your users to download and install Npcap +themselves. It will be free for them if they need 5 or fewer copies. + +If the Nmap Project (directly or through one of our commercial +licensing customers) has granted you additional rights to Npcap or +Npcap OEM, those additional rights take precedence where they conflict +with the terms of this license agreement. + +Since the Npcap source code is available for download and review, +users sometimes contribute code patches to fix bugs or add new +features. By sending these changes to the Nmap Project (including +through direct email or our mailing lists or submitting pull requests +through our source code repository), it is understood unless you +specify otherwise that you are offering the Nmap Project the +unlimited, non-exclusive right to reuse, modify, and relicense your +code contribution so that we may (but are not obligated to) +incorporate it into Npcap. If you wish to specify special license +conditions or restrictions on your contributions, just say so when you +send them. + +This copy of Npcap (the "Software") and accompanying documentation is +licensed and not sold. This Software is protected by copyright laws +and treaties, as well as laws and treaties related to other forms of +intellectual property. The Nmap Project owns intellectual property +rights in the Software. The Licensee's ("you" or "your") license to +download, use, copy, or change the Software is subject to these rights +and to all the terms and conditions of this End User License Agreement +("Agreement"). + +ACCEPTANCE + +By accepting this agreement or by downloading, installing, using, or +copying the Software, or by clicking "I Agree", you agree to be bound +by the terms of this EULA. If you do not agree to the terms of this +EULA, do not install, use, or copy the Software. + +LICENSE GRANT + +This Agreement entitles you to install and use five (5) copies of the +Software. In addition, you may make archival copies of the Software +which may only be used for the reinstallation of the Software. This +Agreement does not permit the installation or use of more than 5 +copies of the Software, or the installation of the Software on more +than five computer at any given time, on a system that allows shared +used of applications by more than five users, or on any configuration +or system of computers that allows more than five users. A user may +only have one instance of this Agreement active at once. For example, +downloading the software multiple times, downloading multiple versions +of the software, and/or executing the software installer multiple +times do not grant any additional rights such as using the software on +more machines. + +The terms "computer" and "machine" in this license include any +computing device, including software computing instances such as +virtual machines and Docker containers. + +Copies of Npcap do not count toward the five copy, five computer, or +five user limitations imposed by this section if they are installed +and used solely in conjunction with any of the following software: + +o The Nmap Security Scanner, as distributed from https://nmap.org + +o The Wireshark network protocol analyzer, as distributed from + https://www.wireshark.org/ + +o Microsoft Defender for Identity, as distributed from + https://www.microsoft.com/en-us/microsoft-365/security/identity-defender + +Users wishing to redistribute Npcap or exceed the usage limits imposed +by this free license or benefit from commercial support and features +such as a silent installer should contact sales@nmap.com to obtain an +appropriate commercial license agreement. More details on our OEM +edition is also available from https://npcap.com/oem/. + +DISCLAIMER OF WARRANTIES AND LIMITATION OF LIABILITY + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +RESTRICTIONS ON TRANSFER + +Without first obtaining the express written consent of the Nmap +Project, you may not assign your rights and obligations under this +Agreement, or redistribute, encumber, sell, rent, lease, sublicense, +or otherwise transfer your rights to the Software Product. + +RESTRICTIONS ON USE + +You may not use, copy, or install the Software Product on more than +five computers, or permit the use, copying, or installation of the +Software Product by more than five users or on more than five +computers. + +RESTRICTIONS ON COPYING + +You may not copy any part of the Software except to the extent that +licensed use inherently demands the creation of a temporary copy +stored in computer memory and not permanently affixed on storage +medium. You may make archival copies as well. + +DISCLAIMER OF WARRANTIES AND LIMITATION OF LIABILITY + +UNLESS OTHERWISE EXPLICITLY AGREED TO IN WRITING BY THE NMAP PROJECT, +THE NMAP PROJECT MAKES NO OTHER WARRANTIES, EXPRESS OR IMPLIED, IN +FACT OR IN LAW, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES +OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OTHER THAN AS +SET FORTH IN THIS AGREEMENT OR IN THE LIMITED WARRANTY DOCUMENTS +PROVIDED WITH THE SOFTWARE. + +The Nmap Project makes no warranty that the Software will meet your +requirements or operate under your specific conditions of use. The +Nmap Project makes no warranty that operation of the Software Product +will be secure, error free, or free from interruption. YOU MUST +DETERMINE WHETHER THE SOFTWARE SUFFICIENTLY MEETS YOUR REQUIREMENTS +FOR SECURITY AND UNINTERRUPTABILITY. YOU BEAR SOLE RESPONSIBILITY AND +ALL LIABILITY FOR ANY LOSS INCURRED DUE TO FAILURE OF THE SOFTWARE TO +MEET YOUR REQUIREMENTS. THE NMAP PROJECT WILL NOT, UNDER ANY +CIRCUMSTANCES, BE RESPONSIBLE OR LIABLE FOR THE LOSS OF DATA ON ANY +COMPUTER OR INFORMATION STORAGE DEVICE. + +UNDER NO CIRCUMSTANCES SHALL THE NMAP PROJECT, ITS DIRECTORS, +OFFICERS, EMPLOYEES OR AGENTS BE LIABLE TO YOU OR ANY OTHER PARTY FOR +INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, PUNITIVE, OR EXEMPLARY +DAMAGES OF ANY KIND (INCLUDING LOST REVENUES OR PROFITS OR LOSS OF +BUSINESS) RESULTING FROM THIS AGREEMENT, OR FROM THE FURNISHING, +PERFORMANCE, INSTALLATION, OR USE OF THE SOFTWARE, WHETHER DUE TO A +BREACH OF CONTRACT, BREACH OF WARRANTY, OR THE NEGLIGENCE OF THE NMAP +PROJECT OR ANY OTHER PARTY, EVEN IF THE NMAP PROJECT IS ADVISED +BEFOREHAND OF THE POSSIBILITY OF SUCH DAMAGES. TO THE EXTENT THAT THE +APPLICABLE JURISDICTION LIMITS THE NMAP PROJECT'S ABILITY TO DISCLAIM +ANY IMPLIED WARRANTIES, THIS DISCLAIMER SHALL BE EFFECTIVE TO THE +MAXIMUM EXTENT PERMITTED. + +LIMITATIONS OF REMEDIES AND DAMAGES + +Your remedy for a breach of this Agreement or of any warranty included +in this Agreement is the correction or replacement of the Software or +a refund of the purchase price of the Software, exclusive of any costs +for shipping and handling. Selection of whether to correct or replace +or refund shall be solely at the discretion of the Nmap Project. The +Nmap Project reserves the right to substitute a functionally +equivalent copy of the Software Product as a replacement. + +Any claim must be made within the applicable warranty period. All +warranties cover only defects arising under normal use and do not +include malfunctions or failure resulting from misuse, abuse, neglect, +alteration, problems with electrical power, acts of nature, unusual +temperatures or humidity, improper installation, or damage determined +by the Nmap Project to have been caused by you. All limited warranties +on the Software Product are granted only to you and are +non-transferable. + +You agree to indemnify and hold the Nmap Project harmless from all +claims, judgments, liabilities, expenses, or costs arising from your +breach of this Agreement and/or acts or omissions. + +GOVERNING LAW, JURISDICTION AND COSTS + +This Agreement is governed by the laws of the United States of America +and Deleware State, without regard to Delaware's conflict or choice of +law provisions. + +SEVERABILITY + +If any provision of this Agreement shall be held to be invalid or +unenforceable, the remainder of this Agreement shall remain in full +force and effect. To the extent any express or implied restrictions +are not permitted by applicable laws, these express or implied +restrictions shall remain in force and effect to the maximum extent +permitted by such applicable laws. + +THIRD PARTY SOFTWARE ATTRIBUTION + +Npcap uses several 3rd party open source software libraries: + +* The libpcap portable packet capturing library from https://tcpdump.org +* The Winpcap packet capturing library. It has been abandoned, but is + currently still available from https://www.winpcap.org/. +* The ieee80211_radiotap.h header file from David Young + +All of these are open source with BSD-style licenses that allow for +unlimited use and royalty-free redistribution within other software +(including commercial/proprietary software). Some include a warranty +disclaimer (relating to the original authors) and require a small +amount of acknowledgment text be added somewhere in the documentation +of any software which includes them (including indirect inclusion +through Npcap). + +The required acknowledgement text as well as full license text and +source details for these libraries is available from: +https://npcap.com/src/docs/Npcap-Third-Party-Open-Source.pdf . + +Since Nmap Software LLC is not the author of this 3rd party code, we +can not waive or modify its software copyright or license. Npcap +users and redistributors must comply with the relevant Npcap license +(either the free/demo license or a commercial Npcap OEM license they +may have purchased) as well as the minimal requirements of this 3rd +party open source software. diff --git a/x-pack/packetbeat/magefile.go b/x-pack/packetbeat/magefile.go index daee711156a..2d0d367a460 100644 --- a/x-pack/packetbeat/magefile.go +++ b/x-pack/packetbeat/magefile.go @@ -36,7 +36,7 @@ import ( // the packetbeat executable. It is used to specify which npcap builder crossbuild // image to use and the installer to obtain from the cloud store for testing. const ( - NpcapVersion = "1.71" + NpcapVersion = "1.76" installer = "npcap-" + NpcapVersion + "-oem.exe" ) diff --git a/x-pack/packetbeat/npcap/installer/LICENSE b/x-pack/packetbeat/npcap/installer/LICENSE index 0bf8aa4d9b6..61173d3226a 100644 --- a/x-pack/packetbeat/npcap/installer/LICENSE +++ b/x-pack/packetbeat/npcap/installer/LICENSE @@ -1,10 +1,10 @@ -------------------------------------------------------------------------------- Dependency : Npcap (https://nmap.org/npcap/) -Version: 1.71 +Version: 1.76 Licence type: Commercial -------------------------------------------------------------------------------- -Npcap is Copyright (c) 2013-2021 Insecure.Com LLC. All rights reserved. +Npcap is Copyright (c) 2013-2023 Insecure.Com LLC. All rights reserved. See https://npcap.org for details. Portions of Npcap are Copyright (c) 1999 - 2005 NetGroup, Politecnico di diff --git a/x-pack/packetbeat/packetbeat.reference.yml b/x-pack/packetbeat/packetbeat.reference.yml index 7442b7f6a0f..aebeb1947a6 100644 --- a/x-pack/packetbeat/packetbeat.reference.yml +++ b/x-pack/packetbeat/packetbeat.reference.yml @@ -916,8 +916,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1803,6 +1804,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is packetbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "packetbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. diff --git a/x-pack/packetbeat/tests/system/app_test.go b/x-pack/packetbeat/tests/system/app_test.go index f6db2aa2977..b7566e7450b 100644 --- a/x-pack/packetbeat/tests/system/app_test.go +++ b/x-pack/packetbeat/tests/system/app_test.go @@ -29,7 +29,7 @@ import ( ) // Keep in sync with NpcapVersion in magefile.go. -const NpcapVersion = "1.71" +const NpcapVersion = "1.76" func TestWindowsNpcapInstaller(t *testing.T) { if runtime.GOOS != "windows" { diff --git a/x-pack/winlogbeat/winlogbeat.reference.yml b/x-pack/winlogbeat/winlogbeat.reference.yml index 3c6799e7329..5d52a07b37b 100644 --- a/x-pack/winlogbeat/winlogbeat.reference.yml +++ b/x-pack/winlogbeat/winlogbeat.reference.yml @@ -334,8 +334,9 @@ output.elasticsearch: # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200 hosts: ["localhost:9200"] - # Set gzip compression level. - #compression_level: 0 + # Set gzip compression level. Set to 0 to disable compression. + # The default is 1. + #compression_level: 1 # Configure escaping HTML symbols in strings. #escape_html: false @@ -1221,6 +1222,33 @@ setup.template.settings: # Overwrite the lifecycle policy at startup. The default is false. #setup.ilm.overwrite: false +# ======================== Data Stream Lifecycle (DSL) ========================= + +# Configure Data Stream Lifecycle to manage data streams while connected to Serverless elasticsearch. +# These settings are mutually exclusive with ILM settings which are not supported in Serverless projects. + +# Enable DSL support. Valid values are true, or false. +#setup.dsl.enabled: true + +# Set the lifecycle policy name or pattern. For DSL, this name must match the data stream that the lifecycle is for. +# The default data stream pattern is winlogbeat-%{[agent.version]}" +# The template string `%{[agent.version]}` will resolve to the current stack version. +# The other possible template value is `%{[beat.name]}`. +#setup.dsl.data_stream_pattern: "winlogbeat-%{[agent.version]}" + +# The path to a JSON file that contains a lifecycle policy configuration. Used +# to load your own lifecycle policy. +# If no custom policy is specified, a default policy with a lifetime of 7 days will be created. +#setup.dsl.policy_file: + +# Disable the check for an existing lifecycle policy. The default is true. If +# you disable this check, set setup.dsl.overwrite: true so the lifecycle policy +# can be installed. +#setup.dsl.check_exists: true + +# Overwrite the lifecycle policy at startup. The default is false. +#setup.dsl.overwrite: false + # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.