diff --git a/.ci/bump-golang-7.17.yml b/.ci/bump-golang-7.17.yml index c447bca878e..5b6619bc453 100644 --- a/.ci/bump-golang-7.17.yml +++ b/.ci/bump-golang-7.17.yml @@ -12,7 +12,7 @@ scms: repository: beats token: '{{ requiredEnv "GITHUB_TOKEN" }}' username: '{{ requiredEnv "GIT_USER" }}' - branch: 7.17 + branch: "7.17" actions: beats: @@ -84,6 +84,15 @@ conditions: command: 'grep -v -q {{ source "latestGoVersion" }} .go-version #' targets: + update-gomod: + name: "Update go.mod" + sourceid: gomod + scmid: githubConfig + kind: file + spec: + content: 'go {{ source "gomod" }}' + file: go.mod + matchpattern: 'go \d+.\d+' update-go-version: name: "Update .go-version" sourceid: latestGoVersion @@ -111,34 +120,154 @@ targets: content: ':go-version: {{ source "latestGoVersion" }}' file: libbeat/docs/version.asciidoc matchpattern: ':go-version: \d+.\d+.\d+' - update-dockerfiles: - name: "Update from dockerfiles" + update-auditbeat-dockerfile: + name: "Update Auditbeat Dockerfile" sourceid: latestGoVersion scmid: githubConfig - kind: file + kind: dockerfile spec: - content: 'FROM golang:{{ source "latestGoVersion" }}' - # This list differs from the main branch, this is the main reason we have a separate job - files: - - ./metricbeat/Dockerfile - - ./metricbeat/module/vsphere/_meta/Dockerfile - - ./metricbeat/module/nats/_meta/Dockerfile - - ./metricbeat/module/http/_meta/Dockerfile - - ./filebeat/Dockerfile - - ./auditbeat/Dockerfile - - ./heartbeat/Dockerfile - - ./packetbeat/Dockerfile - - ./libbeat/Dockerfile - - ./x-pack/metricbeat/module/stan/_meta/Dockerfile - - ./x-pack/functionbeat/Dockerfile - - ./x-pack/libbeat/Dockerfile - matchpattern: 'FROM golang:\d+.\d+.\d+' - update-gomod: - name: "Update go.mod" - sourceid: gomod + instruction: + keyword: "FROM" + matcher: "golang" + file: ./auditbeat/Dockerfile + update-heartbeat-dockerfile: + name: "Update Heartbeat Dockerfile" + sourceid: latestGoVersion scmid: githubConfig - kind: file + kind: dockerfile spec: - content: 'go {{ source "gomod" }}' - file: go.mod - matchpattern: 'go \d+.\d+' + instruction: + keyword: "FROM" + matcher: "golang" + file: ./heartbeat/Dockerfile + update-metricbeat-dockerfile: + name: "Update Metricbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/Dockerfile + update-packetbeat-dockerfile: + name: "Update Packetbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./packetbeat/Dockerfile + update-functionbeat-dockerfile: + name: "Update Functionbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./x-pack/functionbeat/Dockerfile + update-nats-module-dockerfile: + name: "Update NATS module Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/nats/_meta/Dockerfile + update-http-module-dockerfile: + name: "Update HTTP module Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/http/_meta/Dockerfile + update-vsphere-module-dockerfile: + name: "Update from vsphere Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/vsphere/_meta/Dockerfile + update-metricbeat-debug-dockerfile: + name: "Update Metricbeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/metricbeat/Dockerfile.debug + update-dockerfiles-filebeat-debug: + name: "Update Filebeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/filebeat/Dockerfile.debug + update-heartbeat-debug-dockerfile: + name: "Update Heartbeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/heartbeat/Dockerfile.debug + update-stan-module-dockerfile: + name: "Update stan Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./x-pack/metricbeat/module/stan/_meta/Dockerfile + # The following Dockerfiles aren't present on the main branch, this is the main reason we have a separate job + update-filebeat-dockerfile: + name: "Update Filebeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./filebeat/Dockerfile + update-libbeat-dockerfile: + name: "Update libbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./libbeat/Dockerfile + update-x-pack-libbeat-dockerfile: + name: "Update x-pack/libbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./x-pack/libbeat/Dockerfile diff --git a/.ci/bump-golang.yml b/.ci/bump-golang.yml index 668e1137363..8e23c2679c0 100644 --- a/.ci/bump-golang.yml +++ b/.ci/bump-golang.yml @@ -84,6 +84,15 @@ conditions: command: 'grep -v -q {{ source "latestGoVersion" }} .go-version #' targets: + update-gomod: + name: "Update go.mod" + sourceid: gomod + scmid: githubConfig + kind: file + spec: + content: 'go {{ source "gomod" }}' + file: go.mod + matchpattern: 'go \d+.\d+' update-go-version: name: "Update .go-version" sourceid: latestGoVersion @@ -111,33 +120,132 @@ targets: content: ':go-version: {{ source "latestGoVersion" }}' file: libbeat/docs/version.asciidoc matchpattern: ':go-version: \d+.\d+.\d+' - update-dockerfiles: - name: "Update from dockerfiles" - sourceid: latestGoVersion + update-devcontainer: + name: "Update .devcontainer/devcontainer.json" + sourceid: gomod scmid: githubConfig kind: file spec: - content: 'FROM golang:{{ source "latestGoVersion" }}' - files: - - ./auditbeat/Dockerfile - - ./heartbeat/Dockerfile - - ./metricbeat/Dockerfile - - ./packetbeat/Dockerfile - - ./x-pack/functionbeat/Dockerfile - - ./metricbeat/module/nats/_meta/Dockerfile - - ./metricbeat/module/http/_meta/Dockerfile - - ./metricbeat/module/vsphere/_meta/Dockerfile - - ./dev-tools/kubernetes/metricbeat/Dockerfile.debug - - ./dev-tools/kubernetes/filebeat/Dockerfile.debug - - ./dev-tools/kubernetes/heartbeat/Dockerfile.debug - - ./x-pack/metricbeat/module/stan/_meta/Dockerfile - matchpattern: 'FROM golang:\d+.\d+.\d+' - update-gomod: - name: "Update go.mod" - sourceid: gomod + content: 'go:1-{{ source "gomod" }}' + file: ./.devcontainer/devcontainer.json + matchpattern: 'go:1-\d+.\d+' + update-auditbeat-dockerfile: + name: "Update Auditbeat Dockerfile" + sourceid: latestGoVersion scmid: githubConfig - kind: file + kind: dockerfile spec: - content: 'go {{ source "gomod" }}' - file: go.mod - matchpattern: 'go \d+.\d+' + instruction: + keyword: "FROM" + matcher: "golang" + file: ./auditbeat/Dockerfile + update-heartbeat-dockerfile: + name: "Update Heartbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./heartbeat/Dockerfile + update-metricbeat-dockerfile: + name: "Update Metricbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/Dockerfile + update-packetbeat-dockerfile: + name: "Update Packetbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./packetbeat/Dockerfile + update-functionbeat-dockerfile: + name: "Update Functionbeat Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./x-pack/functionbeat/Dockerfile + update-nats-module-dockerfile: + name: "Update NATS module Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/nats/_meta/Dockerfile + update-http-module-dockerfile: + name: "Update HTTP module Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/http/_meta/Dockerfile + update-vsphere-module-dockerfile: + name: "Update from vsphere Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./metricbeat/module/vsphere/_meta/Dockerfile + update-metricbeat-debug-dockerfile: + name: "Update Metricbeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/metricbeat/Dockerfile.debug + update-dockerfiles-filebeat-debug: + name: "Update Filebeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/filebeat/Dockerfile.debug + update-heartbeat-debug-dockerfile: + name: "Update Heartbeat debug Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./dev-tools/kubernetes/heartbeat/Dockerfile.debug + update-stan-module-dockerfile: + name: "Update stan Dockerfile" + sourceid: latestGoVersion + scmid: githubConfig + kind: dockerfile + spec: + instruction: + keyword: "FROM" + matcher: "golang" + file: ./x-pack/metricbeat/module/stan/_meta/Dockerfile diff --git a/.ci/jobs/docker-compose.yml b/.ci/jobs/docker-compose.yml new file mode 100644 index 00000000000..e9fc43ff704 --- /dev/null +++ b/.ci/jobs/docker-compose.yml @@ -0,0 +1,23 @@ +version: '2.3' +services: + # This is a proxy used to block beats until all services are healthy. + # See: https://github.com/docker/compose/issues/4369 + proxy_dep: + image: busybox + depends_on: + localstack: { condition: service_healthy } + + localstack: + container_name: "${localstack_integration_test_container}" + image: localstack/localstack:2.1.0 # Latest stable release + ports: + - "127.0.0.1:4566:4566" # LocalStack Gateway + environment: + - DEBUG=1 + - DOCKER_HOST=unix:///var/run/docker.sock + - LOCALSTACK_HOST=localhost + - S3_HOSTNAME=localhost + - PROVIDER_OVERRIDE_S3=asf + volumes: + - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" + - "/var/run/docker.sock:/var/run/docker.sock" diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 7ba3d20b2cc..e59436813d0 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -4,11 +4,6 @@ import groovy.transform.Field -/** - This is required to store the test suites we will use to trigger the E2E tests. -*/ -@Field def e2eTestSuites = [] - pipeline { agent none environment { @@ -20,7 +15,6 @@ pipeline { JOB_GCS_EXT_CREDENTIALS = 'beats-ci-gcs-plugin-file-credentials' DOCKERELASTIC_SECRET = 'secret/observability-team/ci/docker-registry/prod' DOCKER_REGISTRY = 'docker.elastic.co' - GITHUB_CHECK_E2E_TESTS_NAME = 'E2E Tests' PIPELINE_LOG_LEVEL = "INFO" SLACK_CHANNEL = '#ingest-notifications' NOTIFY_TO = 'beats-contrib+package-beats@elastic.co' @@ -40,9 +34,6 @@ pipeline { // disable upstream trigger on a PR basis upstream("Beats/beats/${ env.JOB_BASE_NAME.startsWith('PR-') ? 'none' : env.JOB_BASE_NAME }") } - parameters { - booleanParam(name: 'run_e2e', defaultValue: true, description: 'Allow to disable the e2e tets. This workaround will generate broken/buggy binaries.') - } stages { stage('Filter build') { options { skipDefaultCheckout() } @@ -103,15 +94,6 @@ pipeline { generateSteps() } } - stage('Run E2E Tests for Packages'){ - options { skipDefaultCheckout() } - when { - expression { return params.run_e2e } - } - steps { - runE2ETests() - } - } stage('DRA Snapshot') { options { skipDefaultCheckout() } // The Unified Release process keeps moving branches as soon as a new @@ -303,7 +285,6 @@ def generateLinuxStep(beat) { pushCIDockerImages(arch: 'amd64') } } - prepareE2ETestForPackage("${beat}") // Staging is only needed from branches (main or release branches) if (isBranch()) { @@ -389,19 +370,6 @@ def tagAndPush(Map args = [:]) { ) } -def prepareE2ETestForPackage(String beat){ - if ("${beat}" == "filebeat" || "${beat}" == "x-pack/filebeat") { - e2eTestSuites.push('fleet') - e2eTestSuites.push('helm') - } else if ("${beat}" == "metricbeat" || "${beat}" == "x-pack/metricbeat") { - e2eTestSuites.push('ALL') - echo("${beat} adds all test suites to the E2E tests job.") - } else { - echo("${beat} does not add any test suite to the E2E tests job.") - return - } -} - def release(type){ withBeatsEnv(type){ // As agreed DEV=false for staging otherwise DEV=true @@ -438,32 +406,6 @@ def release(type){ } } -def runE2ETests(){ - if (e2eTestSuites.size() == 0) { - echo("Not triggering E2E tests for PR-${env.CHANGE_ID} because the changes does not affect the E2E.") - return - } - - def suites = '' // empty value represents all suites in the E2E tests - - def suitesSet = e2eTestSuites.toSet() - - if (!suitesSet.contains('ALL')) { - suitesSet.each { suite -> - suites += "${suite}," - }; - } - echo 'runE2E has asynchronously triggered the end to end test job.' - runE2E(runTestsSuites: suites, - testMatrixFile: '.ci/.e2e-tests-beats.yaml', - beatVersion: "${env.BEAT_VERSION}-SNAPSHOT", - gitHubCheckName: env.GITHUB_CHECK_E2E_TESTS_NAME, - gitHubCheckRepo: env.REPO, - gitHubCheckSha1: env.GIT_BASE_COMMIT, - propagate: false, // Ignore the result of the downstream E2E job. - wait: false) // Do not synchronously wait for the downstream E2E job to complete. - } - /** * There is a specific folder structure in https://staging.elastic.co/ and https://artifacts.elastic.co/downloads/ * therefore the storage bucket in GCP should follow the same folder structure. diff --git a/.ci/scripts/docker-services-cleanup.sh b/.ci/scripts/docker-services-cleanup.sh new file mode 100755 index 00000000000..cc182413a2e --- /dev/null +++ b/.ci/scripts/docker-services-cleanup.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -exuo pipefail + +${HOME}/bin/docker-compose -f .ci/jobs/docker-compose.yml down -v + +exit $? diff --git a/.ci/scripts/install-docker-services.sh b/.ci/scripts/install-docker-services.sh new file mode 100755 index 00000000000..420362f8355 --- /dev/null +++ b/.ci/scripts/install-docker-services.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -exuo pipefail + +${HOME}/bin/docker-compose -f .ci/jobs/docker-compose.yml up -d + +exit $? diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..571faef670a --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/go +// If you're wondering how to get SSH working for git pushes, make sure to ssh-add ~/.ssh/ on your host system +// to make sure the ssh agent has your key +{ + "name": "Beats Development Container", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/go:1-1.20-bullseye", + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/node:1": {}, + "ghcr.io/devcontainers/features/python:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/common-utils:2": {}, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {} + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // Mage is installed this way, and not via the feature plugin because that plugin was + // broken for me, and mage install is simple enough + "postCreateCommand": "cd /opt/; sudo mkdir mage; sudo chown $USER:$(id -g) mage; git clone --depth=1 https://github.com/magefile/mage && cd mage && go run bootstrap.go; npm i -g @elastic/synthetics; sudo env \"PATH=$PATH\" npx -yes playwright install-deps" + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 13edaaaf091..a41ac990750 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -66,6 +66,7 @@ CHANGELOG* /licenses/ @elastic/elastic-agent-data-plane /metricbeat/ @elastic/elastic-agent-data-plane /metricbeat/docs/ # Listed without an owner to avoid maintaining doc ownership for each input and module. +/metricbeat/helper/kubernetes @elastic/obs-cloudnative-monitoring /metricbeat/module/ @elastic/integrations /metricbeat/module/apache @elastic/obs-infraobs-integrations /metricbeat/module/beat/ @elastic/infra-monitoring-ui @@ -115,6 +116,8 @@ CHANGELOG* /x-pack/filebeat/input/gcs/ @elastic/security-external-integrations /x-pack/filebeat/input/http_endpoint/ @elastic/security-external-integrations /x-pack/filebeat/input/httpjson/ @elastic/security-external-integrations +/x-pack/filebeat/input/internal/httplog @elastic/security-external-integrations +/x-pack/filebeat/input/internal/httpmon @elastic/security-external-integrations /x-pack/filebeat/input/lumberjack/ @elastic/security-external-integrations /x-pack/filebeat/input/netflow/ @elastic/security-external-integrations /x-pack/filebeat/input/o365audit/ @elastic/security-external-integrations @@ -155,6 +158,7 @@ CHANGELOG* /x-pack/filebeat/module/proofpoint @elastic/security-external-integrations /x-pack/filebeat/module/rabbitmq @elastic/obs-infraobs-integrations /x-pack/filebeat/module/radware @elastic/security-external-integrations +/x-pack/filebeat/module/salesforce @elastic/obs-infraobs-integrations /x-pack/filebeat/module/snort @elastic/security-external-integrations /x-pack/filebeat/module/snyk @elastic/security-external-integrations /x-pack/filebeat/module/sonicwall @elastic/security-external-integrations diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ef4ecda8836..507de3b18d2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,16 +8,25 @@ Please label this PR with one of the following labels, depending on the scope of - Docs --> -## What does this PR do? +## Proposed commit message +Explain here the changes you made on the PR. -## Why is it important? +Please explain: - ## Checklist diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0238179f29c..994a24bfb49 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,7 +1,5 @@ --- version: 2 -# This section is segmented by the responsible GitHub teams in order -# to make it clear who is responsible for reviewing. updates: - package-ecosystem: gomod directory: / @@ -10,8 +8,8 @@ updates: labels: - automation - dependabot - - Team:Elastic-Agent-Data-Plane allow: + # Team:Elastic-Agent-Data-Plane - dependency-name: github.com/elastic/elastic-agent-autodiscover - dependency-name: github.com/elastic/elastic-agent-client/* - dependency-name: github.com/elastic/elastic-agent-libs @@ -29,36 +27,14 @@ updates: - dependency-name: go.elastic.co/apm/* - dependency-name: go.elastic.co/ecszap - dependency-name: go.elastic.co/go-licence-detector - reviewers: - - elastic/elastic-agent-data-plane - open-pull-requests-limit: 2 - - package-ecosystem: gomod - directory: / - schedule: - interval: daily - labels: - - automation - - dependabot - - Team:Security-External Integrations - allow: - # Skip github.com/elastic/mito because it requires documentation updates. + # Team:Service-Integrations + - dependency-name: github.com/elastic/bayeux + # Team:Security-External Integrations - dependency-name: github.com/elastic/go-libaudit/* - dependency-name: github.com/elastic/go-perf - dependency-name: github.com/elastic/go-seccomp-bpf - dependency-name: github.com/elastic/toutoumomoma - reviewers: - - elastic/security-external-integrations - open-pull-requests-limit: 2 - - package-ecosystem: gomod - directory: / - schedule: - interval: daily - labels: - - automation - - dependabot - - Team:Service-Integrations - allow: - - dependency-name: github.com/elastic/bayeux - reviewers: - - elastic/obs-infraobs-integrations + ignore: + # Skip github.com/elastic/mito because it requires documentation updates. + - dependency-name: github.com/elastic/mito open-pull-requests-limit: 2 diff --git a/.github/workflows/bump-golang.yml b/.github/workflows/bump-golang.yml index bac9c22f1c7..f0cdb0607f9 100644 --- a/.github/workflows/bump-golang.yml +++ b/.github/workflows/bump-golang.yml @@ -2,6 +2,7 @@ name: bump-golang on: + workflow_dispatch: schedule: - cron: "0 20 * * 6" diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml deleted file mode 100644 index 55c2d50fa3f..00000000000 --- a/.github/workflows/macos-build.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: macos-build -env: - GOPATH: /home/runner/work/beats/beats - REPO_PATH: src/beats - MACOS_GOPATH: /Users/runner/work/beats/beats - GITHUB_TOKEN: ${{ github.token }} -on: - workflow_dispatch: - inputs: - id: - description: 'Run ID' - required: true - runner: - description: 'Github actions runner' - required: false - default: 'macos-latest' - path: - description: 'Directory where to run command' - required: false - default: '' - pr: - description: 'Pull request id' - required: false - default: '' - go_version: - description: 'Go version' - required: false - default: '1.17' - command: - description: 'Command to run' - required: true - default: '' -jobs: - build: - runs-on: ${{ github.event.inputs.runner }} - steps: - - name: ${{ format('Run ID {0}', github.event.inputs.id) }} - run: echo Run ID ${{github.event.inputs.id}} - - name: Set environment for macos - if: ${{ contains(github.event.inputs.runner, 'macos') }} - run: | - echo Changed GOPATH to ${{ env.MACOS_GOPATH }} - echo "GOPATH="${{ env.MACOS_GOPATH }} >> $GITHUB_ENV - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: ${{ github.event.inputs.go_version }} - - name: Install dependencies - run: go install github.com/magefile/mage - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ env.GITHUB_REF }} - path: ${{ env.REPO_PATH }} - - name: Checkout and merge PR - if: ${{ github.event.inputs.pr }} - run: | - set -x - cd ${{ env.GOPATH }}/${{ env.REPO_PATH }} - git config --global user.email "user@example.com" - git config --global user.name "user" - git fetch origin pull/${{ github.event.inputs.pr }}/head:${{ github.event.inputs.id }} - git checkout ${{ github.event.inputs.id }} - git checkout $GITHUB_REF_NAME - git merge --no-ff ${{ github.event.inputs.id }} - - name: Run command - run: | - set -x - cd ${{ env.GOPATH }}/${{ env.REPO_PATH }}/${{ github.event.inputs.path }} - ${{ github.event.inputs.command }} diff --git a/.go-version b/.go-version index 88ebadf2c32..8909929f6e7 100644 --- a/.go-version +++ b/.go-version @@ -1 +1 @@ -1.19.10 +1.20.7 diff --git a/.golangci.yml b/.golangci.yml index 793f4a05866..834881d49d7 100755 --- a/.golangci.yml +++ b/.golangci.yml @@ -2,6 +2,9 @@ run: # timeout for analysis, e.g. 30s, 5m, default is 1m timeout: 15m + build-tags: + - synthetics + - integration issues: # Maximum count of issues with the same text. @@ -76,6 +79,7 @@ linters-settings: exclude-functions: - (github.com/elastic/elastic-agent-libs/mapstr.M).Delete # Only returns ErrKeyNotFound, can safely be ignored. - (github.com/elastic/elastic-agent-libs/mapstr.M).Put # Can only fail on type conversions, usually safe to ignore. + - (github.com/elastic/elastic-agent-libs/logp).TestingSetup # Cannot return a non-nil error using the provided API. errorlint: # Check whether fmt.Errorf uses the %w verb for formatting errors. See the readme for caveats @@ -109,7 +113,7 @@ linters-settings: gosimple: # Select the Go version to target. The default is '1.13'. - go: "1.19.10" + go: "1.20.7" nakedret: # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 @@ -127,19 +131,19 @@ linters-settings: staticcheck: # Select the Go version to target. The default is '1.13'. - go: "1.19.10" + go: "1.20.7" checks: ["all"] stylecheck: # Select the Go version to target. The default is '1.13'. - go: "1.19.10" + go: "1.20.7" # Disabled: # ST1005: error strings should not be capitalized checks: ["all", "-ST1005"] unused: # Select the Go version to target. The default is '1.13'. - go: "1.19.10" + go: "1.20.7" gosec: excludes: @@ -162,4 +166,3 @@ linters-settings: # Report pre-allocation suggestions on for loops. # Default: false for-loops: true - \ No newline at end of file diff --git a/.mergify.yml b/.mergify.yml index e0ce720375e..34d48d228d1 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -263,3 +263,16 @@ pull_request_rules: labels: - "backport" title: "[{{ destination_branch }}](backport #{{ number }}) {{ title }}" + - name: backport patches to 8.10 branch + conditions: + - merged + - label=backport-v8.10.0 + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "8.10" + labels: + - "backport" + title: "[{{ destination_branch }}](backport #{{ number }}) {{ title }}" diff --git a/CHANGELOG-developer.next.asciidoc b/CHANGELOG-developer.next.asciidoc index fc28efdbc5f..3b087d19a9d 100644 --- a/CHANGELOG-developer.next.asciidoc +++ b/CHANGELOG-developer.next.asciidoc @@ -65,6 +65,7 @@ The list below covers the major changes between 7.0.0-rc2 and main only. - The `queue.Batch` API now provides access to individual events instead of an array. {pull}31699[31699] - Rename `queue.Batch.ACK()` to `queue.Batch.Done()`. {pull}31903[31903] - `queue.ACKListener` has been removed. Queue configurations now accept an explicit callback function for ACK handling. {pull}35078[35078] +- Split split httpmon out of x-pack/filebeat/input/internal/httplog. {pull}36385[36385] ==== Bugfixes @@ -83,6 +84,8 @@ The list below covers the major changes between 7.0.0-rc2 and main only. - Fix the multiple host support for mongodb module {pull}34624[34624] - Skip HTTPJSON flakey test. {issue}34929[34929] {pull}35138[35138] - Fix ingest pipeline for panw module to parse url scheme correctly {pull}35757[35757] +- 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] ==== Added @@ -162,6 +165,9 @@ The list below covers the major changes between 7.0.0-rc2 and main only. - Add benchmarking to HTTPJSON input testing. {pull}35138[35138] - Allow non-AWS endpoints for testing Filebeat awss3 input. {issue}35496[35496] {pull}35520[35520] - Add AUTH (username) and SSL/TLS support for Redis module {pull}35240[35240] +- Pin PyYAML version to 5.3.1 to avoid CI errors temporarily {pull}36091[36091] +- Skip dependabot updates for github.com/elastic/mito. {pull}36158[36158] +- Add device handling to Okta API package for entity analytics. {pull}35980[35980] ==== Deprecated diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index f49c6480c14..f1adc06601a 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -3,6 +3,207 @@ :issue: https://github.com/elastic/beats/issues/ :pull: https://github.com/elastic/beats/pull/ +[[release-notes-8.9.2]] +=== Beats version 8.9.2 +https://github.com/elastic/beats/compare/v8.9.1\...v8.9.2[View commits] + +==== Bugfixes + +*Filebeat* + +- Fix panic when redact option is not provided to CEL input. {issue}36387[36387] {pull}36388[36388] +- Update mito CEL extension library to v1.5.0. {pull}36146[36146] + +==== Added + +*Metricbeat* + +- Add Azure resource tags support to Azure Billing module {pull}36428[36428] + + +[[release-notes-8.9.1]] +=== Beats version 8.9.1 +https://github.com/elastic/beats/compare/v8.9.0\...v8.9.1[View commits] + +==== Bugfixes + +*Auditbeat* + +- auditd: Expanded the bitmask applied to ECS file.mode so that the SUID, SGID, and sticky bits can be represented. {pull}36294[36294] + +*Filebeat* + +- Fix panic when SQS input metrics getter is invoked. {pull}36101[36101] {issue}36077[36077] +- Make CEL input's `now` global variable static for evaluation lifetime. {pull}36107[36107] +- Fix handling of TCP/UDP address resolution during metric initialization. {issue}35064[35064] {pull}36287[36287] +- Fix handling of Juniper SRX structured data when there is no leading Junos element. {issue}36270[36270] {pull}36308[36308] +- Remove erroneous error log in GCPPubSub input. {pull}36296[36296] +- Fix Filebeat Cisco module with missing escape character. {issue}36325[36325] {pull}36326[36326] + +*Heartbeat* + +- Enable heartbeat-wide publish timeout setting with run_once. {pull}35721[35721] +- Added default timezone UTC to heartbeat docker images to fix synthetics journeys navigation errors. {pull}36193[36193] + +*Packetbeat* + +- Fix handling of Npcap installation options from Fleet. {pull}35541[35541] {pull}35935[35935] + +*Winlogbeat* + +- Fix powershell details regexp to prevent excessive backtracking when processing command invocations. {pull}36178[36178] + +==== Added + +*Affecting all Beats* + +- Upgrade Go to 1.19.12 {pull}36246[36246] +- Add warning message to SysV init scripts for RPM-based systems that lack `/etc/rc.d/init.d/functions`. {issue}35708[35708] {pull}36188[36188] + +*Filebeat* + +- Add support for endpoint resolver in AWS config {pull}36208[36208] + + +[[release-notes-8.9.0]] +=== Beats version 8.9.0 +https://github.com/elastic/beats/compare/v8.8.2\...v8.9.0[View commits] + +==== Bugfixes + +*Affecting all Beats* + +- Do not print context cancelled error message when running under agent {pull}36006[36006] +- Fix recovering from invalid output configuration when running under Elastic-Agent {pull}36016[36016] + +*Filebeat* + +- Add support in s3 input for JSON with array of objects. {pull}35475[35475] +- RFC5424 syslog timestamps with offset 'Z' will be treated as UTC rather than using the default timezone. {pull}35360[35360] +- Fixed a minor code error in the GCS input scheduler where a config value was being used directly instead of the source struct. {pull}35729[35729] +- Fix CEL input JSON marshalling of nested objects. {issue}35763[35763] {pull}35774[35774] +- Fix metric collection in GCPPubSub input. {pull}35773[35773] +- Fix end point deregistration in http_endpoint input. {issue}35899[35899] {pull}35903[35903] +- Fix duplicate ID panic in filestream metrics. {issue}35964[35964] {pull}35972[35972] +- Improve error reporting and fix IPv6 handling of TCP and UDP metric collection. {pull}35996[35996] +- Fix handling of NUL-terminated log lines in Fortinet Firewall module. {issue}36026[36026] {pull}36027[36027] +- Make redact field configuration recommended in CEL input and log warning if missing. {pull}36008[36008] +- Fix handling of region name configuration in awss3 input {pull}36034[36034] + +*Heartbeat* + +- Update gval version. {pull}35636[35636] +- Filter dev flags for ui monitors inside synthetics_args. {pull}35788[35788] +- Fix temp dir running out of space with project monitors. {issue}35843[35843] + +*Metricbeat* + +- Fix no error logs displayed in CloudWatch EC2, RDS and SQS metadata {issue}34985[34985] {pull}35035[35035] +- Remove Beta warning from IIS application_pool metricset {pull}35480[35480] +- Improve documentation for ActiveMQ module {issue}35113[35113] {pull}35558[35558] +- Resolve statsd module's prematurely halting of metrics parsing upon encountering an invalid packet. {pull}35075[35075] + +*Packetbeat* + +- Fix double channel close panic when reloading. {pull}35324[35324] + +*Winlogbeat* + +- Prevent panic on closing iterators on empty channels in experimental API. {issue}33966[33966] {pull}35423[35423] + +==== Added + +*Affecting all Beats* + +- Add Hetzner Cloud as a provider for `add_cloud_metadata`. {pull}35456[35456] +- Upgrade version of elastic-agent-autodiscover to v0.6.1 for improved memory consumption on k8s. {pull}35483[35483] +- Added `orchestrator.cluster.id` and `orchestrator.cluster.name` fields to the add_cloud_metadata processor, AWS cloud provider. {pull}35182[35182] +- Lowercase reported hostnames per Elastic Common Schema (ECS) guidelines for the host.name field. Upgraded github.com/elastic/go-sysinfo to 1.11.0. {pull}35652[35652] + +*Filebeat* + +- Added support for decoding apache parquet files in awss3 input. {issue}34662[34662] {pull}35578[35578] +- Add support for CRC validation in Filebeat's HTTP endpoint input. {pull}35204[35204] +- Add support for CRC validation in Zoom module. {pull}35604[35604] +- Add execution budget to CEL input. {pull}35409[35409] +- Add XML decoding support to HTTPJSON. {issue}34438[34438] {pull}35235[35235] +- Add delegated account support when using Google ADC in `httpjson` input. {pull}35507[35507] +- Add metrics for filestream input. {pull}35529[35529] +- Add support for collecting `httpjson` metrics. {pull}35392[35392] +- Add XML decoding support to CEL. {issue}34438[34438] {pull}35372[35372] +- Mark CEL input as GA. {pull}35559[35559] +- Add metrics for gcp-pubsub input. {pull}35614[35614] +- Allow non-AWS endpoints for awss3 input. {issue}35496[35496] {pull}35520[35520] +- Add Okta input package for entity analytics. {pull}35611[35611] +- Expose harvester metrics from filestream input {pull}35835[35835] {issue}33771[33771] +- Add device support for Azure AD entity analytics. {pull}35807[35807] + +*Libbeat* +- Added support for Apache Parquet file reader. {issue}34662[34662] {pull}35183[35183] + +*Metricbeat* + +- Add GCP Redis metadata {pull}33701[33701] +- Migrate Azure Billing, Monitor, and Storage metricsets to the newer SDK. {pull}33585[33585] +- Add support for float64 values parsing for statsd metrics of counter type. {pull}35099[35099] + +*Packetbeat* + +- Added `packetbeat.interfaces.fanout_group` to allow a Packetbeat sniffer to join an AF_PACKET fanout group. {issue}35451[35451] {pull}35453[35453] + +*Winlogbeat* + +- Set `host.os.type` and `host.os.family` to "windows" if not already set. {pull}35435[35435] +- Handle empty DNS answer data in QueryResults for the Sysmon Pipeline {pull}35207[35207] + +[[release-notes-8.8.2]] +=== Beats version 8.8.2 +https://github.com/elastic/beats/compare/v8.8.1\...v8.8.2[View commits] + +==== Bugfixes + +*Affecting all Beats* + +- Make sure k8s watchers are closed when closing k8s meta processor. {pull}35630[35630] +- Upgraded Apache Arrow library used in `x-pack/libbeat/reader/parquet` from v11 to v12.0.1 in order to fix cross-compilation issues. {pull}35640[35640] +- Fix panic when the disk queue's MaxRetryInterval configuration is specified, but RetryInterval is not. {pull}35820[35820] + +*Filebeat* + +- Fix syslog message parsing for fortinet.firewall to take into account quoted values. {pull}35522[35522] +- [Filebeat GCS input] Fixed an issue where `bucket_timeout` was being applied to the entire bucket poll interval and not individual bucket object read operations. Fixed a map write concurrency issue arising from data races when using a high number of workers. Fixed the flaky tests that were present in the GCS test suit. {pull}35605[35605] +- Fix handling of IPv6 unspecified addresses in TCP input. {issue}35064[35064] {pull}35637[35637] +- Improve error reporting and fix IPv6 handling of TCP and UDP metric collection. {pull}35772[35772] +- Fix input reload on autodiscover. {issue}34388[34388] {pull}35645[35645] + +*Heartbeat* + +- Fix serialization of processors when running diagnostics. {pull}35698[35698] + +*Metricbeat* + +- Fix calculation of the `host.cpu.usage` metric for EC2. {pull}35717[35717] + +==== Added + +*Affecting all Beats* + +- Update Go version to 1.19.10. {pull}35751[35751] + +*Filebeat* + +- [GCS] Added scheduler debug logs and improved the context passing mechanism by removing them from struct params and passing them as function arguments. {pull}35674[35674] + +*Packetbeat* + +- Add AF_PACKET metrics. {issue}35428[35428] {pull}35489[35489] + +==== Deprecated + +*Heartbeat* + +- Removed support for `zip_url` and `local` browser sources. {pull}35429[35429] + [[release-notes-8.8.1]] === Beats version 8.8.1 https://github.com/elastic/beats/compare/v8.8.0\...v8.8.1[View commits] diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index bf79e0d2eed..403016faa0e 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -9,14 +9,13 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] ==== Breaking changes *Affecting all Beats* -- Update Go version to 1.19.10 {pull}35751[35751] - Fix status reporting to Elastic-Agent when output configuration is invalid running under Elastic-Agent {pull}35719[35719] +- Upgrade Go to 1.20.7 {pull}36241[36241] *Auditbeat* *Filebeat* -- Fix input reload on autodiscover {issue}34388[34388] {pull}35645[35645] *Heartbeat* @@ -34,6 +33,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] *Winlogbeat* - Add "event.category" and "event.type" to Sysmon module for EventIDs 8, 9, 19, 20, 27, 28, 255 {pull}35193[35193] +- Fix the ability to use filtering features (e.g. `ignore_older`, `event_id`, `provider`, `level`) while reading `.evtx` files. {issue}16826[16826] {pull}36173[36173] *Functionbeat* @@ -45,23 +45,9 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] *Affecting all Beats* - Support for multiline zookeeper logs {issue}2496[2496] -- Allow `clock_nanosleep` in the default seccomp profiles for amd64 and 386. Newer versions of glibc (e.g. 2.31) require it. {issue}33792[33792] -- Disable lockfile when running under elastic-agent. {pull}33988[33988] -- Fix lockfile logic, retry locking {pull}34194[34194] - Add checks to ensure reloading of units if the configuration actually changed. {pull}34346[34346] - Fix namespacing on self-monitoring {pull}32336[32336] -- Fix race condition when stopping runners {pull}32433[32433] -- Fix concurrent map writes when system/process code called from reporter code {pull}32491[32491] -- Log errors from the Elastic Agent V2 client errors channel. Avoids blocking when error occurs communicating with the Elastic Agent. {pull}34392[34392] -- Only log publish event messages in trace log level under elastic-agent. {pull}34391[34391] -- Fix issue where updating a single Elastic Agent configuration unit results in other units being turned off. {pull}34504[34504] -- Fix dropped events when monitor a beat under the agent and send its `Host info` log entry. {pull}34599[34599] - Fix namespacing on self-monitoring {pull}32336[32336] -- Fix race condition when stopping runners {pull}32433[32433] -- Fix concurrent map writes when system/process code called from reporter code {pull}32491[32491] -- Fix panics when a processor is closed twice {pull}34647[34647] -- Update elastic-agent-system-metrics to v0.4.6 to allow builds on mips platforms. {pull}34674[34674] -- The Elasticsearch output now splits large requests instead of dropping them when it receives a StatusRequestEntityTooLarge error. {pull}34911[34911] - Fix Beats started by agent do not respect the allow_older_versions: true configuration flag {issue}34227[34227] {pull}34964[34964] - Fix performance issues when we have a lot of inputs starting and stopping by allowing to disable global processors under fleet. {issue}35000[35000] {pull}35031[35031] - In cases where the matcher detects a non-string type in a match statement, report the error as a debug statement, and not a warning statement. {pull}35119[35119] @@ -70,65 +56,25 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - Make sure k8s watchers are closed when closing k8s meta processor. {pull}35630[35630] - Upgraded apache arrow library used in x-pack/libbeat/reader/parquet from v11 to v12.0.1 in order to fix cross-compilation issues {pull}35640[35640] - Fix panic when MaxRetryInterval is specified, but RetryInterval is not {pull}35820[35820] +- Do not print context cancelled error message when running under agent {pull}36006[36006] +- Fix recovering from invalid output configuration when running under Elastic-Agent {pull}36016[36016] +- Improve StreamBuf append to improve performance when reading long lines from files. {pull}35928[35928] +- Eliminate cloning of event in deepUpdate {pull}35945[35945] +- Fix ndjson parser to store JSON fields correctly under `target` {issue}29395[29395] +- Support build of projects outside of beats directory {pull}36126[36126] +- Fix environment capture by `add_process_metadata` processor. {issue}36469[36469] {pull}36471[36471] + *Auditbeat* + *Filebeat* -- [Auditbeat System Package] Added support for Apple Silicon chips. {pull}34433[34433] -- [Azure blob storage] Changed logger field name from `container` to `container_name` so that it does not clash - with the ecs field name `container`. {pull}34403[34403] -- [GCS] Added support for more mime types & introduced offset tracking via cursor state. Also added support for - automatic splitting at root level, if root level element is an array. {pull}34155[34155] -- [httpsjon] Improved error handling during pagination with chaining & split processor {pull}34127[34127] -- [Azure blob storage] Added support for more mime types & introduced offset tracking via cursor state. {pull}33981[33981] -- Fix EOF on single line not producing any event. {issue}30436[30436] {pull}33568[33568] -- Fix handling of error in states in direct aws-s3 listing input {issue}33513[33513] {pull}33722[33722] -- Fix `httpjson` input page number initialization and documentation. {pull}33400[33400] -- Add handling of AAA operations for Cisco ASA module. {issue}32257[32257] {pull}32789[32789] -- Fix gc.log always shipped even if gc fileset is disabled {issue}30995[30995] -- Fix handling of empty array in httpjson input. {pull}32001[32001] -- Fix reporting of `filebeat.events.active` in log events such that the current value is always reported instead of the difference from the last value. {pull}33597[33597] -- Fix splitting array of strings/arrays in httpjson input {issue}30345[30345] {pull}33609[33609] -- Fix Google workspace pagination and document ID generation. {pull}33666[33666] -- Fix PANW handling of messages with event.original already set. {issue}33829[33829] {pull}33830[33830] -- Rename identity as identity_name when the value is a string in Azure Platform Logs. {pull}33654[33654] -- Fix 'requires pointer' error while getting cursor metadata. {pull}33956[33956] -- Fix input cancellation handling when HTTP client does not support contexts. {issue}33962[33962] {pull}33968[33968] -- Update mito CEL extension library to v0.0.0-20221207004749-2f0f2875e464 {pull}33974[33974] -- Fix CEL result deserialisation when evaluation fails. {issue}33992[33992] {pull}33996[33996] -- Fix handling of non-200/non-429 status codes. {issue}33999[33999] {pull}34002[34002] -- [azure-eventhub input] Switch the run EPH run mode to non-blocking {pull}34075[34075] -- [google_workspace] Fix pagination and cursor value update. {pull}34274[34274] -- Fix handling of quoted values in auditd module. {issue}22587[22587] {pull}34069[34069] -- Fixing system tests not returning expected content encoding for azure blob storage input. {pull}34412[34412] -- [Azure Logs] Fix authentication_processing_details parsing in sign-in logs. {issue}34330[34330] {pull}34478[34478] -- Prevent Elasticsearch from spewing log warnings about redundant wildcard when setting up ingest pipelines. {issue}34249[34249] {pull}34550[34550] -- Gracefully handle Windows event channel not found errors in winlog input. {issue}30201[30201] {pull}34605[34605] -- Fix the issue of `cometd` input worker getting closed in case of a network connection issue and an EOF error. {issue}34326[34326] {pull}34327[34327] -- Fix for httpjson first_response object throwing false positive errors by making it a flag based object {issue}34747[34747] {pull}34748[34748] -- Fix errors and panics due to re-used processors {pull}34761[34761] -- Add missing Basic Authentication support to CEL input {issue}34609[34609] {pull}34689[34689] - [Gcs Input] - Added missing locks for safe concurrency {pull}34914[34914] - Fix the ignore_inactive option being ignored in Filebeat's filestream input {pull}34770[34770] - Fix TestMultiEventForEOFRetryHandlerInput unit test of CometD input {pull}34903[34903] - Add input instance id to request trace filename for httpjson and cel inputs {pull}35024[35024] -- Fix panic in TCP and UDP inputs on Linux when collecting socket metrics from OS. {issue}35064[35064] -- Correctly collect TCP and UDP metrics for unspecified address values. {pull}35111[35111] -- Fix base for UDP and TCP queue metrics and UDP drops metric. {pull}35123[35123] -- Sanitize filenames for request tracer in httpjson input. {pull}35143[35143] -- decode_cef processor: Fix ECS output by making `observer.ip` into an array of strings instead of string. {issue}35140[35140] {pull}35149[35149] -- Fix handling of MySQL audit logs with strict JSON parser. {issue}35158[35158] {pull}35160[35160] -- Sanitize filenames for request tracer in cel input. {pull}35154[35154] -- Fix accidental error overwrite in defer statement in entityanalytics Azure AD input. {issue}35153[35153] {pull}35169[35169] -- Fixing the grok expression outputs of log files {pull}35221[35221] - Fixes "Can only start an input when all related states are finished" error when running under Elastic-Agent {pull}35250[35250] {issue}33653[33653] -- Move repeated Windows event channel not found errors in winlog input to debug level. {issue}35314[35314] {pull}35317[35317] -- Fix crash when processing forwarded logs missing a message. {issue}34705[34705] {pull}34865[34865] -- Fix crash when loading azurewebstorage cursor with no partially processed data. {pull}35433[35433] -- Add support in s3 input for JSON with array of objects. {pull}35475[35475] -- RFC5424 syslog timestamps with offset 'Z' will be treated as UTC rather than using the default timezone. {pull}35360[35360] -- Fix syslog message parsing for fortinet.firewall to take into account quoted values. {pull}35522[35522] - [system] sync system/auth dataset with system integration 1.29.0. {pull}35581[35581] - [GCS Input] - Fixed an issue where bucket_timeout was being applied to the entire bucket poll interval and not individual bucket object read operations. Fixed a map write concurrency issue arising from data races when using a high number of workers. Fixed the flaky tests that were present in the GCS test suit. {pull}35605[35605] - Fix filestream false positive log error "filestream input with ID 'xyz' already exists" {issue}31767[31767] @@ -140,56 +86,27 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - Fix CEL input JSON marshalling of nested objects. {issue}35763[35763] {pull}35774[35774] - Fix metric collection in GCPPubSub input. {pull}35773[35773] - Fix end point deregistration in http_endpoint input. {issue}35899[35899] {pull}35903[35903] +- Fix duplicate ID panic in filestream metrics. {issue}35964[35964] {pull}35972[35972] +- Improve error reporting and fix IPv6 handling of TCP and UDP metric collection. {pull}35996[35996] +- Fix handling of NUL-terminated log lines in Fortinet Firewall module. {issue}36026[36026] {pull}36027[36027] +- Make redact field configuration recommended in CEL input and log warning if missing. {pull}36008[36008] +- Fix handling of region name configuration in awss3 input {pull}36034[36034] +- Fixed concurrency and flakey tests issue in azure blob storage input. {issue}35983[35983] {pull}36124[36124] +- Fix panic when sqs input metrics getter is invoked {pull}36101[36101] {issue}36077[36077] +- Make CEL input's `now` global variable static for evaluation lifetime. {pull}36107[36107] +- Update mito CEL extension library to v1.5.0. {pull}36146[36146] +- Filter out duplicate paths resolved from matching globs. {issue}36253[36253] {pull}36256[36256] +- Fix handling of TCP/UDP address resolution during metric initialization. {issue}35064[35064] {pull}36287[36287] +- Fix handling of Juniper SRX structured data when there is no leading junos element. {issue}36270[36270] {pull}36308[36308] +- Remove erroneous error log in GCPPubSub input. {pull}36296[36296] +- Fix Filebeat Cisco module with missing escape character {issue}36325[36325] {pull}36326[36326] +- Fix panic when redact option is not provided to CEL input. {issue}36387[36387] {pull}36388[36388] +- Remove 'onFilteredOut' and 'onDroppedOnPublish' callback logs {issue}36299[36299] {pull}36399[36399] +- Added a fix for Crowdstrike pipeline handling process arrays {pull}36496[36496] *Heartbeat* - Fix panics when parsing dereferencing invalid parsed url. {pull}34702[34702] -- Fix broken zip URL monitors. NOTE: Zip URL Monitors will be removed in version 8.7 and replaced with project monitors. {pull}33723[33723] -- Fix integration hashing to prevent reloading all when updated. {pull}34697[34697] -- Fix release of job limit semaphore when context is cancelled. {pull}34697[34697] -- Fix bug where states.duration_ms was incorrect type. {pull}33563[33563] -- Fix handling of long UDP messages in UDP input. {issue}33836[33836] {pull}33837[33837] -- Fix browser monitor summary reporting as up when monitor is down. {issue}33374[33374] {pull}33819[33819] -- Fix beat capabilities on Docker image. {pull}33584[33584] -- Fix serialization of state duration to avoid scientific notation. {pull}34280[34280] -- Enable nodejs engine strict validation when bundling synthetics. {pull}34470[34470] -with the ecs field name `container`. {pull}34403[34403] -automatic splitting at root level, if root level element is an array. {pull}34155[34155] -- Fix broken mapping for state.ends field. {pull}34891[34891] -- Fix issue using projects in airgapped environments by disabling npm audit. {pull}34936[34936] -- Fix broken state ID location naming. {pull}35336[35336] -- Fix project monitor temp directories permission to include group access. {pull}35398[35398] -- Fix output pipeline exit on run_once. {pull}35376[35376] -- Fix formatting issue with socket trace timeout. {pull}35434[35434] -- Update gval version. {pull}35636[35636] -- Fix serialization of processors when running diagnostics. {pull}35698[35698] -- Filter dev flags for ui monitors inside synthetics_args. {pull}35788[35788] -- Fix temp dir running out of space with project monitors. {issue}35843[35843] - -*Heartbeat* - - -*Heartbeat* - - -*Heartbeat* - - -*Auditbeat* - - -*Filebeat* - - -*Auditbeat* - - -*Filebeat* - -- Sanitize filenames for request tracer in cel input. {pull}35154[35154] - -*Heartbeat* - *Metricbeat* @@ -199,12 +116,6 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Add GCP CloudSQL region filter {pull}32943[32943] - Fix logstash cgroup mappings {pull}33131[33131] - Remove unused `elasticsearch.node_stats.indices.bulk.avg_time.bytes` mapping {pull}33263[33263] -- Fix kafka dashboard field names {pull}33555[33555] -- Add tags to events based on parsed identifier. {pull}33472[33472] -- Support Oracle-specific connection strings in SQL module {issue}32089[32089] {pull}32293[32293] -- Remove deprecated metrics from controller manager, scheduler and proxy {pull}34161[34161] -- Fix metrics split through different events and metadata not matching for aws cloudwatch. {pull}34483[34483] -- Fix metadata enricher with correct container ids for pods with multiple containers in container metricset. Align `kubernetes.container.id` and `container.id` fields for state_container metricset. {pull}34516[34516] - Make generic SQL GA {pull}34637[34637] - Collect missing remote_cluster in elasticsearch ccr metricset {pull}34957[34957] - Add context with timeout in AWS API calls {pull}35425[35425] @@ -213,30 +124,21 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Improve documentation for ActiveMQ module {issue}35113[35113] {pull}35558[35558] - Fix EC2 host.cpu.usage {pull}35717[35717] - Resolve statsd module's prematurely halting of metrics parsing upon encountering an invalid packet. {pull}35075[35075] +- Fix the gap in fetching forecast API metrics at the end of each month for Azure billing module {pull}36142[36142] +- Add option in SQL module to execute queries for all dbs. {pull}35688[35688] +- Fix GCP compute metadata. {pull}36338[36338] +- Add support for api_key authentication in elasticsearch module {pull}36274[36274] +- Add remaining dimensions for azure storage account to make them available for tsdb enablement. {pull}36331[36331] +- Add missing 'TransactionType' dimension for Azure Storage Account. {pull}36413[36413] *Osquerybeat* -- Adds the `elastic_file_analysis` table to the Osquery extension for macOS builds. {pull}35056[35056] *Packetbeat* -- Fix double channel close panic when reloading. {pull}35324[35324] -- Fix BPF filter setting not being applied to sniffers. {issue}35363[35363] {pull}35484[35484] -- Fix handling of Npcap installation options from Fleet. {pull}35541[35541] *Winlogbeat* -- Fix handling of event data with keys containing dots. {issue}34345[34345] {pull}34549[34549] -- Gracefully handle channel not found errors. {issue}30201[30201] {pull}34605[34605] -- Clarify query term limits warning and remove link to missing Microsoft doc page. {pull}34715[34715] -- Improve documentation for event_logs.name configuration. {pull}34931[34931] -- Move repeated channel not found errors to debug level. {issue}35314[35314] {pull}35317[35317] -- Fix panic due to misrepresented buffer use. {pull}35437[35437] -- Prevent panic on closing iterators on empty channels in experimental API. {issue}33966[33966] {pull}35423[35423] -- Allow program termination when attempting to open an absent channel. {pull}35474[35474] - -*Functionbeat* - *Elastic Logging Plugin* @@ -246,15 +148,15 @@ automatic splitting at root level, if root level element is an array. {pull}3415 *Affecting all Beats* - Added append Processor which will append concrete values or values from a field to target. {issue}29934[29934] {pull}33364[33364] -- Allow users to enable features via configuration, starting with the FQDN reporting feature. {issue}1070[1070] {pull}34456[34456] -- Add Hetzner Cloud as a provider for `add_cloud_metadata`. {pull}35456[35456] -- Reload Beat when TLS certificates or key files are modified. {issue}34408[34408] {pull}34416[34416] -- Upgrade version of elastic-agent-autodiscover to v0.6.1 for improved memory consumption on k8s. {pull}35483[35483] -- Added `orchestrator.cluster.id` and `orchestrator.cluster.name` fields to the add_cloud_metadata processor, AWS cloud provider. {pull}35182[35182] -- Lowercase reported hostnames per Elastic Common Schema (ECS) guidelines for the host.name field. Upgraded github.com/elastic/go-sysinfo to 1.11.0. {pull}35652[35652] +- When running under Elastic-Agent the status is now reported per Unit instead of the whole Beat {issue}35874[35874] {pull}36183[36183] +- Add warning message to SysV init scripts for RPM-based systems that lack `/etc/rc.d/init.d/functions`. {issue}35708[35708] {pull}36188[36188] +- Mark `translate_sid` processor is GA. {issue}36279[36279] {pull}36280[36280] +- dns processor: Add support for forward lookups (`A`, `AAAA`, and `TXT`). {issue}11416[11416] {pull}36394[36394] +- Mark `syslog` processor as GA, improve docs about how processor handles syslog messages. {issue}36416[36416] {pull}36417[36417] *Auditbeat* +- Add support for `security.selinux` and `system.posix_acl_access` extended attributes to FIM. {issue}36265[36265] {pull}36310[36310] *Filebeat* @@ -263,53 +165,13 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Add cloudflare R2 to provider list in AWS S3 input. {pull}32620[32620] - Add support for single string containing multiple relation-types in getRFC5988Link. {pull}32811[32811] - Added separation of transform context object inside httpjson. Introduced new clause `.parent_last_response.*` {pull}33499[33499] -- Cloud Foundry input uses server-side filtering when retrieving logs. {pull}33456[33456] -- Add `parse_aws_vpc_flow_log` processor. {pull}33656[33656] -- Update `aws.vpcflow` dataset in AWS module have a configurable log `format` and to produce ECS 8.x fields. {pull}33699[33699] -- Modified `aws-s3` input to reduce mutex contention when multiple SQS message are being processed concurrently. {pull}33658[33658] -- Disable "event normalization" processing for the aws-s3 input to reduce allocations. {pull}33673[33673] -- Add Common Expression Language input. {pull}31233[31233] -- Add support for http+unix and http+npipe schemes in httpjson input. {issue}33571[33571] {pull}33610[33610] -- Add support for http+unix and http+npipe schemes in cel input. {issue}33571[33571] {pull}33712[33712] -- Add `decode_duration`, `move_fields` processors. {pull}31301[31301] -- Add backup to bucket and delete functionality for the `aws-s3` input. {issue}30696[30696] {pull}33559[33559] -- Add metrics for UDP packet processing. {pull}33870[33870] -- Convert UDP input to v2 input. {pull}33930[33930] -- Improve collection of risk information from Okta debug data. {issue}33677[33677] {pull}34030[34030] - Adding filename details from zip to response for httpjson {issue}33952[33952] {pull}34044[34044] -- Allow user configuration of keep-alive behaviour for HTTPJSON and CEL inputs. {issue}33951[33951] {pull}34014[34014] -- Add support for polling system UDP stats for UDP input metrics. {pull}34070[34070] -- Add support for recognizing the log level in Elasticsearch JVM logs {pull}34159[34159] -- Add new Entity Analytics input with Azure Active Directory support. {pull}34305[34305] -- Added metric `sqs_lag_time` for aws-s3 input. {pull}34306[34306] -- Add metrics for TCP packet processing. {pull}34333[34333] -- Add metrics for unix socket packet processing. {pull}34335[34335] -- Add beta `take over` mode for `filestream` for simple migration from `log` inputs {pull}34292[34292] -- Add pagination support for Salesforce module. {issue}34057[34057] {pull}34065[34065] -- Allow users to redact sensitive data from CEL input debug logs. {pull}34302[34302] -- Added support for HTTP destination override to Google Cloud Storage input. {pull}34413[34413] - Added metric `sqs_messages_waiting_gauge` for aws-s3 input. {pull}34488[34488] -- Add support for new Rabbitmq timestamp format for logs {pull}34211[34211] -- Allow user configuration of timezone offset in Cisco ASA and FTD modules. {pull}34436[34436] -- Allow user configuration of timezone offset in Checkpoint module. {pull}34472[34472] -- Add support for Okta debug attributes, `risk_reasons`, `risk_behaviors` and `factor`. {issue}33677[33677] {pull}34508[34508] -- Fill okta.request.ip_chain.* as a flattened object in Okta module. {pull}34621[34621] -- Fixed GCS log format issues. {pull}34659[34659] - Add nginx.ingress_controller.upstream.ip to related.ip {issue}34645[34645] {pull}34672[34672] -- Include NAT and firewall IPs in `related.ip` in Fortinet Firewall module. {issue}34640[34640] {pull}34673[34673] -- Add Basic Authentication support on constructed requests to CEL input {issue}34609[34609] {pull}34689[34689] -- Add string manipulation extensions to CEL input {issue}34610[34610] {pull}34689[34689] - Add unix socket log parsing for nginx ingress_controller {pull}34732[34732] - Added metric `sqs_worker_utilization` for aws-s3 input. {pull}34793[34793] -- Improve CEL input documentation {pull}34831[34831] -- Add metrics documentation for CEL and AWS CloudWatch inputs. {issue}34887[34887] {pull}34889[34889] -- Register MIME handlers for CSV types in CEL input. {pull}34934[34934] - Add MySQL authentication message parsing and `related.ip` and `related.user` fields {pull}34810[34810] -- Mention `mito` CEL tool in CEL input docs. {pull}34959[34959] - Add nginx ingress_controller parsing if one of upstreams fails to return response {pull}34787[34787] -- Allow neflow v9 and ipfix templates to be shared between source addresses. {pull}35036[35036] -- Add support for collecting IPv6 metrics. {pull}35123[35123] -- Added support for decoding apache parquet files in awss3 input. {issue}34662[34662] {pull}35578[35578] - Add oracle authentication messages parsing {pull}35127[35127] - Add sanitization capabilities to azure-eventhub input {pull}34874[34874] - Add support for CRC validation in Filebeat's HTTP endpoint input. {pull}35204[35204] @@ -317,6 +179,7 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Add execution budget to CEL input. {pull}35409[35409] - Add XML decoding support to HTTPJSON. {issue}34438[34438] {pull}35235[35235] - Add delegated account support when using Google ADC in `httpjson` input. {pull}35507[35507] +- Allow specifying since when to read journald entries. {pull}35408[35408] - Add metrics for filestream input. {pull}35529[35529] - Add support for collecting `httpjson` metrics. {pull}35392[35392] - Add XML decoding support to CEL. {issue}34438[34438] {pull}35372[35372] @@ -324,34 +187,45 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Add metrics for gcp-pubsub input. {pull}35614[35614] - [GCS] Added scheduler debug logs and improved the context passing mechanism by removing them from struct params and passing them as function arguments. {pull}35674[35674] - Allow non-AWS endpoints for awss3 input. {issue}35496[35496] {pull}35520[35520] +- Under elastic-agent the input metrics will now be included in agent diagnostics dumps. {pull}35798[35798] - Add Okta input package for entity analytics. {pull}35611[35611] - Expose harvester metrics from filestream input {pull}35835[35835] {issue}33771[33771] - Add device support for Azure AD entity analytics. {pull}35807[35807] +- Improve CEL input performance. {pull}35915[35915] +- Adding filename details from zip to response for httpjson {issue}33952[33952] {pull}34044[34044] +- Added support for min/max template functions in httpjson input. {issue}36094[36094] {pull}36036[36036] +- Add `clean_session` configuration setting for MQTT input. {pull}35806[16204] +- Add fingerprint mode for the filestream scanner and new file identity based on it {issue}34419[34419] {pull}35734[35734] +- Add file system metadata to events ingested via filestream {issue}35801[35801] {pull}36065[36065] +- Add support for localstack based input integration testing {pull}35727[35727] +- Allow parsing bytes in and bytes out as long integer in CEF processor. {issue}36100[36100] {pull}36108[36108] +- Add support for registered owners and users to AzureAD entity analytics provider. {pull}36092[36092] +- Add support for endpoint resolver in AWS config {pull}36208[36208] +- Added support for Okta OAuth2 provider in the httpjson input. {pull}36273[36273] +- Add support of the interval parameter in Salesforce setupaudittrail-rest fileset. {issue}35917[35917] {pull}35938[35938] +- Add device handling to Okta input package for entity analytics. {pull}36049[36049] +- Add setup option `--force-enable-module-filesets`, that will act as if all filesets have been enabled in a module during setup. {issue}30915[30915] {pull}99999[99999] +- Add setup option `--force-enable-module-filesets`, that will act as if all filesets have been enabled in a module during setup. {issue}30915[30915] {pull}36286[36286] +- [Azure] Add input metrics to the azure-eventhub input. {pull}35739[35739] +- Reduce HTTPJSON metrics allocations. {pull}36282[36282] +- Add support for a simplified input configuraton when running under Elastic-Agent {pull}36390[36390] +- Make HTTPJSON response body decoding errors more informative. {pull}36481[36481] +- Allow fine-grained control of entity analytics API requests for Okta provider. {issue}36440[36440] {pull}36492[36492] +- Add support for expanding `journald.process.capabilities` into the human-readable effective capabilities in the ECS `process.thread.capabilities.effective` field. {issue}36454[36454] {pull}36470[36470] *Auditbeat* - - Migration of system/package module storage from gob encoding to flatbuffer encoding in bolt db. {pull}34817[34817] *Libbeat* -- Added support for apache parquet file reader. {issue}34662[34662] {pull}35183[35183] *Heartbeat* -- Users can now configure max scheduler job limits per monitor type via env var. {pull}34307[34307] - Added status to monitor run log report. -- Removed beta label for browser monitors. {pull}35424[35424]. *Metricbeat* - Add per-thread metrics to system_summary {pull}33614[33614] - Add GCP CloudSQL metadata {pull}33066[33066] -- Add GCP Redis metadata {pull}33701[33701] -- Remove GCP Compute metadata cache {pull}33655[33655] - Add support for multiple regions in GCP {pull}32964[32964] -- Add GCP Redis regions support {pull}33728[33728] -- Add namespace metadata to all namespaced kubernetes resources. {pull}33763[33763] -- Changed cloudwatch module to call ListMetrics API only once per region, instead of per AWS namespace {pull}34055[34055] -- Add beta ingest_pipeline metricset to Elasticsearch module for ingest pipeline monitoring {pull}34012[34012] -- Handle duplicated TYPE line for prometheus metrics {issue}18813[18813] {pull}33865[33865] - Add GCP Carbon Footprint metricbeat data {pull}34820[34820] - Add event loop utilization metric to Kibana module {pull}35020[35020] - Support collecting metrics from both the monitoring account and linked accounts from AWS CloudWatch. {pull}35540[35540] @@ -359,6 +233,9 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Migrate Azure Billing, Monitor, and Storage metricsets to the newer SDK. {pull}33585[33585] - Add support for float64 values parsing for statsd metrics of counter type. {pull}35099[35099] - [Enhanncement for host.ip and host.mac] Disabling netinfo.enabled option of add-host-metadata processor {pull}36506[36506] +- Add kubernetes.deployment.status.* fields for Kubernetes module {pull}35999[35999] +- Add Azure resource tags support to Azure Billing module {pull}36428[36428] + *Osquerybeat* @@ -367,6 +244,11 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Added `packetbeat.interfaces.fanout_group` to allow a Packetbeat sniffer to join an AF_PACKET fanout group. {issue}35451[35451] {pull}35453[35453] - Add AF_PACKET metrics. {issue}35428[35428] {pull}35489[35489] +- Under elastic-agent the input metrics will now be included in agent diagnostics dumps. {pull}35798[35798] +- Add support for multiple regions in GCP {pull}32964[32964] + +*Packetbeat* + *Winlogbeat* @@ -378,6 +260,7 @@ automatic splitting at root level, if root level element is an array. {pull}3415 - Set `host.os.type` and `host.os.family` to "windows" if not already set. {pull}35435[35435] - Handle empty DNS answer data in QueryResults for the Sysmon Pipeline {pull}35207[35207] +- Under elastic-agent the input metrics will now be included in agent diagnostics dumps. {pull}35798[35798] *Elastic Log Driver* @@ -394,7 +277,8 @@ automatic splitting at root level, if root level element is an array. {pull}3415 *Heartbeat* -- Removed zip_url and local browser sources. {pull}35429[35429] +- Deprecate aws_elb autodiscover provider. {pull}36191[36191] + *Metricbeat* @@ -415,3 +299,12 @@ automatic splitting at root level, if root level element is an array. {pull}3415 ==== Known Issues + + + + + + + + + diff --git a/Jenkinsfile b/Jenkinsfile index d9192e1e1ad..32276ca72f5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,8 +24,8 @@ pipeline { SNAPSHOT = 'true' TERRAFORM_VERSION = "1.0.2" XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' - KIND_VERSION = 'v0.17.0' - K8S_VERSION = 'v1.26.0' + KIND_VERSION = 'v0.20.0' + K8S_VERSION = 'v1.27.3' } options { timeout(time: 6, unit: 'HOURS') @@ -309,7 +309,7 @@ def cloud(Map args = [:]) { withCloudTestEnv(args) { startCloudTestEnv(name: args.directory, dirs: args.dirs, withAWS: args.withAWS) try { - targetWithoutNode(context: args.context, command: args.command, directory: args.directory, label: args.label, withModule: args.withModule, isMage: true, id: args.id) + targetWithoutNode(dirs: args.dirs, context: args.context, command: args.command, directory: args.directory, label: args.label, withModule: args.withModule, isMage: true, id: args.id) } finally { terraformCleanup(name: args.directory, dir: args.directory, withAWS: args.withAWS) } @@ -353,7 +353,7 @@ def withTools(Map args = [:], Closure body) { body() } } else if (args.get('nodejs', false)) { - withNodeJSEnv() { + withNodeJSEnv(version: '18.17.1') { withEnv(["ELASTIC_SYNTHETICS_CAPABLE=true"]) { cmd(label: "Install @elastic/synthetics", script: "npm i -g @elastic/synthetics") body() @@ -578,6 +578,7 @@ def target(Map args = [:]) { * - mage then the dir(location) is required, aka by enabling isMage: true. */ def targetWithoutNode(Map args = [:]) { + def dirs = args.get('dirs',[]) def command = args.command def context = args.context def directory = args.get('directory', '') @@ -590,9 +591,22 @@ def targetWithoutNode(Map args = [:]) { def enableRetry = args.get('enableRetry', false) def withGCP = args.get('withGCP', false) def withNodejs = args.get('withNodejs', false) + String name = normalise(args.directory) withGithubNotify(context: "${context}") { withBeatsEnv(archive: true, withModule: withModule, directory: directory, id: args.id) { dumpVariables() + // unstash terraform outputs in the same directory where the files were stashed + dirs?.each { folder -> + dir("${folder}") { + try { + unstash("terraform-${name}") + //unstash does not print verbose output , hence printing contents of the directory for logging purposes + sh "ls -la ${pwd()}" + } catch (error) { + echo "error unstashing: ${error}" + } + } + } withTools(k8s: installK8s, gcp: withGCP, nodejs: withNodejs) { // make commands use -C while mage commands require the dir(folder) // let's support this scenario with the location variable. @@ -604,7 +618,7 @@ def targetWithoutNode(Map args = [:]) { cmd(label: "${args.id?.trim() ? args.id : env.STAGE_NAME} - ${command}", script: "${command}") } } else { - cmd(label: "${args.id?.trim() ? args.id : env.STAGE_NAME} - ${command}", script: "${command}") + cmd(label: "${args.id?.trim() ? args.id : env.STAGE_NAME} - ${command}", script: "${command}") } } } @@ -920,6 +934,8 @@ def startCloudTestEnv(Map args = [:]) { stage("${name}-prepare-cloud-env"){ withBeatsEnv(archive: false, withModule: false) { try { + // Run the docker services to setup the emulated cloud environment + sh(label: 'Run docker-compose services for emulated cloud env', script: ".ci/scripts/install-docker-services.sh ", returnStatus: true) dirs?.each { folder -> retryWithSleep(retries: 2, seconds: 5, backoff: true){ terraformApply(folder) @@ -930,12 +946,19 @@ def startCloudTestEnv(Map args = [:]) { // If it failed then cleanup without failing the build sh(label: 'Terraform Cleanup', script: ".ci/scripts/terraform-cleanup.sh ${folder}", returnStatus: true) } + // Cleanup the docker services + sh(label: 'Docker Compose Cleanup', script: ".ci/scripts/docker-services-cleanup.sh", returnStatus: true) + error('startCloudTestEnv: terraform apply failed.') } finally { - // Archive terraform states in case manual cleanup is needed. - archiveArtifacts(allowEmptyArchive: true, artifacts: '**/terraform.tfstate') + dirs?.each { folder -> + // Archive terraform states in case manual cleanup is needed. + archiveArtifacts(allowEmptyArchive: true, artifacts: '**/terraform.tfstate') + dir("${folder}") { + stash(name: "terraform-${name}", allowEmpty: true, includes: '**/terraform.tfstate,**/.terraform/**,outputs*.yml') + } + } } - stash(name: "terraform-${name}", allowEmpty: true, includes: '**/terraform.tfstate,**/.terraform/**') } } } @@ -960,6 +983,7 @@ def terraformApply(String directory) { * Tear down the terraform environments, by looking for all terraform states in directory * then it runs terraform destroy for each one. * It uses terraform states previously stashed by startCloudTestEnv. +* This also tears down any associated docker services */ def terraformCleanup(Map args = [:]) { String name = normalise(args.name) @@ -970,6 +994,8 @@ def terraformCleanup(Map args = [:]) { retryWithSleep(retries: 2, seconds: 5, backoff: true) { sh(label: "Terraform Cleanup", script: ".ci/scripts/terraform-cleanup.sh ${directory}") } + // Cleanup associated docker services + sh(label: 'Docker Compose Cleanup', script: ".ci/scripts/docker-services-cleanup.sh") } } } diff --git a/NOTICE.txt b/NOTICE.txt index 969942b5464..5f075e426e1 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -11,11 +11,11 @@ Third party libraries used by the Elastic Beats project: -------------------------------------------------------------------------------- Dependency : cloud.google.com/go -Version: v0.105.0 +Version: v0.107.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/cloud.google.com/go@v0.105.0/LICENSE: +Contents of probable licence file $GOMODCACHE/cloud.google.com/go@v0.107.0/LICENSE: Apache License @@ -435,11 +435,11 @@ Contents of probable licence file $GOMODCACHE/cloud.google.com/go/bigquery@v1.44 -------------------------------------------------------------------------------- Dependency : cloud.google.com/go/compute -Version: v1.14.0 +Version: v1.15.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/cloud.google.com/go/compute@v1.14.0/LICENSE: +Contents of probable licence file $GOMODCACHE/cloud.google.com/go/compute@v1.15.1/LICENSE: Apache License @@ -1924,11 +1924,11 @@ SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/Azure/azure-sdk-for-go/sdk/storage/azblob -Version: v0.4.1 +Version: v1.0.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/!azure/azure-sdk-for-go/sdk/storage/azblob@v0.4.1/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/!azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0/LICENSE.txt: MIT License @@ -5237,11 +5237,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2@v1.18 -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/config -Version: v1.15.12 +Version: v1.17.7 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/config@v1.15.12/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/config@v1.17.7/LICENSE.txt: Apache License @@ -5449,11 +5449,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/confi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/credentials -Version: v1.12.7 +Version: v1.12.20 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/credentials@v1.12.7/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/credentials@v1.12.20/LICENSE.txt: Apache License @@ -5661,11 +5661,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/crede -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/feature/ec2/imds -Version: v1.12.7 +Version: v1.12.17 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/feature/ec2/imds@v1.12.7/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/feature/ec2/imds@v1.12.17/LICENSE.txt: Apache License @@ -5873,11 +5873,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/featu -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/feature/s3/manager -Version: v1.11.17 +Version: v1.11.33 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/feature/s3/manager@v1.11.17/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/feature/s3/manager@v1.11.33/LICENSE.txt: Apache License @@ -8417,11 +8417,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/s3 -Version: v1.26.12 +Version: v1.27.11 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/s3@v1.26.12/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/s3@v1.27.11/LICENSE.txt: Apache License @@ -8841,11 +8841,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/sts -Version: v1.16.8 +Version: v1.16.19 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/sts@v1.16.8/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/sts@v1.16.19/LICENSE.txt: Apache License @@ -9555,11 +9555,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/cespare/xxhash/v2 -Version: v2.1.2 +Version: v2.2.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/cespare/xxhash/v2@v2.1.2/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/cespare/xxhash/v2@v2.2.0/LICENSE.txt: Copyright (c) 2016 Caleb Spare @@ -12479,11 +12479,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-a -------------------------------------------------------------------------------- Dependency : github.com/elastic/elastic-agent-client/v7 -Version: v7.1.2 +Version: v7.3.0 Licence type (autodetected): Elastic -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-client/v7@v7.1.2/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-client/v7@v7.3.0/LICENSE.txt: ELASTIC LICENSE AGREEMENT @@ -12712,11 +12712,11 @@ SOFTWARE -------------------------------------------------------------------------------- Dependency : github.com/elastic/elastic-agent-libs -Version: v0.3.9 +Version: v0.3.13 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-libs@v0.3.9/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-libs@v0.3.13/LICENSE: Apache License Version 2.0, January 2004 @@ -13448,11 +13448,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-concert@v0.2 -------------------------------------------------------------------------------- Dependency : github.com/elastic/go-elasticsearch/v8 -Version: v8.8.1 +Version: v8.9.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-elasticsearch/v8@v8.8.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-elasticsearch/v8@v8.9.0/LICENSE: Apache License Version 2.0, January 2004 @@ -13659,11 +13659,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-elasticsearc -------------------------------------------------------------------------------- Dependency : github.com/elastic/go-libaudit/v2 -Version: v2.3.2 +Version: v2.3.3 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-libaudit/v2@v2.3.2/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-libaudit/v2@v2.3.3/LICENSE.txt: Apache License @@ -14966,11 +14966,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-structform@v -------------------------------------------------------------------------------- Dependency : github.com/elastic/go-sysinfo -Version: v1.11.0 +Version: v1.11.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-sysinfo@v1.11.0/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-sysinfo@v1.11.1/LICENSE.txt: Apache License @@ -15600,11 +15600,11 @@ limitations under the License. -------------------------------------------------------------------------------- Dependency : github.com/elastic/mito -Version: v1.4.0 +Version: v1.5.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/mito@v1.4.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/mito@v1.5.0/LICENSE: Apache License @@ -17038,11 +17038,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/gofrs/uuid -Version: v4.2.0+incompatible +Version: v4.4.0+incompatible Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/gofrs/uuid@v4.2.0+incompatible/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/gofrs/uuid@v4.4.0+incompatible/LICENSE: Copyright (C) 2013-2018 by Maxim Bublis @@ -20379,6 +20379,38 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +Dependency : github.com/lestrrat-go/jwx/v2 +Version: v2.0.11 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/jwx/v2@v2.0.11/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015 lestrrat + +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/lib/pq Version: v1.10.3 @@ -20399,11 +20431,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI -------------------------------------------------------------------------------- Dependency : github.com/magefile/mage -Version: v1.14.0 +Version: v1.15.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/magefile/mage@v1.14.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/magefile/mage@v1.15.0/LICENSE: Apache License Version 2.0, January 2004 @@ -21151,13 +21183,44 @@ The above copyright notice and this permission notice shall be included in all c 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/otiai10/copy +Version: v1.12.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/copy@v1.12.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2018 otiai10 + +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/pierrec/lz4/v4 -Version: v4.1.15 +Version: v4.1.16 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4/v4@v4.1.15/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4/v4@v4.1.16/LICENSE: Copyright (c) 2015, Pierre Curto All rights reserved. @@ -21238,6 +21301,41 @@ 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/pkg/xattr +Version: v0.4.9 +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/pkg/xattr@v0.4.9/LICENSE: + +Copyright (c) 2012 Dave Cheney. All rights reserved. +Copyright (c) 2014 Kuba Podgórski. 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/pmezard/go-difflib Version: v1.0.0 @@ -22265,11 +22363,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/spf13/cobra -Version: v1.3.0 +Version: v1.7.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/spf13/cobra@v1.3.0/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/spf13/cobra@v1.7.0/LICENSE.txt: Apache License Version 2.0, January 2004 @@ -22487,11 +22585,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/stretchr/testify -Version: v1.8.2 +Version: v1.8.4 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/stretchr/testify@v1.8.2/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/stretchr/testify@v1.8.4/LICENSE: MIT License @@ -23195,11 +23293,11 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg/scram@v1.0.3/LICENS -------------------------------------------------------------------------------- Dependency : go.elastic.co/apm/module/apmelasticsearch/v2 -Version: v2.0.0 +Version: v2.4.4 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmelasticsearch/v2@v2.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmelasticsearch/v2@v2.4.4/LICENSE: Apache License Version 2.0, January 2004 @@ -23406,11 +23504,11 @@ Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmelasti -------------------------------------------------------------------------------- Dependency : go.elastic.co/apm/module/apmhttp/v2 -Version: v2.0.0 +Version: v2.4.4 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmhttp/v2@v2.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmhttp/v2@v2.4.4/LICENSE: Apache License Version 2.0, January 2004 @@ -23617,11 +23715,11 @@ Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/module/apmhttp/v -------------------------------------------------------------------------------- Dependency : go.elastic.co/apm/v2 -Version: v2.0.0 +Version: v2.4.4 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/v2@v2.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/go.elastic.co/apm/v2@v2.4.4/LICENSE: Apache License Version 2.0, January 2004 @@ -24579,11 +24677,11 @@ THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : golang.org/x/crypto -Version: v0.6.0 +Version: v0.12.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/crypto@v0.6.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/crypto@v0.12.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -24690,11 +24788,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/net -Version: v0.9.0 +Version: v0.10.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/net@v0.9.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/net@v0.10.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -24801,11 +24899,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/sys -Version: v0.7.0 +Version: v0.11.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.7.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.11.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -24838,11 +24936,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/text -Version: v0.9.0 +Version: v0.12.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/text@v0.9.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/text@v0.12.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -24986,11 +25084,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : google.golang.org/genproto -Version: v0.0.0-20221207170731-23e4bf6bdc37 +Version: v0.0.0-20230110181048-76db0878b65f Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/google.golang.org/genproto@v0.0.0-20221207170731-23e4bf6bdc37/LICENSE: +Contents of probable licence file $GOMODCACHE/google.golang.org/genproto@v0.0.0-20230110181048-76db0878b65f/LICENSE: Apache License @@ -25198,11 +25296,11 @@ Contents of probable licence file $GOMODCACHE/google.golang.org/genproto@v0.0.0- -------------------------------------------------------------------------------- Dependency : google.golang.org/grpc -Version: v1.51.0 +Version: v1.53.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/google.golang.org/grpc@v1.51.0/LICENSE: +Contents of probable licence file $GOMODCACHE/google.golang.org/grpc@v1.53.0/LICENSE: Apache License @@ -25410,11 +25508,11 @@ Contents of probable licence file $GOMODCACHE/google.golang.org/grpc@v1.51.0/LIC -------------------------------------------------------------------------------- Dependency : google.golang.org/protobuf -Version: v1.28.1 +Version: v1.29.1 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/google.golang.org/protobuf@v1.28.1/LICENSE: +Contents of probable licence file $GOMODCACHE/google.golang.org/protobuf@v1.29.1/LICENSE: Copyright (c) 2018 The Go Authors. All rights reserved. @@ -27319,11 +27417,11 @@ THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : cloud.google.com/go/compute/metadata -Version: v0.2.1 +Version: v0.2.3 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/cloud.google.com/go/compute/metadata@v0.2.1/LICENSE: +Contents of probable licence file $GOMODCACHE/cloud.google.com/go/compute/metadata@v0.2.3/LICENSE: Apache License @@ -31612,11 +31710,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go@v1.38.60 -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream -Version: v1.4.3 +Version: v1.4.8 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream@v1.4.3/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream@v1.4.8/LICENSE.txt: Apache License @@ -32248,11 +32346,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/inter -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/internal/ini -Version: v1.3.14 +Version: v1.3.24 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/internal/ini@v1.3.14/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/internal/ini@v1.3.24/LICENSE.txt: Apache License @@ -32460,11 +32558,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/inter -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/internal/v4a -Version: v1.0.4 +Version: v1.0.14 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/internal/v4a@v1.0.4/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/internal/v4a@v1.0.14/LICENSE.txt: Apache License @@ -32672,11 +32770,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/inter -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding -Version: v1.9.3 +Version: v1.9.9 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding@v1.9.3/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding@v1.9.9/LICENSE.txt: Apache License @@ -32884,11 +32982,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/internal/checksum -Version: v1.1.8 +Version: v1.1.18 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/checksum@v1.1.8/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/checksum@v1.1.18/LICENSE.txt: Apache License @@ -33096,11 +33194,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -Version: v1.9.7 +Version: v1.9.17 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url@v1.9.7/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url@v1.9.17/LICENSE.txt: Apache License @@ -33308,11 +33406,11 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/internal/s3shared -Version: v1.13.7 +Version: v1.13.17 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/s3shared@v1.13.7/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/internal/s3shared@v1.13.17/LICENSE.txt: Apache License @@ -33520,11 +33618,223 @@ Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/servi -------------------------------------------------------------------------------- Dependency : github.com/aws/aws-sdk-go-v2/service/sso -Version: v1.11.10 +Version: v1.11.23 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/sso@v1.11.23/LICENSE.txt: + + + 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/aws/aws-sdk-go-v2/service/ssooidc +Version: v1.13.5 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/sso@v1.11.10/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/aws/aws-sdk-go-v2/service/ssooidc@v1.13.5/LICENSE.txt: Apache License @@ -33999,6 +34309,33 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +Dependency : github.com/decred/dcrd/dcrec/secp256k1/v4 +Version: v4.2.0 +Licence type (autodetected): ISC +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/decred/dcrd/dcrec/secp256k1/v4@v4.2.0/LICENSE: + +ISC License + +Copyright (c) 2013-2017 The btcsuite developers +Copyright (c) 2015-2020 The Decred developers +Copyright (c) 2017 The Lightning Network Developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/devigned/tab Version: v0.1.2-0.20190607222403-0c15cf42f9a2 @@ -35774,11 +36111,11 @@ Copyright (c) 2016 Felix Geisendörfer (felix@debuggable.com) -------------------------------------------------------------------------------- Dependency : github.com/form3tech-oss/jwt-go -Version: v3.2.3+incompatible +Version: v3.2.5+incompatible Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/form3tech-oss/jwt-go@v3.2.3+incompatible/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/form3tech-oss/jwt-go@v3.2.5+incompatible/LICENSE: Copyright (c) 2012 Dave Grijalva @@ -36261,11 +36598,11 @@ SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/goccy/go-json -Version: v0.9.11 +Version: v0.10.2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/goccy/go-json@v0.9.11/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/goccy/go-json@v0.10.2/LICENSE: MIT License @@ -39683,11 +40020,11 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice -------------------------------------------------------------------------------- Dependency : github.com/hashicorp/go-hclog -Version: v1.0.0 +Version: v0.12.2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/hashicorp/go-hclog@v1.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/hashicorp/go-hclog@v0.12.2/LICENSE: MIT License @@ -40862,11 +41199,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : github.com/inconshreveable/mousetrap -Version: v1.0.1 +Version: v1.1.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetrap@v1.0.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetrap@v1.1.0/LICENSE: Apache License Version 2.0, January 2004 @@ -41071,217 +41408,6 @@ Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetr limitations under the License. --------------------------------------------------------------------------------- -Dependency : github.com/jcchavezs/porto -Version: v0.1.0 -Licence type (autodetected): Apache-2.0 --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/jcchavezs/porto@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/jcmturner/aescts/v2 Version: v2.0.0 @@ -43318,6 +43444,161 @@ Contents of probable licence file $GOMODCACHE/github.com/kylelemons/godebug@v1.1 limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/lestrrat-go/blackmagic +Version: v1.0.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/blackmagic@v1.0.1/LICENSE: + +MIT License + +Copyright (c) 2021 lestrrat-go + +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/lestrrat-go/httpcc +Version: v1.0.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/httpcc@v1.0.1/LICENSE: + +MIT License + +Copyright (c) 2020 lestrrat-go + +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/lestrrat-go/httprc +Version: v1.0.4 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/httprc@v1.0.4/LICENSE: + +MIT License + +Copyright (c) 2022 lestrrat + +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/lestrrat-go/iter +Version: v1.0.2 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/iter@v1.0.2/LICENSE: + +MIT License + +Copyright (c) 2020 lestrrat-go + +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/lestrrat-go/option +Version: v1.0.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/lestrrat-go/option@v1.0.1/LICENSE: + +MIT License + +Copyright (c) 2021 lestrrat-go + +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/lufia/plan9stats Version: v0.0.0-20211012122336-39d0f177ccd0 @@ -43520,11 +43801,11 @@ SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/mattn/go-sqlite3 -Version: v1.14.6 +Version: v1.14.14 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/mattn/go-sqlite3@v1.14.6/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/mattn/go-sqlite3@v1.14.14/LICENSE: The MIT License (MIT) @@ -45628,11 +45909,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/onsi/gomega -Version: v1.10.1 +Version: v1.10.3 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/onsi/gomega@v1.10.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/onsi/gomega@v1.10.3/LICENSE: Copyright (c) 2013-2014 Onsi Fakhouri @@ -46059,6 +46340,23 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/image-sp limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/otiai10/mint +Version: v1.5.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/mint@v1.5.1/LICENSE: + +Copyright 2017 otiai10 (Hiromu OCHIAI) + +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/oxtoacart/bpool Version: v0.0.0-20150712133111-4e1c5567d7c2 @@ -47136,40 +47434,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/santhosh-tekuri/jsonschema -Version: v1.2.4 -Licence type (autodetected): BSD-3-Clause +Dependency : github.com/segmentio/asm +Version: v1.2.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/santhosh-tekuri/jsonschema@v1.2.4/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/segmentio/asm@v1.2.0/LICENSE: -Copyright (c) 2017 Santhosh Kumar Tekuri. All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Copyright (c) 2021 Segment - * 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. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +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. -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/sergi/go-diff @@ -48014,11 +48307,11 @@ Contents of probable licence file $GOMODCACHE/github.com/urso/diag@v0.0.0-202002 -------------------------------------------------------------------------------- Dependency : github.com/vishvananda/netlink -Version: v1.1.0 +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.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/vishvananda/netlink@v1.1.1-0.20201029203352-d40f9887b852/LICENSE: Apache License @@ -49158,11 +49451,11 @@ Contents of probable licence file $GOMODCACHE/github.com/xdg/stringprep@v1.0.3/L -------------------------------------------------------------------------------- Dependency : github.com/youmark/pkcs8 -Version: v0.0.0-20181117223130-1be2e3e5546d +Version: v0.0.0-20201027041543-1326539a0a0a Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/youmark/pkcs8@v0.0.0-20181117223130-1be2e3e5546d/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/youmark/pkcs8@v0.0.0-20201027041543-1326539a0a0a/LICENSE: The MIT License (MIT) @@ -49727,11 +50020,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/term -Version: v0.7.0 +Version: v0.11.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/term@v0.7.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/term@v0.11.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. diff --git a/Vagrantfile b/Vagrantfile index 39084118f33..47bc686d74f 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -132,4 +132,48 @@ Vagrant.configure("2") do |config| end end + config.vm.define "beats" do |nodeconfig| + nodeconfig.vm.box = "ubuntu/jammy64" + + # We deliberately set a fully-qualified domain name for the VM; it helps + # test the FQDN feature flag. + nodeconfig.vm.hostname = "beats-dev.elastic.dev.internal" + + nodeconfig.vm.network "private_network", + hostname: true, + ip: "192.168.56.44" # only 192.168.56.0/21 range allowed: https://www.virtualbox.org/manual/ch06.html#network_hostonly + nodeconfig.vm.network "forwarded_port", + guest: 4244, + host: 4244, + id: "delve" + + nodeconfig.vm.provider "virtualbox" do |vb| + # Display the VirtualBox GUI when booting the machine + vb.gui = false + vb.customize ["modifyvm", :id, "--vram", "128"] + # Customize the amount of memory on the VM: + vb.memory = "4096" + end + + nodeconfig.vm.provision "shell", inline: <<-SHELL + apt-get update + apt-get install -y \ + build-essential \ + curl \ + delve \ + make \ + unzip + vim \ + wget + curl -sL -o /tmp/go#{GO_VERSION}.linux-amd64.tar.gz https://go.dev/dl/go#{GO_VERSION}.linux-amd64.tar.gz + tar -C /usr/local -xzf /tmp/go#{GO_VERSION}.linux-amd64.tar.gz + curl -sL -o /tmp/mage_1.15.0_Linux-64bit.tar.gz https://github.com/magefile/mage/releases/download/v1.15.0/mage_1.15.0_Linux-64bit.tar.gz + tar -C /tmp -xf /tmp/mage_1.15.0_Linux-64bit.tar.gz + mv /tmp/mage /usr/local/bin/mage + echo "alias ll='ls -la'" > /etc/profile.d/ll.sh + echo 'export PATH=$PATH:/usr/local/go/bin' > /etc/profile.d/go.sh + echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> /etc/profile.d/go.sh + SHELL + end + end diff --git a/auditbeat/Dockerfile b/auditbeat/Dockerfile index d410055f8d5..97199e89a0e 100644 --- a/auditbeat/Dockerfile +++ b/auditbeat/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 RUN \ apt-get update \ @@ -11,7 +11,7 @@ RUN \ && rm -rf /var/lib/apt/lists/* # Use a virtualenv to avoid the PEP668 "externally managed environment" error caused by conflicts -# with the system Python installation. golang:1.19.10 uses Debian 12 which now enforces PEP668. +# with the system Python installation. golang:1.20.6 uses Debian 12 which now enforces PEP668. ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" diff --git a/auditbeat/docs/troubleshooting.asciidoc b/auditbeat/docs/troubleshooting.asciidoc index cd5906710f8..19eb279272b 100644 --- a/auditbeat/docs/troubleshooting.asciidoc +++ b/auditbeat/docs/troubleshooting.asciidoc @@ -8,6 +8,7 @@ following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -26,5 +27,15 @@ include::{libbeat-dir}/getting-help.asciidoc[] include::{libbeat-dir}/debugging.asciidoc[] +//sets block macro for metrics-in-logs.asciidoc included in next section +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] diff --git a/auditbeat/module/file_integrity/event.go b/auditbeat/module/file_integrity/event.go index 67615efd4a9..a86130d3ec8 100644 --- a/auditbeat/module/file_integrity/event.go +++ b/auditbeat/module/file_integrity/event.go @@ -23,12 +23,14 @@ import ( "crypto/sha1" "crypto/sha256" "crypto/sha512" + "encoding/binary" "encoding/hex" "fmt" "hash" "io" "math" "os" + "os/user" "path/filepath" "runtime" "strconv" @@ -127,20 +129,22 @@ type Event struct { // Metadata contains file metadata. type Metadata struct { - Inode uint64 `json:"inode"` - UID uint32 `json:"uid"` - GID uint32 `json:"gid"` - SID string `json:"sid"` - Owner string `json:"owner"` - Group string `json:"group"` - Size uint64 `json:"size"` - MTime time.Time `json:"mtime"` // Last modification time. - CTime time.Time `json:"ctime"` // Last metadata change time. - Type Type `json:"type"` // File type (dir, file, symlink). - Mode os.FileMode `json:"mode"` // Permissions - SetUID bool `json:"setuid"` // setuid bit (POSIX only) - SetGID bool `json:"setgid"` // setgid bit (POSIX only) - Origin []string `json:"origin"` // External origin info for the file (MacOS only) + Inode uint64 `json:"inode"` + UID uint32 `json:"uid"` + GID uint32 `json:"gid"` + SID string `json:"sid"` + Owner string `json:"owner"` + Group string `json:"group"` + Size uint64 `json:"size"` + MTime time.Time `json:"mtime"` // Last modification time. + CTime time.Time `json:"ctime"` // Last metadata change time. + Type Type `json:"type"` // File type (dir, file, symlink). + Mode os.FileMode `json:"mode"` // Permissions + SetUID bool `json:"setuid"` // setuid bit (POSIX only) + SetGID bool `json:"setgid"` // setgid bit (POSIX only) + Origin []string `json:"origin"` // External origin info for the file (MacOS only) + SELinux string `json:"selinux"` // security.selinux xattr value (Linux only) + POSIXACLAccess []byte `json:"posix_acl_access"` // system.posix_acl_access xattr value (Linux only) } // NewEventFromFileInfo creates a new Event based on data from a os.FileInfo @@ -319,6 +323,15 @@ func buildMetricbeatEvent(e *Event, existedBefore bool) mb.Event { if len(info.Origin) > 0 { file["origin"] = info.Origin } + if info.SELinux != "" { + file["selinux"] = info.SELinux + } + if len(info.POSIXACLAccess) != 0 { + a, err := aclText(info.POSIXACLAccess) + if err == nil { + file["posix_acl_access"] = a + } + } } if len(e.Hashes) > 0 { @@ -332,14 +345,14 @@ func buildMetricbeatEvent(e *Event, existedBefore bool) mb.Event { file[k] = v } - out.MetricSetFields.Put("event.kind", "event") //nolint:errcheck // Will not error. - out.MetricSetFields.Put("event.category", []string{"file"}) //nolint:errcheck // Will not error. + out.MetricSetFields.Put("event.kind", "event") + out.MetricSetFields.Put("event.category", []string{"file"}) if e.Action > 0 { actions := e.Action.InOrder(existedBefore, e.Info != nil) - out.MetricSetFields.Put("event.type", actions.ECSTypes()) //nolint:errcheck // Will not error. - out.MetricSetFields.Put("event.action", actions.StringArray()) //nolint:errcheck // Will not error. + out.MetricSetFields.Put("event.type", actions.ECSTypes()) + out.MetricSetFields.Put("event.action", actions.StringArray()) } else { - out.MetricSetFields.Put("event.type", None.ECSTypes()) //nolint:errcheck // Will not error. + out.MetricSetFields.Put("event.type", None.ECSTypes()) } if n := len(e.errors); n > 0 { @@ -348,14 +361,82 @@ func buildMetricbeatEvent(e *Event, existedBefore bool) mb.Event { errors[idx] = err.Error() } if n == 1 { - out.MetricSetFields.Put("error.message", errors[0]) //nolint:errcheck // Will not error. + out.MetricSetFields.Put("error.message", errors[0]) } else { - out.MetricSetFields.Put("error.message", errors) //nolint:errcheck // Will not error. + out.MetricSetFields.Put("error.message", errors) } } return out } +func aclText(b []byte) ([]string, error) { + if (len(b)-4)%8 != 0 { + return nil, fmt.Errorf("unexpected ACL length: %d", len(b)) + } + b = b[4:] // The first four bytes is the version, discard it. + a := make([]string, 0, len(b)/8) + for len(b) != 0 { + tag := binary.LittleEndian.Uint16(b) + perm := binary.LittleEndian.Uint16(b[2:]) + qual := binary.LittleEndian.Uint32(b[4:]) + a = append(a, fmt.Sprintf("%s:%s:%s", tags[tag], qualString(qual, tag), modeString(perm))) + b = b[8:] + } + return a, nil +} + +var tags = map[uint16]string{ + 0x00: "undefined", + 0x01: "user", + 0x02: "user", + 0x04: "group", + 0x08: "group", + 0x10: "mask", + 0x20: "other", +} + +func qualString(qual uint32, tag uint16) string { + if qual == math.MaxUint32 { + // 0xffffffff is undefined ID, so return zero. + return "" + } + const ( + tagUser = 0x02 + tagGroup = 0x08 + ) + id := strconv.Itoa(int(qual)) + switch tag { + case tagUser: + u, err := user.LookupId(id) + if err == nil { + return u.Username + } + case tagGroup: + g, err := user.LookupGroupId(id) + if err == nil { + return g.Name + } + } + // Fallback to the numeric ID if we can't get a name + // or the tag is other than user/group. + return id +} + +func modeString(perm uint16) string { + var buf [3]byte + w := 0 + const rwx = "rwx" + for i, c := range rwx { + if perm&(1< 0 { + schema.MetadataAddSelinux(b, selinuxOffset) + } + if aclAccessOffset > 0 { + schema.MetadataAddPosixAclAccess(b, aclAccessOffset) + } return schema.MetadataEnd(b) } @@ -245,17 +256,26 @@ func fbDecodeMetadata(e *schema.Event) *Metadata { return nil } mode := os.FileMode(info.Mode()) + var posixACLAccess []byte + if n := info.PosixAclAccessLength(); n != 0 { + posixACLAccess = make([]byte, n) + for i := range posixACLAccess { + posixACLAccess[i] = byte(info.PosixAclAccess(i)) + } + } rtn := &Metadata{ - Inode: info.Inode(), - UID: info.Uid(), - GID: info.Gid(), - SID: string(info.Sid()), - Mode: mode & ^(os.ModeSetuid | os.ModeSetgid), - Size: info.Size(), - MTime: time.Unix(0, info.MtimeNs()).UTC(), - CTime: time.Unix(0, info.CtimeNs()).UTC(), - SetUID: mode&os.ModeSetuid != 0, - SetGID: mode&os.ModeSetgid != 0, + Inode: info.Inode(), + UID: info.Uid(), + GID: info.Gid(), + SID: string(info.Sid()), + Mode: mode & ^(os.ModeSetuid | os.ModeSetgid), + Size: info.Size(), + MTime: time.Unix(0, info.MtimeNs()).UTC(), + CTime: time.Unix(0, info.CtimeNs()).UTC(), + SetUID: mode&os.ModeSetuid != 0, + SetGID: mode&os.ModeSetgid != 0, + SELinux: string(info.Selinux()), + POSIXACLAccess: posixACLAccess, } switch info.Type() { diff --git a/auditbeat/module/file_integrity/schema.fbs b/auditbeat/module/file_integrity/schema.fbs index b22efd5e5ae..9e0863f6379 100644 --- a/auditbeat/module/file_integrity/schema.fbs +++ b/auditbeat/module/file_integrity/schema.fbs @@ -31,6 +31,8 @@ table Metadata { mtime_ns:long; ctime_ns:long; type:Type = 1; + selinux:string; + posix_acl_access:[byte]; } table Hash { diff --git a/auditbeat/module/file_integrity/schema/Metadata.go b/auditbeat/module/file_integrity/schema/Metadata.go index a9f08378913..cda0ae5d660 100644 --- a/auditbeat/module/file_integrity/schema/Metadata.go +++ b/auditbeat/module/file_integrity/schema/Metadata.go @@ -154,8 +154,42 @@ func (rcv *Metadata) MutateType(n Type) bool { return rcv._tab.MutateByteSlot(20, byte(n)) } +func (rcv *Metadata) Selinux() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(22)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + +func (rcv *Metadata) PosixAclAccess(j int) int8 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(24)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.GetInt8(a + flatbuffers.UOffsetT(j*1)) + } + return 0 +} + +func (rcv *Metadata) PosixAclAccessLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(24)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + +func (rcv *Metadata) MutatePosixAclAccess(j int, n int8) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(24)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateInt8(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func MetadataStart(builder *flatbuffers.Builder) { - builder.StartObject(9) + builder.StartObject(11) } func MetadataAddInode(builder *flatbuffers.Builder, inode uint64) { builder.PrependUint64Slot(0, inode, 0) @@ -184,6 +218,15 @@ func MetadataAddCtimeNs(builder *flatbuffers.Builder, ctimeNs int64) { func MetadataAddType(builder *flatbuffers.Builder, type_ Type) { builder.PrependByteSlot(8, byte(type_), 1) } +func MetadataAddSelinux(builder *flatbuffers.Builder, selinux flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(9, flatbuffers.UOffsetT(selinux), 0) +} +func MetadataAddPosixAclAccess(builder *flatbuffers.Builder, posixAclAccess flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(10, flatbuffers.UOffsetT(posixAclAccess), 0) +} +func MetadataStartPosixAclAccessVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(1, numElems, 1) +} func MetadataEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() } diff --git a/deploy/kubernetes/Jenkinsfile.yml b/deploy/kubernetes/Jenkinsfile.yml index be6180af2d6..abe96b66556 100644 --- a/deploy/kubernetes/Jenkinsfile.yml +++ b/deploy/kubernetes/Jenkinsfile.yml @@ -18,5 +18,5 @@ stages: make check-no-changes; stage: checks k8sTest: - k8sTest: "v1.26.0,v1.25.0,v1.24.3,v1.23.6" + k8sTest: "v1.27.3,v1.26.6,v1.25.11" stage: mandatory diff --git a/deploy/kubernetes/auditbeat-kubernetes.yaml b/deploy/kubernetes/auditbeat-kubernetes.yaml index c7d5beb201e..064d50114b8 100644 --- a/deploy/kubernetes/auditbeat-kubernetes.yaml +++ b/deploy/kubernetes/auditbeat-kubernetes.yaml @@ -205,7 +205,7 @@ spec: dnsPolicy: ClusterFirstWithHostNet containers: - name: auditbeat - image: docker.elastic.co/beats/auditbeat:8.9.0 + image: docker.elastic.co/beats/auditbeat:8.11.0 args: [ "-c", "/etc/auditbeat.yml", "-e", diff --git a/deploy/kubernetes/filebeat-kubernetes.yaml b/deploy/kubernetes/filebeat-kubernetes.yaml index a3a6c88dd18..d1f8fd975e0 100644 --- a/deploy/kubernetes/filebeat-kubernetes.yaml +++ b/deploy/kubernetes/filebeat-kubernetes.yaml @@ -167,7 +167,7 @@ spec: dnsPolicy: ClusterFirstWithHostNet containers: - name: filebeat - image: docker.elastic.co/beats/filebeat:8.9.0 + image: docker.elastic.co/beats/filebeat:8.11.0 args: [ "-c", "/etc/filebeat.yml", "-e", diff --git a/deploy/kubernetes/heartbeat-kubernetes.yaml b/deploy/kubernetes/heartbeat-kubernetes.yaml index 4fef98d60e8..75260fadf70 100644 --- a/deploy/kubernetes/heartbeat-kubernetes.yaml +++ b/deploy/kubernetes/heartbeat-kubernetes.yaml @@ -171,7 +171,7 @@ spec: dnsPolicy: ClusterFirstWithHostNet containers: - name: heartbeat - image: docker.elastic.co/beats/heartbeat:8.9.0 + image: docker.elastic.co/beats/heartbeat:8.11.0 args: [ "-c", "/etc/heartbeat.yml", "-e", diff --git a/deploy/kubernetes/metricbeat-kubernetes.yaml b/deploy/kubernetes/metricbeat-kubernetes.yaml index 128ce0454ee..acece92b8d6 100644 --- a/deploy/kubernetes/metricbeat-kubernetes.yaml +++ b/deploy/kubernetes/metricbeat-kubernetes.yaml @@ -290,7 +290,7 @@ spec: dnsPolicy: ClusterFirstWithHostNet containers: - name: metricbeat - image: docker.elastic.co/beats/metricbeat:8.9.0 + image: docker.elastic.co/beats/metricbeat:8.11.0 args: [ "-c", "/etc/metricbeat.yml", "-e", diff --git a/dev-tools/kubernetes/filebeat/Dockerfile.debug b/dev-tools/kubernetes/filebeat/Dockerfile.debug index 96458cbffbe..5184138de53 100644 --- a/dev-tools/kubernetes/filebeat/Dockerfile.debug +++ b/dev-tools/kubernetes/filebeat/Dockerfile.debug @@ -1,4 +1,4 @@ -FROM golang:1.19.10 as builder +FROM golang:1.20.7 as builder ENV PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/go/bin:/usr/local/go/bin diff --git a/dev-tools/kubernetes/heartbeat/Dockerfile.debug b/dev-tools/kubernetes/heartbeat/Dockerfile.debug index bacfa95ca35..16defa414fd 100644 --- a/dev-tools/kubernetes/heartbeat/Dockerfile.debug +++ b/dev-tools/kubernetes/heartbeat/Dockerfile.debug @@ -1,4 +1,4 @@ -FROM golang:1.19.10 as builder +FROM golang:1.20.7 as builder ENV PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/go/bin:/usr/local/go/bin diff --git a/dev-tools/kubernetes/metricbeat/Dockerfile.debug b/dev-tools/kubernetes/metricbeat/Dockerfile.debug index da68b4fb5d1..24c588d0f24 100644 --- a/dev-tools/kubernetes/metricbeat/Dockerfile.debug +++ b/dev-tools/kubernetes/metricbeat/Dockerfile.debug @@ -1,4 +1,4 @@ -FROM golang:1.19.10 as builder +FROM golang:1.20.7 as builder ENV PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/go/bin:/usr/local/go/bin diff --git a/dev-tools/mage/build.go b/dev-tools/mage/build.go index 0673c486328..263299671fd 100644 --- a/dev-tools/mage/build.go +++ b/dev-tools/mage/build.go @@ -139,6 +139,18 @@ func GolangCrossBuild(params BuildArgs) error { return err } + // Support projects outside of the beats directory. + repoInfo, err := GetProjectRepoInfo() + if err != nil { + return err + } + + // TODO: Support custom build dir/subdir + projectMountPoint := filepath.ToSlash(filepath.Join("/go", "src", repoInfo.CanonicalRootImportPath)) + if err := sh.Run("git", "config", "--global", "--add", "safe.directory", projectMountPoint); err != nil { + return err + } + return Build(params) } diff --git a/dev-tools/mage/common.go b/dev-tools/mage/common.go index 0647a13a59a..1c1ca25d95b 100644 --- a/dev-tools/mage/common.go +++ b/dev-tools/mage/common.go @@ -29,6 +29,7 @@ import ( "debug/elf" "encoding/hex" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -50,7 +51,6 @@ import ( "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" "github.com/magefile/mage/target" - "github.com/pkg/errors" ) // Expand expands the given Go text/template string. @@ -91,17 +91,17 @@ func expandTemplate(name, tmpl string, funcs template.FuncMap, args ...map[strin t, err := t.Parse(tmpl) if err != nil { if name == "inline" { - return "", errors.Wrapf(err, "failed to parse template '%v'", tmpl) + return "", fmt.Errorf("failed to parse template '%v': %w", tmpl, err) } - return "", errors.Wrap(err, "failed to parse template") + return "", fmt.Errorf("failed to parse template: %w", err) } buf := new(bytes.Buffer) if err := t.Execute(buf, joinMaps(args...)); err != nil { if name == "inline" { - return "", errors.Wrapf(err, "failed to expand template '%v'", tmpl) + return "", fmt.Errorf("failed to expand template '%v': %w", tmpl, err) } - return "", errors.Wrap(err, "failed to expand template") + return "", fmt.Errorf("failed to expand template: %w", err) } return buf.String(), nil @@ -127,7 +127,7 @@ func joinMaps(args ...map[string]interface{}) map[string]interface{} { func expandFile(src, dst string, args ...map[string]interface{}) error { tmplData, err := ioutil.ReadFile(src) if err != nil { - return errors.Wrapf(err, "failed reading from template %v", src) + return fmt.Errorf("failed reading from template %v: %w", src, err) } output, err := expandTemplate(src, string(tmplData), FuncMap, args...) @@ -141,7 +141,7 @@ func expandFile(src, dst string, args ...map[string]interface{}) error { } if err = ioutil.WriteFile(createDir(dst), []byte(output), 0644); err != nil { - return errors.Wrap(err, "failed to write rendered template") + return fmt.Errorf("failed to write rendered template: %w", err) } return nil @@ -151,7 +151,7 @@ func expandFile(src, dst string, args ...map[string]interface{}) error { func CWD(elem ...string) string { wd, err := os.Getwd() if err != nil { - panic(errors.Wrap(err, "failed to get the CWD")) + panic(fmt.Errorf("failed to get the CWD: %w", err)) } return filepath.Join(append([]string{wd}, elem...)...) } @@ -188,7 +188,7 @@ func (info *DockerInfo) IsBoot2Docker() bool { // HaveDocker returns an error if docker is unavailable. func HaveDocker() error { if _, err := GetDockerInfo(); err != nil { - return errors.Wrap(err, "docker is not available") + return fmt.Errorf("docker is not available: %w", err) } return nil } @@ -274,7 +274,7 @@ func FindReplace(file string, re *regexp.Regexp, repl string) error { // MustFindReplace invokes FindReplace and panics if an error occurs. func MustFindReplace(file string, re *regexp.Regexp, repl string) { if err := FindReplace(file, re, repl); err != nil { - panic(errors.Wrap(err, "failed to find and replace")) + panic(fmt.Errorf("failed to find and replace: %w", err)) } } @@ -285,23 +285,23 @@ func DownloadFile(url, destinationDir string) (string, error) { resp, err := http.Get(url) if err != nil { - return "", errors.Wrap(err, "http get failed") + return "", fmt.Errorf("http get failed: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return "", errors.Errorf("download failed with http status: %v", resp.StatusCode) + return "", fmt.Errorf("download failed with http status: %v", resp.StatusCode) } name := filepath.Join(destinationDir, filepath.Base(url)) f, err := os.Create(createDir(name)) if err != nil { - return "", errors.Wrap(err, "failed to create output file") + return "", fmt.Errorf("failed to create output file: %w", err) } defer f.Close() if _, err = io.Copy(f, resp.Body); err != nil { - return "", errors.Wrap(err, "failed to write file") + return "", fmt.Errorf("failed to write file: %w", err) } return name, f.Close() @@ -316,7 +316,7 @@ func Extract(sourceFile, destinationDir string) error { case ext == ".zip": return unzip(sourceFile, destinationDir) default: - return errors.Errorf("failed to extract %v, unhandled file extension", sourceFile) + return fmt.Errorf("failed to extract %v, unhandled file extension", sourceFile) } } @@ -340,7 +340,7 @@ func unzip(sourceFile, destinationDir string) error { path := filepath.Join(destinationDir, f.Name) if !strings.HasPrefix(path, destinationDir) { - return errors.Errorf("illegal file path in zip: %v", f.Name) + return fmt.Errorf("illegal file path in zip: %v", f.Name) } if f.FileInfo().IsDir() { @@ -485,7 +485,7 @@ func untar(sourceFile, destinationDir string) error { path := filepath.Join(destinationDir, header.Name) if !strings.HasPrefix(path, destinationDir) { - return errors.Errorf("illegal file path in tar: %v", header.Name) + return fmt.Errorf("illegal file path in tar: %v", header.Name) } switch header.Typeflag { @@ -511,7 +511,7 @@ func untar(sourceFile, destinationDir string) error { return err } default: - return errors.Errorf("unable to untar type=%c in file=%s", header.Typeflag, path) + return fmt.Errorf("unable to untar type=%c in file=%s", header.Typeflag, path) } } @@ -613,7 +613,7 @@ func ParallelCtx(ctx context.Context, fns ...interface{}) { wg.Wait() if len(errs) > 0 { - panic(errors.Errorf(strings.Join(errs, "\n"))) + panic(fmt.Errorf(strings.Join(errs, "\n"))) } } @@ -652,7 +652,7 @@ func FindFiles(globs ...string) ([]string, error) { for _, glob := range globs { files, err := filepath.Glob(glob) if err != nil { - return nil, errors.Wrapf(err, "failed on glob %v", glob) + return nil, fmt.Errorf("failed on glob %v: %w", glob, err) } configFiles = append(configFiles, files...) } @@ -691,7 +691,7 @@ func FindFilesRecursive(match func(path string, info os.FileInfo) bool) ([]strin func FileConcat(out string, perm os.FileMode, files ...string) error { f, err := os.OpenFile(createDir(out), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, perm) if err != nil { - return errors.Wrap(err, "failed to create file") + return fmt.Errorf("failed to create file: %w", err) } defer f.Close() @@ -735,20 +735,20 @@ func MustFileConcat(out string, perm os.FileMode, files ...string) { func VerifySHA256(file string, hash string) error { f, err := os.Open(file) if err != nil { - return errors.Wrap(err, "failed to open file for sha256 verification") + return fmt.Errorf("failed to open file for sha256 verification: %w", err) } defer f.Close() sum := sha256.New() if _, err := io.Copy(sum, f); err != nil { - return errors.Wrap(err, "failed reading from input file") + return fmt.Errorf("failed reading from input file: %w", err) } computedHash := hex.EncodeToString(sum.Sum(nil)) expectedHash := strings.TrimSpace(hash) if computedHash != expectedHash { - return errors.Errorf("SHA256 verification of %v failed. Expected=%v, "+ + return fmt.Errorf("SHA256 verification of %v failed. Expected=%v, "+ "but computed=%v", f.Name(), expectedHash, computedHash) } log.Println("SHA256 OK:", f.Name()) @@ -761,13 +761,13 @@ func VerifySHA256(file string, hash string) error { func CreateSHA512File(file string) error { f, err := os.Open(file) if err != nil { - return errors.Wrap(err, "failed to open file for sha512 summing") + return fmt.Errorf("failed to open file for sha512 summing: %w", err) } defer f.Close() sum := sha512.New() if _, err := io.Copy(sum, f); err != nil { - return errors.Wrap(err, "failed reading from input file") + return fmt.Errorf("failed reading from input file: %w", err) } computedHash := hex.EncodeToString(sum.Sum(nil)) @@ -856,7 +856,7 @@ func XPackBeatDir(path ...string) string { func LibbeatDir(path ...string) string { esBeatsDir, err := ElasticBeatsDir() if err != nil { - panic(errors.Wrap(err, "failed determine libbeat dir location")) + panic(fmt.Errorf("failed determine libbeat dir location: %w", err)) } return filepath.Join(append([]string{esBeatsDir, "libbeat"}, path...)...) @@ -873,7 +873,7 @@ func CreateDir(file string) string { // Create the output directory. if dir := filepath.Dir(file); dir != "." { if err := os.MkdirAll(dir, 0755); err != nil { - panic(errors.Wrapf(err, "failed to create parent dir for %v", file)) + panic(fmt.Errorf("failed to create parent dir for %v: %w", file, err)) } } return file @@ -895,7 +895,7 @@ func ParseVersion(version string) (major, minor, patch int, err error) { names := parseVersionRegex.SubexpNames() matches := parseVersionRegex.FindStringSubmatch(version) if len(matches) == 0 { - err = errors.Errorf("failed to parse version '%v'", version) + err = fmt.Errorf("failed to parse version '%v'", version) return } diff --git a/dev-tools/mage/config.go b/dev-tools/mage/config.go index adfa4c74541..822e7f0f163 100644 --- a/dev-tools/mage/config.go +++ b/dev-tools/mage/config.go @@ -19,6 +19,7 @@ package mage import ( "bytes" + "errors" "fmt" "io/ioutil" "os" @@ -30,7 +31,6 @@ import ( "github.com/magefile/mage/mg" - "github.com/pkg/errors" "gopkg.in/yaml.v2" ) @@ -98,7 +98,7 @@ func Config(types ConfigFileType, args ConfigFileParams, targetDir string) error if types.IsShort() { file := filepath.Join(targetDir, BeatName+".yml") if err := makeConfigTemplate(file, 0600, args, ShortConfigType); err != nil { - return errors.Wrap(err, "failed making short config") + return fmt.Errorf("failed making short config: %w", err) } } @@ -106,7 +106,7 @@ func Config(types ConfigFileType, args ConfigFileParams, targetDir string) error if types.IsReference() { file := filepath.Join(targetDir, BeatName+".reference.yml") if err := makeConfigTemplate(file, 0644, args, ReferenceConfigType); err != nil { - return errors.Wrap(err, "failed making reference config") + return fmt.Errorf("failed making reference config: %w", err) } } @@ -114,7 +114,7 @@ func Config(types ConfigFileType, args ConfigFileParams, targetDir string) error if types.IsDocker() { file := filepath.Join(targetDir, BeatName+".docker.yml") if err := makeConfigTemplate(file, 0600, args, DockerConfigType); err != nil { - return errors.Wrap(err, "failed making docker config") + return fmt.Errorf("failed making docker config: %w", err) } } @@ -136,7 +136,7 @@ func makeConfigTemplate(destination string, mode os.FileMode, confParams ConfigF confFile = confParams.Docker tmplParams = map[string]interface{}{"Docker": true} default: - panic(errors.Errorf("Invalid config file type: %v", typ)) + panic(fmt.Errorf("Invalid config file type: %v", typ)) } // Build the dependencies. @@ -192,18 +192,18 @@ func makeConfigTemplate(destination string, mode os.FileMode, confParams ConfigF var err error for _, templateGlob := range confParams.Templates { if tmpl, err = tmpl.ParseGlob(templateGlob); err != nil { - return errors.Wrapf(err, "failed to parse config templates in %q", templateGlob) + return fmt.Errorf("failed to parse config templates in %q: %w", templateGlob, err) } } data, err := ioutil.ReadFile(confFile.Template) if err != nil { - return errors.Wrapf(err, "failed to read config template %q", confFile.Template) + return fmt.Errorf("failed to read config template %q: %w", confFile.Template, err) } tmpl, err = tmpl.Parse(string(data)) if err != nil { - return errors.Wrap(err, "failed to parse template") + return fmt.Errorf("failed to parse template: %w", err) } out, err := os.OpenFile(CreateDir(destination), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, mode) @@ -213,7 +213,7 @@ func makeConfigTemplate(destination string, mode os.FileMode, confParams ConfigF defer out.Close() if err = tmpl.Execute(out, EnvMap(params)); err != nil { - return errors.Wrapf(err, "failed building %v", destination) + return fmt.Errorf("failed building %v: %w", destination, err) } return nil diff --git a/dev-tools/mage/copy.go b/dev-tools/mage/copy.go index c4774539871..fc9aa854823 100644 --- a/dev-tools/mage/copy.go +++ b/dev-tools/mage/copy.go @@ -18,13 +18,12 @@ package mage import ( + "fmt" "io" "io/ioutil" "os" "path/filepath" "regexp" - - "github.com/pkg/errors" ) // Copy copies a file or a directory (recursively) and preserves the permissions. @@ -38,7 +37,7 @@ func CopyFile(src, dest string) error { copy := &CopyTask{Source: src, Dest: dest} info, err := os.Stat(src) if err != nil { - return errors.Wrapf(err, "copy failed: cannot stat source file %v", src) + return fmt.Errorf("copy failed: cannot stat source file %v: %w", src, err) } return copy.fileCopy(src, dest, info) } @@ -56,22 +55,27 @@ type CopyTask struct { // Execute executes the copy and returns an error of there is a failure. func (t *CopyTask) Execute() error { if err := t.init(); err != nil { - return errors.Wrap(err, "copy failed") + return fmt.Errorf("copy failed: %w", err) } info, err := os.Stat(t.Source) if err != nil { - return errors.Wrapf(err, "copy failed: cannot stat source file %v", t.Source) + return fmt.Errorf("copy failed: cannot stat source file %v: %w", t.Source, err) } - return errors.Wrap(t.recursiveCopy(t.Source, t.Dest, info), "copy failed") + err = t.recursiveCopy(t.Source, t.Dest, info) + if err != nil { + return fmt.Errorf("copy failed: %w", err) + } + + return nil } func (t *CopyTask) init() error { for _, excl := range t.Exclude { re, err := regexp.Compile(excl) if err != nil { - return errors.Wrapf(err, "bad exclude pattern %v", excl) + return fmt.Errorf("bad exclude pattern %v: %w", excl, err) } t.excludes = append(t.excludes, re) } @@ -106,7 +110,7 @@ func (t *CopyTask) fileCopy(src, dest string, info os.FileInfo) error { defer srcFile.Close() if !info.Mode().IsRegular() { - return errors.Errorf("failed to copy source file because it is not a " + + return fmt.Errorf("failed to copy source file because it is not a " + "regular file") } @@ -137,19 +141,19 @@ func (t *CopyTask) dirCopy(src, dest string, info os.FileInfo) error { mode = info.Mode() } if err := os.MkdirAll(dest, mode&os.ModePerm); err != nil { - return errors.Wrap(err, "failed creating dirs") + return fmt.Errorf("failed creating dirs: %w", err) } contents, err := ioutil.ReadDir(src) if err != nil { - return errors.Wrapf(err, "failed to read dir %v", src) + return fmt.Errorf("failed to read dir %v: %w", src, err) } for _, info := range contents { srcFile := filepath.Join(src, info.Name()) destFile := filepath.Join(dest, info.Name()) if err = t.recursiveCopy(srcFile, destFile, info); err != nil { - return errors.Wrapf(err, "failed to copy %v to %v", srcFile, destFile) + return fmt.Errorf("failed to copy %v to %v: %w", srcFile, destFile, err) } } diff --git a/dev-tools/mage/dockerbuilder.go b/dev-tools/mage/dockerbuilder.go index b9c48c2c35f..2066670dc80 100644 --- a/dev-tools/mage/dockerbuilder.go +++ b/dev-tools/mage/dockerbuilder.go @@ -20,6 +20,7 @@ package mage import ( "bytes" "compress/gzip" + "errors" "fmt" "io" "os" @@ -29,7 +30,6 @@ import ( "time" "github.com/magefile/mage/sh" - "github.com/pkg/errors" ) type dockerBuilder struct { @@ -59,7 +59,7 @@ func newDockerBuilder(spec PackageSpec) (*dockerBuilder, error) { func (b *dockerBuilder) Build() error { if err := os.RemoveAll(b.buildDir); err != nil { - return errors.Wrapf(err, "failed to clean existing build directory %s", b.buildDir) + return fmt.Errorf("failed to clean existing build directory %s: %w", b.buildDir, err) } if err := b.copyFiles(); err != nil { @@ -67,7 +67,7 @@ func (b *dockerBuilder) Build() error { } if err := b.prepareBuild(); err != nil { - return errors.Wrap(err, "failed to prepare build") + return fmt.Errorf("failed to prepare build: %w", err) } tag, err := b.dockerBuild() @@ -80,11 +80,11 @@ func (b *dockerBuilder) Build() error { tries -= 1 } if err != nil { - return errors.Wrap(err, "failed to build docker") + return fmt.Errorf("failed to build docker: %w", err) } if err := b.dockerSave(tag); err != nil { - return errors.Wrap(err, "failed to save docker as artifact") + return fmt.Errorf("failed to save docker as artifact: %w", err) } return nil @@ -114,7 +114,7 @@ func (b *dockerBuilder) copyFiles() error { if f.SkipOnMissing && errors.Is(err, os.ErrNotExist) { continue } - return errors.Wrapf(err, "failed to copy from %s to %s", f.Source, target) + return fmt.Errorf("failed to copy from %s to %s: %w", f.Source, target, err) } } return nil @@ -141,7 +141,7 @@ func (b *dockerBuilder) prepareBuild() error { err = b.ExpandFile(path, target, data) if err != nil { - return errors.Wrapf(err, "expanding template '%s' to '%s'", path, target) + return fmt.Errorf("expanding template '%s' to '%s': %w", path, target, err) } } return nil @@ -182,7 +182,7 @@ func (b *dockerBuilder) expandDockerfile(templatesDir string, data map[string]in path := filepath.Join(templatesDir, file.source) err := b.ExpandFile(path, target, data) if err != nil { - return errors.Wrapf(err, "expanding template '%s' to '%s'", path, target) + return fmt.Errorf("expanding template '%s' to '%s': %w", path, target, err) } } @@ -251,9 +251,13 @@ func (b *dockerBuilder) dockerSave(tag string) error { if err = cmd.Wait(); err != nil { if errmsg := strings.TrimSpace(stderr.String()); errmsg != "" { - err = errors.Wrap(errors.New(errmsg), err.Error()) + err = fmt.Errorf(err.Error()+": %w", errors.New(errmsg)) } return err } - return errors.Wrap(CreateSHA512File(outputFile), "failed to create .sha512 file") + + if err = CreateSHA512File(outputFile); err != nil { + return fmt.Errorf("failed to create .sha512 file: %w", err) + } + return nil } diff --git a/dev-tools/mage/fields.go b/dev-tools/mage/fields.go index aff1a3be28c..b90e4e22fa5 100644 --- a/dev-tools/mage/fields.go +++ b/dev-tools/mage/fields.go @@ -18,10 +18,9 @@ package mage import ( + "fmt" "path/filepath" - "github.com/pkg/errors" - "github.com/magefile/mage/sh" ) @@ -229,6 +228,6 @@ func toLibbeatLicenseName(name string) string { case "Elastic License": return "Elastic" default: - panic(errors.Errorf("invalid license name '%v'", name)) + panic(fmt.Errorf("invalid license name '%v'", name)) } } diff --git a/dev-tools/mage/gomod.go b/dev-tools/mage/gomod.go index 11ad159b841..de67f94797a 100644 --- a/dev-tools/mage/gomod.go +++ b/dev-tools/mage/gomod.go @@ -18,11 +18,10 @@ package mage import ( + "fmt" "os" "path/filepath" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/dev-tools/mage/gotool" ) @@ -38,7 +37,7 @@ func CopyFilesToVendor(vendorFolder string, modulesToCopy []CopyModule) error { for _, p := range modulesToCopy { path, err := gotool.ListModuleCacheDir(p.Name) if err != nil { - return errors.Wrapf(err, "error while looking up cached dir of module: %s", p.Name) + return fmt.Errorf("error while looking up cached dir of module: %s: %w", p.Name, err) } for _, f := range p.FilesToCopy { @@ -47,7 +46,7 @@ func CopyFilesToVendor(vendorFolder string, modulesToCopy []CopyModule) error { copyTask := &CopyTask{Source: from, Dest: to, Mode: 0600, DirMode: os.ModeDir | 0750} err = copyTask.Execute() if err != nil { - return errors.Wrapf(err, "error while copying file from %s to %s", from, to) + return fmt.Errorf("error while copying file from %s to %s: %w", from, to, err) } } } diff --git a/dev-tools/mage/gotest.go b/dev-tools/mage/gotest.go index 64a658ee77f..5065882fdb8 100644 --- a/dev-tools/mage/gotest.go +++ b/dev-tools/mage/gotest.go @@ -107,6 +107,25 @@ func DefaultGoTestUnitArgs() GoTestArgs { return makeGoTestArgs("Unit") } func DefaultGoTestIntegrationArgs() GoTestArgs { args := makeGoTestArgs("Integration") args.Tags = append(args.Tags, "integration") + + synth := exec.Command("npx", "@elastic/synthetics", "-h") + if synth.Run() == nil { + // Run an empty journey to ensure playwright can be loaded + // catches situations like missing playwright deps + cmd := exec.Command("sh", "-c", "echo 'step(\"t\", () => { })' | elastic-synthetics --inline") + var out strings.Builder + cmd.Stdout = &out + cmd.Stderr = &out + err := cmd.Run() + if err != nil || cmd.ProcessState.ExitCode() != 0 { + fmt.Printf("synthetics is available, but not invokable, command exited with bad code: %s\n", out.String()) + } + + fmt.Println("npx @elastic/synthetics found, will run with synthetics tags") + os.Setenv("ELASTIC_SYNTHETICS_CAPABLE", "true") + args.Tags = append(args.Tags, "synthetics") + } + // Use the non-cachable -count=1 flag to disable test caching when running integration tests. // There are reasons to re-run tests even if the code is unchanged (e.g. Dockerfile changes). args.ExtraFlags = append(args.ExtraFlags, "-count=1") @@ -125,6 +144,7 @@ func DefaultGoTestIntegrationFromHostArgs() GoTestArgs { // module integration tests. We tag integration test files with 'integration'. func GoTestIntegrationArgsForModule(module string) GoTestArgs { args := makeGoTestArgsForModule("Integration", module) + args.Tags = append(args.Tags, "integration") return args } @@ -138,7 +158,7 @@ func DefaultTestBinaryArgs() TestBinaryArgs { } // GoTestIntegrationForModule executes the Go integration tests sequentially. -// Currently all test cases must be present under "./module" directory. +// Currently, all test cases must be present under "./module" directory. // // Motivation: previous implementation executed all integration tests at once, // causing high CPU load, high memory usage and resulted in timeouts. @@ -307,12 +327,15 @@ func GoTest(ctx context.Context, params GoTestArgs) error { // Generate a HTML code coverage report. var htmlCoverReport string if params.CoverageProfileFile != "" { + htmlCoverReport = strings.TrimSuffix(params.CoverageProfileFile, filepath.Ext(params.CoverageProfileFile)) + ".html" + coverToHTML := sh.RunCmd("go", "tool", "cover", "-html="+params.CoverageProfileFile, "-o", htmlCoverReport) - if err = coverToHTML(); err != nil { + + if err := coverToHTML(); err != nil { return fmt.Errorf("failed to write HTML code coverage report: %w", err) } } diff --git a/dev-tools/mage/gotest_test.go b/dev-tools/mage/gotest_test.go index edbb1e549f9..49784c0fd6c 100644 --- a/dev-tools/mage/gotest_test.go +++ b/dev-tools/mage/gotest_test.go @@ -210,41 +210,41 @@ var wantTestAssertOutput = `(?sm: Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/assert_fails.* - --- FAIL: TestGoTest_Helper_AssertOutput/assert_fails .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/assert_with_message .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/assert_with_message.* Messages: My message.* - --- FAIL: TestGoTest_Helper_AssertOutput/assert_with_message .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/assert_with_messagef .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/assert_with_messagef.* Messages: My message with arguments: 42.* - --- FAIL: TestGoTest_Helper_AssertOutput/assert_with_messagef .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/require_fails .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/require_fails.* - --- FAIL: TestGoTest_Helper_AssertOutput/require_fails .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/require_with_message .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/require_with_message.* Messages: My message.* - --- FAIL: TestGoTest_Helper_AssertOutput/require_with_message .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/require_with_messagef .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* Error: Should be true.* Test: TestGoTest_Helper_AssertOutput/require_with_messagef.* Messages: My message with arguments: 42.* - --- FAIL: TestGoTest_Helper_AssertOutput/require_with_messagef .* + === FAIL: dev-tools/mage TestGoTest_Helper_AssertOutput/equals_map .* gotest_test.go:\d+:.* Error Trace: gotest_test.go:\d+.* @@ -306,17 +306,17 @@ var wantTestLogOutput = `(?sm: gotest_test.go:\d+: printf style log message: 42.* gotest_test.go:\d+: Log should fail.* gotest_test.go:\d+: Log should fail with printf style log: 23.* - --- FAIL: TestGoTest_Helper_LogOutput/on_error.* + === FAIL: dev-tools/mage TestGoTest_Helper_LogOutput/on_fatal.* gotest_test.go:\d+: Log message should be printed.* gotest_test.go:\d+: printf style log message: 42.* gotest_test.go:\d+: Log should fail.* - --- FAIL: TestGoTest_Helper_LogOutput/on_fatal.* + === FAIL: dev-tools/mage TestGoTest_Helper_LogOutput/on_fatalf.* gotest_test.go:\d+: Log message should be printed.* gotest_test.go:\d+: printf style log message: 42.* gotest_test.go:\d+: Log should fail with printf style log: 42.* - --- FAIL: TestGoTest_Helper_LogOutput/on_fatalf.* + === FAIL: dev-tools/mage TestGoTest_Helper_LogOutput/with_newlines.* gotest_test.go:\d+: Log.* message.* @@ -336,7 +336,7 @@ var wantTestLogOutput = `(?sm: style.* log:.* 42.* - --- FAIL: TestGoTest_Helper_LogOutput/with_newlines.* + === FAIL: dev-tools/mage TestGoTest_Helper_LogOutput.* DONE 5 tests, 5 failures in.* )` diff --git a/dev-tools/mage/keychain.go b/dev-tools/mage/keychain.go index c66bec16d35..4435604ea57 100644 --- a/dev-tools/mage/keychain.go +++ b/dev-tools/mage/keychain.go @@ -18,6 +18,7 @@ package mage import ( + "fmt" "log" "regexp" "strconv" @@ -25,7 +26,6 @@ import ( "sync" "github.com/magefile/mage/sh" - "github.com/pkg/errors" ) var _appleKeychain = &appleKeychain{} @@ -138,19 +138,19 @@ func getAppleSigningInfo() (*AppleSigningInfo, error) { } if len(install) > 1 { - return nil, errors.Errorf("found multiple installer signing identities "+ + return nil, fmt.Errorf("found multiple installer signing identities "+ "that match '%v'. Set a more specific APPLE_SIGNING_IDENTITY_INSTALLER "+ "value that will select one of %+v", identityInstaller, install) } if len(app) > 1 { - return nil, errors.Errorf("found multiple installer signing identities "+ + return nil, fmt.Errorf("found multiple installer signing identities "+ "that match '%v'. Set a more specific APPLE_SIGNING_IDENTITY_APP "+ "value that will select one of %+v", identityApp, app) } if len(install) == 0 || len(app) == 0 { - return nil, errors.Errorf("apple signing was requested with " + + return nil, fmt.Errorf("apple signing was requested with " + "APPLE_SIGNING_ENABLED=true, but the required signing identities " + "for app and installer were not found") } diff --git a/dev-tools/mage/kibana.go b/dev-tools/mage/kibana.go index a556e5b5429..47e67a24a50 100644 --- a/dev-tools/mage/kibana.go +++ b/dev-tools/mage/kibana.go @@ -18,11 +18,11 @@ package mage import ( + "errors" + "fmt" "io/fs" "os" "path/filepath" - - "github.com/pkg/errors" ) const kibanaBuildDir = "build/kibana" @@ -81,7 +81,7 @@ func PackageKibanaDashboardsFromBuildDir() { case Deb, RPM: pkgArgs.Spec.ReplaceFile("/usr/share/{{.BeatName}}/kibana", kibanaDashboards) default: - panic(errors.Errorf("unhandled package type: %v", pkgType)) + panic(fmt.Errorf("unhandled package type: %v", pkgType)) } break } diff --git a/dev-tools/mage/kubernetes/kuberemote.go b/dev-tools/mage/kubernetes/kuberemote.go index 3bb540a42da..8e9d9897d44 100644 --- a/dev-tools/mage/kubernetes/kuberemote.go +++ b/dev-tools/mage/kubernetes/kuberemote.go @@ -35,7 +35,6 @@ import ( "strings" "time" - "github.com/pkg/errors" "golang.org/x/crypto/ssh" apiv1 "k8s.io/api/core/v1" @@ -97,7 +96,7 @@ func NewKubeRemote(kubeconfig string, namespace string, name string, workDir str // Run runs the command remotely on the kubernetes cluster. func (r *KubeRemote) Run(env map[string]string, stdout io.Writer, stderr io.Writer, args ...string) error { if err := r.syncSSHKey(); err != nil { - return errors.Wrap(err, "failed to sync SSH secret") + return fmt.Errorf("failed to sync SSH secret: %w", err) } defer r.deleteSSHKey() if err := r.syncServiceAccount(); err != nil { @@ -106,21 +105,21 @@ func (r *KubeRemote) Run(env map[string]string, stdout io.Writer, stderr io.Writ defer r.deleteServiceAccount() _, err := r.createPod(env, args...) if err != nil { - return errors.Wrap(err, "failed to create execute pod") + return fmt.Errorf("failed to create execute pod: %w", err) } defer r.deletePod() // wait for SSH to be up inside the init container. _, err = r.waitForPod(5*time.Minute, podInitReady) if err != nil { - return errors.Wrap(err, "execute pod init container never started") + return fmt.Errorf("execute pod init container never started: %w", err) } time.Sleep(1 * time.Second) // SSH inside of container can take a moment // forward the SSH port so rsync can be ran. randomPort, err := getFreePort() if err != nil { - return errors.Wrap(err, "failed to find a free port") + return fmt.Errorf("failed to find a free port: %w", err) } stopChannel := make(chan struct{}, 1) readyChannel := make(chan struct{}, 1) @@ -140,19 +139,19 @@ func (r *KubeRemote) Run(env map[string]string, stdout io.Writer, stderr io.Writ // wait for exec container to be running _, err = r.waitForPod(5*time.Minute, containerRunning("exec")) if err != nil { - return errors.Wrap(err, "execute pod container never started") + return fmt.Errorf("execute pod container never started: %w", err) } // stream the logs of the container err = r.streamLogs("exec", stdout) if err != nil { - return errors.Wrap(err, "failed to stream the logs") + return fmt.Errorf("failed to stream the logs: %w", err) } // wait for exec container to be completely done pod, err := r.waitForPod(30*time.Second, podDone) if err != nil { - return errors.Wrap(err, "execute pod didn't terminate after 30 seconds of log stream") + return fmt.Errorf("execute pod didn't terminate after 30 seconds of log stream: %w", err) } // return error on failure @@ -199,18 +198,18 @@ func (r *KubeRemote) syncServiceAccount() error { createServiceAccountManifest(r.svcAccName), metav1.CreateOptions{}) if err != nil { - return errors.Wrap(err, "failed to create service account") + return fmt.Errorf("failed to create service account: %w", err) } _, err = r.cs.RbacV1().ClusterRoles().Create(ctx, createClusterRoleManifest(r.name), metav1.CreateOptions{}) if err != nil { - return errors.Wrap(err, "failed to create cluster role") + return fmt.Errorf("failed to create cluster role: %w", err) } _, err = r.cs.RbacV1().ClusterRoleBindings().Create( ctx, createClusterRoleBindingManifest(r.name, r.namespace, r.svcAccName), metav1.CreateOptions{}) if err != nil { - return errors.Wrap(err, "failed to create cluster role binding") + return fmt.Errorf("failed to create cluster role binding: %w", err) } return nil } diff --git a/dev-tools/mage/kubernetes/kubernetes.go b/dev-tools/mage/kubernetes/kubernetes.go index 9b25f316b2c..e93632d7b65 100644 --- a/dev-tools/mage/kubernetes/kubernetes.go +++ b/dev-tools/mage/kubernetes/kubernetes.go @@ -29,7 +29,6 @@ import ( "time" "github.com/magefile/mage/mg" - "github.com/pkg/errors" "github.com/elastic/beats/v7/dev-tools/mage" ) @@ -106,14 +105,14 @@ func (d *KubernetesIntegrationTester) Test(dir string, mageTarget string, env ma // Apply the manifest from the dir. This is the requirements for the tests that will // run inside the cluster. if err := KubectlApply(env, stdOut, stdErr, manifestPath); err != nil { - return errors.Wrapf(err, "failed to apply manifest %s", manifestPath) + return fmt.Errorf("failed to apply manifest %s: %w", manifestPath, err) } defer func() { if mg.Verbose() { fmt.Println(">> Deleting module manifest from cluster...") } if err := KubectlDelete(env, stdOut, stdErr, manifestPath); err != nil { - log.Printf("%s", errors.Wrapf(err, "failed to apply manifest %s", manifestPath)) + log.Printf("%s", fmt.Errorf("failed to apply manifest %s: %w", manifestPath, err)) } }() @@ -164,7 +163,7 @@ func waitKubeStateMetricsReadiness(env map[string]string, stdOut, stdErr io.Writ break } if readyAttempts > checkKubeStateMetricsReadyAttempts { - return errors.Wrapf(err, "Timeout waiting for kube-state-metrics") + return fmt.Errorf("Timeout waiting for kube-state-metrics: %w", err) } time.Sleep(6 * time.Second) readyAttempts += 1 @@ -177,12 +176,12 @@ func waitKubeStateMetricsReadiness(env map[string]string, stdOut, stdErr io.Writ func kubernetesClusterName() string { commit, err := mage.CommitHash() if err != nil { - panic(errors.Wrap(err, "failed to construct kind cluster name")) + panic(fmt.Errorf("failed to construct kind cluster name: %w", err)) } version, err := mage.BeatQualifiedVersion() if err != nil { - panic(errors.Wrap(err, "failed to construct kind cluster name")) + panic(fmt.Errorf("failed to construct kind cluster name: %w", err)) } version = strings.NewReplacer(".", "-").Replace(version) @@ -202,7 +201,7 @@ func kubernetesClusterName() string { // Note that underscores, in particular, are not permitted. matched, err := regexp.MatchString(subDomainPattern, clusterName) if err != nil { - panic(errors.Wrap(err, "error while validating kind cluster name")) + panic(fmt.Errorf("error while validating kind cluster name: %w", err)) } if !matched { panic("constructed invalid kind cluster name") diff --git a/dev-tools/mage/modules.go b/dev-tools/mage/modules.go index a65c2c2a121..14b7f7ab118 100644 --- a/dev-tools/mage/modules.go +++ b/dev-tools/mage/modules.go @@ -25,7 +25,6 @@ import ( "strings" "github.com/joeshaw/multierror" - "github.com/pkg/errors" "gopkg.in/yaml.v2" ) @@ -131,11 +130,11 @@ func loadModulesD() (modules map[string][]moduleDefinition, err error) { for _, file := range files { contents, err := ioutil.ReadFile(file) if err != nil { - return nil, errors.Wrapf(err, "reading %s", file) + return nil, fmt.Errorf("reading %s: %w", file, err) } var cfg []moduleDefinition if err = yaml.Unmarshal(contents, &cfg); err != nil { - return nil, errors.Wrapf(err, "parsing %s as YAML", file) + return nil, fmt.Errorf("parsing %s as YAML: %w", file, err) } modules[file] = cfg } diff --git a/dev-tools/mage/pkgspecs.go b/dev-tools/mage/pkgspecs.go index 7a029238b61..9d0a6b339b4 100644 --- a/dev-tools/mage/pkgspecs.go +++ b/dev-tools/mage/pkgspecs.go @@ -19,11 +19,11 @@ package mage import ( "bytes" + "fmt" "io/ioutil" "log" "path/filepath" - "github.com/pkg/errors" "gopkg.in/yaml.v2" ) @@ -72,12 +72,12 @@ func MustUsePackaging(specName, specFile string) { func LoadNamedSpec(name string, files ...string) error { specs, err := LoadSpecs(files...) if err != nil { - return errors.Wrap(err, "failed to load spec file") + return fmt.Errorf("failed to load spec file: %w", err) } packages, found := specs[name] if !found { - return errors.Errorf("%v not found in package specs", name) + return fmt.Errorf("%v not found in package specs", name) } log.Printf("%v package spec loaded from %v", name, files) @@ -91,7 +91,7 @@ func LoadSpecs(files ...string) (map[string][]OSPackageArgs, error) { for _, file := range files { d, err := ioutil.ReadFile(file) if err != nil { - return nil, errors.Wrap(err, "failed to read from spec file") + return nil, fmt.Errorf("failed to read from spec file: %w", err) } data = append(data, d) } @@ -102,7 +102,7 @@ func LoadSpecs(files ...string) (map[string][]OSPackageArgs, error) { var packages PackageYAML if err := yaml.Unmarshal(bytes.Join(data, []byte{'\n'}), &packages); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal spec data") + return nil, fmt.Errorf("failed to unmarshal spec data: %w", err) } return packages.Specs, nil diff --git a/dev-tools/mage/pkgtypes.go b/dev-tools/mage/pkgtypes.go index 7a775850cf3..249612f8feb 100644 --- a/dev-tools/mage/pkgtypes.go +++ b/dev-tools/mage/pkgtypes.go @@ -36,7 +36,6 @@ import ( "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" ) const ( @@ -185,19 +184,19 @@ var OSArchNames = map[string]map[PackageType]map[string]string{ func getOSArchName(platform BuildPlatform, t PackageType) (string, error) { names, found := OSArchNames[platform.GOOS()] if !found { - return "", errors.Errorf("arch names for os=%v are not defined", + return "", fmt.Errorf("arch names for os=%v are not defined", platform.GOOS()) } archMap, found := names[t] if !found { - return "", errors.Errorf("arch names for %v on os=%v are not defined", + return "", fmt.Errorf("arch names for %v on os=%v are not defined", t, platform.GOOS()) } arch, found := archMap[platform.Arch()] if !found { - return "", errors.Errorf("arch name associated with %v for %v on "+ + return "", fmt.Errorf("arch name associated with %v for %v on "+ "os=%v is not defined", platform.Arch(), t, platform.GOOS()) } @@ -241,7 +240,7 @@ func (typ *PackageType) UnmarshalText(text []byte) error { case "docker": *typ = Docker default: - return errors.Errorf("unknown package type: %v", string(text)) + return fmt.Errorf("unknown package type: %v", string(text)) } return nil } @@ -286,7 +285,7 @@ func (typ PackageType) Build(spec PackageSpec) error { case Docker: return PackageDocker(spec) default: - return errors.Errorf("unknown package type: %v", typ) + return fmt.Errorf("unknown package type: %v", typ) } } @@ -309,7 +308,7 @@ func (s PackageSpec) Clone() PackageSpec { func (s PackageSpec) ReplaceFile(target string, file PackageFile) { _, found := s.Files[target] if !found { - panic(errors.Errorf("failed to ReplaceFile because target=%v does not exist", target)) + panic(fmt.Errorf("failed to ReplaceFile because target=%v does not exist", target)) } s.Files[target] = file @@ -407,7 +406,7 @@ func (s PackageSpec) Evaluate(args ...map[string]interface{}) PackageSpec { // Execute the dependency if it exists. if f.Dep != nil { if err := f.Dep(s); err != nil { - panic(errors.Wrapf(err, "failed executing package file dependency for target=%v", target)) + panic(fmt.Errorf("failed executing package file dependency for target=%v: %w", target, err)) } } @@ -422,20 +421,20 @@ func (s PackageSpec) Evaluate(args ...map[string]interface{}) PackageSpec { case f.Content != "": content, err := s.Expand(f.Content) if err != nil { - panic(errors.Wrapf(err, "failed to expand content template for target=%v", target)) + panic(fmt.Errorf("failed to expand content template for target=%v: %w", target, err)) } f.Source = filepath.Join(s.packageDir, filepath.Base(f.Target)) if err = ioutil.WriteFile(CreateDir(f.Source), []byte(content), 0644); err != nil { - panic(errors.Wrapf(err, "failed to write file containing content for target=%v", target)) + panic(fmt.Errorf("failed to write file containing content for target=%v: %w", target, err)) } case f.Template != "": f.Source = filepath.Join(s.packageDir, filepath.Base(f.Template)) if err := s.ExpandFile(f.Template, CreateDir(f.Source)); err != nil { - panic(errors.Wrapf(err, "failed to expand template file for target=%v", target)) + panic(fmt.Errorf("failed to expand template file for target=%v: %w", target, err)) } default: - panic(errors.Errorf("package file with target=%v must have either source, content, or template", target)) + panic(fmt.Errorf("package file with target=%v must have either source, content, or template", target)) } evaluatedFiles[f.Target] = f @@ -459,7 +458,7 @@ func (s PackageSpec) ImageName() (string, error) { if name, _ := s.ExtraVars["image_name"]; name != "" { imageName, err := s.Expand(name) if err != nil { - return "", errors.Wrapf(err, "failed to expand image_name") + return "", fmt.Errorf("failed to expand image_name: %w", err) } return imageName, nil } @@ -481,11 +480,11 @@ func copyInstallScript(spec PackageSpec, script string, local *string) error { } if err := spec.ExpandFile(script, createDir(*local)); err != nil { - return errors.Wrap(err, "failed to copy install script to package dir") + return fmt.Errorf("failed to copy install script to package dir: %w", err) } if err := os.Chmod(*local, 0755); err != nil { - return errors.Wrap(err, "failed to chmod install script") + return fmt.Errorf("failed to chmod install script: %w", err) } return nil @@ -494,7 +493,7 @@ func copyInstallScript(spec PackageSpec, script string, local *string) error { func (s PackageSpec) hash() string { h, err := hashstructure.Hash(s, nil) if err != nil { - panic(errors.Wrap(err, "failed to compute hash of spec")) + panic(fmt.Errorf("failed to compute hash of spec: %w", err)) } hash := strconv.FormatUint(h, 10) @@ -550,7 +549,7 @@ func PackageZip(spec PackageSpec) error { if err := addFileToZip(w, baseDir, pkgFile); err != nil { p, _ := filepath.Abs(pkgFile.Source) - return errors.Wrapf(err, "failed adding file=%+v to zip", p) + return fmt.Errorf("failed adding file=%+v to zip: %w", p, err) } } @@ -570,7 +569,7 @@ func PackageZip(spec PackageSpec) error { // Write the zip file. if err := ioutil.WriteFile(CreateDir(spec.OutputFile), buf.Bytes(), 0644); err != nil { - return errors.Wrap(err, "failed to write zip file") + return fmt.Errorf("failed to write zip file: %w", err) } // Any packages beginning with "tmp-" are temporary by nature so don't have @@ -579,7 +578,10 @@ func PackageZip(spec PackageSpec) error { return nil } - return errors.Wrap(CreateSHA512File(spec.OutputFile), "failed to create .sha512 file") + if err := CreateSHA512File(spec.OutputFile); err != nil { + return fmt.Errorf("failed to create .sha512 file: %w", err) + } + return nil } // PackageTarGz packages a gzipped tar file. @@ -619,7 +621,7 @@ func PackageTarGz(spec PackageSpec) error { } if err := addFileToTar(w, baseDir, pkgFile); err != nil { - return errors.Wrapf(err, "failed adding file=%+v to tar", pkgFile) + return fmt.Errorf("failed adding file=%+v to tar: %w", pkgFile, err) } } @@ -636,7 +638,7 @@ func PackageTarGz(spec PackageSpec) error { defer os.RemoveAll(tmpdir) if err := addSymlinkToTar(tmpdir, w, baseDir, pkgFile); err != nil { - return errors.Wrapf(err, "failed adding file=%+v to tar", pkgFile) + return fmt.Errorf("failed adding file=%+v to tar: %w", pkgFile, err) } } @@ -679,7 +681,11 @@ func PackageTarGz(spec PackageSpec) error { return nil } - return errors.Wrap(CreateSHA512File(spec.OutputFile), "failed to create .sha512 file") + if err := CreateSHA512File(spec.OutputFile); err != nil { + return fmt.Errorf("failed to create .sha512 file: %w", err) + } + + return nil } func replaceFileArch(filename string, pkgFile PackageFile, arch string) (string, PackageFile) { @@ -706,7 +712,7 @@ func runFPM(spec PackageSpec, packageType PackageType) error { case RPM, Deb: fpmPackageType = packageType.String() default: - return errors.Errorf("unsupported package type=%v for runFPM", fpmPackageType) + return fmt.Errorf("unsupported package type=%v for runFPM", fpmPackageType) } if err := HaveDocker(); err != nil { @@ -787,10 +793,13 @@ func runFPM(spec PackageSpec, packageType PackageType) error { ) if err = dockerRun(args...); err != nil { - return errors.Wrap(err, "failed while running FPM in docker") + return fmt.Errorf("failed while running FPM in docker: %w", err) } - return errors.Wrap(CreateSHA512File(spec.OutputFile), "failed to create .sha512 file") + if err = CreateSHA512File(spec.OutputFile); err != nil { + return fmt.Errorf("failed to create .sha512 file: %w", err) + } + return nil } func addUidGidEnvArgs(args []string) ([]string, error) { @@ -800,7 +809,7 @@ func addUidGidEnvArgs(args []string) ([]string, error) { info, err := GetDockerInfo() if err != nil { - return args, errors.Wrap(err, "failed to get docker info") + return args, fmt.Errorf("failed to get docker info: %w", err) } uid, gid := os.Getuid(), os.Getgid() @@ -1006,7 +1015,7 @@ func addSymlinkToTar(tmpdir string, ar *tar.Writer, baseDir string, pkgFile Pack // PackageDocker packages the Beat into a docker image. func PackageDocker(spec PackageSpec) error { if err := HaveDocker(); err != nil { - return errors.Errorf("docker daemon required to build images: %s", err) + return fmt.Errorf("docker daemon required to build images: %s", err) } b, err := newDockerBuilder(spec) diff --git a/dev-tools/mage/settings.go b/dev-tools/mage/settings.go index 0fe010877f0..46ccf691502 100644 --- a/dev-tools/mage/settings.go +++ b/dev-tools/mage/settings.go @@ -18,6 +18,7 @@ package mage import ( + "errors" "fmt" "go/build" "io/ioutil" @@ -31,7 +32,6 @@ import ( "time" "github.com/magefile/mage/sh" - "github.com/pkg/errors" "golang.org/x/tools/go/vcs" "github.com/elastic/beats/v7/dev-tools/mage/gotool" @@ -108,22 +108,22 @@ func init() { var err error RaceDetector, err = strconv.ParseBool(EnvOr("RACE_DETECTOR", "false")) if err != nil { - panic(errors.Wrap(err, "failed to parse RACE_DETECTOR env value")) + panic(fmt.Errorf("failed to parse RACE_DETECTOR env value: %w", err)) } TestCoverage, err = strconv.ParseBool(EnvOr("TEST_COVERAGE", "false")) if err != nil { - panic(errors.Wrap(err, "failed to parse TEST_COVERAGE env value")) + panic(fmt.Errorf("failed to parse TEST_COVERAGE env value: %w", err)) } Snapshot, err = strconv.ParseBool(EnvOr("SNAPSHOT", "false")) if err != nil { - panic(errors.Wrap(err, "failed to parse SNAPSHOT env value")) + panic(fmt.Errorf("failed to parse SNAPSHOT env value: %w", err)) } DevBuild, err = strconv.ParseBool(EnvOr("DEV", "false")) if err != nil { - panic(errors.Wrap(err, "failed to parse DEV env value")) + panic(fmt.Errorf("failed to parse DEV env value: %w", err)) } versionQualifier, versionQualified = os.LookupEnv("VERSION_QUALIFIER") @@ -448,7 +448,7 @@ func getBuildVariableSources() *BuildVariableSources { return buildVariableSources } - panic(errors.Errorf("magefile must call devtools.SetBuildVariableSources() "+ + panic(fmt.Errorf("magefile must call devtools.SetBuildVariableSources() "+ "because it is not an elastic beat (repo=%+v)", repo.RootImportPath)) } @@ -493,7 +493,7 @@ func (s *BuildVariableSources) GetBeatVersion() (string, error) { data, err := ioutil.ReadFile(file) if err != nil { - return "", errors.Wrapf(err, "failed to read beat version file=%v", file) + return "", fmt.Errorf("failed to read beat version file=%v: %w", file, err) } if s.BeatVersionParser == nil { @@ -511,7 +511,7 @@ func (s *BuildVariableSources) GetGoVersion() (string, error) { data, err := ioutil.ReadFile(file) if err != nil { - return "", errors.Wrapf(err, "failed to read go version file=%v", file) + return "", fmt.Errorf("failed to read go version file=%v: %w", file, err) } if s.GoVersionParser == nil { @@ -529,7 +529,7 @@ func (s *BuildVariableSources) GetDocBranch() (string, error) { data, err := ioutil.ReadFile(file) if err != nil { - return "", errors.Wrapf(err, "failed to read doc branch file=%v", file) + return "", fmt.Errorf("failed to read doc branch file=%v: %w", file, err) } if s.DocBranchParser == nil { @@ -645,7 +645,7 @@ func getProjectRepoInfoWithModules() (*ProjectRepoInfo, error) { } if rootDir == "" { - return nil, errors.Errorf("failed to find root dir of module file: %v", errs) + return nil, fmt.Errorf("failed to find root dir of module file: %v", errs) } rootImportPath, err := gotool.GetModuleName() @@ -699,12 +699,12 @@ func getProjectRepoInfoUnderGopath() (*ProjectRepoInfo, error) { } if rootDir == "" { - return nil, errors.Errorf("error while determining root directory: %v", errs) + return nil, fmt.Errorf("error while determining root directory: %v", errs) } subDir, err := filepath.Rel(rootDir, cwd) if err != nil { - return nil, errors.Wrap(err, "failed to get relative path to repo root") + return nil, fmt.Errorf("failed to get relative path to repo root: %w", err) } rootImportPath, err := gotool.GetModuleName() @@ -756,7 +756,7 @@ func listSrcGOPATHs() ([]string, error) { } if len(srcDirs) == 0 { - return srcDirs, errors.Errorf("failed to find any GOPATH %v", errs) + return srcDirs, fmt.Errorf("failed to find any GOPATH %v", errs) } return srcDirs, nil diff --git a/dev-tools/mage/target/dashboards/dashboards.go b/dev-tools/mage/target/dashboards/dashboards.go index c993b8bacc0..b7ac6685c31 100644 --- a/dev-tools/mage/target/dashboards/dashboards.go +++ b/dev-tools/mage/target/dashboards/dashboards.go @@ -18,8 +18,9 @@ package dashboards import ( + "errors" + "github.com/magefile/mage/mg" - "github.com/pkg/errors" devtools "github.com/elastic/beats/v7/dev-tools/mage" ) diff --git a/dev-tools/mage/target/unittest/unittest.go b/dev-tools/mage/target/unittest/unittest.go index d4201421177..c6f6afc0a5f 100644 --- a/dev-tools/mage/target/unittest/unittest.go +++ b/dev-tools/mage/target/unittest/unittest.go @@ -20,6 +20,7 @@ package unittest import ( "context" "fmt" + "os/exec" "github.com/magefile/mage/mg" @@ -55,7 +56,15 @@ func UnitTest() { // Use RACE_DETECTOR=true to enable the race detector. func GoUnitTest(ctx context.Context) error { mg.SerialCtxDeps(ctx, goTestDeps...) - return devtools.GoTest(ctx, devtools.DefaultGoTestUnitArgs()) + + utArgs := devtools.DefaultGoTestUnitArgs() + // If synthetics is installed run synthetics unit tests + synth := exec.Command("npx", "@elastic/synthetics", "-h") + if synth.Run() == nil { + fmt.Printf("npx @elastic/synthetics found, will run with synthetics tags") + utArgs.Tags = append(utArgs.Tags, "synthetics") + } + return devtools.GoTest(ctx, utArgs) } // PythonUnitTest executes the python system tests. diff --git a/dev-tools/packaging/templates/docker/Dockerfile.tmpl b/dev-tools/packaging/templates/docker/Dockerfile.tmpl index 3ba9207f077..305687d33e0 100644 --- a/dev-tools/packaging/templates/docker/Dockerfile.tmpl +++ b/dev-tools/packaging/templates/docker/Dockerfile.tmpl @@ -121,6 +121,7 @@ RUN echo \ # Setup synthetics env vars ENV ELASTIC_SYNTHETICS_CAPABLE=true +ENV TZ=UTC ENV SUITES_DIR={{ $beatHome }}/suites ENV NODE_VERSION=18.16.0 ENV PATH="$NODE_PATH/node/bin:$PATH" diff --git a/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml index df1db186fd4..57606723656 100644 --- a/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/auditbeat/hardening_manifest.yaml @@ -55,9 +55,6 @@ maintainers: - email: "nassim.kammah@elastic.co" name: "Nassim Kammah" username: "nassim.kammah" - - email: "ivan.fernandez@elastic.co" - name: "Ivan Fernandez Calvo" - username: "ivan.fernandez" - - email: "victor.martinez@elastic.co" - name: "Victor Martinez" - username: "victor.martinez" + - email: "julien.lind@elastic.co" + name: "Julien lind" + username: "julien.lind" diff --git a/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml index 3813cc17d8b..7da333f844f 100644 --- a/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/filebeat/hardening_manifest.yaml @@ -55,9 +55,6 @@ maintainers: - email: "nassim.kammah@elastic.co" name: "Nassim Kammah" username: "nassim.kammah" - - email: "ivan.fernandez@elastic.co" - name: "Ivan Fernandez Calvo" - username: "ivan.fernandez" - - email: "victor.martinez@elastic.co" - name: "Victor Martinez" - username: "victor.martinez" + - email: "julien.lind@elastic.co" + name: "Julien lind" + username: "julien.lind" diff --git a/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml index 4777a0ba457..6476f9298ce 100644 --- a/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/heartbeat/hardening_manifest.yaml @@ -55,9 +55,6 @@ maintainers: - email: "nassim.kammah@elastic.co" name: "Nassim Kammah" username: "nassim.kammah" - - email: "ivan.fernandez@elastic.co" - name: "Ivan Fernandez Calvo" - username: "ivan.fernandez" - - email: "victor.martinez@elastic.co" - name: "Victor Martinez" - username: "victor.martinez" + - email: "julien.lind@elastic.co" + name: "Julien lind" + username: "julien.lind" diff --git a/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml index 652fd89ab2d..e66005ebf2a 100644 --- a/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/metricbeat/hardening_manifest.yaml @@ -55,9 +55,6 @@ maintainers: - email: "nassim.kammah@elastic.co" name: "Nassim Kammah" username: "nassim.kammah" - - email: "ivan.fernandez@elastic.co" - name: "Ivan Fernandez Calvo" - username: "ivan.fernandez" - - email: "victor.martinez@elastic.co" - name: "Victor Martinez" - username: "victor.martinez" + - email: "julien.lind@elastic.co" + name: "Julien lind" + username: "julien.lind" diff --git a/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml b/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml index 0855de8c201..d0f09a8496a 100644 --- a/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml +++ b/dev-tools/packaging/templates/ironbank/packetbeat/hardening_manifest.yaml @@ -55,9 +55,6 @@ maintainers: - email: "nassim.kammah@elastic.co" name: "Nassim Kammah" username: "nassim.kammah" - - email: "ivan.fernandez@elastic.co" - name: "Ivan Fernandez Calvo" - username: "ivan.fernandez" - - email: "victor.martinez@elastic.co" - name: "Victor Martinez" - username: "victor.martinez" + - email: "julien.lind@elastic.co" + name: "Julien lind" + username: "julien.lind" diff --git a/dev-tools/packaging/templates/rpm/elastic-agent.init.sh.tmpl b/dev-tools/packaging/templates/rpm/elastic-agent.init.sh.tmpl index 573f0c9496b..25c87d29fd9 100644 --- a/dev-tools/packaging/templates/rpm/elastic-agent.init.sh.tmpl +++ b/dev-tools/packaging/templates/rpm/elastic-agent.init.sh.tmpl @@ -17,6 +17,13 @@ # family. Please see: https://www.elastic.co/beats ### END INIT INFO +# Exit with an informative message if functions does not exist. +# This has been removed from RHEL9, but exists on other RPM-based +# distributions in the support matrix. +if [ ! -f /etc/rc.d/init.d/functions ]; then + echo "SysV-style init script service management is not supported on this system, use systemctl instead" + exit 1 +fi PATH=/usr/bin:/sbin:/bin:/usr/sbin diff --git a/dev-tools/packaging/templates/rpm/init.sh.tmpl b/dev-tools/packaging/templates/rpm/init.sh.tmpl index 1bd3a846705..8e4c9731e9c 100644 --- a/dev-tools/packaging/templates/rpm/init.sh.tmpl +++ b/dev-tools/packaging/templates/rpm/init.sh.tmpl @@ -17,6 +17,13 @@ # family. Please see: https://www.elastic.co/beats ### END INIT INFO +# Exit with an informative message if functions does not exist. +# This has been removed from RHEL9, but exists on other RPM-based +# distributions in the support matrix. +if [ ! -f /etc/rc.d/init.d/functions ]; then + echo "SysV-style init script service management is not supported on this system, use systemctl instead" + exit 1 +fi PATH=/usr/bin:/sbin:/bin:/usr/sbin diff --git a/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl b/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl index e3424de1914..68ff3d22e07 100644 --- a/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl +++ b/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl @@ -300,6 +300,19 @@ filebeat.inputs: # original for harvesting but will report the symlink name as the source. #prospector.scanner.symlinks: false + # If enabled, instead of relying on the device ID and inode values when comparing files, + # compare hashes of the given byte ranges in files. A file becomes an ingest target + # when its size grows larger than offset+length (see below). Until then it's ignored. + #prospector.scanner.fingerprint.enabled: false + + # If fingerprint mode is enabled, sets the offset from the beginning of the file + # for the byte range used for computing the fingerprint value. + #prospector.scanner.fingerprint.offset: 0 + + # If fingerprint mode is enabled, sets the length of the byte range used for + # computing the fingerprint value. Cannot be less than 64 bytes. + #prospector.scanner.fingerprint.length: 1024 + ### Parsers configuration #### JSON configuration diff --git a/filebeat/autodiscover/builder/hints/logs.go b/filebeat/autodiscover/builder/hints/logs.go index 59d2eea70ae..72d8e4a63dd 100644 --- a/filebeat/autodiscover/builder/hints/logs.go +++ b/filebeat/autodiscover/builder/hints/logs.go @@ -69,7 +69,7 @@ func NewLogHints(cfg *conf.C) (autodiscover.Builder, error) { return nil, fmt.Errorf("unable to unpack hints config due to error: %w", err) } - moduleRegistry, err := fileset.NewModuleRegistry(nil, beat.Info{}, false, false) + moduleRegistry, err := fileset.NewModuleRegistry(nil, beat.Info{}, false, fileset.FilesetOverrides{}) if err != nil { return nil, err } @@ -105,7 +105,7 @@ func (l *logHints) CreateConfig(event bus.Event, options ...ucfg.Option) []*conf return template.ApplyConfigTemplate(event, configs) } - var configs []*conf.C + var configs []*conf.C //nolint:prealloc //breaks tests inputs := l.getInputs(hints) for _, h := range inputs { // Clone original config, enable it if disabled @@ -262,7 +262,7 @@ func (l *logHints) getFilesets(hints mapstr.M, module string) map[string]*filese func (l *logHints) getInputs(hints mapstr.M) []mapstr.M { modules := utils.GetHintsAsList(hints, l.config.Key) - var output []mapstr.M + var output []mapstr.M //nolint:prealloc //breaks tests for _, mod := range modules { output = append(output, mapstr.M{ diff --git a/filebeat/beater/filebeat.go b/filebeat/beater/filebeat.go index 737c2aa9344..2fddfd3bb4f 100644 --- a/filebeat/beater/filebeat.go +++ b/filebeat/beater/filebeat.go @@ -108,7 +108,13 @@ func newBeater(b *beat.Beat, plugins PluginFactory, rawConfig *conf.C) (beat.Bea return nil, err } - moduleRegistry, err := fileset.NewModuleRegistry(config.Modules, b.Info, true, false) + enableAllFilesets, _ := b.BeatConfig.Bool("config.modules.enable_all_filesets", -1) + forceEnableModuleFilesets, _ := b.BeatConfig.Bool("config.modules.force_enable_module_filesets", -1) + filesetOverrides := fileset.FilesetOverrides{ + EnableAllFilesets: enableAllFilesets, + ForceEnableModuleFilesets: forceEnableModuleFilesets, + } + moduleRegistry, err := fileset.NewModuleRegistry(config.Modules, b.Info, true, filesetOverrides) if err != nil { return nil, err } @@ -128,6 +134,18 @@ func newBeater(b *beat.Beat, plugins PluginFactory, rawConfig *conf.C) (beat.Bea } } + if b.Manager != nil { + b.Manager.RegisterDiagnosticHook("input_metrics", "Metrics from active inputs.", + "input_metrics.json", "application/json", func() []byte { + data, err := inputmon.MetricSnapshotJSON() + if err != nil { + logp.L().Warnw("Failed to collect input metric snapshot for Agent diagnostics.", "error", err) + return []byte(err.Error()) + } + return data + }) + } + // Add inputs created by the modules config.Inputs = append(config.Inputs, moduleInputs...) @@ -187,7 +205,13 @@ func (fb *Filebeat) setupPipelineLoaderCallback(b *beat.Beat) error { // have to be loaded using cfg.Reloader. Otherwise those configurations are skipped. pipelineLoaderFactory := newPipelineLoaderFactory(b.Config.Output.Config()) enableAllFilesets, _ := b.BeatConfig.Bool("config.modules.enable_all_filesets", -1) - modulesFactory := fileset.NewSetupFactory(b.Info, pipelineLoaderFactory, enableAllFilesets) + forceEnableModuleFilesets, _ := b.BeatConfig.Bool("config.modules.force_enable_module_filesets", -1) + filesetOverrides := fileset.FilesetOverrides{ + EnableAllFilesets: enableAllFilesets, + ForceEnableModuleFilesets: forceEnableModuleFilesets, + } + + modulesFactory := fileset.NewSetupFactory(b.Info, pipelineLoaderFactory, filesetOverrides) if fb.config.ConfigModules.Enabled() { if enableAllFilesets { // All module configs need to be loaded to enable all the filesets diff --git a/filebeat/docs/howto/load-ingest-pipelines.asciidoc b/filebeat/docs/howto/load-ingest-pipelines.asciidoc index a6ec44e7ea2..23dc1a2ac64 100644 --- a/filebeat/docs/howto/load-ingest-pipelines.asciidoc +++ b/filebeat/docs/howto/load-ingest-pipelines.asciidoc @@ -5,7 +5,7 @@ The ingest pipelines used to parse log lines are set up automatically the first time you run {beatname_uc}, assuming the {es} output is enabled. If you're sending events to {ls} you need to load the ingest pipelines manually. To do this, run the `setup` command with the `--pipelines` option specified. You also need to enable -the modules and filesets, this can be accomplished one of two ways. +the modules and filesets, this can be accomplished several ways. First you can use the `--modules` option to enable the module, and the `-M` option to enable the fileset. For example, the following command @@ -39,7 +39,40 @@ loads the access pipeline from the nginx module. PS > .{backslash}{beatname_lc}.exe setup --pipelines --modules nginx -M "nginx.access.enabled=true" ---- -The second option is to use the `--enable-all-filesets` option to +The second option is to use the `--modules` option to enable the +module, and the `--force-enable-module-filesets` option to enable all +the filesets in the module. For example, the following command loads +the access pipeline from the nginx module. + +*deb and rpm:* + +["source","sh",subs="attributes"] +---- +{beatname_lc} setup --pipelines --modules nginx --force-enable-module-filesets +---- + +*mac:* + +["source","sh",subs="attributes"] +---- +./{beatname_lc} setup --pipelines --modules nginx --force-enable-module-filesets +---- + +*linux:* + +["source","sh",subs="attributes"] +---- +./{beatname_lc} setup --pipelines --modules nginx --force-enable-module-filesets +---- + +*win:* + +["source","sh",subs="attributes"] +---- +PS > .{backslash}{beatname_lc}.exe setup --pipelines --modules nginx --force-enable-module-filesets +---- + +The third option is to use the `--enable-all-filesets` option to enable all the modules and all the filesets so all of the ingest pipelines are loaded. For example, the following command loads all the ingest pipelines. diff --git a/filebeat/docs/howto/migrate-to-filestream.asciidoc b/filebeat/docs/howto/migrate-to-filestream.asciidoc index ce68033803e..a57105adb3e 100644 --- a/filebeat/docs/howto/migrate-to-filestream.asciidoc +++ b/filebeat/docs/howto/migrate-to-filestream.asciidoc @@ -97,6 +97,9 @@ defined `log` input, we need to add `take_over: true` to each new `filestream`. that the new `filestream` inputs will continue ingesting files from the same offset where the `log` inputs stopped. +NOTE: It's recommended to enable debug-level logs for Filebeat in order to follow the migration process. +After the first run with `take_over: true` the setting can be removed. + WARNING: The `take over` mode is in beta. IMPORTANT: If this parameter is not set, all the files will be re-ingested from the beginning @@ -104,6 +107,8 @@ and this will lead to data duplication. Please, double-check that this parameter [source,yaml] ---- +logging: + level: debug filebeat.inputs: - type: filestream enabled: true @@ -235,9 +240,10 @@ If for whatever reason you'd like to revert the configuration after running the and return to old `log` inputs the files that were taken by `filestream` inputs, you need to do the following: 1. Stop Filebeat as soon as possible -2. Find your <> -3. Find the created backup files, they have the `.bak` suffix. If you have multiple backups for the same file, choose the one with the more recent timestamp. -4. Replace the files with their backups, e.g. `log.json` should be replaced by `log.json-1674152412247684000.bak` -5. Run Filebeat with the old configuration (no `filestream` inputs with `take_over: true`). +2. Save its debug-level logs for further investigation +3. Find your <> +4. Find the created backup files, they have the `.bak` suffix. If you have multiple backups for the same file, choose the one with the more recent timestamp. +5. Replace the files with their backups, e.g. `log.json` should be replaced by `log.json-1674152412247684000.bak` +6. Run Filebeat with the old configuration (no `filestream` inputs with `take_over: true`). NOTE: Reverting to backups might cause some events to repeat, depends on the amount of time the new configuration was running. diff --git a/filebeat/docs/inputs/input-common-file-options.asciidoc b/filebeat/docs/inputs/input-common-file-options.asciidoc index c913e4e3380..7d62c5827fe 100644 --- a/filebeat/docs/inputs/input-common-file-options.asciidoc +++ b/filebeat/docs/inputs/input-common-file-options.asciidoc @@ -77,10 +77,10 @@ certain criteria or time. Closing the harvester means closing the file handler. If a file is updated after the harvester is closed, the file will be picked up again after `scan_frequency` has elapsed. However, if the file is moved or deleted while the harvester is closed, {beatname_uc} will not be able to pick up -the file again, and any data that the harvester hasn't read will be lost. -The `close_*` settings are applied synchronously when {beatname_uc} attempts +the file again, and any data that the harvester hasn't read will be lost. +The `close_*` settings are applied synchronously when {beatname_uc} attempts to read from a file, meaning that if {beatname_uc} is in a blocked state -due to blocked output, full queue or other issue, a file that would +due to blocked output, full queue or other issue, a file that would otherwise be closed remains open until {beatname_uc} once again attempts to read from the file. @@ -240,7 +240,7 @@ that should be removed based on the `clean_inactive` setting. This happens because {beatname_uc} doesn't remove the entries until it opens the registry again to read a different file. If you are testing the `clean_inactive` setting, make sure {beatname_uc} is configured to read from more than one file, or the -file state will never be removed from the registry. +file state will never be removed from the registry. [float] [id="{beatname_lc}-input-{type}-clean-removed"] @@ -441,4 +441,3 @@ Set the location of the marker file the following way: ---- file_identity.inode_marker.path: /logs/.filebeat-marker ---- - diff --git a/filebeat/docs/inputs/input-common-udp-options.asciidoc b/filebeat/docs/inputs/input-common-udp-options.asciidoc index 5a9dbd7e324..e4b2cae25e4 100644 --- a/filebeat/docs/inputs/input-common-udp-options.asciidoc +++ b/filebeat/docs/inputs/input-common-udp-options.asciidoc @@ -20,10 +20,11 @@ The host and UDP port to listen on for event streams. [id="{beatname_lc}-input-{type}-udp-read-buffer"] ==== `read_buffer` -The size of the read buffer on the UDP socket. +The size of the read buffer on the UDP socket. If not specified the default +from the operating system will be used. [float] [id="{beatname_lc}-input-{type}-udp-timeout"] ==== `timeout` -The read and write timeout for socket operations. +The read and write timeout for socket operations. The default is `5m`. diff --git a/filebeat/docs/inputs/input-filestream-file-options.asciidoc b/filebeat/docs/inputs/input-filestream-file-options.asciidoc index 68629d32e8a..8b1bd083668 100644 --- a/filebeat/docs/inputs/input-filestream-file-options.asciidoc +++ b/filebeat/docs/inputs/input-filestream-file-options.asciidoc @@ -146,6 +146,62 @@ stays open and constantly polls your files. The default setting is 10s. +[float] +[id="{beatname_lc}-input-{type}-scan-fingerprint"] +===== `prospector.scanner.fingerprint` + +Instead of relying on the device ID and inode values when comparing files, compare hashes of the given byte ranges of files. + +Enable this option if you're experiencing data loss or data duplication due to unstable file identifiers provided by the file system. + +Following are some scenarios where this can happen: + +. Some file systems (i.e. in Docker) cache and re-use inodes ++ +for example if you: ++ +.. Create a file (`touch x`) +.. Check the file's inode (`ls -i x`) +.. Delete the file (`rm x`) +.. Create a new file right away (`touch y`) +.. Check the inode of the new file (`ls -i y`) ++ + +For both files you might see the same inode value despite even having different filenames. ++ +. Non-Ext file systems can change inodes: ++ +Ext file systems store the inode number in the `i_ino` file, inside a struct `inode`, which is written to disk. In this case, if the file is the same (not another file with the same name) then the inode number is guaranteed to be the same. ++ +If the file system is other than Ext, the inode number is generated by the inode operations defined by the file system driver. As they don't have the concept of what an inode is, they have to mimic all of the inode's internal fields to comply with VFS, so this number will probably be different after a reboot, even after closing and opening the file again (theoretically). ++ +. Some file processing tools change inode values ++ +Sometimes users unintentionally change inodes by using tools like `rsync` or `sed`. ++ +. Some operating systems change device IDs after reboot ++ +Depending on a mounting approach, the device ID (which is also used for comparing files) might change after a reboot. + +**Configuration** + +Fingerprint mode is disabled by default. + +WARNING: Enabling fingerprint mode delays ingesting new files until they grow to at least `offset`+`length` bytes in size, so they can be fingerprinted. Until then these files are ignored. + +Normally, log lines contain timestamps and other unique fields that should be able to use the fingerprint mode, +but in every use-case users should inspect their logs to determine what are the appropriate values for +the `offset` and `length` parameters. Default `offset` is `0` and default `length` is `1024` or 1 KB. `length` cannot be less than `64`. + +[source,yaml] +---- +fingerprint: + enabled: false + offset: 0 + length: 1024 +---- + + [float] [id="{beatname_lc}-input-{type}-ignore-older"] ===== `ignore_older` @@ -502,6 +558,17 @@ Set the location of the marker file the following way: file_identity.inode_marker.path: /logs/.filebeat-marker ---- +*`fingerprint`*:: To identify files based on their content byte range. + +WARNING: In order to use this file identity option, you must enable the <<{beatname_lc}-input-filestream-scan-fingerprint,fingerprint option in the scanner>>. Once this file identity is enabled, changing the fingerprint configuration (offset, length, or other settings) will lead to a global re-ingestion of all files that match the paths configuration of the input. + +Please refer to the <<{beatname_lc}-input-filestream-scan-fingerprint,fingerprint configuration for details>>. + +[source,yaml] +---- +file_identity.fingerprint: ~ +---- + [[filestream-log-rotation-support]] [float] === Log rotation diff --git a/filebeat/docs/inputs/input-filestream.asciidoc b/filebeat/docs/inputs/input-filestream.asciidoc index bb9e32e235c..e55ff611496 100644 --- a/filebeat/docs/inputs/input-filestream.asciidoc +++ b/filebeat/docs/inputs/input-filestream.asciidoc @@ -95,7 +95,7 @@ device IDs. However, on network shares and cloud providers these values might change during the lifetime of the file. If this happens {beatname_uc} thinks that file is new and resends the whole content of the file. To solve this problem you can configure `file_identity` option. Possible -values besides the default `inode_deviceid` are `path` and `inode_marker`. +values besides the default `inode_deviceid` are `path`, `inode_marker` and `fingerprint`. WARNING: Changing `file_identity` methods between runs may result in duplicated events in the output. @@ -116,6 +116,13 @@ example oneliner generates a hidden marker file for the selected mountpoint `/lo Please note that you should not use this option on Windows as file identifiers might be more volatile. +Selecting `fingerprint` instructs {beatname_uc} to identify files based on their +content byte range. + +WARNING: In order to use this file identity option, one must enable the <<{beatname_lc}-input-filestream-scan-fingerprint,fingerprint option in the scanner>>. Once this file identity is enabled, changing the fingerprint configuration (offset, length, etc) will lead to a global re-ingestion of all files that match the paths configuration of the input. + +Please refer to the <<{beatname_lc}-input-filestream-scan-fingerprint,fingerprint configuration for details>>. + ["source","sh",subs="attributes"] ---- $ lsblk -o MOUNTPOINT,UUID | grep /logs | awk '{print $2}' >> /logs/.filebeat-marker diff --git a/filebeat/docs/inputs/input-journald.asciidoc b/filebeat/docs/inputs/input-journald.asciidoc index 1eb161deef7..5b932b4d133 100644 --- a/filebeat/docs/inputs/input-journald.asciidoc +++ b/filebeat/docs/inputs/input-journald.asciidoc @@ -126,6 +126,7 @@ The position to start reading the journal from. Valid settings are: will be sent until a new message is written. * `cursor`: On first read, starts reading at the beginning of the journal. After a reload or restart, continues reading at the last known position. +* `since`: Use the `since` option to determine where to start reading from. If you have old log files and want to skip lines, start {beatname_uc} with `seek: tail` specified. Then stop {beatname_uc}, set `seek: cursor`, and restart @@ -136,7 +137,25 @@ If you have old log files and want to skip lines, start {beatname_uc} with ==== `cursor_seek_fallback` The position to start reading the journal from if no cursor information is -available. Valid options are `head` and `tail`. +available. Valid options are `head`, `tail` and `since`. + +[float] +[id="{beatname_lc}-input-{type}-since"] +==== `since` + +A time offset from the current time to start reading from. To use +`since`, either the `seek` option must be set to `since`, or the `seek` mode +must be set to `cursor` and the `cursor_seek_fallback` set to `since`. + +This example demonstrates how to resume from the persisted cursor when +it exists, or otherwise begin reading logs from the last 24 hours. + +["source","yaml",subs="attributes"] +---- +seek: cursor +cursor_seek_fallback: since +since: -24h +---- [float] [id="{beatname_lc}-input-{type}-units"] diff --git a/filebeat/docs/inputs/input-mqtt.asciidoc b/filebeat/docs/inputs/input-mqtt.asciidoc index 081f9788234..3f8e61cedb9 100644 --- a/filebeat/docs/inputs/input-mqtt.asciidoc +++ b/filebeat/docs/inputs/input-mqtt.asciidoc @@ -68,6 +68,17 @@ A client username used for authentication provided on the application level by t A client password used for authentication provided on the application level by the MQTT protocol. +===== `clean_session` + +The `clean_session` flag indicates whether the client wants to establish a persistent session with the broker. +The default is `true`. + +When `clean_session` is set to false, the session is considered to be persistent. The broker stores all subscriptions for +the client and all missed messages for the client that subscribed with a Quality of Service (QoS) level 1 or 2. + +In contrast, when `clean_session` is set to true, the broker doesn’t retain any information for the client +and discards any previous state from any persistent session. + ===== `ssl` Configuration options for SSL parameters like the certificate, key and the certificate authorities diff --git a/filebeat/docs/modules.asciidoc b/filebeat/docs/modules.asciidoc index efe3f172489..9de23994c65 100644 --- a/filebeat/docs/modules.asciidoc +++ b/filebeat/docs/modules.asciidoc @@ -9,4 +9,6 @@ modules. Filebeat modules require Elasticsearch 5.2 or later. +NOTE: While {filebeat} modules are still supported, we recommend {agent} integrations over {filebeat} modules. Integrations provide a streamlined way to connect data from a variety of vendors to the {stack}. Refer to the https://www.elastic.co/integrations/data-integrations[full list of integrations]. For more information, please refer to the {fleet-guide}/beats-agent-comparison.html[{beats} vs {agent} comparison documentation]. + include::modules_list.asciidoc[] diff --git a/filebeat/docs/modules/salesforce.asciidoc b/filebeat/docs/modules/salesforce.asciidoc index 05bf5d759dd..b81def57bef 100644 --- a/filebeat/docs/modules/salesforce.asciidoc +++ b/filebeat/docs/modules/salesforce.asciidoc @@ -225,6 +225,7 @@ Example config: var.user: "my.email@here.com" var.password: "password" var.url: "https://instance-url.salesforce.com" + var.interval: 1h ---- include::../include/var-paths.asciidoc[] @@ -253,6 +254,12 @@ The password used as part of the authentication flow. It is required for authent The URL of the Saleforce instance. +*`var.interval`*:: + +Period of fetching logs, i.e. 1s/1m/1h. + +Note: The default value of `var.interval` is 1h. It is important to exercise caution when reducing the interval, as it directly affects the API rate limit of the Salesforce instance. Salesforce API rate limit is ~1000 API calls per hour. Hence if user goes with lower limit of var.interval, the Salesforce API rate limit will exceed and any additional API requests beyond the limit will result in an error response from the Salesforce API. The error message will typically indicate that the rate limit has been exceeded. Please refer to the following link for the https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm[Salesforce API Rate Limit]. + [float] ==== `apex-rest` fileset settings diff --git a/filebeat/docs/modules/sonicwall.asciidoc b/filebeat/docs/modules/sonicwall.asciidoc index 0f20ec4785d..bd8803659fe 100644 --- a/filebeat/docs/modules/sonicwall.asciidoc +++ b/filebeat/docs/modules/sonicwall.asciidoc @@ -7,7 +7,7 @@ This file is generated! See scripts/docs_collector.py [[filebeat-module-sonicwall]] [role="xpack"] -:modulename: sonicwall +:modulename: sonicwall_firewall :has-dashboards: false == Sonicwall module diff --git a/filebeat/docs/troubleshooting.asciidoc b/filebeat/docs/troubleshooting.asciidoc index 0edffce46cf..f16042bc871 100644 --- a/filebeat/docs/troubleshooting.asciidoc +++ b/filebeat/docs/troubleshooting.asciidoc @@ -8,6 +8,7 @@ following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -26,5 +27,15 @@ include::{libbeat-dir}/getting-help.asciidoc[] include::{libbeat-dir}/debugging.asciidoc[] +//sets block macro for metrics-in-logs.asciidoc included in next section +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index 87053c24213..2de0bc61f56 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -707,6 +707,19 @@ filebeat.inputs: # original for harvesting but will report the symlink name as the source. #prospector.scanner.symlinks: false + # If enabled, instead of relying on the device ID and inode values when comparing files, + # compare hashes of the given byte ranges in files. A file becomes an ingest target + # when its size grows larger than offset+length (see below). Until then it's ignored. + #prospector.scanner.fingerprint.enabled: false + + # If fingerprint mode is enabled, sets the offset from the beginning of the file + # for the byte range used for computing the fingerprint value. + #prospector.scanner.fingerprint.offset: 0 + + # If fingerprint mode is enabled, sets the length of the byte range used for + # computing the fingerprint value. Cannot be less than 64 bytes. + #prospector.scanner.fingerprint.length: 1024 + ### Parsers configuration #### JSON configuration diff --git a/filebeat/fileset/factory.go b/filebeat/fileset/factory.go index bdc6350618e..0e5308946fa 100644 --- a/filebeat/fileset/factory.go +++ b/filebeat/fileset/factory.go @@ -129,7 +129,7 @@ func (f *Factory) CheckConfig(c *conf.C) error { // createRegistry starts a registry for a set of filesets, it returns the registry and // its input configurations func (f *Factory) createRegistry(c *conf.C) (*ModuleRegistry, []*conf.C, error) { - m, err := NewModuleRegistry([]*conf.C{c}, f.beatInfo, false, false) + m, err := NewModuleRegistry([]*conf.C{c}, f.beatInfo, false, FilesetOverrides{}) if err != nil { return nil, nil, err } diff --git a/filebeat/fileset/modules.go b/filebeat/fileset/modules.go index 158b45f56d3..b1482033c91 100644 --- a/filebeat/fileset/modules.go +++ b/filebeat/fileset/modules.go @@ -46,12 +46,17 @@ type Module struct { config ModuleConfig } +type FilesetOverrides struct { + EnableAllFilesets bool + ForceEnableModuleFilesets bool +} + // newModuleRegistry reads and loads the configured module into the registry. func newModuleRegistry(modulesPath string, moduleConfigs []*ModuleConfig, overrides *ModuleOverrides, beatInfo beat.Info, - enableAllFilesets bool, + filesetOverrides FilesetOverrides, ) (*ModuleRegistry, error) { reg := ModuleRegistry{ registry: []Module{}, @@ -61,7 +66,7 @@ func newModuleRegistry(modulesPath string, for _, mcfg := range moduleConfigs { // an empty ModuleConfig can reach this so we only force enable a // config if the Module name is set and Enabled pointer is valid. - if enableAllFilesets && mcfg.Module != "" && mcfg.Enabled != nil { + if (filesetOverrides.EnableAllFilesets || filesetOverrides.ForceEnableModuleFilesets) && mcfg.Module != "" && mcfg.Enabled != nil { *mcfg.Enabled = true } if mcfg.Module == "" || (mcfg.Enabled != nil && !(*mcfg.Enabled)) { @@ -80,8 +85,18 @@ func newModuleRegistry(modulesPath string, config: *mcfg, filesets: []Fileset{}, } - for filesetName, fcfg := range mcfg.Filesets { + if filesetOverrides.ForceEnableModuleFilesets { + if mcfg.Filesets == nil { + mcfg.Filesets = make(map[string]*FilesetConfig) + } + for _, fName := range moduleFilesets { + if _, ok := mcfg.Filesets[fName]; !ok { + mcfg.Filesets[fName] = &FilesetConfig{Enabled: func() *bool { b := true; return &b }()} + } + } + } + for filesetName, fcfg := range mcfg.Filesets { fcfg, err = applyOverrides(fcfg, mcfg.Module, filesetName, overrides) if err != nil { return nil, fmt.Errorf("error applying overrides on fileset %s/%s: %w", mcfg.Module, filesetName, err) @@ -89,7 +104,7 @@ func newModuleRegistry(modulesPath string, // ModuleConfig can have empty Filesets so we only force // enable if the Enabled pointer is valid - if enableAllFilesets && fcfg.Enabled != nil { + if (filesetOverrides.EnableAllFilesets || filesetOverrides.ForceEnableModuleFilesets) && fcfg.Enabled != nil { *fcfg.Enabled = true } if fcfg.Enabled != nil && !(*fcfg.Enabled) { @@ -128,14 +143,14 @@ func newModuleRegistry(modulesPath string, } // NewModuleRegistry reads and loads the configured module into the registry. -func NewModuleRegistry(moduleConfigs []*conf.C, beatInfo beat.Info, init bool, enableAllFilesets bool) (*ModuleRegistry, error) { +func NewModuleRegistry(moduleConfigs []*conf.C, beatInfo beat.Info, init bool, filesetOverrides FilesetOverrides) (*ModuleRegistry, error) { modulesPath := paths.Resolve(paths.Home, "module") stat, err := os.Stat(modulesPath) if err != nil || !stat.IsDir() { log := logp.NewLogger(logName) log.Errorf("Not loading modules. Module directory not found: %s", modulesPath) - return &ModuleRegistry{log: log}, nil // empty registry, no error + return &ModuleRegistry{log: log}, nil //nolint:nilerr // empty registry, no error } var modulesCLIList []string @@ -146,7 +161,7 @@ func NewModuleRegistry(moduleConfigs []*conf.C, beatInfo beat.Info, init bool, e return nil, err } } - var mcfgs []*ModuleConfig + var mcfgs []*ModuleConfig //nolint:prealloc //breaks tests for _, cfg := range moduleConfigs { cfg, err = mergePathDefaults(cfg) if err != nil { @@ -166,7 +181,7 @@ func NewModuleRegistry(moduleConfigs []*conf.C, beatInfo beat.Info, init bool, e } enableFilesetsFromOverrides(mcfgs, modulesOverrides) - return newModuleRegistry(modulesPath, mcfgs, modulesOverrides, beatInfo, enableAllFilesets) + return newModuleRegistry(modulesPath, mcfgs, modulesOverrides, beatInfo, filesetOverrides) } // enableFilesetsFromOverrides enables in mcfgs the filesets mentioned in overrides, @@ -433,7 +448,7 @@ func (reg *ModuleRegistry) Empty() bool { // ModuleNames returns the names of modules in the ModuleRegistry. func (reg *ModuleRegistry) ModuleNames() []string { - var modules []string + var modules []string //nolint:prealloc //breaks tests for _, m := range reg.registry { modules = append(modules, m.config.Module) } diff --git a/filebeat/fileset/modules_integration_test.go b/filebeat/fileset/modules_integration_test.go index 2d06db83c09..0d5ad2172c0 100644 --- a/filebeat/fileset/modules_integration_test.go +++ b/filebeat/fileset/modules_integration_test.go @@ -46,7 +46,7 @@ func TestLoadPipeline(t *testing.T) { t.Skip("Skip tests because ingest is missing in this elasticsearch version: ", client.GetVersion()) } - client.Request("DELETE", "/_ingest/pipeline/my-pipeline-id", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/my-pipeline-id", "", nil, nil) content := map[string]interface{}{ "description": "describe pipeline", @@ -98,8 +98,8 @@ func TestSetupNginx(t *testing.T) { t.Skip("Skip tests because ingest is missing in this elasticsearch version: ", client.GetVersion()) } - client.Request("DELETE", "/_ingest/pipeline/filebeat-5.2.0-nginx-access-default", "", nil, nil) - client.Request("DELETE", "/_ingest/pipeline/filebeat-5.2.0-nginx-error-pipeline", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-5.2.0-nginx-access-default", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-5.2.0-nginx-error-pipeline", "", nil, nil) modulesPath, err := filepath.Abs("../module") require.NoError(t, err) @@ -114,7 +114,7 @@ func TestSetupNginx(t *testing.T) { }, } - reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("5.2.0"), false) + reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("5.2.0"), FilesetOverrides{}) if err != nil { t.Fatal(err) } @@ -176,9 +176,9 @@ func TestLoadMultiplePipelines(t *testing.T) { t.Skip("Skip tests because ingest is missing the pipeline processor: ", client.GetVersion()) } - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-pipeline", "", nil, nil) - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-json_logs", "", nil, nil) - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-plain_logs", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-pipeline", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-json_logs", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multi-plain_logs", "", nil, nil) modulesPath, err := filepath.Abs("../_meta/test/module") require.NoError(t, err) @@ -193,7 +193,7 @@ func TestLoadMultiplePipelines(t *testing.T) { {"foo", &enabled, filesetConfigs}, } - reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("6.6.0"), false) + reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("6.6.0"), FilesetOverrides{}) if err != nil { t.Fatal(err) } @@ -221,9 +221,9 @@ func TestLoadMultiplePipelinesWithRollback(t *testing.T) { t.Skip("Skip tests because ingest is missing the pipeline processor: ", client.GetVersion()) } - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-pipeline", "", nil, nil) - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-json_logs", "", nil, nil) - client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-plain_logs_bad", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-pipeline", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-json_logs", "", nil, nil) + _, _, _ = client.Request("DELETE", "/_ingest/pipeline/filebeat-6.6.0-foo-multibad-plain_logs_bad", "", nil, nil) modulesPath, err := filepath.Abs("../_meta/test/module") require.NoError(t, err) @@ -238,7 +238,7 @@ func TestLoadMultiplePipelinesWithRollback(t *testing.T) { {"foo", &enabled, filesetConfigs}, } - reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("6.6.0"), false) + reg, err := newModuleRegistry(modulesPath, configs, nil, makeTestInfo("6.6.0"), FilesetOverrides{}) if err != nil { t.Fatal(err) } diff --git a/filebeat/fileset/modules_test.go b/filebeat/fileset/modules_test.go index f1baed9e5c5..2328e327c00 100644 --- a/filebeat/fileset/modules_test.go +++ b/filebeat/fileset/modules_test.go @@ -81,7 +81,7 @@ func TestNewModuleRegistry(t *testing.T) { }, } - reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, false) + reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, FilesetOverrides{}) require.NoError(t, err) assert.NotNil(t, reg) @@ -148,7 +148,7 @@ func TestNewModuleRegistryConfig(t *testing.T) { }, } - reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, false) + reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, FilesetOverrides{}) require.NoError(t, err) assert.NotNil(t, reg) @@ -174,7 +174,7 @@ func TestMovedModule(t *testing.T) { }, } - reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, false) + reg, err := newModuleRegistry(modulesPath, configs, nil, beat.Info{Version: "5.2.0"}, FilesetOverrides{}) require.NoError(t, err) assert.NotNil(t, reg) } @@ -445,7 +445,7 @@ func TestMissingModuleFolder(t *testing.T) { load(t, map[string]interface{}{"module": "nginx"}), } - reg, err := NewModuleRegistry(configs, beat.Info{Version: "5.2.0"}, true, false) + reg, err := NewModuleRegistry(configs, beat.Info{Version: "5.2.0"}, true, FilesetOverrides{}) require.NoError(t, err) assert.NotNil(t, reg) diff --git a/filebeat/fileset/setup.go b/filebeat/fileset/setup.go index 3ef5a6f2997..a17a504ab7f 100644 --- a/filebeat/fileset/setup.go +++ b/filebeat/fileset/setup.go @@ -29,22 +29,22 @@ type SetupFactory struct { beatInfo beat.Info pipelineLoaderFactory PipelineLoaderFactory overwritePipelines bool - enableAllFilesets bool + filesetOverrides FilesetOverrides } // NewSetupFactory creates a SetupFactory -func NewSetupFactory(beatInfo beat.Info, pipelineLoaderFactory PipelineLoaderFactory, enableAllFilesets bool) *SetupFactory { +func NewSetupFactory(beatInfo beat.Info, pipelineLoaderFactory PipelineLoaderFactory, filesetOverrides FilesetOverrides) *SetupFactory { return &SetupFactory{ beatInfo: beatInfo, pipelineLoaderFactory: pipelineLoaderFactory, overwritePipelines: true, - enableAllFilesets: enableAllFilesets, + filesetOverrides: filesetOverrides, } } // Create creates a new SetupCfgRunner to setup module configuration. func (sf *SetupFactory) Create(_ beat.PipelineConnector, c *conf.C) (cfgfile.Runner, error) { - m, err := NewModuleRegistry([]*conf.C{c}, sf.beatInfo, false, sf.enableAllFilesets) + m, err := NewModuleRegistry([]*conf.C{c}, sf.beatInfo, false, sf.filesetOverrides) if err != nil { return nil, err } diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go index a9ca55d8eb2..f6e1ca03f4c 100644 --- a/filebeat/input/filestream/config.go +++ b/filebeat/input/filestream/config.go @@ -33,6 +33,7 @@ import ( type config struct { Reader readerConfig `config:",inline"` + ID string `config:"id"` Paths []string `config:"paths"` Close closerConfig `config:"close"` FileWatcher *conf.Namespace `config:"prospector"` diff --git a/filebeat/input/filestream/copytruncate_prospector.go b/filebeat/input/filestream/copytruncate_prospector.go index 1f12f167a4c..10884cb9b94 100644 --- a/filebeat/input/filestream/copytruncate_prospector.go +++ b/filebeat/input/filestream/copytruncate_prospector.go @@ -329,7 +329,9 @@ func (p *copyTruncateFileProspector) onRotatedFile( hg.Start(ctx, src) return } - originalSrc := p.identifier.GetSource(loginp.FSEvent{NewPath: originalPath, Info: fi}) + descCopy := fe.Descriptor + descCopy.Info = fi + originalSrc := p.identifier.GetSource(loginp.FSEvent{NewPath: originalPath, Descriptor: descCopy}) p.rotatedFiles.addOriginalFile(originalPath, originalSrc) p.rotatedFiles.addRotatedFile(originalPath, fe.NewPath, src) hg.Start(ctx, src) diff --git a/filebeat/input/filestream/environment_test.go b/filebeat/input/filestream/environment_test.go index 2c121fa8c4a..cc53d23a214 100644 --- a/filebeat/input/filestream/environment_test.go +++ b/filebeat/input/filestream/environment_test.go @@ -374,7 +374,7 @@ func (e *inputTestingEnvironment) getRegistryState(key string) (registryEntry, e func getIDFromPath(filepath, inputID string, fi os.FileInfo) string { identifier, _ := newINodeDeviceIdentifier(nil) - src := identifier.GetSource(loginp.FSEvent{Info: fi, Op: loginp.OpCreate, NewPath: filepath}) + src := identifier.GetSource(loginp.FSEvent{Descriptor: loginp.FileDescriptor{Info: fi}, Op: loginp.OpCreate, NewPath: filepath}) return "filestream::" + inputID + "::" + src.Name() } diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go index 68ff28f47dd..39d0275cfef 100644 --- a/filebeat/input/filestream/fswatch.go +++ b/filebeat/input/filestream/fswatch.go @@ -18,7 +18,11 @@ package filestream import ( + "bufio" + "crypto/sha256" + "encoding/hex" "fmt" + "io" "os" "path/filepath" "time" @@ -28,35 +32,18 @@ import ( "github.com/elastic/beats/v7/filebeat/input/file" loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" - file_helper "github.com/elastic/beats/v7/libbeat/common/file" "github.com/elastic/beats/v7/libbeat/common/match" conf "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/logp" ) const ( - RecursiveGlobDepth = 8 - scannerName = "scanner" - watcherDebugKey = "file_watcher" + RecursiveGlobDepth = 8 + DefaultFingerprintSize int64 = 1024 // 1KB + scannerDebugKey = "scanner" + watcherDebugKey = "file_watcher" ) -var watcherFactories = map[string]watcherFactory{ - scannerName: newScannerWatcher, -} - -type watcherFactory func(paths []string, cfg *conf.C) (loginp.FSWatcher, error) - -// fileScanner looks for files which match the patterns in paths. -// It is able to exclude files and symlinks. -type fileScanner struct { - paths []string - excludedFiles []match.Matcher - includedFiles []match.Matcher - symlinks bool - - log *logp.Logger -} - type fileWatcherConfig struct { // Interval is the time between two scans. Interval time.Duration `config:"check_interval"` @@ -70,27 +57,22 @@ type fileWatcherConfig struct { // fileWatcher gets the list of files from a FSWatcher and creates events by // comparing the files between its last two runs. type fileWatcher struct { - interval time.Duration - resendOnModTime bool - prev map[string]os.FileInfo - scanner loginp.FSScanner - log *logp.Logger - events chan loginp.FSEvent - sameFileFunc func(os.FileInfo, os.FileInfo) bool + cfg fileWatcherConfig + prev map[string]loginp.FileDescriptor + scanner loginp.FSScanner + log *logp.Logger + events chan loginp.FSEvent } func newFileWatcher(paths []string, ns *conf.Namespace) (loginp.FSWatcher, error) { + var config *conf.C if ns == nil { - return newScannerWatcher(paths, conf.NewConfig()) + config = conf.NewConfig() + } else { + config = ns.Config() } - watcherType := ns.Name() - f, ok := watcherFactories[watcherType] - if !ok { - return nil, fmt.Errorf("no such file watcher: %s", watcherType) - } - - return f(paths, ns.Config()) + return newScannerWatcher(paths, config) } func newScannerWatcher(paths []string, c *conf.C) (loginp.FSWatcher, error) { @@ -104,13 +86,11 @@ func newScannerWatcher(paths []string, c *conf.C) (loginp.FSWatcher, error) { return nil, err } return &fileWatcher{ - log: logp.NewLogger(watcherDebugKey), - interval: config.Interval, - resendOnModTime: config.ResendOnModTime, - prev: make(map[string]os.FileInfo, 0), - scanner: scanner, - events: make(chan loginp.FSEvent), - sameFileFunc: os.SameFile, + log: logp.NewLogger(watcherDebugKey), + cfg: config, + prev: make(map[string]loginp.FileDescriptor, 0), + scanner: scanner, + events: make(chan loginp.FSEvent), }, nil } @@ -128,7 +108,7 @@ func (w *fileWatcher) Run(ctx unison.Canceler) { // run initial scan before starting regular w.watch(ctx) - _ = timed.Periodic(ctx, w.interval, func() error { + _ = timed.Periodic(ctx, w.cfg.Interval, func() error { w.watch(ctx) return nil @@ -140,140 +120,198 @@ func (w *fileWatcher) watch(ctx unison.Canceler) { paths := w.scanner.GetFiles() - newFiles := make(map[string]os.FileInfo) + // for debugging purposes + writtenCount := 0 + truncatedCount := 0 + renamedCount := 0 + removedCount := 0 + createdCount := 0 - for path, info := range paths { + newFilesByName := make(map[string]*loginp.FileDescriptor) + newFilesByID := make(map[string]*loginp.FileDescriptor) + for path, fd := range paths { // if the scanner found a new path or an existing path // with a different file, it is a new file - prevInfo, ok := w.prev[path] - if !ok || !w.sameFileFunc(prevInfo, info) { - newFiles[path] = info + prevDesc, ok := w.prev[path] + sfd := fd // to avoid memory aliasing + if !ok || !loginp.SameFile(&prevDesc, &sfd) { + newFilesByName[path] = &sfd + newFilesByID[fd.FileID()] = &sfd continue } - // if the two infos belong to the same file and it has been modified - // if the size is smaller than before, it is truncated, if bigger, it is a write event. - // It might happen that a file is truncated and then more data is added, both - // within the same second, this will make the reader stop, but a new one will not - // start because the modification data is the same, to avoid this situation, - // we also check for size changes here. - if prevInfo.ModTime() != info.ModTime() || prevInfo.Size() != info.Size() { - if prevInfo.Size() > info.Size() || w.resendOnModTime && prevInfo.Size() == info.Size() { - select { - case <-ctx.Done(): - return - case w.events <- truncateEvent(path, info): - } - } else { - select { - case <-ctx.Done(): - return - case w.events <- writeEvent(path, info): - } + var e loginp.FSEvent + switch { + + // the new size is smaller, the file was truncated + case prevDesc.Info.Size() > fd.Info.Size(): + e = truncateEvent(path, fd) + truncatedCount++ + + // the size is the same, timestamps are different, the file was touched + case prevDesc.Info.Size() == fd.Info.Size() && prevDesc.Info.ModTime() != fd.Info.ModTime(): + if w.cfg.ResendOnModTime { + e = truncateEvent(path, fd) + truncatedCount++ } + + // the new size is larger, something was written + case prevDesc.Info.Size() < fd.Info.Size(): + e = writeEvent(path, fd) + writtenCount++ } - // delete from previous state, as we have more up to date info + // if none of the conditions were true, the file remained unchanged and we don't need to create an event + if e.Op != loginp.OpDone { + select { + case <-ctx.Done(): + return + case w.events <- e: + } + } + + // delete from previous state to mark that we've seen the existing file again delete(w.prev, path) } - // remaining files are in the prev map are the ones that are missing + // remaining files in the prev map are the ones that are missing // either because they have been deleted or renamed - for removedPath, removedInfo := range w.prev { - for newPath, newInfo := range newFiles { - if w.sameFileFunc(removedInfo, newInfo) { - select { - case <-ctx.Done(): - return - case w.events <- renamedEvent(removedPath, newPath, newInfo): - delete(newFiles, newPath) - goto CHECK_NEXT_REMOVED - } - } + for remainingPath, remainingDesc := range w.prev { + var e loginp.FSEvent + + id := remainingDesc.FileID() + if newDesc, renamed := newFilesByID[id]; renamed { + e = renamedEvent(remainingPath, newDesc.Filename, *newDesc) + delete(newFilesByName, newDesc.Filename) + delete(newFilesByID, id) + renamedCount++ + } else { + e = deleteEvent(remainingPath, remainingDesc) + removedCount++ } - select { case <-ctx.Done(): return - case w.events <- deleteEvent(removedPath, removedInfo): + case w.events <- e: } - CHECK_NEXT_REMOVED: } - // remaining files in newFiles are new - for path, info := range newFiles { + // remaining files in newFiles are newly created files + for path, fd := range newFilesByName { + // no need to react on empty new files + if fd.Info.Size() == 0 { + w.log.Warnf("file %q has no content yet, skipping", fd.Filename) + delete(paths, path) + continue + } select { case <-ctx.Done(): return - case w.events <- createEvent(path, info): + case w.events <- createEvent(path, *fd): + createdCount++ } } - w.log.Debugf("Found %d paths", len(paths)) + w.log.With( + "total", len(paths), + "written", writtenCount, + "truncated", truncatedCount, + "renamed", renamedCount, + "removed", removedCount, + "created", createdCount, + ).Debugf("File scan complete") + w.prev = paths } -func createEvent(path string, fi os.FileInfo) loginp.FSEvent { - return loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: path, Info: fi} +func createEvent(path string, fd loginp.FileDescriptor) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: path, Descriptor: fd} } -func writeEvent(path string, fi os.FileInfo) loginp.FSEvent { - return loginp.FSEvent{Op: loginp.OpWrite, OldPath: path, NewPath: path, Info: fi} +func writeEvent(path string, fd loginp.FileDescriptor) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpWrite, OldPath: path, NewPath: path, Descriptor: fd} } -func truncateEvent(path string, fi os.FileInfo) loginp.FSEvent { - return loginp.FSEvent{Op: loginp.OpTruncate, OldPath: path, NewPath: path, Info: fi} +func truncateEvent(path string, fd loginp.FileDescriptor) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpTruncate, OldPath: path, NewPath: path, Descriptor: fd} } -func renamedEvent(oldPath, path string, fi os.FileInfo) loginp.FSEvent { - return loginp.FSEvent{Op: loginp.OpRename, OldPath: oldPath, NewPath: path, Info: fi} +func renamedEvent(oldPath, path string, fd loginp.FileDescriptor) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpRename, OldPath: oldPath, NewPath: path, Descriptor: fd} } -func deleteEvent(path string, fi os.FileInfo) loginp.FSEvent { - return loginp.FSEvent{Op: loginp.OpDelete, OldPath: path, NewPath: "", Info: fi} +func deleteEvent(path string, fd loginp.FileDescriptor) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpDelete, OldPath: path, NewPath: "", Descriptor: fd} } func (w *fileWatcher) Event() loginp.FSEvent { return <-w.events } -func (w *fileWatcher) GetFiles() map[string]os.FileInfo { +func (w *fileWatcher) GetFiles() map[string]loginp.FileDescriptor { return w.scanner.GetFiles() } +type fingerprintConfig struct { + Enabled bool `config:"enabled"` + Offset int64 `config:"offset"` + Length int64 `config:"length"` +} + type fileScannerConfig struct { - ExcludedFiles []match.Matcher `config:"exclude_files"` - IncludedFiles []match.Matcher `config:"include_files"` - Symlinks bool `config:"symlinks"` - RecursiveGlob bool `config:"recursive_glob"` + ExcludedFiles []match.Matcher `config:"exclude_files"` + IncludedFiles []match.Matcher `config:"include_files"` + Symlinks bool `config:"symlinks"` + RecursiveGlob bool `config:"recursive_glob"` + Fingerprint fingerprintConfig `config:"fingerprint"` } func defaultFileScannerConfig() fileScannerConfig { return fileScannerConfig{ Symlinks: false, RecursiveGlob: true, + Fingerprint: fingerprintConfig{ + Enabled: false, + Offset: 0, + Length: DefaultFingerprintSize, + }, } } -func newFileScanner(paths []string, cfg fileScannerConfig) (loginp.FSScanner, error) { - fs := fileScanner{ - paths: paths, - excludedFiles: cfg.ExcludedFiles, - includedFiles: cfg.IncludedFiles, - symlinks: cfg.Symlinks, - log: logp.NewLogger(scannerName), +// 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 +} + +func newFileScanner(paths []string, config fileScannerConfig) (loginp.FSScanner, error) { + s := fileScanner{ + paths: paths, + cfg: config, + log: logp.NewLogger(scannerDebugKey), } - err := fs.resolveRecursiveGlobs(cfg) + + if s.cfg.Fingerprint.Enabled { + if s.cfg.Fingerprint.Length < sha256.BlockSize { + err := fmt.Errorf("fingerprint size %d bytes cannot be smaller than %d bytes", config.Fingerprint.Length, sha256.BlockSize) + 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) + } + + err := s.resolveRecursiveGlobs(config) if err != nil { return nil, err } - err = fs.normalizeGlobPatterns() + err = s.normalizeGlobPatterns() if err != nil { return nil, err } - return &fs, nil + return &s, nil } // resolveRecursiveGlobs expands `**` from the globs in multiple patterns @@ -313,12 +351,14 @@ func (s *fileScanner) normalizeGlobPatterns() error { return nil } -// GetFiles returns a map of files and fileinfos which +// GetFiles returns a map of file descriptors by filenames that // match the configured paths. -func (s *fileScanner) GetFiles() map[string]os.FileInfo { - pathInfo := map[string]os.FileInfo{} - uniqFileID := map[string]os.FileInfo{} - +func (s *fileScanner) GetFiles() map[string]loginp.FileDescriptor { + fdByName := map[string]loginp.FileDescriptor{} + // used to determine if a symlink resolves in a already known target + uniqueIDs := map[string]string{} + // used to filter out duplicate matches + uniqueFiles := map[string]struct{}{} for _, path := range s.paths { matches, err := filepath.Glob(path) if err != nil { @@ -326,93 +366,143 @@ func (s *fileScanner) GetFiles() map[string]os.FileInfo { continue } - for _, file := range matches { - if s.shouldSkipFile(file) { + for _, filename := range matches { + // in case multiple globs match on the same file we filter out duplicates + if _, knownFile := uniqueFiles[filename]; knownFile { continue } + uniqueFiles[filename] = struct{}{} - // If symlink is enabled, it is checked that original is not part of same input - // If original is harvested by other input, states will potentially overwrite each other - if s.isOriginalAndSymlinkConfigured(file, uniqFileID) { + it, err := s.getIngestTarget(filename) + if err != nil { + s.log.Debugf("cannot create an ingest target for file %q: %s", filename, err) continue } - fileInfo, err := os.Stat(file) + fd, err := s.toFileDescriptor(&it) if err != nil { - s.log.Debug("stat(%s) failed: %s", file, err) + s.log.Warnf("cannot create a file descriptor for an ingest target %q: %s", filename, err) continue } - pathInfo[file] = fileInfo + + fileID := fd.FileID() + if knownFilename, exists := uniqueIDs[fileID]; exists { + s.log.Warnf("%q points to an already known ingest target %q [%s==%s]. Skipping", fd.Filename, knownFilename, fileID, fileID) + continue + } + uniqueIDs[fileID] = fd.Filename + fdByName[filename] = fd } } - return pathInfo + return fdByName } -func (s *fileScanner) shouldSkipFile(file string) bool { - if s.isFileExcluded(file) || !s.isFileIncluded(file) { - s.log.Debugf("Exclude file: %s", file) - return true - } +type ingestTarget struct { + filename string + originalFilename string + symlink bool + info os.FileInfo +} - fileInfo, err := os.Lstat(file) - if err != nil { - s.log.Debugf("lstat(%s) failed: %s", file, err) - return true +func (s *fileScanner) getIngestTarget(filename string) (it ingestTarget, err error) { + if s.isFileExcluded(filename) { + return it, fmt.Errorf("file %q is excluded from ingestion", filename) } - if fileInfo.IsDir() { - s.log.Debugf("Skipping directory: %s", file) - return true + if !s.isFileIncluded(filename) { + return it, fmt.Errorf("file %q is not included in ingestion", filename) } - isSymlink := fileInfo.Mode()&os.ModeSymlink > 0 - if isSymlink && !s.symlinks { - s.log.Debugf("File %s skipped as it is a symlink", file) - return true - } + it.filename = filename + it.originalFilename = filename - originalFile, err := filepath.EvalSymlinks(file) + it.info, err = os.Lstat(it.filename) // to determine if it's a symlink if err != nil { - s.log.Debugf("finding path to original file has failed %s: %+v", file, err) - return true + return it, fmt.Errorf("failed to lstat %q: %w", it.filename, err) } - // Check if original file is included to make sure we are not reading from - // unwanted files. - if s.isFileExcluded(originalFile) || !s.isFileIncluded(originalFile) { - s.log.Debugf("Exclude original file: %s", file) - return true + + if it.info.IsDir() { + return it, fmt.Errorf("file %q is a directory", it.filename) } - return false + it.symlink = it.info.Mode()&os.ModeSymlink > 0 + + if it.symlink { + if !s.cfg.Symlinks { + return it, fmt.Errorf("file %q is a symlink and they're disabled", it.filename) + } + + // now we know it's a symlink, we stat with link resolution + it.info, err = os.Stat(it.filename) + if err != nil { + return it, fmt.Errorf("failed to stat the symlink %q: %w", it.filename, err) + } + + it.originalFilename, err = filepath.EvalSymlinks(it.filename) + if err != nil { + return it, fmt.Errorf("failed to resolve the symlink %q: %w", it.filename, err) + } + + if s.isFileExcluded(it.originalFilename) { + return it, fmt.Errorf("file %q->%q is excluded from ingestion", it.filename, it.originalFilename) + } + + if !s.isFileIncluded(it.originalFilename) { + return it, fmt.Errorf("file %q->%q is not included in ingestion", it.filename, it.originalFilename) + } + } + + return it, nil } -func (s *fileScanner) isOriginalAndSymlinkConfigured(file string, uniqFileID map[string]os.FileInfo) bool { - if s.symlinks { - fileInfo, err := os.Stat(file) +func (s *fileScanner) toFileDescriptor(it *ingestTarget) (fd loginp.FileDescriptor, err error) { + fd.Filename = it.filename + fd.Info = it.info + + if s.cfg.Fingerprint.Enabled { + fileSize := it.info.Size() + 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) + } + + file, err := os.Open(it.originalFilename) if err != nil { - s.log.Debugf("stat(%s) failed: %s", file, err) - return false + return fd, fmt.Errorf("failed to open %q for fingerprinting: %w", it.originalFilename, err) } - fileID := file_helper.GetOSState(fileInfo).String() - if finfo, exists := uniqFileID[fileID]; exists { - s.log.Infof("Same file found as symlink and original. Skipping file: %s (as it same as %s)", file, finfo.Name()) - return true + defer file.Close() + + if s.cfg.Fingerprint.Offset != 0 { + _, err = file.Seek(s.cfg.Fingerprint.Offset, io.SeekStart) + if err != nil { + return fd, fmt.Errorf("failed to seek %q for fingerprinting: %w", fd.Filename, err) + } + } + + 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) + 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) + } + if written != s.cfg.Fingerprint.Length { + return fd, fmt.Errorf("failed to read %d bytes from %q to compute fingerprint, read only %d", written, fd.Filename, s.cfg.Fingerprint.Length) } - uniqFileID[fileID] = fileInfo + + fd.Fingerprint = hex.EncodeToString(h.Sum(nil)) } - return false + + return fd, nil } func (s *fileScanner) isFileExcluded(file string) bool { - return len(s.excludedFiles) > 0 && s.matchAny(s.excludedFiles, file) + return len(s.cfg.ExcludedFiles) > 0 && s.matchAny(s.cfg.ExcludedFiles, file) } func (s *fileScanner) isFileIncluded(file string) bool { - if len(s.includedFiles) == 0 { - return true - } - return s.matchAny(s.includedFiles, file) + return len(s.cfg.IncludedFiles) == 0 || s.matchAny(s.cfg.IncludedFiles, file) } // matchAny checks if the text matches any of the regular expressions diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index da656a1ca0f..ded2459628b 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -19,301 +19,951 @@ package filestream import ( "context" - "io/ioutil" + "fmt" "os" "path/filepath" + "sort" + "strings" "testing" "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" - "github.com/elastic/beats/v7/libbeat/common/match" + conf "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/logp" ) -var ( - excludedFileName = "excluded_file" - includedFileName = "included_file" - directoryPath = "unharvestable_dir" -) +func TestFileWatcher(t *testing.T) { + dir := t.TempDir() + paths := []string{filepath.Join(dir, "*.log")} + cfgStr := ` +scanner: + check_interval: 100ms + resend_on_touch: true + symlinks: false + recursive_glob: true + fingerprint: + enabled: false + offset: 0 + length: 1024 +` -func TestFileScanner(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "fswatch_test_file_scanner") - if err != nil { - t.Fatalf("cannot create temporary test dir: %v", err) - } - defer os.RemoveAll(tmpDir) - setupFilesForScannerTest(t, tmpDir) - - excludedFilePath := filepath.Join(tmpDir, excludedFileName) - includedFilePath := filepath.Join(tmpDir, includedFileName) - - testCases := map[string]struct { - paths []string - excludedFiles []match.Matcher - includedFiles []match.Matcher - symlinks bool - expectedFiles []string - }{ - "select all files": { - paths: []string{excludedFilePath, includedFilePath}, - expectedFiles: []string{excludedFilePath, includedFilePath}, - }, - "skip excluded files": { - paths: []string{excludedFilePath, includedFilePath}, - excludedFiles: []match.Matcher{ - match.MustCompile(excludedFileName), + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + fw := createWatcherWithConfig(t, paths, cfgStr) + + go fw.Run(ctx) + + t.Run("detects a new file", func(t *testing.T) { + basename := "created.log" + filename := filepath.Join(dir, basename) + err := os.WriteFile(filename, []byte("hello"), 0777) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 5}, // 5 bytes written }, - expectedFiles: []string{includedFilePath}, - }, - "only include included_files": { - paths: []string{excludedFilePath, includedFilePath}, - includedFiles: []match.Matcher{ - match.MustCompile(includedFileName), + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("detects a file write", func(t *testing.T) { + basename := "created.log" + filename := filepath.Join(dir, basename) + + f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0777) + require.NoError(t, err) + _, err = f.WriteString("world") + require.NoError(t, err) + f.Close() + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + OldPath: filename, + Op: loginp.OpWrite, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 10}, // +5 bytes appended }, - expectedFiles: []string{includedFilePath}, - }, - "skip directories": { - paths: []string{filepath.Join(tmpDir, directoryPath)}, - expectedFiles: []string{}, - }, - } + } + requireEqualEvents(t, expEvent, e) + }) - for name, test := range testCases { - test := test + t.Run("detects a file rename", func(t *testing.T) { + basename := "created.log" + filename := filepath.Join(dir, basename) + newBasename := "renamed.log" + newFilename := filepath.Join(dir, newBasename) - t.Run(name, func(t *testing.T) { - cfg := fileScannerConfig{ - ExcludedFiles: test.excludedFiles, - IncludedFiles: test.includedFiles, - Symlinks: test.symlinks, - RecursiveGlob: false, - } - fs, err := newFileScanner(test.paths, cfg) - if err != nil { - t.Fatal(err) - } - files := fs.GetFiles() - paths := make([]string, 0) - for p := range files { - paths = append(paths, p) + err := os.Rename(filename, newFilename) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: newFilename, + OldPath: filename, + Op: loginp.OpRename, + Descriptor: loginp.FileDescriptor{ + Filename: newFilename, + Info: testFileInfo{name: newBasename, size: 10}, + }, + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("detects a file truncate", func(t *testing.T) { + basename := "renamed.log" + filename := filepath.Join(dir, basename) + + err := os.Truncate(filename, 2) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + OldPath: filename, + Op: loginp.OpTruncate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 2}, + }, + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("emits truncate on touch when resend_on_touch is enabled", func(t *testing.T) { + basename := "renamed.log" + filename := filepath.Join(dir, basename) + time := time.Now().Local().Add(time.Hour) + err := os.Chtimes(filename, time, time) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + OldPath: filename, + Op: loginp.OpTruncate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 2}, + }, + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("detects a file remove", func(t *testing.T) { + basename := "renamed.log" + filename := filepath.Join(dir, basename) + + err := os.Remove(filename) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + OldPath: filename, + Op: loginp.OpDelete, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 2}, + }, + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("propagates a fingerprints for a new file", func(t *testing.T) { + dir := t.TempDir() + paths := []string{filepath.Join(dir, "*.log")} + cfgStr := ` +scanner: + check_interval: 100ms + symlinks: false + recursive_glob: true + fingerprint: + enabled: true + offset: 0 + length: 1024 +` + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + fw := createWatcherWithConfig(t, paths, cfgStr) + go fw.Run(ctx) + + basename := "created.log" + filename := filepath.Join(dir, basename) + err := os.WriteFile(filename, []byte(strings.Repeat("a", 1024)), 0777) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Fingerprint: "2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a", + Info: testFileInfo{name: basename, size: 1024}, + }, + } + requireEqualEvents(t, expEvent, e) + }) + + t.Run("does not emit events if a file is touched and resend_on_touch is disabled", func(t *testing.T) { + dir := t.TempDir() + paths := []string{filepath.Join(dir, "*.log")} + cfgStr := ` +scanner: + check_interval: 10ms +` + + ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Millisecond) + defer cancel() + + fw := createWatcherWithConfig(t, paths, cfgStr) + go fw.Run(ctx) + + basename := "created.log" + filename := filepath.Join(dir, basename) + err := os.WriteFile(filename, []byte(strings.Repeat("a", 1024)), 0777) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 1024}, + }, + } + requireEqualEvents(t, expEvent, e) + + time := time.Now().Local().Add(time.Hour) + err = os.Chtimes(filename, time, time) + require.NoError(t, err) + + e = fw.Event() + require.Equal(t, loginp.OpDone, e.Op) + }) + + t.Run("does not emit events for empty files", func(t *testing.T) { + dir := t.TempDir() + paths := []string{filepath.Join(dir, "*.log")} + cfgStr := ` +scanner: + check_interval: 10ms +` + + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + err := logp.DevelopmentSetup(logp.ToObserverOutput()) + require.NoError(t, err) + + fw := createWatcherWithConfig(t, paths, cfgStr) + go fw.Run(ctx) + + basename := "created.log" + filename := filepath.Join(dir, basename) + err = os.WriteFile(filename, nil, 0777) + require.NoError(t, err) + + t.Run("issues a warning in logs", func(t *testing.T) { + var lastWarning string + expLogMsg := fmt.Sprintf("file %q has no content yet, skipping", filename) + require.Eventually(t, func() bool { + logs := logp.ObserverLogs().FilterLevelExact(logp.WarnLevel.ZapLevel()).TakeAll() + if len(logs) == 0 { + return false + } + lastWarning = logs[len(logs)-1].Message + return strings.Contains(lastWarning, expLogMsg) + }, 100*time.Millisecond, 10*time.Millisecond, "required a warning message %q but got %q", expLogMsg, lastWarning) + }) + + t.Run("emits a create event once something is written to the empty file", func(t *testing.T) { + err = os.WriteFile(filename, []byte("hello"), 0777) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Info: testFileInfo{name: basename, size: 5}, // +5 bytes appended + }, } - assert.ElementsMatch(t, paths, test.expectedFiles) + requireEqualEvents(t, expEvent, e) }) - } + }) + + t.Run("does not emit an event for a fingerprint collision", func(t *testing.T) { + dir := t.TempDir() + paths := []string{filepath.Join(dir, "*.log")} + cfgStr := ` +scanner: + check_interval: 10ms + fingerprint.enabled: true +` + + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + fw := createWatcherWithConfig(t, paths, cfgStr) + go fw.Run(ctx) + + basename := "created.log" + filename := filepath.Join(dir, basename) + err := os.WriteFile(filename, []byte(strings.Repeat("a", 1024)), 0777) + require.NoError(t, err) + + e := fw.Event() + expEvent := loginp.FSEvent{ + NewPath: filename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: filename, + Fingerprint: "2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a", + Info: testFileInfo{name: basename, size: 1024}, + }, + } + requireEqualEvents(t, expEvent, e) + + // collisions are resolved in the alphabetical order, the first filename wins + basename = "created_collision.log" + filename = filepath.Join(dir, basename) + err = os.WriteFile(filename, []byte(strings.Repeat("a", 1024)), 0777) + require.NoError(t, err) + + e = fw.Event() + // means no event + require.Equal(t, loginp.OpDone, e.Op) + }) + + t.Run("does not log warnings on duplicate globs and filters out duplicates", func(t *testing.T) { + dir := t.TempDir() + firstBasename := "file-123.ndjson" + secondBasename := "file-watcher-123.ndjson" + firstFilename := filepath.Join(dir, firstBasename) + secondFilename := filepath.Join(dir, secondBasename) + err := os.WriteFile(firstFilename, []byte("line\n"), 0777) + require.NoError(t, err) + err = os.WriteFile(secondFilename, []byte("line\n"), 0777) + require.NoError(t, err) + + paths := []string{ + // to emulate the case we have in the agent monitoring + filepath.Join(dir, "file-*.ndjson"), + filepath.Join(dir, "file-watcher-*.ndjson"), + } + cfgStr := ` +scanner: + check_interval: 100ms +` + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + err = logp.DevelopmentSetup(logp.ToObserverOutput()) + require.NoError(t, err) + + fw := createWatcherWithConfig(t, paths, cfgStr) + + go fw.Run(ctx) + + expectedEvents := []loginp.FSEvent{ + { + NewPath: firstFilename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: firstFilename, + Info: testFileInfo{name: firstBasename, size: 5}, // "line\n" + }, + }, + { + NewPath: secondFilename, + Op: loginp.OpCreate, + Descriptor: loginp.FileDescriptor{ + Filename: secondFilename, + Info: testFileInfo{name: secondBasename, size: 5}, // "line\n" + }, + }, + } + var actualEvents []loginp.FSEvent + actualEvents = append(actualEvents, fw.Event()) + actualEvents = append(actualEvents, fw.Event()) + + // since this is coming from a map, the order is not deterministic + // we need to sort events based on paths first + // we expect only creation events for two different files, so it's alright. + sort.Slice(actualEvents, func(i, j int) bool { + return actualEvents[i].NewPath < actualEvents[j].NewPath + }) + sort.Slice(expectedEvents, func(i, j int) bool { + return expectedEvents[i].NewPath < expectedEvents[j].NewPath + }) + + for i, actualEvent := range actualEvents { + requireEqualEvents(t, expectedEvents[i], actualEvent) + } + + logs := logp.ObserverLogs().FilterLevelExact(logp.WarnLevel.ZapLevel()).TakeAll() + require.Lenf(t, logs, 0, "must be no warning messages, got: %v", logs) + }) } -func setupFilesForScannerTest(t *testing.T, tmpDir string) { - err := os.Mkdir(filepath.Join(tmpDir, directoryPath), 0750) - if err != nil { - t.Fatalf("cannot create non harvestable directory: %v", err) +func TestFileScanner(t *testing.T) { + dir := t.TempDir() + dir2 := t.TempDir() // for symlink testing + paths := []string{filepath.Join(dir, "*.log")} + + normalBasename := "normal.log" + undersizedBasename := "undersized.log" + excludedBasename := "excluded.log" + excludedIncludedBasename := "excluded_included.log" + travelerBasename := "traveler.log" + normalSymlinkBasename := "normal_symlink.log" + exclSymlinkBasename := "excl_symlink.log" + travelerSymlinkBasename := "portal.log" + + normalFilename := filepath.Join(dir, normalBasename) + undersizedFilename := filepath.Join(dir, undersizedBasename) + excludedFilename := filepath.Join(dir, excludedBasename) + excludedIncludedFilename := filepath.Join(dir, excludedIncludedBasename) + travelerFilename := filepath.Join(dir2, travelerBasename) + normalSymlinkFilename := filepath.Join(dir, normalSymlinkBasename) + exclSymlinkFilename := filepath.Join(dir, exclSymlinkBasename) + travelerSymlinkFilename := filepath.Join(dir, travelerSymlinkBasename) + + files := map[string]string{ + normalFilename: strings.Repeat("a", 1024), + undersizedFilename: strings.Repeat("a", 128), + excludedFilename: strings.Repeat("nothing to see here", 1024), + excludedIncludedFilename: strings.Repeat("perhaps something to see here", 1024), + travelerFilename: strings.Repeat("folks, I think I got lost", 1024), } - for _, path := range []string{excludedFileName, includedFileName} { - f, err := os.Create(filepath.Join(tmpDir, path)) - if err != nil { - t.Fatalf("file %s, error %v", path, err) - } - f.Close() + + sizes := make(map[string]int64, len(files)) + for filename, content := range files { + sizes[filename] = int64(len(content)) } -} + for filename, content := range files { + err := os.WriteFile(filename, []byte(content), 0777) + require.NoError(t, err) + } + + // this is to test that a symlink for a known file does not add the file twice + err := os.Symlink(normalFilename, normalSymlinkFilename) + require.NoError(t, err) + + // this is to test that a symlink for an unknown file is added once + err = os.Symlink(travelerFilename, travelerSymlinkFilename) + require.NoError(t, err) + + // this is to test that a symlink to an excluded file is not added + err = os.Symlink(exclSymlinkFilename, exclSymlinkFilename) + require.NoError(t, err) -func TestFileWatchNewDeleteModified(t *testing.T) { - oldTs := time.Now() - newTs := oldTs.Add(5 * time.Second) - testCases := map[string]struct { - prevFiles map[string]os.FileInfo - nextFiles map[string]os.FileInfo - expectedEvents []loginp.FSEvent + // this is to test that directories are handled and excluded + err = os.Mkdir(filepath.Join(dir, "dir"), 0777) + require.NoError(t, err) + + cases := []struct { + name string + cfgStr string + expDesc map[string]loginp.FileDescriptor }{ - "one new file": { - prevFiles: map[string]os.FileInfo{}, - nextFiles: map[string]os.FileInfo{ - "new_path": testFileInfo{"new_path", 5, oldTs, nil}, - }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpCreate, OldPath: "", NewPath: "new_path", Info: testFileInfo{"new_path", 5, oldTs, nil}}, + { + name: "returns all files when no limits, not including the repeated symlink", + cfgStr: ` +scanner: + symlinks: true + recursive_glob: true + fingerprint: + enabled: false + offset: 0 + length: 1024 +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + undersizedFilename: { + Filename: undersizedFilename, + Info: testFileInfo{ + size: sizes[undersizedFilename], + name: undersizedBasename, + }, + }, + excludedFilename: { + Filename: excludedFilename, + Info: testFileInfo{ + size: sizes[excludedFilename], + name: excludedBasename, + }, + }, + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, + travelerSymlinkFilename: { + Filename: travelerSymlinkFilename, + Info: testFileInfo{ + size: sizes[travelerFilename], + name: travelerSymlinkBasename, + }, + }, }, }, - "one deleted file": { - prevFiles: map[string]os.FileInfo{ - "old_path": testFileInfo{"old_path", 5, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{}, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpDelete, OldPath: "old_path", NewPath: "", Info: testFileInfo{"old_path", 5, oldTs, nil}}, + { + name: "returns filtered files, excluding symlinks", + cfgStr: ` +scanner: + symlinks: false # symlinks are disabled + recursive_glob: false + fingerprint: + enabled: false + offset: 0 + length: 1024 +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + undersizedFilename: { + Filename: undersizedFilename, + Info: testFileInfo{ + size: sizes[undersizedFilename], + name: undersizedBasename, + }, + }, + excludedFilename: { + Filename: excludedFilename, + Info: testFileInfo{ + size: sizes[excludedFilename], + name: excludedBasename, + }, + }, + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, }, }, - "one modified file": { - prevFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 5, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 10, newTs, nil}, - }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpWrite, OldPath: "path", NewPath: "path", Info: testFileInfo{"path", 10, newTs, nil}}, + { + name: "returns files according to excluded list", + cfgStr: ` +scanner: + exclude_files: ['.*exclude.*'] + symlinks: true + recursive_glob: true + fingerprint: + enabled: false + offset: 0 + length: 1024 +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + undersizedFilename: { + Filename: undersizedFilename, + Info: testFileInfo{ + size: sizes[undersizedFilename], + name: undersizedBasename, + }, + }, + travelerSymlinkFilename: { + Filename: travelerSymlinkFilename, + Info: testFileInfo{ + size: sizes[travelerFilename], + name: travelerSymlinkBasename, + }, + }, }, }, - "two modified files": { - prevFiles: map[string]os.FileInfo{ - "path1": testFileInfo{"path1", 5, oldTs, nil}, - "path2": testFileInfo{"path2", 5, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path1": testFileInfo{"path1", 10, newTs, nil}, - "path2": testFileInfo{"path2", 10, newTs, nil}, - }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs, nil}}, - {Op: loginp.OpWrite, OldPath: "path2", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs, nil}}, + { + name: "returns no symlink if the original file is excluded", + cfgStr: ` +scanner: + exclude_files: ['.*exclude.*', '.*traveler.*'] + symlinks: true +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + undersizedFilename: { + Filename: undersizedFilename, + Info: testFileInfo{ + size: sizes[undersizedFilename], + name: undersizedBasename, + }, + }, }, }, - "one modified file, one new file": { - prevFiles: map[string]os.FileInfo{ - "path1": testFileInfo{"path1", 5, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path1": testFileInfo{"path1", 10, newTs, nil}, - "path2": testFileInfo{"path2", 10, newTs, nil}, + { + name: "returns files according to included list", + cfgStr: ` +scanner: + include_files: ['.*include.*'] + symlinks: true + recursive_glob: true + fingerprint: + enabled: false + offset: 0 + length: 1024 +`, + expDesc: map[string]loginp.FileDescriptor{ + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs, nil}}, - {Op: loginp.OpCreate, OldPath: "", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs, nil}}, + }, + { + name: "returns no included symlink if the original file is not included", + cfgStr: ` +scanner: + include_files: ['.*include.*', '.*portal.*'] + symlinks: true +`, + expDesc: map[string]loginp.FileDescriptor{ + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, }, }, - "one new file, one deleted file": { - prevFiles: map[string]os.FileInfo{ - "path_deleted": testFileInfo{"path_deleted", 5, oldTs, nil}, + { + name: "returns an included symlink if the original file is included", + cfgStr: ` +scanner: + include_files: ['.*include.*', '.*portal.*', '.*traveler.*'] + symlinks: true +`, + expDesc: map[string]loginp.FileDescriptor{ + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, + travelerSymlinkFilename: { + Filename: travelerSymlinkFilename, + Info: testFileInfo{ + size: sizes[travelerFilename], + name: travelerSymlinkBasename, + }, + }, }, - nextFiles: map[string]os.FileInfo{ - "path_new": testFileInfo{"path_new", 10, newTs, nil}, + }, + { + name: "returns all files except too small to fingerprint", + cfgStr: ` +scanner: + symlinks: true + recursive_glob: true + fingerprint: + enabled: true + offset: 0 + length: 1024 +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Fingerprint: "2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a", + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + excludedFilename: { + Filename: excludedFilename, + Fingerprint: "bd151321c3bbdb44185414a1b56b5649a00206dd4792e7230db8904e43987336", + Info: testFileInfo{ + size: sizes[excludedFilename], + name: excludedBasename, + }, + }, + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Fingerprint: "bfdb99a65297062658c26dfcea816d76065df2a2da2594bfd9b96e9e405da1c2", + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, + travelerSymlinkFilename: { + Filename: travelerSymlinkFilename, + Fingerprint: "c4058942bffcea08810a072d5966dfa5c06eb79b902bf0011890dd8d22e1a5f8", + Info: testFileInfo{ + size: sizes[travelerFilename], + name: travelerSymlinkBasename, + }, + }, }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpDelete, OldPath: "path_deleted", NewPath: "", Info: testFileInfo{"path_deleted", 5, oldTs, nil}}, - {Op: loginp.OpCreate, OldPath: "", NewPath: "path_new", Info: testFileInfo{"path_new", 10, newTs, nil}}, + }, + { + name: "returns all files that match a non-standard fingerprint window", + cfgStr: ` +scanner: + symlinks: true + recursive_glob: true + fingerprint: + enabled: true + offset: 2 + length: 64 +`, + expDesc: map[string]loginp.FileDescriptor{ + normalFilename: { + Filename: normalFilename, + Fingerprint: "ffe054fe7ae0cb6dc65c3af9b61d5209f439851db43d0ba5997337df154668eb", + Info: testFileInfo{ + size: sizes[normalFilename], + name: normalBasename, + }, + }, + // undersizedFilename got excluded because of the matching fingerprint + excludedFilename: { + Filename: excludedFilename, + Fingerprint: "9c225a1e6a7df9c869499e923565b93937e88382bb9188145f117195cd41dcd1", + Info: testFileInfo{ + size: sizes[excludedFilename], + name: excludedBasename, + }, + }, + excludedIncludedFilename: { + Filename: excludedIncludedFilename, + Fingerprint: "7985b2b9750bdd3c76903db408aff3859204d6334279eaf516ecaeb618a218d5", + Info: testFileInfo{ + size: sizes[excludedIncludedFilename], + name: excludedIncludedBasename, + }, + }, + travelerSymlinkFilename: { + Filename: travelerSymlinkFilename, + Fingerprint: "da437600754a8eed6c194b7241b078679551c06c7dc89685a9a71be7829ad7e5", + Info: testFileInfo{ + size: sizes[travelerFilename], + name: travelerSymlinkBasename, + }, + }, }, }, } - for name, test := range testCases { - test := test + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + s := createScannerWithConfig(t, paths, tc.cfgStr) + requireEqualFiles(t, tc.expDesc, s.GetFiles()) + }) + } - t.Run(name, func(t *testing.T) { - w := fileWatcher{ - log: logp.L(), - prev: test.prevFiles, - scanner: &mockScanner{test.nextFiles}, - events: make(chan loginp.FSEvent), - sameFileFunc: testSameFile, - } + t.Run("returns error when creating scanner with a fingerprint too small", func(t *testing.T) { + cfgStr := ` +scanner: + fingerprint: + enabled: true + offset: 0 + length: 1 +` + cfg, err := conf.NewConfigWithYAML([]byte(cfgStr), cfgStr) + require.NoError(t, err) - go w.watch(context.Background()) + ns := &conf.Namespace{} + err = ns.Unpack(cfg) + require.NoError(t, err) - count := len(test.expectedEvents) - actual := make([]loginp.FSEvent, count) - for i := 0; i < count; i++ { - actual[i] = w.Event() - } + _, err = newFileWatcher(paths, ns) + require.Error(t, err) + require.Contains(t, err.Error(), "fingerprint size 1 bytes cannot be smaller than 64 bytes") + }) +} - assert.ElementsMatch(t, actual, test.expectedEvents) - }) +const benchmarkFileCount = 1000 + +func BenchmarkGetFiles(b *testing.B) { + dir := b.TempDir() + basenameFormat := "file-%d.log" + + for i := 0; i < benchmarkFileCount; i++ { + filename := filepath.Join(dir, fmt.Sprintf(basenameFormat, i)) + content := fmt.Sprintf("content-%d\n", i) + err := os.WriteFile(filename, []byte(strings.Repeat(content, 1024)), 0777) + require.NoError(b, err) } -} -func TestFileWatcherTruncate(t *testing.T) { - oldTs := time.Now() - newTs := oldTs.Add(time.Second) - testCases := map[string]struct { - prevFiles map[string]os.FileInfo - nextFiles map[string]os.FileInfo - expectedEvents []loginp.FSEvent - }{ - "truncated file, only size changes": { - prevFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 42, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 0, oldTs, nil}, - }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpTruncate, OldPath: "path", NewPath: "path", Info: testFileInfo{"path", 0, oldTs, nil}}, - }, - }, - "truncated file, mod time and size changes": { - prevFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 42, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 0, newTs, nil}, - }, - expectedEvents: []loginp.FSEvent{ - {Op: loginp.OpTruncate, OldPath: "path", NewPath: "path", Info: testFileInfo{"path", 0, newTs, nil}}, + s := fileScanner{ + paths: []string{filepath.Join(dir, "*.log")}, + cfg: fileScannerConfig{ + Fingerprint: fingerprintConfig{ + Enabled: false, }, }, - "no file change": { - prevFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 42, oldTs, nil}, - }, - nextFiles: map[string]os.FileInfo{ - "path": testFileInfo{"path", 42, oldTs, nil}, + } + + for i := 0; i < b.N; i++ { + files := s.GetFiles() + require.Len(b, files, benchmarkFileCount) + } +} + +func BenchmarkGetFilesWithFingerprint(b *testing.B) { + dir := b.TempDir() + basenameFormat := "file-%d.log" + + for i := 0; i < benchmarkFileCount; i++ { + filename := filepath.Join(dir, fmt.Sprintf(basenameFormat, i)) + content := fmt.Sprintf("content-%d\n", i) + 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, }, - expectedEvents: []loginp.FSEvent{}, }, } - for name, test := range testCases { - t.Run(name, func(t *testing.T) { - w := fileWatcher{ - log: logp.L(), - prev: test.prevFiles, - scanner: &mockScanner{test.nextFiles}, - events: make(chan loginp.FSEvent, len(test.expectedEvents)), - sameFileFunc: testSameFile, - } + for i := 0; i < b.N; i++ { + files := s.GetFiles() + require.Len(b, files, benchmarkFileCount) + } +} - w.watch(context.Background()) - close(w.events) +func createWatcherWithConfig(t *testing.T, paths []string, cfgStr string) loginp.FSWatcher { + cfg, err := conf.NewConfigWithYAML([]byte(cfgStr), cfgStr) + require.NoError(t, err) - actual := []loginp.FSEvent{} - for evt := range w.events { - actual = append(actual, evt) - } + ns := &conf.Namespace{} + err = ns.Unpack(cfg) + require.NoError(t, err) - if len(actual) != len(test.expectedEvents) { - t.Fatalf("expecting %d elements, got %d", len(test.expectedEvents), len(actual)) - } - for i := range test.expectedEvents { - if test.expectedEvents[i] != actual[i] { - t.Errorf("element [%d] differ. Expecting:\n%#v\nGot:\n%#v\n", i, test.expectedEvents[i], actual[i]) - } - } - }) + fw, err := newFileWatcher(paths, ns) + require.NoError(t, err) + + return fw +} + +func createScannerWithConfig(t *testing.T, paths []string, cfgStr string) loginp.FSScanner { + cfg, err := conf.NewConfigWithYAML([]byte(cfgStr), cfgStr) + require.NoError(t, err) + + ns := &conf.Namespace{} + err = ns.Unpack(cfg) + require.NoError(t, err) + + config := defaultFileWatcherConfig() + err = ns.Config().Unpack(&config) + require.NoError(t, err) + scanner, err := newFileScanner(paths, config.Scanner) + require.NoError(t, err) + + return scanner +} + +func requireEqualFiles(t *testing.T, expected, actual map[string]loginp.FileDescriptor) { + t.Helper() + require.Equalf(t, len(expected), len(actual), "amount of files does not match:\n\nexpected \n%v\n\n actual \n%v\n", filenames(expected), filenames(actual)) + + for expFilename, expFD := range expected { + actFD, exists := actual[expFilename] + require.Truef(t, exists, "the actual file list is missing expected filename %s", expFilename) + requireEqualDescriptors(t, expFD, actFD) } } -type mockScanner struct { - files map[string]os.FileInfo +func requireEqualEvents(t *testing.T, expected, actual loginp.FSEvent) { + t.Helper() + require.Equal(t, expected.NewPath, actual.NewPath, "NewPath") + require.Equal(t, expected.OldPath, actual.OldPath, "OldPath") + require.Equal(t, expected.Op, actual.Op, "Op") + requireEqualDescriptors(t, expected.Descriptor, actual.Descriptor) } -func (m *mockScanner) GetFiles() map[string]os.FileInfo { - return m.files +func requireEqualDescriptors(t *testing.T, expected, actual loginp.FileDescriptor) { + t.Helper() + require.Equal(t, expected.Filename, actual.Filename, "Filename") + require.Equal(t, expected.Fingerprint, actual.Fingerprint, "Fingerprint") + require.Equal(t, expected.Info.Name(), actual.Info.Name(), "Info.Name()") + require.Equal(t, expected.Info.Size(), actual.Info.Size(), "Info.Size()") } -type testFileInfo struct { - path string - size int64 - time time.Time - sys interface{} +func filenames(m map[string]loginp.FileDescriptor) (result string) { + for filename := range m { + result += filename + "\n" + } + return result } -func (t testFileInfo) Name() string { return t.path } -func (t testFileInfo) Size() int64 { return t.size } -func (t testFileInfo) Mode() os.FileMode { return 0 } -func (t testFileInfo) ModTime() time.Time { return t.time } -func (t testFileInfo) IsDir() bool { return false } -func (t testFileInfo) Sys() interface{} { return t.sys } +func BenchmarkToFileDescriptor(b *testing.B) { + dir := b.TempDir() + basename := "created.log" + filename := filepath.Join(dir, basename) + 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, + }, + }, + } -func testSameFile(fi1, fi2 os.FileInfo) bool { - return fi1.Name() == fi2.Name() + it, err := s.getIngestTarget(filename) + require.NoError(b, err) + + for i := 0; i < b.N; i++ { + fd, err := s.toFileDescriptor(&it) + require.NoError(b, err) + require.Equal(b, "2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a", fd.Fingerprint) + } } diff --git a/filebeat/input/filestream/identifier.go b/filebeat/input/filestream/identifier.go index 467ec64f23a..0cfeb031d63 100644 --- a/filebeat/input/filestream/identifier.go +++ b/filebeat/input/filestream/identifier.go @@ -19,7 +19,6 @@ package filestream import ( "fmt" - "os" loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" "github.com/elastic/beats/v7/libbeat/common/file" @@ -36,6 +35,7 @@ const ( nativeName = "native" pathName = "path" inodeMarkerName = "inode_marker" + fingerprintName = "fingerprint" DefaultIdentifierName = nativeName identitySep = "::" @@ -45,6 +45,7 @@ var identifierFactories = map[string]identifierFactory{ nativeName: newINodeDeviceIdentifier, pathName: newPathIdentifier, inodeMarkerName: newINodeMarkerIdentifier, + fingerprintName: newFingerprintIdentifier, } type identifierFactory func(*conf.C) (fileIdentifier, error) @@ -58,19 +59,19 @@ type fileIdentifier interface { // fileSource implements the Source interface // It is required to identify and manage file sources. type fileSource struct { - info os.FileInfo + desc loginp.FileDescriptor newPath string oldPath string truncated bool archived bool - name string + fileID string identifierGenerator string } // Name returns the registry identifier of the file. func (f fileSource) Name() string { - return f.name + return f.fileID } // newFileIdentifier creates a new state identifier for a log input. @@ -108,12 +109,12 @@ func newINodeDeviceIdentifier(_ *conf.C) (fileIdentifier, error) { func (i *inodeDeviceIdentifier) GetSource(e loginp.FSEvent) fileSource { return fileSource{ - info: e.Info, + desc: e.Descriptor, newPath: e.NewPath, oldPath: e.OldPath, truncated: e.Op == loginp.OpTruncate, archived: e.Op == loginp.OpArchived, - name: i.name + identitySep + file.GetOSState(e.Info).String(), + fileID: i.name + identitySep + file.GetOSState(e.Descriptor.Info).String(), identifierGenerator: i.name, } } @@ -147,12 +148,12 @@ func (p *pathIdentifier) GetSource(e loginp.FSEvent) fileSource { path = e.OldPath } return fileSource{ - info: e.Info, + desc: e.Descriptor, newPath: e.NewPath, oldPath: e.OldPath, truncated: e.Op == loginp.OpTruncate, archived: e.Op == loginp.OpArchived, - name: p.name + identitySep + path, + fileID: p.name + identitySep + path, identifierGenerator: p.name, } } @@ -179,7 +180,7 @@ func withSuffix(inner fileIdentifier, suffix string) fileIdentifier { func (s *suffixIdentifier) GetSource(e loginp.FSEvent) fileSource { fs := s.i.GetSource(e) - fs.name += "-" + s.suffix + fs.fileID += "-" + s.suffix return fs } diff --git a/filebeat/input/filestream/identifier_fingerprint.go b/filebeat/input/filestream/identifier_fingerprint.go new file mode 100644 index 00000000000..5fe524ebaf2 --- /dev/null +++ b/filebeat/input/filestream/identifier_fingerprint.go @@ -0,0 +1,59 @@ +// 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 filestream + +import ( + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + conf "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" +) + +type fingerprintIdentifier struct { + log *logp.Logger +} + +func newFingerprintIdentifier(cfg *conf.C) (fileIdentifier, error) { + return &fingerprintIdentifier{ + log: logp.NewLogger("fingerprint_identifier"), + }, nil +} + +func (i *fingerprintIdentifier) GetSource(e loginp.FSEvent) fileSource { + return fileSource{ + desc: e.Descriptor, + newPath: e.NewPath, + oldPath: e.OldPath, + truncated: e.Op == loginp.OpTruncate, + archived: e.Op == loginp.OpArchived, + fileID: fingerprintName + identitySep + e.Descriptor.Fingerprint, + identifierGenerator: fingerprintName, + } +} + +func (i *fingerprintIdentifier) Name() string { + return fingerprintName +} + +func (i *fingerprintIdentifier) Supports(f identifierFeature) bool { + switch f { + case trackRename: + return true + default: + } + return false +} diff --git a/filebeat/input/filestream/identifier_inode_deviceid.go b/filebeat/input/filestream/identifier_inode_deviceid.go index d5ef0aa6c65..af6a5610086 100644 --- a/filebeat/input/filestream/identifier_inode_deviceid.go +++ b/filebeat/input/filestream/identifier_inode_deviceid.go @@ -93,14 +93,14 @@ func (i *inodeMarkerIdentifier) markerContents() string { } func (i *inodeMarkerIdentifier) GetSource(e loginp.FSEvent) fileSource { - osstate := file.GetOSState(e.Info) + osstate := file.GetOSState(e.Descriptor.Info) return fileSource{ - info: e.Info, + desc: e.Descriptor, newPath: e.NewPath, oldPath: e.OldPath, truncated: e.Op == loginp.OpTruncate, archived: e.Op == loginp.OpArchived, - name: i.name + identitySep + osstate.InodeString() + "-" + i.markerContents(), + fileID: i.name + identitySep + osstate.InodeString() + "-" + i.markerContents(), identifierGenerator: i.name, } } diff --git a/filebeat/input/filestream/identifier_test.go b/filebeat/input/filestream/identifier_test.go index 4007161116f..ca67ba375d6 100644 --- a/filebeat/input/filestream/identifier_test.go +++ b/filebeat/input/filestream/identifier_test.go @@ -52,8 +52,8 @@ func TestFileIdentifier(t *testing.T) { } src := identifier.GetSource(loginp.FSEvent{ - NewPath: tmpFile.Name(), - Info: fi, + NewPath: tmpFile.Name(), + Descriptor: loginp.FileDescriptor{Info: fi}, }) assert.Equal(t, identifier.Name()+"::"+file.GetOSState(fi).String(), src.Name()) @@ -76,8 +76,8 @@ func TestFileIdentifier(t *testing.T) { } src := identifier.GetSource(loginp.FSEvent{ - NewPath: tmpFile.Name(), - Info: fi, + NewPath: tmpFile.Name(), + Descriptor: loginp.FileDescriptor{Info: fi}, }) assert.Equal(t, identifier.Name()+"::"+file.GetOSState(fi).String()+"-my-suffix", src.Name()) @@ -129,4 +129,56 @@ func TestFileIdentifier(t *testing.T) { assert.Equal(t, test.expectedSrc, src.Name()) } }) + + t.Run("fingerprint identifier", func(t *testing.T) { + c := conf.MustNewConfigFrom(map[string]interface{}{ + "identifier": map[string]interface{}{ + "fingerprint": nil, + }, + }) + var cfg testFileIdentifierConfig + err := c.Unpack(&cfg) + require.NoError(t, err) + + identifier, err := newFileIdentifier(cfg.Identifier, "") + require.NoError(t, err) + assert.Equal(t, fingerprintName, identifier.Name()) + + testCases := []struct { + newPath string + oldPath string + operation loginp.Operation + desc loginp.FileDescriptor + expectedSrc string + }{ + { + newPath: "/path/to/file", + desc: loginp.FileDescriptor{Fingerprint: "fingerprintvalue"}, + expectedSrc: fingerprintName + "::fingerprintvalue", + }, + { + newPath: "/new/path/to/file", + oldPath: "/old/path/to/file", + operation: loginp.OpRename, + desc: loginp.FileDescriptor{Fingerprint: "fingerprintvalue"}, + expectedSrc: fingerprintName + "::fingerprintvalue", + }, + { + oldPath: "/old/path/to/file", + operation: loginp.OpDelete, + desc: loginp.FileDescriptor{Fingerprint: "fingerprintvalue"}, + expectedSrc: fingerprintName + "::fingerprintvalue", + }, + } + + for _, test := range testCases { + src := identifier.GetSource(loginp.FSEvent{ + NewPath: test.newPath, + OldPath: test.oldPath, + Op: test.operation, + Descriptor: test.desc, + }) + assert.Equal(t, test.expectedSrc, src.Name()) + } + }) } diff --git a/filebeat/input/filestream/input.go b/filebeat/input/filestream/input.go index 30fcb916ef5..b935161c126 100644 --- a/filebeat/input/filestream/input.go +++ b/filebeat/input/filestream/input.go @@ -228,7 +228,7 @@ func (inp *filestream) open(log *logp.Logger, canceler input.Canceler, fs fileSo r = readfile.NewStripNewline(r, inp.readerConfig.LineTerminator) - r = readfile.NewFilemeta(r, fs.newPath, offset) + r = readfile.NewFilemeta(r, fs.newPath, fs.desc.Info, fs.desc.Fingerprint, offset) r = inp.parsers.Create(r) diff --git a/filebeat/input/filestream/internal/input-logfile/fswatch.go b/filebeat/input/filestream/internal/input-logfile/fswatch.go index 4f8fffe6741..dc00519c437 100644 --- a/filebeat/input/filestream/internal/input-logfile/fswatch.go +++ b/filebeat/input/filestream/internal/input-logfile/fswatch.go @@ -21,6 +21,8 @@ import ( "os" "github.com/elastic/go-concert/unison" + + file_helper "github.com/elastic/beats/v7/libbeat/common/file" ) const ( @@ -54,6 +56,33 @@ func (o *Operation) String() string { return name } +// FileDescriptor represents full information about a file. +type FileDescriptor struct { + // Filename is an original filename this descriptor was created from. + // In case it was a symlink, this will be the filename of the symlink unlike + // the filename from the `Info`. + Filename string + // Info is the result of file stat + Info os.FileInfo + // Fingerprint is a computed hash of the file header + Fingerprint string +} + +// FileID returns a unique file ID +// If fingerprint is computed it's used as the ID. +// Otherwise, a combination of the device ID and inode is used. +func (fd FileDescriptor) FileID() string { + if fd.Fingerprint != "" { + return fd.Fingerprint + } + return file_helper.GetOSState(fd.Info).String() +} + +// SameFile returns true if descriptors point to the same file. +func SameFile(a, b *FileDescriptor) bool { + return a.FileID() == b.FileID() +} + // FSEvent returns inforamation about file system changes. type FSEvent struct { // NewPath is the new path of the file. @@ -63,16 +92,16 @@ type FSEvent struct { OldPath string // Op is the file system event: create, write, rename, remove Op Operation - // Info describes the file in the event. - Info os.FileInfo + // Descriptor describes the file in the event. + Descriptor FileDescriptor } // FSScanner retrieves a list of files from the file system. type FSScanner interface { // GetFiles returns the list of monitored files. // The keys of the map are the paths to the files and - // the values are the FileInfos describing the file. - GetFiles() map[string]os.FileInfo + // the values are the file descriptors that contain all necessary information about the file. + GetFiles() map[string]FileDescriptor } // FSWatcher returns file events of the monitored files. diff --git a/filebeat/input/filestream/internal/input-logfile/input.go b/filebeat/input/filestream/internal/input-logfile/input.go index afb68f9ba8b..db3e713fbdd 100644 --- a/filebeat/input/filestream/internal/input-logfile/input.go +++ b/filebeat/input/filestream/internal/input-logfile/input.go @@ -30,6 +30,7 @@ import ( type managedInput struct { userID string + metricsID string manager *InputManager ackCH *updateChan sourceIdentifier *sourceIdentifier @@ -61,7 +62,7 @@ func (inp *managedInput) Run( defer cancel() ctx.Cancelation = cancelCtx - metrics := NewMetrics(ctx.ID) + metrics := NewMetrics(inp.metricsID) defer metrics.Close() hg := &defaultHarvesterGroup{ diff --git a/filebeat/input/filestream/internal/input-logfile/manager.go b/filebeat/input/filestream/internal/input-logfile/manager.go index 0e1895f8b83..c95efd1c5a1 100644 --- a/filebeat/input/filestream/internal/input-logfile/manager.go +++ b/filebeat/input/filestream/internal/input-logfile/manager.go @@ -177,10 +177,13 @@ func (cim *InputManager) Create(config *conf.C) (v2.Input, error) { " duplication, please add an ID and restart Filebeat") } + metricsID := settings.ID cim.idsMux.Lock() if _, exists := cim.ids[settings.ID]; exists { cim.Logger.Errorf("filestream input with ID '%s' already exists, this "+ - "will lead to data duplication, please use a different ID", settings.ID) + "will lead to data duplication, please use a different ID. Metrics "+ + "collection has been disabled on this input.", settings.ID) + metricsID = "" } // TODO: improve how inputs with empty IDs are tracked. @@ -223,6 +226,7 @@ func (cim *InputManager) Create(config *conf.C) (v2.Input, error) { manager: cim, ackCH: cim.ackCH, userID: settings.ID, + metricsID: metricsID, prospector: prospector, harvester: harvester, sourceIdentifier: sourceIdentifier, diff --git a/filebeat/input/filestream/legacy_metrics_integration_test.go b/filebeat/input/filestream/legacy_metrics_integration_test.go index 6c98a53a19c..649ede41f3e 100644 --- a/filebeat/input/filestream/legacy_metrics_integration_test.go +++ b/filebeat/input/filestream/legacy_metrics_integration_test.go @@ -71,7 +71,7 @@ func TestLegacyMetrics(t *testing.T) { filebeat.WriteConfigFile(cfg) filebeat.Start() - filebeat.WaitForLogs("Metrics endpoint listening on:", 10*time.Second, "The metric server is not running") + filebeat.WaitForLogs("Metrics endpoint listening on:", 10*time.Second) // After starting Filebeat all counters must be zero waitForMetrics(t, diff --git a/filebeat/input/filestream/logger.go b/filebeat/input/filestream/logger.go index 7963f11308d..7b644fd0d87 100644 --- a/filebeat/input/filestream/logger.go +++ b/filebeat/input/filestream/logger.go @@ -28,8 +28,11 @@ func loggerWithEvent(logger *logp.Logger, event loginp.FSEvent, src loginp.Sourc "operation", event.Op.String(), "source_name", src.Name(), ) - if event.Info != nil && event.Info.Sys() != nil { - log = log.With("os_id", file.GetOSState(event.Info)) + if event.Descriptor.Fingerprint != "" { + log = log.With("fingerprint", event.Descriptor.Fingerprint) + } + if event.Descriptor.Info != nil && event.Descriptor.Info.Sys() != nil { + log = log.With("os_id", file.GetOSState(event.Descriptor.Info)) } if event.NewPath != "" { log = log.With("new_path", event.NewPath) diff --git a/filebeat/input/filestream/prospector.go b/filebeat/input/filestream/prospector.go index 1e4a9c91c7f..336461fede5 100644 --- a/filebeat/input/filestream/prospector.go +++ b/filebeat/input/filestream/prospector.go @@ -78,12 +78,12 @@ func (p *fileProspector) Init( return "", nil } - fi, ok := files[fm.Source] + fd, ok := files[fm.Source] if !ok { return "", fm } - newKey := newID(p.identifier.GetSource(loginp.FSEvent{NewPath: fm.Source, Info: fi})) + newKey := newID(p.identifier.GetSource(loginp.FSEvent{NewPath: fm.Source, Descriptor: fd})) return newKey, fm }) @@ -109,13 +109,13 @@ func (p *fileProspector) Init( return "", nil } - fi, ok := files[fm.Source] + fd, ok := files[fm.Source] if !ok { return "", fm } if fm.IdentifierName != identifierName { - newKey := p.identifier.GetSource(loginp.FSEvent{NewPath: fm.Source, Info: fi}).Name() + newKey := p.identifier.GetSource(loginp.FSEvent{NewPath: fm.Source, Descriptor: fd}).Name() fm.IdentifierName = identifierName return newKey, fm } @@ -188,7 +188,7 @@ func (p *fileProspector) onFSEvent( } if p.isFileIgnored(log, event, ignoreSince) { - err := updater.ResetCursor(src, state{Offset: event.Info.Size()}) + err := updater.ResetCursor(src, state{Offset: event.Descriptor.Info.Size()}) if err != nil { log.Errorf("setting cursor for ignored file: %v", err) } @@ -224,12 +224,12 @@ func (p *fileProspector) onFSEvent( func (p *fileProspector) isFileIgnored(log *logp.Logger, fe loginp.FSEvent, ignoreInactiveSince time.Time) bool { if p.ignoreOlder > 0 { now := time.Now() - if now.Sub(fe.Info.ModTime()) > p.ignoreOlder { + if now.Sub(fe.Descriptor.Info.ModTime()) > p.ignoreOlder { log.Debugf("Ignore file because ignore_older reached. File %s", fe.NewPath) return true } } - if !ignoreInactiveSince.IsZero() && fe.Info.ModTime().Sub(ignoreInactiveSince) <= 0 { + if !ignoreInactiveSince.IsZero() && fe.Descriptor.Info.ModTime().Sub(ignoreInactiveSince) <= 0 { log.Debugf("Ignore file because ignore_since.* reached time %v. File %s", p.ignoreInactiveSince, fe.NewPath) return true } diff --git a/filebeat/input/filestream/prospector_creator.go b/filebeat/input/filestream/prospector_creator.go index 75a5e8dc3aa..5142704a614 100644 --- a/filebeat/input/filestream/prospector_creator.go +++ b/filebeat/input/filestream/prospector_creator.go @@ -24,6 +24,8 @@ import ( loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" + conf "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" ) const ( @@ -36,16 +38,25 @@ const ( var experimentalWarning sync.Once func newProspector(config config) (loginp.Prospector, error) { + err := checkConfigCompatibility(config.FileWatcher, config.FileIdentity) + if err != nil { + return nil, err + } + filewatcher, err := newFileWatcher(config.Paths, config.FileWatcher) if err != nil { return nil, fmt.Errorf("error while creating filewatcher %w", err) } - identifier, err := newFileIdentifier(config.FileIdentity, getIdentifierSuffix(config)) + identifier, err := newFileIdentifier(config.FileIdentity, config.Reader.Parsers.Suffix) if err != nil { return nil, fmt.Errorf("error while creating file identifier: %w", err) } + logp.L(). + With("filestream_id", config.ID). + Debugf("file identity is set to %s", identifier.Name()) + fileprospector := fileProspector{ filewatcher: filewatcher, identifier: identifier, @@ -104,6 +115,22 @@ func newProspector(config config) (loginp.Prospector, error) { return nil, fmt.Errorf("no such rotation method: %s", rotationMethod) } -func getIdentifierSuffix(config config) string { - return config.Reader.Parsers.Suffix +func checkConfigCompatibility(fileWatcher, fileIdentifier *conf.Namespace) error { + var fwCfg struct { + Fingerprint struct { + Enabled bool `config:"enabled"` + } `config:"fingerprint"` + } + + if fileWatcher != nil && fileIdentifier != nil && fileIdentifier.Name() == fingerprintName { + err := fileWatcher.Config().Unpack(&fwCfg) + if err != nil { + return fmt.Errorf("failed to parse file watcher configuration: %w", err) + } + if !fwCfg.Fingerprint.Enabled { + return fmt.Errorf("fingerprint file identity can be used only when fingerprint is enabled in the scanner") + } + } + + return nil } diff --git a/filebeat/input/filestream/prospector_creator_test.go b/filebeat/input/filestream/prospector_creator_test.go index bb87cc7118d..c49488ffd9c 100644 --- a/filebeat/input/filestream/prospector_creator_test.go +++ b/filebeat/input/filestream/prospector_creator_test.go @@ -21,31 +21,95 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + conf "github.com/elastic/elastic-agent-libs/config" ) -func TestCreateProspector_SetIgnoreInactiveSince(t *testing.T) { - testCases := map[string]struct { - ignore_inactive_since string - }{ - "ignore_inactive_since set to since_last_start": { - ignore_inactive_since: "since_last_start", - }, - "ignore_inactive_since set to since_first_start": { - ignore_inactive_since: "since_first_start", - }, - "ignore_inactive_since not set": { - ignore_inactive_since: "", - }, - } - for name, test := range testCases { - test := test - t.Run(name, func(t *testing.T) { - c := config{ - IgnoreInactive: ignoreInactiveSettings[test.ignore_inactive_since], - } - p, _ := newProspector(c) - fileProspector := p.(*fileProspector) - assert.Equal(t, fileProspector.ignoreInactiveSince, ignoreInactiveSettings[test.ignore_inactive_since]) - }) - } +func TestCreateProspector(t *testing.T) { + t.Run("SetIgnoreInactiveSince", func(t *testing.T) { + testCases := map[string]struct { + ignore_inactive_since string + }{ + "ignore_inactive_since set to since_last_start": { + ignore_inactive_since: "since_last_start", + }, + "ignore_inactive_since set to since_first_start": { + ignore_inactive_since: "since_first_start", + }, + "ignore_inactive_since not set": { + ignore_inactive_since: "", + }, + } + for name, test := range testCases { + test := test + t.Run(name, func(t *testing.T) { + c := config{ + IgnoreInactive: ignoreInactiveSettings[test.ignore_inactive_since], + } + p, _ := newProspector(c) + fileProspector := p.(*fileProspector) + assert.Equal(t, fileProspector.ignoreInactiveSince, ignoreInactiveSettings[test.ignore_inactive_since]) + }) + } + }) + t.Run("file watcher and file identity compatibility", func(t *testing.T) { + cases := []struct { + name string + cfgStr string + err string + }{ + { + name: "returns no error for a fully default config", + cfgStr: ` +paths: ['some'] +`, + }, + { + name: "returns no error when fingerprint and identity is configured", + cfgStr: ` +paths: ['some'] +file_identity.fingerprint: ~ +prospector.scanner.fingerprint.enabled: true +`, + }, + { + name: "returns no error when fingerprint and other identity is configured", + cfgStr: ` +paths: ['some'] +file_identity.path: ~ +prospector.scanner.fingerprint.enabled: true +`, + }, + { + name: "returns error when fingerprint is disabled but fingerprint identity is configured", + cfgStr: ` +paths: ['some'] +file_identity.fingerprint: ~ +prospector.scanner.fingerprint.enabled: false +`, + err: "fingerprint file identity can be used only when fingerprint is enabled in the scanner", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + c, err := conf.NewConfigWithYAML([]byte(tc.cfgStr), tc.cfgStr) + require.NoError(t, err) + + cfg := defaultConfig() + err = c.Unpack(&cfg) + require.NoError(t, err) + + _, err = newProspector(cfg) + if tc.err == "" { + require.NoError(t, err) + return + } + + require.Error(t, err) + require.Contains(t, err.Error(), tc.err) + }) + } + }) } diff --git a/filebeat/input/filestream/prospector_test.go b/filebeat/input/filestream/prospector_test.go index c3860856e58..834784c81da 100644 --- a/filebeat/input/filestream/prospector_test.go +++ b/filebeat/input/filestream/prospector_test.go @@ -21,6 +21,7 @@ package filestream import ( "context" "fmt" + "io/fs" "io/ioutil" "os" "sync" @@ -39,7 +40,7 @@ import ( func TestProspector_InitCleanIfRemoved(t *testing.T) { testCases := map[string]struct { entries map[string]loginp.Value - filesOnDisk map[string]os.FileInfo + filesOnDisk map[string]loginp.FileDescriptor cleanRemoved bool expectedCleanedKeys []string }{ @@ -108,7 +109,7 @@ func TestProspector_InitUpdateIdentifiers(t *testing.T) { testCases := map[string]struct { entries map[string]loginp.Value - filesOnDisk map[string]os.FileInfo + filesOnDisk map[string]loginp.FileDescriptor expectedUpdatedKeys map[string]string }{ "prospector init does not update keys if there are no entries": { @@ -137,8 +138,8 @@ func TestProspector_InitUpdateIdentifiers(t *testing.T) { }, }, }, - filesOnDisk: map[string]os.FileInfo{ - tmpFileName: fi, + filesOnDisk: map[string]loginp.FileDescriptor{ + tmpFileName: {Info: fi}, }, expectedUpdatedKeys: map[string]string{"not_path::key1": "path::" + tmpFileName}, }, @@ -170,8 +171,8 @@ func TestProspectorNewAndUpdatedFiles(t *testing.T) { }{ "two new files": { events: []loginp.FSEvent{ - {Op: loginp.OpCreate, NewPath: "/path/to/file", Info: testFileInfo{}}, - {Op: loginp.OpCreate, NewPath: "/path/to/other/file", Info: testFileInfo{}}, + {Op: loginp.OpCreate, NewPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, + {Op: loginp.OpCreate, NewPath: "/path/to/other/file", Descriptor: createTestFileDescriptor()}, }, expectedEvents: []harvesterEvent{ harvesterStart("path::/path/to/file"), @@ -181,7 +182,7 @@ func TestProspectorNewAndUpdatedFiles(t *testing.T) { }, "one updated file": { events: []loginp.FSEvent{ - {Op: loginp.OpWrite, NewPath: "/path/to/file", Info: testFileInfo{}}, + {Op: loginp.OpWrite, NewPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, }, expectedEvents: []harvesterEvent{ harvesterStart("path::/path/to/file"), @@ -190,8 +191,8 @@ func TestProspectorNewAndUpdatedFiles(t *testing.T) { }, "one updated then truncated file": { events: []loginp.FSEvent{ - {Op: loginp.OpWrite, NewPath: "/path/to/file", Info: testFileInfo{}}, - {Op: loginp.OpTruncate, NewPath: "/path/to/file", Info: testFileInfo{}}, + {Op: loginp.OpWrite, NewPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, + {Op: loginp.OpTruncate, NewPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, }, expectedEvents: []harvesterEvent{ harvesterStart("path::/path/to/file"), @@ -202,14 +203,14 @@ func TestProspectorNewAndUpdatedFiles(t *testing.T) { "old files with ignore older configured": { events: []loginp.FSEvent{ { - Op: loginp.OpCreate, - NewPath: "/path/to/file", - Info: testFileInfo{"/path/to/file", 5, minuteAgo, nil}, + Op: loginp.OpCreate, + NewPath: "/path/to/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/file", 5, minuteAgo, nil}), }, { - Op: loginp.OpWrite, - NewPath: "/path/to/other/file", - Info: testFileInfo{"/path/to/other/file", 5, minuteAgo, nil}, + Op: loginp.OpWrite, + NewPath: "/path/to/other/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/other/file", 5, minuteAgo, nil}), }, }, ignoreOlder: 10 * time.Second, @@ -220,14 +221,14 @@ func TestProspectorNewAndUpdatedFiles(t *testing.T) { "newer files with ignore older": { events: []loginp.FSEvent{ { - Op: loginp.OpCreate, - NewPath: "/path/to/file", - Info: testFileInfo{"/path/to/file", 5, minuteAgo, nil}, + Op: loginp.OpCreate, + NewPath: "/path/to/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/file", 5, minuteAgo, nil}), }, { - Op: loginp.OpWrite, - NewPath: "/path/to/other/file", - Info: testFileInfo{"/path/to/other/file", 5, minuteAgo, nil}, + Op: loginp.OpWrite, + NewPath: "/path/to/other/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/other/file", 5, minuteAgo, nil}), }, }, ignoreOlder: 5 * time.Minute, @@ -265,14 +266,14 @@ func TestProspectorHarvesterUpdateIgnoredFiles(t *testing.T) { minuteAgo := time.Now().Add(-1 * time.Minute) eventCreate := loginp.FSEvent{ - Op: loginp.OpCreate, - NewPath: "/path/to/file", - Info: testFileInfo{"/path/to/file", 5, minuteAgo, nil}, + Op: loginp.OpCreate, + NewPath: "/path/to/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/file", 5, minuteAgo, nil}), } eventUpdated := loginp.FSEvent{ - Op: loginp.OpWrite, - NewPath: "/path/to/file", - Info: testFileInfo{"/path/to/file", 10, time.Now(), nil}, + Op: loginp.OpWrite, + NewPath: "/path/to/file", + Descriptor: createTestFileDescriptorWithInfo(testFileInfo{"/path/to/file", 10, time.Now(), nil}), } expectedEvents := []harvesterEvent{ harvesterStart("path::/path/to/file"), @@ -328,13 +329,13 @@ func TestProspectorDeletedFile(t *testing.T) { }{ "one deleted file without clean removed": { events: []loginp.FSEvent{ - {Op: loginp.OpDelete, OldPath: "/path/to/file", Info: testFileInfo{}}, + {Op: loginp.OpDelete, OldPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, }, cleanRemoved: false, }, "one deleted file with clean removed": { events: []loginp.FSEvent{ - {Op: loginp.OpDelete, OldPath: "/path/to/file", Info: testFileInfo{}}, + {Op: loginp.OpDelete, OldPath: "/path/to/file", Descriptor: createTestFileDescriptor()}, }, cleanRemoved: true, }, @@ -377,10 +378,10 @@ func TestProspectorRenamedFile(t *testing.T) { "one renamed file without rename tracker": { events: []loginp.FSEvent{ { - Op: loginp.OpRename, - OldPath: "/old/path/to/file", - NewPath: "/new/path/to/file", - Info: testFileInfo{}, + Op: loginp.OpRename, + OldPath: "/old/path/to/file", + NewPath: "/new/path/to/file", + Descriptor: createTestFileDescriptor(), }, }, expectedEvents: []harvesterEvent{ @@ -392,10 +393,10 @@ func TestProspectorRenamedFile(t *testing.T) { "one renamed file with rename tracker": { events: []loginp.FSEvent{ { - Op: loginp.OpRename, - OldPath: "/old/path/to/file", - NewPath: "/new/path/to/file", - Info: testFileInfo{}, + Op: loginp.OpRename, + OldPath: "/old/path/to/file", + NewPath: "/new/path/to/file", + Descriptor: createTestFileDescriptor(), }, }, trackRename: true, @@ -406,10 +407,10 @@ func TestProspectorRenamedFile(t *testing.T) { "one renamed file with rename tracker with close renamed": { events: []loginp.FSEvent{ { - Op: loginp.OpRename, - OldPath: "/old/path/to/file", - NewPath: "/new/path/to/file", - Info: testFileInfo{}, + Op: loginp.OpRename, + OldPath: "/old/path/to/file", + NewPath: "/new/path/to/file", + Descriptor: createTestFileDescriptor(), }, }, trackRename: true, @@ -503,7 +504,7 @@ func (t *testHarvesterGroup) StopHarvesters() error { type mockFileWatcher struct { events []loginp.FSEvent - filesOnDisk map[string]os.FileInfo + filesOnDisk map[string]loginp.FileDescriptor outputCount, eventCount int @@ -523,7 +524,7 @@ func newMockFileWatcher(events []loginp.FSEvent, eventCount int) *mockFileWatche // newMockFileWatcherWithFiles creates an FSWatch mock to // get the required file information from the file system using // the GetFiles function. -func newMockFileWatcherWithFiles(filesOnDisk map[string]os.FileInfo) *mockFileWatcher { +func newMockFileWatcherWithFiles(filesOnDisk map[string]loginp.FileDescriptor) *mockFileWatcher { return &mockFileWatcher{ filesOnDisk: filesOnDisk, out: make(chan loginp.FSEvent), @@ -542,7 +543,7 @@ func (m *mockFileWatcher) Event() loginp.FSEvent { func (m *mockFileWatcher) Run(_ unison.Canceler) {} -func (m *mockFileWatcher) GetFiles() map[string]os.FileInfo { return m.filesOnDisk } +func (m *mockFileWatcher) GetFiles() map[string]loginp.FileDescriptor { return m.filesOnDisk } type mockMetadataUpdater struct { table map[string]interface{} @@ -668,10 +669,10 @@ func TestOnRenameFileIdentity(t *testing.T) { populateStore: true, events: []loginp.FSEvent{ { - Op: loginp.OpRename, - OldPath: "/old/path/to/file", - NewPath: "/new/path/to/file", - Info: testFileInfo{}, + Op: loginp.OpRename, + OldPath: "/old/path/to/file", + NewPath: "/new/path/to/file", + Descriptor: createTestFileDescriptor(), }, }, }, @@ -681,10 +682,10 @@ func TestOnRenameFileIdentity(t *testing.T) { populateStore: false, events: []loginp.FSEvent{ { - Op: loginp.OpRename, - OldPath: "/old/path/to/file", - NewPath: "/new/path/to/file", - Info: testFileInfo{}, + Op: loginp.OpRename, + OldPath: "/old/path/to/file", + NewPath: "/new/path/to/file", + Descriptor: createTestFileDescriptor(), }, }, }, @@ -721,3 +722,29 @@ func TestOnRenameFileIdentity(t *testing.T) { }) } } + +type testFileInfo struct { + name string + size int64 + time time.Time + sys interface{} +} + +func (t testFileInfo) Name() string { return t.name } +func (t testFileInfo) Size() int64 { return t.size } +func (t testFileInfo) Mode() os.FileMode { return 0 } +func (t testFileInfo) ModTime() time.Time { return t.time } +func (t testFileInfo) IsDir() bool { return false } +func (t testFileInfo) Sys() interface{} { return t.sys } + +func createTestFileDescriptor() loginp.FileDescriptor { + return createTestFileDescriptorWithInfo(testFileInfo{}) +} + +func createTestFileDescriptorWithInfo(fi fs.FileInfo) loginp.FileDescriptor { + return loginp.FileDescriptor{ + Info: fi, + Fingerprint: "fingerprint", + Filename: "filename", + } +} diff --git a/filebeat/input/internal/procnet/procnet.go b/filebeat/input/internal/procnet/procnet.go new file mode 100644 index 00000000000..0761c9994c7 --- /dev/null +++ b/filebeat/input/internal/procnet/procnet.go @@ -0,0 +1,83 @@ +// 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 procnet provides support for obtaining and formatting /proc/net +// network addresses for linux systems. +package procnet + +import ( + "fmt" + "net" + "strconv" + + "github.com/elastic/elastic-agent-libs/logp" +) + +// Addrs returns the linux /proc/net/tcp or /proc/net/udp addresses for the +// provided host address, addr. addr is a host:port address and host may be +// an IPv4 or IPv6 address, or an FQDN for the host. The returned slices +// contain the string representations of the address as they would appear in +// the /proc/net tables. +func Addrs(addr string, log *logp.Logger) (addr4, addr6 []string, err error) { + host, port, err := net.SplitHostPort(addr) + if err != nil { + return nil, nil, fmt.Errorf("failed to get address for %s: could not split host and port: %w", addr, err) + } + ip, err := net.LookupIP(host) + if err != nil { + return nil, nil, fmt.Errorf("failed to get address for %s: %w", addr, err) + } + pn, err := strconv.ParseInt(port, 10, 16) + if err != nil { + return nil, nil, fmt.Errorf("failed to get port for %s: %w", addr, err) + } + addr4 = make([]string, 0, len(ip)) + addr6 = make([]string, 0, len(ip)) + for _, p := range ip { + // Ensure the length of the net.IP is canonicalised to the standard + // length for the format, as the net package may return IPv4 addresses + // as the IPv6 form ::ffff:wwxxyyzz. So if we only compare len(p) to + // the len constants all addresses may appear to be IPv6. + switch { + case len(p.To4()) == net.IPv4len: + addr4 = append(addr4, IPv4(p, int(pn))) + case len(p.To16()) == net.IPv6len: + addr6 = append(addr6, IPv6(p, int(pn))) + default: + log.Warnf("unexpected addr length %d for %s", len(p), p) + } + } + return addr4, addr6, nil +} + +// IPv4 returns the string representation of an IPv4 address in a /proc/net table. +func IPv4(ip net.IP, port int) string { + return fmt.Sprintf("%08X:%04X", reverse(ip.To4()), port) +} + +// IPv6 returns the string representation of an IPv6 address in a /proc/net table. +func IPv6(ip net.IP, port int) string { + return fmt.Sprintf("%032X:%04X", reverse(ip.To16()), port) +} + +func reverse(b []byte) []byte { + c := make([]byte, len(b)) + for i, e := range b { + c[len(b)-1-i] = e + } + return c +} diff --git a/filebeat/input/internal/procnet/procnet_test.go b/filebeat/input/internal/procnet/procnet_test.go new file mode 100644 index 00000000000..975f4a4aa95 --- /dev/null +++ b/filebeat/input/internal/procnet/procnet_test.go @@ -0,0 +1,52 @@ +// 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 procnet + +import ( + "testing" + + "github.com/elastic/elastic-agent-libs/logp" +) + +func TestAddrs(t *testing.T) { + t.Run("ipv4", func(t *testing.T) { + addr4, addr6, err := Addrs("0.0.0.0:9001", logp.L()) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(addr4) == 0 { + t.Errorf("expected addr in addr4 for IPv4 address: addr6 is %v", addr6) + } + if len(addr6) != 0 { + t.Errorf("unexpected addrs in addr6 for IPv4 address: %v", addr6) + } + }) + + t.Run("ipv6", func(t *testing.T) { + addr4, addr6, err := Addrs("[::]:9001", logp.L()) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(addr4) != 0 { + t.Errorf("unexpected addr in addr4 for IPv6 address: %v", addr4) + } + if len(addr6) == 0 { + t.Errorf("expected addrs in addr6 for IPv6 address: addr4 is %v", addr4) + } + }) +} diff --git a/filebeat/input/journald/config.go b/filebeat/input/journald/config.go index 60f5881341b..5f18cbce211 100644 --- a/filebeat/input/journald/config.go +++ b/filebeat/input/journald/config.go @@ -48,6 +48,10 @@ type config struct { // MaxBackoff is the limit of the backoff time. MaxBackoff time.Duration `config:"max_backoff" validate:"min=0,nonzero"` + // Since is the relative time offset from now to provide journal + // entries from. If Since is nil, no offset is applied. + Since *time.Duration `config:"since"` + // Seek is the method to read from journals. Seek journalread.SeekMode `config:"seek"` @@ -100,7 +104,11 @@ func (im *bwcIncludeMatches) Unpack(c *ucfg.Config) error { return c.Unpack((*journalfield.IncludeMatches)(im)) } -var errInvalidSeekFallback = errors.New("invalid setting for cursor_seek_fallback") +var ( + errInvalidSeekFallback = errors.New("invalid setting for cursor_seek_fallback") + errInvalidSeek = errors.New("invalid setting for seek") + errInvalidSeekSince = errors.New("incompatible setting for since and seek or cursor_seek_fallback") +) func defaultConfig() config { return config{ @@ -113,8 +121,26 @@ func defaultConfig() config { } func (c *config) Validate() error { - if c.CursorSeekFallback != journalread.SeekHead && c.CursorSeekFallback != journalread.SeekTail { + if c.Seek == journalread.SeekInvalid { + return errInvalidSeek + } + switch c.CursorSeekFallback { + case journalread.SeekHead, journalread.SeekTail, journalread.SeekSince: + default: return errInvalidSeekFallback } + if c.Since == nil { + switch { + case c.Seek == journalread.SeekSince, + c.Seek == journalread.SeekCursor && c.CursorSeekFallback == journalread.SeekSince: + return errInvalidSeekSince + default: + return nil + } + } + needSince := c.Seek == journalread.SeekSince || (c.Seek == journalread.SeekCursor && c.CursorSeekFallback == journalread.SeekSince) + if !needSince { + return errInvalidSeekSince + } return nil } diff --git a/filebeat/input/journald/config_test.go b/filebeat/input/journald/config_test.go index e5205d8161d..cf6abe848b5 100644 --- a/filebeat/input/journald/config_test.go +++ b/filebeat/input/journald/config_test.go @@ -20,12 +20,17 @@ package journald import ( + "errors" + "fmt" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + jr "github.com/elastic/beats/v7/filebeat/input/journald/pkg/journalread" conf "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" ) func TestConfigIncludeMatches(t *testing.T) { @@ -62,3 +67,96 @@ include_matches: verify(t, yaml) }) } + +func TestConfigValidate(t *testing.T) { + t.Run("table", func(t *testing.T) { + + nameOf := [...]string{ + jr.SeekInvalid: "invalid", + jr.SeekHead: "head", + jr.SeekTail: "tail", + jr.SeekCursor: "cursor", + jr.SeekSince: "since", + } + + modes := []jr.SeekMode{ + jr.SeekInvalid, + jr.SeekHead, + jr.SeekTail, + jr.SeekCursor, + jr.SeekSince, + } + const n = jr.SeekSince + 1 + + errSeek := errInvalidSeek + errFall := errInvalidSeekFallback + errSince := errInvalidSeekSince + // Want is the tables of expectations: seek in major, fallback in minor. + want := map[bool][n][n]error{ + false: { // No since option set. + jr.SeekInvalid: {jr.SeekInvalid: errSeek, jr.SeekHead: errSeek, jr.SeekTail: errSeek, jr.SeekCursor: errSeek, jr.SeekSince: errSeek}, + jr.SeekHead: {jr.SeekInvalid: errFall, jr.SeekHead: nil, jr.SeekTail: nil, jr.SeekCursor: errFall, jr.SeekSince: nil}, + jr.SeekTail: {jr.SeekInvalid: errFall, jr.SeekHead: nil, jr.SeekTail: nil, jr.SeekCursor: errFall, jr.SeekSince: nil}, + jr.SeekCursor: {jr.SeekInvalid: errFall, jr.SeekHead: nil, jr.SeekTail: nil, jr.SeekCursor: errFall, jr.SeekSince: errSince}, + jr.SeekSince: {jr.SeekInvalid: errFall, jr.SeekHead: errSince, jr.SeekTail: errSince, jr.SeekCursor: errFall, jr.SeekSince: errSince}, + }, + true: { // Since option set. + jr.SeekInvalid: {jr.SeekInvalid: errSeek, jr.SeekHead: errSeek, jr.SeekTail: errSeek, jr.SeekCursor: errSeek, jr.SeekSince: errSeek}, + jr.SeekHead: {jr.SeekInvalid: errFall, jr.SeekHead: errSince, jr.SeekTail: errSince, jr.SeekCursor: errFall, jr.SeekSince: errSince}, + jr.SeekTail: {jr.SeekInvalid: errFall, jr.SeekHead: errSince, jr.SeekTail: errSince, jr.SeekCursor: errFall, jr.SeekSince: errSince}, + jr.SeekCursor: {jr.SeekInvalid: errFall, jr.SeekHead: errSince, jr.SeekTail: errSince, jr.SeekCursor: errFall, jr.SeekSince: nil}, + jr.SeekSince: {jr.SeekInvalid: errFall, jr.SeekHead: nil, jr.SeekTail: nil, jr.SeekCursor: errFall, jr.SeekSince: nil}, + }, + } + + for setSince := range want { + for _, seek := range modes { + for _, fallback := range modes { + name := fmt.Sprintf("seek_%s_fallback_%s_since_%t", nameOf[seek], nameOf[fallback], setSince) + t.Run(name, func(t *testing.T) { + cfg := config{Seek: seek, CursorSeekFallback: fallback} + if setSince { + cfg.Since = new(time.Duration) + } + got := cfg.Validate() + if !errors.Is(got, want[setSince][seek][fallback]) { + t.Errorf("unexpected error: got:%v want:%v", got, want[setSince][seek][fallback]) + } + }) + } + } + } + }) + + t.Run("use", func(t *testing.T) { + logger := logp.L() + for seek := jr.SeekInvalid; seek <= jr.SeekSince+1; seek++ { + for seekFallback := jr.SeekInvalid; seekFallback <= jr.SeekSince+1; seekFallback++ { + for _, since := range []*time.Duration{nil, new(time.Duration)} { + for _, pos := range []string{"", "defined"} { + // Construct a config with fields checked by Validate. + cfg := config{ + Since: since, + Seek: seek, + CursorSeekFallback: seekFallback, + } + if err := cfg.Validate(); err != nil { + continue + } + + // Confirm we never get to seek since mode with a nil since. + cp := checkpoint{Position: pos} + mode, _ := seekBy(logger, cp, cfg.Seek, cfg.CursorSeekFallback) + if mode == jr.SeekSince { + if cfg.Since == nil { + // If we reach here we would have panicked in Run. + t.Errorf("got nil since in valid seek since mode: seek=%d seek_fallback=%d since=%d cp=%+v", + seek, seekFallback, since, cp) + } + } + } + } + } + } + }) +} diff --git a/filebeat/input/journald/input.go b/filebeat/input/journald/input.go index e4d3d858dd6..c32d677ffa4 100644 --- a/filebeat/input/journald/input.go +++ b/filebeat/input/journald/input.go @@ -40,6 +40,7 @@ import ( type journald struct { Backoff time.Duration MaxBackoff time.Duration + Since *time.Duration Seek journalread.SeekMode CursorSeekFallback journalread.SeekMode Matches journalfield.IncludeMatches @@ -104,6 +105,7 @@ func configure(cfg *conf.C) ([]cursor.Source, cursor.Input, error) { return sources, &journald{ Backoff: config.Backoff, MaxBackoff: config.MaxBackoff, + Since: config.Since, Seek: config.Seek, CursorSeekFallback: config.CursorSeekFallback, Matches: journalfield.IncludeMatches(config.Matches), @@ -140,7 +142,13 @@ func (inp *journald) Run( } defer reader.Close() - if err := reader.Seek(seekBy(ctx.Logger, currentCheckpoint, inp.Seek, inp.CursorSeekFallback)); err != nil { + mode, pos := seekBy(ctx.Logger, currentCheckpoint, inp.Seek, inp.CursorSeekFallback) + if mode == journalread.SeekSince { + err = reader.SeekRealtimeUsec(uint64(time.Now().Add(*inp.Since).UnixMicro())) + } else { + err = reader.Seek(mode, pos) + } + if err != nil { log.Error("Continue from current position. Seek failed with: %v", err) } @@ -168,7 +176,10 @@ func (inp *journald) Run( func (inp *journald) open(log *logp.Logger, canceler input.Canceler, src cursor.Source) (*journalread.Reader, error) { backoff := backoff.NewExpBackoff(canceler.Done(), inp.Backoff, inp.MaxBackoff) reader, err := journalread.Open(log, src.Name(), backoff, - withFilters(inp.Matches), withUnits(inp.Units), withTransports(inp.Transports), withSyslogIdentifiers(inp.Identifiers)) + withFilters(inp.Matches), + withUnits(inp.Units), + withTransports(inp.Transports), + withSyslogIdentifiers(inp.Identifiers)) if err != nil { return nil, sderr.Wrap(err, "failed to create reader for %{path} journal", src.Name()) } @@ -223,12 +234,14 @@ func withSyslogIdentifiers(identifiers []string) func(*sdjournal.Journal) error // seekBy tries to find the last known position in the journal, so we can continue collecting // from the last known position. // The checkpoint is ignored if the user has configured the input to always -// seek to the head/tail of the journal on startup. -func seekBy(log *logp.Logger, cp checkpoint, seek, defaultSeek journalread.SeekMode) (journalread.SeekMode, string) { - mode := seek +// seek to the head/tail/since of the journal on startup. +func seekBy(log *logp.Logger, cp checkpoint, seek, defaultSeek journalread.SeekMode) (mode journalread.SeekMode, pos string) { + mode = seek if mode == journalread.SeekCursor && cp.Position == "" { mode = defaultSeek - if mode != journalread.SeekHead && mode != journalread.SeekTail { + switch mode { + case journalread.SeekHead, journalread.SeekTail, journalread.SeekSince: + default: log.Error("Invalid option for cursor_seek_fallback") mode = journalread.SeekHead } diff --git a/filebeat/input/journald/input_filtering_test.go b/filebeat/input/journald/input_filtering_test.go index 7724c6285fa..a985f1f5258 100644 --- a/filebeat/input/journald/input_filtering_test.go +++ b/filebeat/input/journald/input_filtering_test.go @@ -23,6 +23,7 @@ import ( "context" "path" "testing" + "time" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -219,6 +220,20 @@ func TestInputIncludeMatches(t *testing.T) { // TestInputSeek test the output of various seek modes while reading // from input-multiline-parser.journal. func TestInputSeek(t *testing.T) { + // timeOfFirstEvent is the @timestamp on the "pam_unix" message. + var timeOfFirstEvent = time.Date(2021, time.November, 22, 17, 10, 4, 51729000, time.UTC) + + var allMessages = []string{ + "pam_unix(sudo:session): session closed for user root", + "Started Outputs some log lines.", + "1st line", + "2nd line", + "3rd line", + "4th line", + "5th line", + "6th line", + } + tests := map[string]struct { config mapstr.M expectedMessages []string @@ -227,16 +242,7 @@ func TestInputSeek(t *testing.T) { config: map[string]any{ "seek": "head", }, - expectedMessages: []string{ - "pam_unix(sudo:session): session closed for user root", - "Started Outputs some log lines.", - "1st line", - "2nd line", - "3rd line", - "4th line", - "5th line", - "6th line", - }, + expectedMessages: allMessages, }, "seek tail": { config: map[string]any{ @@ -248,24 +254,34 @@ func TestInputSeek(t *testing.T) { config: map[string]any{ "seek": "cursor", }, - expectedMessages: []string{ - "pam_unix(sudo:session): session closed for user root", - "Started Outputs some log lines.", - "1st line", - "2nd line", - "3rd line", - "4th line", - "5th line", - "6th line", - }, + expectedMessages: allMessages, }, - "seek cursor fallback": { + "seek cursor with tail fallback": { config: map[string]any{ "seek": "cursor", "cursor_seek_fallback": "tail", }, expectedMessages: nil, // No messages are expected because it will fall back to seek=tail. }, + "seek since": { + config: map[string]any{ + "seek": "since", + // Query using one microsecond after the first event so that the first event + // is not returned. Note that journald uses microsecond precision for times. + "since": -1 * time.Since(timeOfFirstEvent.Add(time.Microsecond)), + }, + expectedMessages: allMessages[1:], + }, + "seek cursor with since fallback": { + config: map[string]any{ + "seek": "cursor", + "cursor_seek_fallback": "since", + // Query using one microsecond after the first event so that the first event + // is not returned. Note that journald uses microsecond precision for times. + "since": -1 * time.Since(timeOfFirstEvent.Add(time.Microsecond)), + }, + expectedMessages: allMessages[1:], + }, } for name, testCase := range tests { diff --git a/filebeat/input/journald/pkg/journalfield/conv.go b/filebeat/input/journald/pkg/journalfield/conv.go index 59d435e8eed..bd7403ae142 100644 --- a/filebeat/input/journald/pkg/journalfield/conv.go +++ b/filebeat/input/journald/pkg/journalfield/conv.go @@ -19,6 +19,7 @@ package journalfield import ( "fmt" + "math/bits" "regexp" "strconv" "strings" @@ -116,6 +117,7 @@ func withECSEnrichment(fields mapstr.M) mapstr.M { setGidUidFields("journald.object", fields) setProcessFields("journald", fields) setProcessFields("journald.object", fields) + expandCapabilities(fields) return fields } @@ -173,6 +175,87 @@ func setProcessFields(prefix string, fields mapstr.M) { } } +// expandCapabilites expands the hex string of capabilities bits in the +// journald.process.capabilities field in-place into an array of conventional +// capabilities names in process.thread.capabilities.effective. If a +// capability is unknown it is rendered as the numeric value of the cap. +// The original capabilities string is not altered. If any error is +// encountered no modification is made to the fields. +func expandCapabilities(fields mapstr.M) { + cs, err := fields.GetValue("journald.process.capabilities") + if err != nil { + return + } + c, ok := cs.(string) + if !ok { + return + } + w, err := strconv.ParseUint(c, 16, 64) + if err != nil { + return + } + if w == 0 { + return + } + caps := make([]string, 0, bits.OnesCount64(w)) + for i := 0; w != 0; i++ { + if w&1 != 0 { + if i < len(capTable) { + caps = append(caps, capTable[i]) + } else { + caps = append(caps, strconv.Itoa(i)) + } + } + w >>= 1 + } + fields.Put("process.thread.capabilities.effective", caps) +} + +// include/uapi/linux/capability.h +var capTable = [...]string{ + 0: "CAP_CHOWN", + 1: "CAP_DAC_OVERRIDE", + 2: "CAP_DAC_READ_SEARCH", + 3: "CAP_FOWNER", + 4: "CAP_FSETID", + 5: "CAP_KILL", + 6: "CAP_SETGID", + 7: "CAP_SETUID", + 8: "CAP_SETPCAP", + 9: "CAP_LINUX_IMMUTABLE", + 10: "CAP_NET_BIND_SERVICE", + 11: "CAP_NET_BROADCAST", + 12: "CAP_NET_ADMIN", + 13: "CAP_NET_RAW", + 14: "CAP_IPC_LOCK", + 15: "CAP_IPC_OWNER", + 16: "CAP_SYS_MODULE", + 17: "CAP_SYS_RAWIO", + 18: "CAP_SYS_CHROOT", + 19: "CAP_SYS_PTRACE", + 20: "CAP_SYS_PACCT", + 21: "CAP_SYS_ADMIN", + 22: "CAP_SYS_BOOT", + 23: "CAP_SYS_NICE", + 24: "CAP_SYS_RESOURCE", + 25: "CAP_SYS_TIME", + 26: "CAP_SYS_TTY_CONFIG", + 27: "CAP_MKNOD", + 28: "CAP_LEASE", + 29: "CAP_AUDIT_WRITE", + 30: "CAP_AUDIT_CONTROL", + 31: "CAP_SETFCAP", + 32: "CAP_MAC_OVERRIDE", + 33: "CAP_MAC_ADMIN", + 34: "CAP_SYSLOG", + 35: "CAP_WAKE_ALARM", + 36: "CAP_BLOCK_SUSPEND", + 37: "CAP_AUDIT_READ", + 38: "CAP_PERFMON", + 39: "CAP_BPF", + 40: "CAP_CHECKPOINT_RESTORE", +} + func getStringFromFields(key string, fields mapstr.M) string { value, _ := fields.GetValue(key) str, _ := value.(string) diff --git a/filebeat/input/journald/pkg/journalfield/conv_expand_test.go b/filebeat/input/journald/pkg/journalfield/conv_expand_test.go new file mode 100644 index 00000000000..c43e57a1c49 --- /dev/null +++ b/filebeat/input/journald/pkg/journalfield/conv_expand_test.go @@ -0,0 +1,301 @@ +// 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 journalfield + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + + "github.com/elastic/elastic-agent-libs/mapstr" +) + +var expandCapabilitiesTests = []struct { + name string + src mapstr.M + want mapstr.M +}{ + // All test cases were constructed based on behaviour of capsh --decode , + // with the exception that the CONSTANT names are used instead of the canonical lowercase names in order + // to conform with ECS directions. + { + name: "none", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "0", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "0", + }, + }, + }, + }, + { + name: "cap_chown_short", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "1", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "1", + }, + }, + "process": mapstr.M{ + "thread": mapstr.M{ + "capabilities": mapstr.M{ + "effective": []string{ + "CAP_CHOWN", + }, + }, + }, + }, + }, + }, + { + name: "cap_chown_long", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "0000000000000001", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "0000000000000001", + }, + }, + "process": mapstr.M{ + "thread": mapstr.M{ + "capabilities": mapstr.M{ + "effective": []string{ + "CAP_CHOWN", + }, + }, + }, + }, + }, + }, + { + name: "all", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "1ffffffffff", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "1ffffffffff", + }, + }, + "process": mapstr.M{ + "thread": mapstr.M{ + "capabilities": mapstr.M{ + "effective": []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_DAC_READ_SEARCH", + "CAP_FOWNER", + "CAP_FSETID", + "CAP_KILL", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETPCAP", + "CAP_LINUX_IMMUTABLE", + "CAP_NET_BIND_SERVICE", + "CAP_NET_BROADCAST", + "CAP_NET_ADMIN", + "CAP_NET_RAW", + "CAP_IPC_LOCK", + "CAP_IPC_OWNER", + "CAP_SYS_MODULE", + "CAP_SYS_RAWIO", + "CAP_SYS_CHROOT", + "CAP_SYS_PTRACE", + "CAP_SYS_PACCT", + "CAP_SYS_ADMIN", + "CAP_SYS_BOOT", + "CAP_SYS_NICE", + "CAP_SYS_RESOURCE", + "CAP_SYS_TIME", + "CAP_SYS_TTY_CONFIG", + "CAP_MKNOD", + "CAP_LEASE", + "CAP_AUDIT_WRITE", + "CAP_AUDIT_CONTROL", + "CAP_SETFCAP", + "CAP_MAC_OVERRIDE", + "CAP_MAC_ADMIN", + "CAP_SYSLOG", + "CAP_WAKE_ALARM", + "CAP_BLOCK_SUSPEND", + "CAP_AUDIT_READ", + "CAP_PERFMON", + "CAP_BPF", + "CAP_CHECKPOINT_RESTORE", + }, + }, + }, + }, + }, + }, + { + name: "all_and_new", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "7ffffffffff", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "7ffffffffff", + }, + }, + "process": mapstr.M{ + "thread": mapstr.M{ + "capabilities": mapstr.M{ + "effective": []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_DAC_READ_SEARCH", + "CAP_FOWNER", + "CAP_FSETID", + "CAP_KILL", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETPCAP", + "CAP_LINUX_IMMUTABLE", + "CAP_NET_BIND_SERVICE", + "CAP_NET_BROADCAST", + "CAP_NET_ADMIN", + "CAP_NET_RAW", + "CAP_IPC_LOCK", + "CAP_IPC_OWNER", + "CAP_SYS_MODULE", + "CAP_SYS_RAWIO", + "CAP_SYS_CHROOT", + "CAP_SYS_PTRACE", + "CAP_SYS_PACCT", + "CAP_SYS_ADMIN", + "CAP_SYS_BOOT", + "CAP_SYS_NICE", + "CAP_SYS_RESOURCE", + "CAP_SYS_TIME", + "CAP_SYS_TTY_CONFIG", + "CAP_MKNOD", + "CAP_LEASE", + "CAP_AUDIT_WRITE", + "CAP_AUDIT_CONTROL", + "CAP_SETFCAP", + "CAP_MAC_OVERRIDE", + "CAP_MAC_ADMIN", + "CAP_SYSLOG", + "CAP_WAKE_ALARM", + "CAP_BLOCK_SUSPEND", + "CAP_AUDIT_READ", + "CAP_PERFMON", + "CAP_BPF", + "CAP_CHECKPOINT_RESTORE", + "41", + "42", + }, + }, + }, + }, + }, + }, + { + name: "sparse", + src: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "deadbeef", + }, + }, + }, + want: mapstr.M{ + "journald": mapstr.M{ + "process": mapstr.M{ + "capabilities": "deadbeef", + }, + }, + "process": mapstr.M{ + "thread": mapstr.M{ + "capabilities": mapstr.M{ + "effective": []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_DAC_READ_SEARCH", + "CAP_FOWNER", + "CAP_KILL", + "CAP_SETGID", + "CAP_SETUID", + "CAP_LINUX_IMMUTABLE", + "CAP_NET_BIND_SERVICE", + "CAP_NET_BROADCAST", + "CAP_NET_ADMIN", + "CAP_NET_RAW", + "CAP_IPC_OWNER", + "CAP_SYS_MODULE", + "CAP_SYS_CHROOT", + "CAP_SYS_PTRACE", + "CAP_SYS_ADMIN", + "CAP_SYS_NICE", + "CAP_SYS_TIME", + "CAP_SYS_TTY_CONFIG", + "CAP_MKNOD", + "CAP_LEASE", + "CAP_AUDIT_CONTROL", + "CAP_SETFCAP", + }, + }, + }, + }, + }, + }, +} + +func TestExpandCapabilities(t *testing.T) { + for _, test := range expandCapabilitiesTests { + t.Run(test.name, func(t *testing.T) { + dst := test.src.Clone() + expandCapabilities(dst) + got := dst + if !cmp.Equal(test.want, got) { + t.Errorf("unexpected result\n--- want\n+++ got\n%s", cmp.Diff(test.want, got)) + } + }) + } +} diff --git a/filebeat/input/journald/pkg/journalread/mode.go b/filebeat/input/journald/pkg/journalread/mode.go index 36132ffe11d..3c6fa923361 100644 --- a/filebeat/input/journald/pkg/journalread/mode.go +++ b/filebeat/input/journald/pkg/journalread/mode.go @@ -31,12 +31,15 @@ const ( SeekTail // SeekCursor option seeks to the position specified in the cursor SeekCursor + // SeekSince option seeks to the position specified by the since option + SeekSince ) var seekModes = map[string]SeekMode{ "head": SeekHead, "tail": SeekTail, "cursor": SeekCursor, + "since": SeekSince, } // Unpack validates and unpack "seek" config options. It returns an error if diff --git a/filebeat/input/journald/pkg/journalread/mode_test.go b/filebeat/input/journald/pkg/journalread/mode_test.go index aef0ed4150c..7b323a06be5 100644 --- a/filebeat/input/journald/pkg/journalread/mode_test.go +++ b/filebeat/input/journald/pkg/journalread/mode_test.go @@ -27,6 +27,7 @@ func TestMode_Unpack(t *testing.T) { "head": SeekHead, "tail": SeekTail, "cursor": SeekCursor, + "since": SeekSince, } for str, want := range tests { diff --git a/filebeat/input/journald/pkg/journalread/reader.go b/filebeat/input/journald/pkg/journalread/reader.go index 571de214b55..9994c0aad7c 100644 --- a/filebeat/input/journald/pkg/journalread/reader.go +++ b/filebeat/input/journald/pkg/journalread/reader.go @@ -54,6 +54,7 @@ type journal interface { GetEntry() (*sdjournal.JournalEntry, error) SeekHead() error SeekTail() error + SeekRealtimeUsec(usec uint64) error SeekCursor(string) error } @@ -146,6 +147,13 @@ func (r *Reader) Seek(mode SeekMode, cursor string) (err error) { return err } +// SeekRealtimeUsec moves the read pointer to the entry with the +// specified CLOCK_REALTIME timestamp. This corresponds to +// sd_journal_seek_realtime_usec. +func (r *Reader) SeekRealtimeUsec(usec uint64) error { + return r.journal.SeekRealtimeUsec(usec) +} + // Next reads a new journald entry from the journal. It blocks if there is // currently no entry available in the journal, or until an error has occurred. func (r *Reader) Next(cancel canceler) (*sdjournal.JournalEntry, error) { diff --git a/filebeat/input/mqtt/client.go b/filebeat/input/mqtt/client.go index bece7ee2bbf..f5803d1d340 100644 --- a/filebeat/input/mqtt/client.go +++ b/filebeat/input/mqtt/client.go @@ -28,6 +28,7 @@ func createClientOptions(config mqttInputConfig, onConnectHandler func(client li SetClientID(config.ClientID). SetUsername(config.Username). SetPassword(config.Password). + SetCleanSession(config.CleanSession). SetConnectRetry(true). SetOnConnectHandler(onConnectHandler) diff --git a/filebeat/input/mqtt/config.go b/filebeat/input/mqtt/config.go index f78707e53c1..a729ff346af 100644 --- a/filebeat/input/mqtt/config.go +++ b/filebeat/input/mqtt/config.go @@ -28,9 +28,10 @@ type mqttInputConfig struct { Topics []string `config:"topics" validate:"required,min=1"` QoS int `config:"qos" validate:"min=0,max=2"` - ClientID string `config:"client_id" validate:"nonzero"` - Username string `config:"username"` - Password string `config:"password"` + ClientID string `config:"client_id" validate:"nonzero"` + Username string `config:"username"` + Password string `config:"password"` + CleanSession bool `config:"clean_session"` TLS *tlscommon.Config `config:"ssl"` } @@ -38,8 +39,9 @@ type mqttInputConfig struct { // The default config for the mqtt input. func defaultConfig() mqttInputConfig { return mqttInputConfig{ - ClientID: "filebeat", - Topics: []string{"#"}, + ClientID: "filebeat", + Topics: []string{"#"}, + CleanSession: true, } } diff --git a/filebeat/input/syslog/format_check.go b/filebeat/input/syslog/format_check.go index 5ba3e551003..8d646e10f7d 100644 --- a/filebeat/input/syslog/format_check.go +++ b/filebeat/input/syslog/format_check.go @@ -17,7 +17,7 @@ // Code generated by ragel DO NOT EDIT. // -//line parser/format_check.rl:1 +// line-disable-directive parser/format_check.rl:1 package syslog //line format_check.go:8 @@ -27,7 +27,7 @@ const format_check_error int = 0 const format_check_en_main int = 1 -//line parser/format_check.rl:9 +// line-disable-directive parser/format_check.rl:9 func IsRFC5424Format(data []byte) bool { var p, cs int @@ -143,7 +143,7 @@ func IsRFC5424Format(data []byte) bool { } goto st0 tr9: -//line parser/format_check.rl:17 + // line-disable-directive parser/format_check.rl:17 isRFC5424 = true @@ -294,7 +294,7 @@ func IsRFC5424Format(data []byte) bool { } } -//line parser/format_check.rl:28 + // line-disable-directive parser/format_check.rl:28 return isRFC5424 } diff --git a/filebeat/input/syslog/rfc3164_parser.go b/filebeat/input/syslog/rfc3164_parser.go index d717ee7be4c..63d43cdf200 100644 --- a/filebeat/input/syslog/rfc3164_parser.go +++ b/filebeat/input/syslog/rfc3164_parser.go @@ -17,7 +17,7 @@ // Code generated by ragel DO NOT EDIT. // -//line parser/rfc3164_parser.rl:1 +// line-disable-directive parser/rfc3164_parser.rl:1 package syslog //line rfc3164_parser.go:8 @@ -28,7 +28,7 @@ const syslog_rfc3154_error int = -1 const syslog_rfc3154_en_main int = 0 const syslog_rfc3154_en_catch_all int = 1 -//line parser/rfc3164_parser.rl:9 +// line-disable-directive parser/rfc3164_parser.rl:9 var ( noDuplicates = []byte{'-', '.'} @@ -332,17 +332,17 @@ func ParserRFC3164(data []byte, event *event) { } goto tr0 tr0: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st2 tr134: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -355,17 +355,17 @@ func ParserRFC3164(data []byte, event *event) { //line rfc3164_parser.go:342 goto st2 tr1: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st3 tr135: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -399,17 +399,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr14: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st4 tr136: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -452,7 +452,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr18: -//line parser/common.rl:19 + // line-disable-directive parser/common.rl:19 event.SetYear(data[tok:p]) @@ -468,7 +468,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr19: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -493,7 +493,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr21: -//line parser/common.rl:23 + // line-disable-directive parser/common.rl:23 event.SetMonthNumeric(data[tok:p]) @@ -509,7 +509,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr22: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -542,7 +542,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr24: -//line parser/common.rl:27 + // line-disable-directive parser/common.rl:27 event.SetDay(data[tok:p]) @@ -561,7 +561,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr25: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -586,7 +586,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr28: -//line parser/common.rl:31 + // line-disable-directive parser/common.rl:31 event.SetHour(data[tok:p]) @@ -602,7 +602,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr29: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -627,7 +627,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr31: -//line parser/common.rl:35 + // line-disable-directive parser/common.rl:35 event.SetMinute(data[tok:p]) @@ -643,7 +643,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr32: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -684,19 +684,19 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr34: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) goto st23 tr61: -//line parser/common.rl:103 + // line-disable-directive parser/common.rl:103 event.SetTimeZone(data[tok:p]) goto st23 tr68: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) @@ -732,11 +732,11 @@ func ParserRFC3164(data []byte, event *event) { } goto tr0 tr39: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -751,7 +751,7 @@ func ParserRFC3164(data []byte, event *event) { goto st24 tr42: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -796,11 +796,11 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr40: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -815,7 +815,7 @@ func ParserRFC3164(data []byte, event *event) { goto st25 tr43: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -867,7 +867,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr45: -//line parser/common.rl:91 + // line-disable-directive parser/common.rl:91 event.SetHostname(data[tok:p]) @@ -891,7 +891,7 @@ func ParserRFC3164(data []byte, event *event) { } goto tr47 tr47: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -917,7 +917,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st27 tr49: -//line parser/common.rl:95 + // line-disable-directive parser/common.rl:95 event.SetProgram(data[tok:p]) @@ -949,7 +949,7 @@ func ParserRFC3164(data []byte, event *event) { st_case_29: goto tr0 tr50: -//line parser/common.rl:95 + // line-disable-directive parser/common.rl:95 event.SetProgram(data[tok:p]) @@ -965,7 +965,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr52: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -984,7 +984,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr54: -//line parser/common.rl:99 + // line-disable-directive parser/common.rl:99 event.SetPid(data[tok:p]) @@ -1012,7 +1012,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr46: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -1025,7 +1025,7 @@ func ParserRFC3164(data []byte, event *event) { } } -//line parser/common.rl:91 + // line-disable-directive parser/common.rl:91 event.SetHostname(data[tok:p]) @@ -1068,7 +1068,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr57: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -1083,7 +1083,7 @@ func ParserRFC3164(data []byte, event *event) { goto st35 tr58: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -1096,7 +1096,7 @@ func ParserRFC3164(data []byte, event *event) { } } -//line parser/common.rl:91 + // line-disable-directive parser/common.rl:91 event.SetHostname(data[tok:p]) @@ -1139,11 +1139,11 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr41: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -1158,7 +1158,7 @@ func ParserRFC3164(data []byte, event *event) { goto st36 tr44: -//line parser/common.rl:80 + // line-disable-directive parser/common.rl:80 if p-1 > 0 { for _, b := range noDuplicates { @@ -1203,21 +1203,21 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr35: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st37 tr69: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1286,19 +1286,19 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr37: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) goto st42 tr65: -//line parser/common.rl:103 + // line-disable-directive parser/common.rl:103 event.SetTimeZone(data[tok:p]) goto st42 tr71: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) @@ -1317,7 +1317,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr63: -//line parser/common.rl:103 + // line-disable-directive parser/common.rl:103 event.SetTimeZone(data[tok:p]) @@ -1341,7 +1341,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr36: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) @@ -1357,7 +1357,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr67: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1392,21 +1392,21 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr38: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st46 tr72: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1432,7 +1432,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr26: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1448,17 +1448,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr4: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st48 tr137: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1501,7 +1501,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr77: -//line parser/common.rl:15 + // line-disable-directive parser/common.rl:15 event.SetMonth(data[tok:p]) @@ -1543,7 +1543,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr83: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1562,7 +1562,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr84: -//line parser/common.rl:27 + // line-disable-directive parser/common.rl:27 event.SetDay(data[tok:p]) @@ -1581,7 +1581,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr85: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1606,7 +1606,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr88: -//line parser/common.rl:31 + // line-disable-directive parser/common.rl:31 event.SetHour(data[tok:p]) @@ -1622,7 +1622,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr89: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1647,7 +1647,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr91: -//line parser/common.rl:35 + // line-disable-directive parser/common.rl:35 event.SetMinute(data[tok:p]) @@ -1663,7 +1663,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr92: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1696,7 +1696,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr94: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) @@ -1712,7 +1712,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr95: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1739,7 +1739,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr86: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1755,7 +1755,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr80: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1771,7 +1771,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr81: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1795,7 +1795,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr82: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1882,17 +1882,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr5: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st75 tr138: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1968,17 +1968,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr6: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st82 tr139: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2054,17 +2054,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr7: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st89 tr140: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2149,17 +2149,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr8: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st95 tr141: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2216,17 +2216,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr9: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st99 tr142: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2251,17 +2251,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr10: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st101 tr143: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2301,17 +2301,17 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr11: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st104 tr144: -//line parser/common.rl:107 + // line-disable-directive parser/common.rl:107 event.SetSequence(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2360,7 +2360,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr2: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2442,7 +2442,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr133: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2482,7 +2482,7 @@ func ParserRFC3164(data []byte, event *event) { } goto tr134 tr3: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2498,7 +2498,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr145: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2562,7 +2562,7 @@ func ParserRFC3164(data []byte, event *event) { } goto st2 tr147: -//line parser/common.rl:7 + // line-disable-directive parser/common.rl:7 event.SetPriority(data[tok:p]) @@ -2608,7 +2608,7 @@ func ParserRFC3164(data []byte, event *event) { st_case_1: goto tr12 tr12: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2994,7 +2994,7 @@ func ParserRFC3164(data []byte, event *event) { if (p) == eof { switch cs { case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122: -//line parser/common.rl:11 + // line-disable-directive parser/common.rl:11 event.SetMessage(data[tok:p]) @@ -3004,6 +3004,6 @@ func ParserRFC3164(data []byte, event *event) { } -//line parser/rfc3164_parser.rl:28 + // line-disable-directive parser/rfc3164_parser.rl:28 } diff --git a/filebeat/input/syslog/rfc5424_parser.go b/filebeat/input/syslog/rfc5424_parser.go index 7d9761b5ad4..9d935d8c866 100644 --- a/filebeat/input/syslog/rfc5424_parser.go +++ b/filebeat/input/syslog/rfc5424_parser.go @@ -17,7 +17,7 @@ // Code generated by ragel DO NOT EDIT. // -//line parser/rfc5424_parser.rl:1 +// line-disable-directive parser/rfc5424_parser.rl:1 package syslog //line rfc5424_parser.go:8 @@ -27,7 +27,7 @@ const syslog_rfc5424_error int = 0 const syslog_rfc5424_en_main int = 1 -//line parser/rfc5424_parser.rl:9 +// line-disable-directive parser/rfc5424_parser.rl:9 type machineState struct { sd_id string @@ -1266,7 +1266,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr2: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1282,7 +1282,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr5: -//line parser/common.rl:7 + // line-disable-directive parser/common.rl:7 event.SetPriority(data[tok:p]) @@ -1298,7 +1298,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr6: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1317,7 +1317,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr7: -//line parser/common.rl:111 + // line-disable-directive parser/common.rl:111 event.SetVersion(data[tok:p]) @@ -1345,7 +1345,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr586: -//line parser/common.rl:103 + // line-disable-directive parser/common.rl:103 event.SetTimeZone(data[tok:p]) @@ -1361,7 +1361,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr12: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1380,7 +1380,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr13: -//line parser/common.rl:91 + // line-disable-directive parser/common.rl:91 event.SetHostname(data[tok:p]) @@ -1396,7 +1396,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr15: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1415,7 +1415,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr16: -//line parser/common.rl:115 + // line-disable-directive parser/common.rl:115 event.SetAppName(data[tok:p]) @@ -1431,7 +1431,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr18: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1450,7 +1450,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr19: -//line parser/common.rl:119 + // line-disable-directive parser/common.rl:119 event.SetProcID(data[tok:p]) @@ -1466,7 +1466,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr21: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1485,7 +1485,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr22: -//line parser/common.rl:123 + // line-disable-directive parser/common.rl:123 event.SetMsgID(data[tok:p]) @@ -1519,7 +1519,7 @@ func ParserRFC5424(data []byte, event *event) { st_case_589: goto tr600 tr600: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1532,7 +1532,7 @@ func ParserRFC5424(data []byte, event *event) { //line rfc5424_parser.go:1519 goto st590 tr25: -//line parser/common.rl:48 + // line-disable-directive parser/common.rl:48 event.data = EventData{} @@ -1560,7 +1560,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr26: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -1589,7 +1589,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr27: -//line parser/common.rl:64 + // line-disable-directive parser/common.rl:64 state.sd_id = string(data[tok:p]) if _, ok := event.data[state.sd_id]; ok { @@ -1623,7 +1623,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr30: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2259,7 +2259,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr32: -//line parser/common.rl:56 + // line-disable-directive parser/common.rl:56 state.sd_param_name = string(data[tok:p]) @@ -2289,7 +2289,7 @@ func ParserRFC5424(data []byte, event *event) { } goto tr64 tr64: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -2310,11 +2310,11 @@ func ParserRFC5424(data []byte, event *event) { } goto st54 tr67: -//line parser/common.rl:60 + // line-disable-directive parser/common.rl:60 event.SetData(state.sd_id, state.sd_param_name, data, tok, p, state.sd_value_bs) -//line parser/common.rl:52 + // line-disable-directive parser/common.rl:52 state.sd_value_bs = []int{} @@ -2343,7 +2343,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr29: -//line parser/common.rl:64 + // line-disable-directive parser/common.rl:64 state.sd_id = string(data[tok:p]) if _, ok := event.data[state.sd_id]; ok { @@ -2368,17 +2368,17 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr65: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p -//line parser/common.rl:73 + // line-disable-directive parser/common.rl:73 state.sd_value_bs = append(state.sd_value_bs, p) goto st56 tr68: -//line parser/common.rl:73 + // line-disable-directive parser/common.rl:73 state.sd_value_bs = append(state.sd_value_bs, p) @@ -8565,7 +8565,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr10: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8608,7 +8608,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr559: -//line parser/common.rl:19 + // line-disable-directive parser/common.rl:19 event.SetYear(data[tok:p]) @@ -8627,7 +8627,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr560: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8652,7 +8652,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr563: -//line parser/common.rl:23 + // line-disable-directive parser/common.rl:23 event.SetMonthNumeric(data[tok:p]) @@ -8674,7 +8674,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr564: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8699,7 +8699,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr568: -//line parser/common.rl:27 + // line-disable-directive parser/common.rl:27 event.SetDay(data[tok:p]) @@ -8718,7 +8718,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr569: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8743,7 +8743,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr572: -//line parser/common.rl:31 + // line-disable-directive parser/common.rl:31 event.SetHour(data[tok:p]) @@ -8759,7 +8759,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr573: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8784,7 +8784,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr575: -//line parser/common.rl:35 + // line-disable-directive parser/common.rl:35 event.SetMinute(data[tok:p]) @@ -8800,7 +8800,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr576: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8832,21 +8832,21 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr578: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st566 tr588: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8898,21 +8898,21 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr580: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p goto st571 tr590: -//line parser/common.rl:43 + // line-disable-directive parser/common.rl:43 event.SetNanosecond(data[tok:p]) -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -8928,7 +8928,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr579: -//line parser/common.rl:39 + // line-disable-directive parser/common.rl:39 event.SetSecond(data[tok:p]) @@ -8944,7 +8944,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr587: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9050,7 +9050,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr570: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9066,7 +9066,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr565: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9082,7 +9082,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr566: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9098,7 +9098,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr561: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9135,7 +9135,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr3: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -9157,7 +9157,7 @@ func ParserRFC5424(data []byte, event *event) { } goto st0 tr4: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p @@ -10965,16 +10965,16 @@ func ParserRFC5424(data []byte, event *event) { if (p) == eof { switch cs { case 590: -//line parser/common.rl:11 + // line-disable-directive parser/common.rl:11 event.SetMessage(data[tok:p]) case 589: -//line parser/common.rl:3 + // line-disable-directive parser/common.rl:3 tok = p -//line parser/common.rl:11 + // line-disable-directive parser/common.rl:11 event.SetMessage(data[tok:p]) @@ -10987,6 +10987,6 @@ func ParserRFC5424(data []byte, event *event) { } } -//line parser/rfc5424_parser.rl:35 + // line-disable-directive parser/rfc5424_parser.rl:35 } diff --git a/filebeat/input/tcp/input.go b/filebeat/input/tcp/input.go index bd15e1560c8..762c6b6ba35 100644 --- a/filebeat/input/tcp/input.go +++ b/filebeat/input/tcp/input.go @@ -32,6 +32,7 @@ import ( "github.com/dustin/go-humanize" "github.com/rcrowley/go-metrics" + "github.com/elastic/beats/v7/filebeat/input/internal/procnet" input "github.com/elastic/beats/v7/filebeat/input/v2" stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" "github.com/elastic/beats/v7/filebeat/inputsource" @@ -195,56 +196,18 @@ func newInputMetrics(id, device string, poll time.Duration, log *logp.Logger) *i out.device.Set(device) if poll > 0 && runtime.GOOS == "linux" { - host, port, err := net.SplitHostPort(device) + addr4, addr6, err := procnet.Addrs(device, log) if err != nil { - log.Warnf("failed to get address for %s: could not split host and port:", err) + log.Warn(err) return out } - ip, err := net.LookupIP(host) - if err != nil { - log.Warnf("failed to get address for %s: %v", device, err) - return out - } - pn, err := strconv.ParseInt(port, 10, 16) - if err != nil { - log.Warnf("failed to get port for %s: %v", device, err) - return out - } - addr := make([]string, 0, len(ip)) - addr6 := make([]string, 0, len(ip)) - for _, p := range ip { - switch len(p) { - case net.IPv4len: - addr = append(addr, ipv4KernelAddr(p, int(pn))) - case net.IPv6len: - addr6 = append(addr6, ipv6KernelAddr(p, int(pn))) - default: - log.Warnf("unexpected addr length %d for %s", len(p), p) - } - } out.done = make(chan struct{}) - go out.poll(addr, addr6, poll, log) + go out.poll(addr4, addr6, poll, log) } return out } -func ipv4KernelAddr(ip net.IP, port int) string { - return fmt.Sprintf("%08X:%04X", reverse(ip.To4()), port) -} - -func ipv6KernelAddr(ip net.IP, port int) string { - return fmt.Sprintf("%032X:%04X", reverse(ip.To16()), port) -} - -func reverse(b []byte) []byte { - c := make([]byte, len(b)) - for i, e := range b { - c[len(b)-1-i] = e - } - return c -} - // log logs metric for the given packet. func (m *inputMetrics) log(data []byte, timestamp time.Time) { if m == nil { @@ -338,6 +301,9 @@ func procNetTCP(path string, addr []string, hasUnspecified bool, addrIsUnspecifi if len(addr) == 0 { return 0, nil } + if len(addr) != len(addrIsUnspecified) { + return 0, errors.New("mismatched address/unspecified lists: please report this") + } b, err := os.ReadFile(path) if err != nil { return 0, err diff --git a/filebeat/input/tcp/input_test.go b/filebeat/input/tcp/input_test.go index 2c4ebf1e0f8..5f53de51682 100644 --- a/filebeat/input/tcp/input_test.go +++ b/filebeat/input/tcp/input_test.go @@ -22,13 +22,15 @@ import ( "testing" "github.com/stretchr/testify/assert" + + "github.com/elastic/beats/v7/filebeat/input/internal/procnet" ) func TestProcNetTCP(t *testing.T) { t.Run("IPv4", func(t *testing.T) { path := "testdata/proc_net_tcp.txt" t.Run("with_match", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.IP{0x7f, 0x00, 0x00, 0x01}, 0x17ac)} + addr := []string{procnet.IPv4(net.IP{0x7f, 0x00, 0x00, 0x01}, 0x17ac)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -39,7 +41,7 @@ func TestProcNetTCP(t *testing.T) { }) t.Run("leading_zero", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.IP{0x00, 0x7f, 0x01, 0x00}, 0x17af)} + addr := []string{procnet.IPv4(net.IP{0x00, 0x7f, 0x01, 0x00}, 0x17af)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -50,7 +52,7 @@ func TestProcNetTCP(t *testing.T) { }) t.Run("unspecified", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.ParseIP("0.0.0.0"), 0x17ac)} + addr := []string{procnet.IPv4(net.ParseIP("0.0.0.0"), 0x17ac)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -62,8 +64,8 @@ func TestProcNetTCP(t *testing.T) { t.Run("without_match", func(t *testing.T) { addr := []string{ - ipv4KernelAddr(net.IP{0xde, 0xad, 0xbe, 0xef}, 0xf00d), - ipv4KernelAddr(net.IP{0xba, 0x1d, 0xfa, 0xce}, 0x1135), + procnet.IPv4(net.IP{0xde, 0xad, 0xbe, 0xef}, 0xf00d), + procnet.IPv4(net.IP{0xba, 0x1d, 0xfa, 0xce}, 0x1135), } hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) _, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) @@ -87,7 +89,7 @@ func TestProcNetTCP(t *testing.T) { t.Run("IPv6", func(t *testing.T) { path := "testdata/proc_net_tcp6.txt" t.Run("with_match", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.IP{0: 0x7f, 3: 0x01, 15: 0}, 0x17ac)} + addr := []string{procnet.IPv6(net.IP{0: 0x7f, 3: 0x01, 15: 0}, 0x17ac)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -98,7 +100,7 @@ func TestProcNetTCP(t *testing.T) { }) t.Run("leading_zero", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.IP{1: 0x7f, 2: 0x01, 15: 0}, 0x17af)} + addr := []string{procnet.IPv6(net.IP{1: 0x7f, 2: 0x01, 15: 0}, 0x17af)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -109,7 +111,7 @@ func TestProcNetTCP(t *testing.T) { }) t.Run("unspecified", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.ParseIP("[::]"), 0x17ac)} + addr := []string{procnet.IPv6(net.ParseIP("[::]"), 0x17ac)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -121,8 +123,8 @@ func TestProcNetTCP(t *testing.T) { t.Run("without_match", func(t *testing.T) { addr := []string{ - ipv6KernelAddr(net.IP{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef}, 0xf00d), - ipv6KernelAddr(net.IP{0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce}, 0x1135), + procnet.IPv6(net.IP{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef}, 0xf00d), + procnet.IPv6(net.IP{0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce}, 0x1135), } hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) _, err := procNetTCP(path, addr, hasUnspecified, addrIsUnspecified) diff --git a/filebeat/input/udp/input.go b/filebeat/input/udp/input.go index f6f2536614a..831fb41c2ee 100644 --- a/filebeat/input/udp/input.go +++ b/filebeat/input/udp/input.go @@ -32,6 +32,7 @@ import ( "github.com/dustin/go-humanize" "github.com/rcrowley/go-metrics" + "github.com/elastic/beats/v7/filebeat/input/internal/procnet" input "github.com/elastic/beats/v7/filebeat/input/v2" stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" "github.com/elastic/beats/v7/filebeat/inputsource" @@ -188,33 +189,11 @@ func newInputMetrics(id, device string, buflen uint64, poll time.Duration, log * out.bufferLen.Set(buflen) if poll > 0 && runtime.GOOS == "linux" { - host, port, err := net.SplitHostPort(device) + addr, addr6, err := procnet.Addrs(device, log) if err != nil { - log.Warnf("failed to get address for %s: could not split host and port:", err) + log.Warn(err) return out } - ip, err := net.LookupIP(host) - if err != nil { - log.Warnf("failed to get address for %s: %v", device, err) - return out - } - pn, err := strconv.ParseInt(port, 10, 16) - if err != nil { - log.Warnf("failed to get port for %s: %v", device, err) - return out - } - addr := make([]string, 0, len(ip)) - addr6 := make([]string, 0, len(ip)) - for _, p := range ip { - switch len(p) { - case net.IPv4len: - addr = append(addr, ipv4KernelAddr(p, int(pn))) - case net.IPv6len: - addr6 = append(addr6, ipv6KernelAddr(p, int(pn))) - default: - log.Warnf("unexpected addr length %d for %s", len(p), p) - } - } out.done = make(chan struct{}) go out.poll(addr, addr6, poll, log) } @@ -222,22 +201,6 @@ func newInputMetrics(id, device string, buflen uint64, poll time.Duration, log * return out } -func ipv4KernelAddr(ip net.IP, port int) string { - return fmt.Sprintf("%08X:%04X", reverse(ip.To4()), port) -} - -func ipv6KernelAddr(ip net.IP, port int) string { - return fmt.Sprintf("%032X:%04X", reverse(ip.To16()), port) -} - -func reverse(b []byte) []byte { - c := make([]byte, len(b)) - for i, e := range b { - c[len(b)-1-i] = e - } - return c -} - // log logs metric for the given packet. func (m *inputMetrics) log(data []byte, timestamp time.Time) { if m == nil { @@ -272,7 +235,7 @@ func (m *inputMetrics) poll(addr, addr6 []string, each time.Duration, log *logp. if err != nil { log.Warnf("failed to get initial udp stats from /proc: %v", err) } - rx6, drops6, err := procNetUDP("/proc/net/udp6", addr, hasUnspecified6, addrIsUnspecified6) + rx6, drops6, err := procNetUDP("/proc/net/udp6", addr6, hasUnspecified6, addrIsUnspecified6) if err != nil { log.Warnf("failed to get initial udp6 stats from /proc: %v", err) } @@ -288,7 +251,7 @@ func (m *inputMetrics) poll(addr, addr6 []string, each time.Duration, log *logp. log.Warnf("failed to get udp stats from /proc: %v", err) continue } - rx6, drops6, err := procNetUDP("/proc/net/udp6", addr, hasUnspecified6, addrIsUnspecified6) + rx6, drops6, err := procNetUDP("/proc/net/udp6", addr6, hasUnspecified6, addrIsUnspecified6) if err != nil { log.Warnf("failed to get udp6 stats from /proc: %v", err) continue @@ -333,6 +296,9 @@ func procNetUDP(path string, addr []string, hasUnspecified bool, addrIsUnspecifi if len(addr) == 0 { return 0, 0, nil } + if len(addr) != len(addrIsUnspecified) { + return 0, 0, errors.New("mismatched address/unspecified lists: please report this") + } b, err := os.ReadFile(path) if err != nil { return 0, 0, err diff --git a/filebeat/input/udp/input_test.go b/filebeat/input/udp/input_test.go index 8acf972a3ee..756f17375f9 100644 --- a/filebeat/input/udp/input_test.go +++ b/filebeat/input/udp/input_test.go @@ -22,13 +22,15 @@ import ( "testing" "github.com/stretchr/testify/assert" + + "github.com/elastic/beats/v7/filebeat/input/internal/procnet" ) func TestProcNetUDP(t *testing.T) { t.Run("IPv4", func(t *testing.T) { path := "testdata/proc_net_udp.txt" t.Run("with_match", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.IP{0x0a, 0x64, 0x08, 0x25}, 0x1bbe)} + addr := []string{procnet.IPv4(net.IP{0x0a, 0x64, 0x08, 0x25}, 0x1bbe)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -40,7 +42,7 @@ func TestProcNetUDP(t *testing.T) { }) t.Run("leading_zero", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.IP{0x00, 0x7f, 0x01, 0x00}, 0x1eef)} + addr := []string{procnet.IPv4(net.IP{0x00, 0x7f, 0x01, 0x00}, 0x1eef)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -52,7 +54,7 @@ func TestProcNetUDP(t *testing.T) { }) t.Run("unspecified", func(t *testing.T) { - addr := []string{ipv4KernelAddr(net.ParseIP("0.0.0.0"), 0x1bbe)} + addr := []string{procnet.IPv4(net.ParseIP("0.0.0.0"), 0x1bbe)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -65,8 +67,8 @@ func TestProcNetUDP(t *testing.T) { t.Run("without_match", func(t *testing.T) { addr := []string{ - ipv4KernelAddr(net.IP{0xde, 0xad, 0xbe, 0xef}, 0xf00d), - ipv4KernelAddr(net.IP{0xba, 0x1d, 0xfa, 0xce}, 0x1135), + procnet.IPv4(net.IP{0xde, 0xad, 0xbe, 0xef}, 0xf00d), + procnet.IPv4(net.IP{0xba, 0x1d, 0xfa, 0xce}, 0x1135), } hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) _, _, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) @@ -90,7 +92,7 @@ func TestProcNetUDP(t *testing.T) { t.Run("IPv6", func(t *testing.T) { path := "testdata/proc_net_udp6.txt" t.Run("with_match", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.IP{0: 0x7f, 3: 0x01, 15: 0}, 0x1bbd)} + addr := []string{procnet.IPv6(net.IP{0: 0x7f, 3: 0x01, 15: 0}, 0x1bbd)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -102,7 +104,7 @@ func TestProcNetUDP(t *testing.T) { }) t.Run("leading_zero", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.IP{1: 0x7f, 2: 0x81, 15: 0}, 0x1eef)} + addr := []string{procnet.IPv6(net.IP{1: 0x7f, 2: 0x81, 15: 0}, 0x1eef)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -114,7 +116,7 @@ func TestProcNetUDP(t *testing.T) { }) t.Run("unspecified", func(t *testing.T) { - addr := []string{ipv6KernelAddr(net.ParseIP("[::]"), 0x1bbd)} + addr := []string{procnet.IPv6(net.ParseIP("[::]"), 0x1bbd)} hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) rx, drops, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) if err != nil { @@ -127,8 +129,8 @@ func TestProcNetUDP(t *testing.T) { t.Run("without_match", func(t *testing.T) { addr := []string{ - ipv6KernelAddr(net.IP{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef}, 0xf00d), - ipv6KernelAddr(net.IP{0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce}, 0x1135), + procnet.IPv6(net.IP{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef}, 0xf00d), + procnet.IPv6(net.IP{0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce, 0xba, 0x1d, 0xfa, 0xce}, 0x1135), } hasUnspecified, addrIsUnspecified, bad := containsUnspecifiedAddr(addr) _, _, err := procNetUDP(path, addr, hasUnspecified, addrIsUnspecified) diff --git a/filebeat/modules.d/apache.yml.disabled b/filebeat/modules.d/apache.yml.disabled index d4fbc61659d..cd58ed77b3c 100644 --- a/filebeat/modules.d/apache.yml.disabled +++ b/filebeat/modules.d/apache.yml.disabled @@ -1,5 +1,5 @@ # Module: apache -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-apache.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-apache.html - module: apache # Access logs diff --git a/filebeat/modules.d/auditd.yml.disabled b/filebeat/modules.d/auditd.yml.disabled index 8bcedafdee9..b63d14ffc27 100644 --- a/filebeat/modules.d/auditd.yml.disabled +++ b/filebeat/modules.d/auditd.yml.disabled @@ -1,5 +1,5 @@ # Module: auditd -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-auditd.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-auditd.html - module: auditd log: diff --git a/filebeat/modules.d/elasticsearch.yml.disabled b/filebeat/modules.d/elasticsearch.yml.disabled index 75236f1a664..33ea085f784 100644 --- a/filebeat/modules.d/elasticsearch.yml.disabled +++ b/filebeat/modules.d/elasticsearch.yml.disabled @@ -1,5 +1,5 @@ # Module: elasticsearch -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-elasticsearch.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-elasticsearch.html - module: elasticsearch # Server log diff --git a/filebeat/modules.d/haproxy.yml.disabled b/filebeat/modules.d/haproxy.yml.disabled index 5863c5bbdf8..cb0a107fb5f 100644 --- a/filebeat/modules.d/haproxy.yml.disabled +++ b/filebeat/modules.d/haproxy.yml.disabled @@ -1,5 +1,5 @@ # Module: haproxy -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-haproxy.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-haproxy.html - module: haproxy # All logs diff --git a/filebeat/modules.d/icinga.yml.disabled b/filebeat/modules.d/icinga.yml.disabled index 10ab79616eb..1f0ba5e4de4 100644 --- a/filebeat/modules.d/icinga.yml.disabled +++ b/filebeat/modules.d/icinga.yml.disabled @@ -1,5 +1,5 @@ # Module: icinga -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-icinga.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-icinga.html - module: icinga # Main logs diff --git a/filebeat/modules.d/iis.yml.disabled b/filebeat/modules.d/iis.yml.disabled index 868fadedbb0..6be750c8701 100644 --- a/filebeat/modules.d/iis.yml.disabled +++ b/filebeat/modules.d/iis.yml.disabled @@ -1,5 +1,5 @@ # Module: iis -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-iis.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-iis.html - module: iis # Access logs diff --git a/filebeat/modules.d/kafka.yml.disabled b/filebeat/modules.d/kafka.yml.disabled index fd7b0013739..0cc4fbf9fe3 100644 --- a/filebeat/modules.d/kafka.yml.disabled +++ b/filebeat/modules.d/kafka.yml.disabled @@ -1,5 +1,5 @@ # Module: kafka -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-kafka.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-kafka.html - module: kafka # All logs diff --git a/filebeat/modules.d/kibana.yml.disabled b/filebeat/modules.d/kibana.yml.disabled index bc34de819a5..5ade4bf1439 100644 --- a/filebeat/modules.d/kibana.yml.disabled +++ b/filebeat/modules.d/kibana.yml.disabled @@ -1,5 +1,5 @@ # Module: kibana -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-kibana.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-kibana.html - module: kibana # Server logs diff --git a/filebeat/modules.d/logstash.yml.disabled b/filebeat/modules.d/logstash.yml.disabled index fe99eeabae4..501b8bc3321 100644 --- a/filebeat/modules.d/logstash.yml.disabled +++ b/filebeat/modules.d/logstash.yml.disabled @@ -1,5 +1,5 @@ # Module: logstash -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-logstash.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-logstash.html - module: logstash # logs diff --git a/filebeat/modules.d/mongodb.yml.disabled b/filebeat/modules.d/mongodb.yml.disabled index ac31f64bed1..4180e598582 100644 --- a/filebeat/modules.d/mongodb.yml.disabled +++ b/filebeat/modules.d/mongodb.yml.disabled @@ -1,5 +1,5 @@ # Module: mongodb -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-mongodb.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-mongodb.html - module: mongodb # All logs diff --git a/filebeat/modules.d/mysql.yml.disabled b/filebeat/modules.d/mysql.yml.disabled index dd5079648bc..b2c42d1f1cd 100644 --- a/filebeat/modules.d/mysql.yml.disabled +++ b/filebeat/modules.d/mysql.yml.disabled @@ -1,5 +1,5 @@ # Module: mysql -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-mysql.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-mysql.html - module: mysql # Error logs diff --git a/filebeat/modules.d/nats.yml.disabled b/filebeat/modules.d/nats.yml.disabled index 6074f499cad..2cfa45e5c19 100644 --- a/filebeat/modules.d/nats.yml.disabled +++ b/filebeat/modules.d/nats.yml.disabled @@ -1,5 +1,5 @@ # Module: nats -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-nats.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-nats.html - module: nats # All logs diff --git a/filebeat/modules.d/nginx.yml.disabled b/filebeat/modules.d/nginx.yml.disabled index 450b30c0e01..709e52630e9 100644 --- a/filebeat/modules.d/nginx.yml.disabled +++ b/filebeat/modules.d/nginx.yml.disabled @@ -1,5 +1,5 @@ # Module: nginx -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-nginx.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-nginx.html - module: nginx # Access logs diff --git a/filebeat/modules.d/osquery.yml.disabled b/filebeat/modules.d/osquery.yml.disabled index 0740b774a52..2def611ecbb 100644 --- a/filebeat/modules.d/osquery.yml.disabled +++ b/filebeat/modules.d/osquery.yml.disabled @@ -1,5 +1,5 @@ # Module: osquery -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-osquery.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-osquery.html - module: osquery result: diff --git a/filebeat/modules.d/pensando.yml.disabled b/filebeat/modules.d/pensando.yml.disabled index 1002b61bf3e..18a8b7d4efe 100644 --- a/filebeat/modules.d/pensando.yml.disabled +++ b/filebeat/modules.d/pensando.yml.disabled @@ -1,5 +1,5 @@ # Module: pensando -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-pensando.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-pensando.html - module: pensando # Firewall logs diff --git a/filebeat/modules.d/postgresql.yml.disabled b/filebeat/modules.d/postgresql.yml.disabled index 5df32fefc49..bec77dc84f7 100644 --- a/filebeat/modules.d/postgresql.yml.disabled +++ b/filebeat/modules.d/postgresql.yml.disabled @@ -1,5 +1,5 @@ # Module: postgresql -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-postgresql.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-postgresql.html - module: postgresql # All logs diff --git a/filebeat/modules.d/redis.yml.disabled b/filebeat/modules.d/redis.yml.disabled index dfec32f8849..31b022d2bc9 100644 --- a/filebeat/modules.d/redis.yml.disabled +++ b/filebeat/modules.d/redis.yml.disabled @@ -1,5 +1,5 @@ # Module: redis -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-redis.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-redis.html - module: redis # Main logs diff --git a/filebeat/modules.d/santa.yml.disabled b/filebeat/modules.d/santa.yml.disabled index 9655b1afb59..4707b903ce8 100644 --- a/filebeat/modules.d/santa.yml.disabled +++ b/filebeat/modules.d/santa.yml.disabled @@ -1,5 +1,5 @@ # Module: santa -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-santa.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-santa.html - module: santa log: diff --git a/filebeat/modules.d/system.yml.disabled b/filebeat/modules.d/system.yml.disabled index 4171c65f7ad..1302c6374da 100644 --- a/filebeat/modules.d/system.yml.disabled +++ b/filebeat/modules.d/system.yml.disabled @@ -1,5 +1,5 @@ # Module: system -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-system.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-system.html - module: system # Syslog diff --git a/filebeat/modules.d/traefik.yml.disabled b/filebeat/modules.d/traefik.yml.disabled index 440028cc182..cc65ce2de9c 100644 --- a/filebeat/modules.d/traefik.yml.disabled +++ b/filebeat/modules.d/traefik.yml.disabled @@ -1,5 +1,5 @@ # Module: traefik -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-traefik.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-traefik.html - module: traefik # Access logs diff --git a/filebeat/registrar/registrar.go b/filebeat/registrar/registrar.go index c7043da249c..3ba8427e55f 100644 --- a/filebeat/registrar/registrar.go +++ b/filebeat/registrar/registrar.go @@ -23,8 +23,6 @@ import ( "sync" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/filebeat/input/file" "github.com/elastic/beats/v7/libbeat/statestore" "github.com/elastic/beats/v7/libbeat/statestore/backend" @@ -102,7 +100,7 @@ func (r *Registrar) GetStates() []file.State { func (r *Registrar) loadStates() error { states, err := readStatesFrom(r.store) if err != nil { - return errors.Wrap(err, "can not load filebeat registry state") + return fmt.Errorf("can not load filebeat registry state: %w", err) } r.states.SetStates(states) diff --git a/filebeat/tests/integration/setup_pipelines_test.go b/filebeat/tests/integration/setup_pipelines_test.go new file mode 100644 index 00000000000..bb74ecbe24f --- /dev/null +++ b/filebeat/tests/integration/setup_pipelines_test.go @@ -0,0 +1,202 @@ +// 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 integration + +import ( + "fmt" + "net/http" + "net/url" + "path/filepath" + "testing" + "time" + + cp "github.com/otiai10/copy" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/tests/integration" +) + +func TestSetupNoModules(t *testing.T) { + cfg := ` +filebeat: +output.elasticsearch: + hosts: + - %s + username: %s + password: %s + allow_older_versions: true +setup.kibana: + hosts: %s + username: %s + password: %s +` + integration.EnsureESIsRunning(t) + esURL := integration.GetESURL(t, "http") + esPassword, ok := esURL.User.Password() + require.True(t, ok, "ES didn't have a password") + kURL, kUserInfo := integration.GetKibana(t) + kPassword, ok := kUserInfo.Password() + require.True(t, ok, "Kibana didn't have a password") + + filebeat := integration.NewBeat(t, "filebeat", "../../filebeat.test") + + err := cp.Copy("../../module", filepath.Join(filebeat.TempDir(), "module")) + require.NoError(t, err, "error copying module directory") + + err = cp.Copy("../../modules.d", filepath.Join(filebeat.TempDir(), "modules.d")) + require.NoError(t, err, "error copying modules.d directory") + + filebeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.Host, esURL.User.Username(), esPassword, kURL.Host, kUserInfo.Username(), kPassword)) + filebeat.Start("setup") + filebeat.WaitForLogs("Setup called, but no modules enabled.", 10*time.Second) +} + +func TestSetupModulesNoFileset(t *testing.T) { + cfg := ` +filebeat.config: + modules: + enabled: true + path: modules.d/*.yml +output.elasticsearch: + hosts: + - %s + username: %s + password: %s + allow_older_versions: true +setup.kibana: + hosts: %s + username: %s + password: %s +logging.level: debug +` + integration.EnsureESIsRunning(t) + esURL := integration.GetESURL(t, "http") + esPassword, ok := esURL.User.Password() + require.True(t, ok, "ES didn't have a password") + kURL, kUserInfo := integration.GetKibana(t) + kPassword, ok := kUserInfo.Password() + require.True(t, ok, "Kibana didn't have a password") + + filebeat := integration.NewBeat(t, "filebeat", "../../filebeat.test") + + err := cp.Copy("../../module", filepath.Join(filebeat.TempDir(), "module")) + require.NoError(t, err, "error copying module directory") + + err = cp.Copy("../../modules.d", filepath.Join(filebeat.TempDir(), "modules.d")) + require.NoError(t, err, "error copying modules.d directory") + + filebeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.Host, esURL.User.Username(), esPassword, kURL.Host, kUserInfo.Username(), kPassword)) + filebeat.Start("setup", "--pipelines") + filebeat.WaitForLogs("Number of module configs found: 0", 10*time.Second) +} + +func TestSetupModulesOneEnabled(t *testing.T) { + cfg := ` +filebeat.config: + modules: + enabled: true + path: modules.d/*.yml +output.elasticsearch: + hosts: + - %s + username: %s + password: %s + allow_older_versions: true +setup.kibana: + hosts: %s + username: %s + password: %s +logging.level: debug +` + integration.EnsureESIsRunning(t) + esURL := integration.GetESURL(t, "http") + esPassword, ok := esURL.User.Password() + require.True(t, ok, "ES didn't have a password") + kURL, kUserInfo := integration.GetKibana(t) + kPassword, ok := kUserInfo.Password() + require.True(t, ok, "Kibana didn't have a password") + + filebeat := integration.NewBeat(t, "filebeat", "../../filebeat.test") + + err := cp.Copy("../../module", filepath.Join(filebeat.TempDir(), "module")) + require.NoError(t, err, "error copying module directory") + + err = cp.Copy("../../modules.d", filepath.Join(filebeat.TempDir(), "modules.d")) + require.NoError(t, err, "error copying modules.d directory") + + filebeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.Host, esURL.User.Username(), esPassword, kURL.Host, kUserInfo.Username(), kPassword)) + filebeat.Start("setup", "--pipelines", "--modules", "apache") + filebeat.WaitForLogs("Exiting: module apache is configured but has no enabled filesets", 10*time.Second) +} + +func TestSetupModulesOneEnabledOverride(t *testing.T) { + cfg := ` +filebeat.config: + modules: + enabled: true + path: modules.d/*.yml +output.elasticsearch: + hosts: + - %s + username: %s + password: %s + allow_older_versions: true +setup.kibana: + hosts: %s + username: %s + password: %s +logging.level: debug +` + integration.EnsureESIsRunning(t) + esURL := integration.GetESURL(t, "http") + esPassword, ok := esURL.User.Password() + require.True(t, ok, "ES didn't have a password") + kURL, kUserInfo := integration.GetKibana(t) + kPassword, ok := kUserInfo.Password() + require.True(t, ok, "Kibana didn't have a password") + + filebeat := integration.NewBeat(t, "filebeat", "../../filebeat.test") + + err := cp.Copy("../../module", filepath.Join(filebeat.TempDir(), "module")) + require.NoError(t, err, "error copying module directory") + + err = cp.Copy("../../modules.d", filepath.Join(filebeat.TempDir(), "modules.d")) + require.NoError(t, err, "error copying modules.d directory") + + filebeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.Host, esURL.User.Username(), esPassword, kURL.Host, kUserInfo.Username(), kPassword)) + + t.Cleanup(func() { + delURL, err := url.Parse(esURL.String()) + if err != nil { + t.Fatalf("could not parse ES url: %s", err) + } + delURL.Path = "/_ingest/pipeline/filebeat-*" + ret, _, err := integration.HttpDo(t, http.MethodDelete, *delURL) + if err != nil { + t.Logf("error while deleting filebeat-* pipelines: %s", err) + } + if ret != http.StatusOK { + t.Logf("status was %d while deleting filebeat-* pipelines", ret) + } + }) + filebeat.Start("setup", "--pipelines", "--modules", "apache", "--force-enable-module-filesets") + filebeat.WaitForLogs("Elasticsearch pipeline loaded.", 10*time.Second) + filebeat.WaitForLogs("Elasticsearch pipeline loaded.", 10*time.Second) +} diff --git a/go.mod b/go.mod index 99611863897..fecbf95b1ed 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/elastic/beats/v7 -go 1.19 +go 1.20 require ( cloud.google.com/go/bigquery v1.44.0 @@ -28,8 +28,8 @@ require ( github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/aws/aws-lambda-go v1.13.3 github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.15.12 - github.com/aws/aws-sdk-go-v2/credentials v1.12.7 + github.com/aws/aws-sdk-go-v2/config v1.17.7 + github.com/aws/aws-sdk-go-v2/credentials v1.12.20 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.15.5 github.com/aws/aws-sdk-go-v2/service/costexplorer v1.18.4 @@ -39,15 +39,15 @@ require ( github.com/aws/aws-sdk-go-v2/service/organizations v1.15.2 github.com/aws/aws-sdk-go-v2/service/rds v1.20.1 github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.13.5 - github.com/aws/aws-sdk-go-v2/service/s3 v1.26.12 + github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11 github.com/aws/aws-sdk-go-v2/service/sqs v1.18.4 - github.com/aws/aws-sdk-go-v2/service/sts v1.16.8 + github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 github.com/awslabs/goformation/v4 v4.1.0 github.com/blakesmith/ar v0.0.0-20150311145944-8bd4349a67f2 github.com/bsm/sarama-cluster v2.1.14-0.20180625083203-7e67d87a6b3f+incompatible github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e // indirect github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e - github.com/cespare/xxhash/v2 v2.1.2 + github.com/cespare/xxhash/v2 v2.2.0 github.com/cloudfoundry-community/go-cfclient v0.0.0-20190808214049-35bcce23fc5f github.com/cloudfoundry/noaa v2.1.0+incompatible github.com/cloudfoundry/sonde-go v0.0.0-20171206171820-b33733203bb4 @@ -69,16 +69,16 @@ require ( github.com/dustin/go-humanize v1.0.1 github.com/eapache/go-resiliency v1.2.0 github.com/eclipse/paho.mqtt.golang v1.3.5 - github.com/elastic/elastic-agent-client/v7 v7.1.2 + github.com/elastic/elastic-agent-client/v7 v7.3.0 github.com/elastic/go-concert v0.2.0 - github.com/elastic/go-libaudit/v2 v2.3.2 + github.com/elastic/go-libaudit/v2 v2.3.3 github.com/elastic/go-licenser v0.4.1 github.com/elastic/go-lookslike v0.3.0 github.com/elastic/go-lumber v0.1.2-0.20220819171948-335fde24ea0f github.com/elastic/go-perf v0.0.0-20191212140718-9c656876f595 github.com/elastic/go-seccomp-bpf v1.3.0 github.com/elastic/go-structform v0.0.10 - github.com/elastic/go-sysinfo v1.11.0 + github.com/elastic/go-sysinfo v1.11.1 github.com/elastic/go-ucfg v0.8.6 github.com/elastic/gosigar v0.14.2 github.com/fatih/color v1.13.0 @@ -92,7 +92,7 @@ require ( github.com/godbus/dbus/v5 v5.0.6 github.com/godror/godror v0.33.2 github.com/gofrs/flock v0.8.1 - github.com/gofrs/uuid v4.2.0+incompatible + github.com/gofrs/uuid v4.4.0+incompatible github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 @@ -117,7 +117,7 @@ require ( github.com/josephspurrier/goversioninfo v0.0.0-20190209210621-63e6d1acd3dd github.com/jpillora/backoff v1.0.0 // indirect github.com/lib/pq v1.10.3 - github.com/magefile/mage v1.14.0 + github.com/magefile/mage v1.15.0 github.com/mattn/go-colorable v0.1.12 github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe // indirect github.com/miekg/dns v1.1.42 @@ -138,9 +138,9 @@ require ( github.com/samuel/go-thrift v0.0.0-20140522043831-2187045faa54 github.com/sanathkr/yaml v1.0.1-0.20170819201035-0056894fa522 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/spf13/cobra v1.3.0 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.4 github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b github.com/ugorji/go/codec v1.1.8 github.com/urso/sderr v0.0.0-20210525210834-52b04e8f5c71 @@ -152,20 +152,20 @@ require ( go.uber.org/atomic v1.10.0 go.uber.org/multierr v1.10.0 go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.6.0 + golang.org/x/crypto v0.12.0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/mod v0.9.0 - golang.org/x/net v0.9.0 + 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.7.0 - golang.org/x/text v0.9.0 + golang.org/x/sys v0.11.0 + golang.org/x/text v0.12.0 golang.org/x/time v0.3.0 golang.org/x/tools v0.6.0 google.golang.org/api v0.103.0 - google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37 - google.golang.org/grpc v1.51.0 - google.golang.org/protobuf v1.28.1 + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f + google.golang.org/grpc v1.53.0 + google.golang.org/protobuf v1.29.1 gopkg.in/inf.v0 v0.9.1 gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect @@ -182,8 +182,8 @@ require ( ) require ( - cloud.google.com/go v0.105.0 - cloud.google.com/go/compute v1.14.0 + cloud.google.com/go v0.107.0 + cloud.google.com/go/compute v1.15.1 cloud.google.com/go/redis v1.10.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.2 @@ -191,40 +191,43 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement v1.0.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.8.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 github.com/Azure/go-autorest/autorest/adal v0.9.14 github.com/apache/arrow/go/v12 v12.0.1-0.20230605094802-c153c6d36ccf - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.7 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.17 + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33 github.com/aws/aws-sdk-go-v2/service/cloudformation v1.20.4 github.com/aws/aws-sdk-go-v2/service/kinesis v1.15.8 github.com/aws/smithy-go v1.13.5 github.com/awslabs/kinesis-aggregation/go/v2 v2.0.0-20220623125934-28468a6701b5 github.com/elastic/bayeux v1.0.5 github.com/elastic/elastic-agent-autodiscover v0.6.2 - github.com/elastic/elastic-agent-libs v0.3.9 + github.com/elastic/elastic-agent-libs v0.3.13 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/go-elasticsearch/v8 v8.8.1 - github.com/elastic/mito v1.4.0 + github.com/elastic/go-elasticsearch/v8 v8.9.0 + github.com/elastic/mito v1.5.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 github.com/googleapis/gax-go/v2 v2.7.0 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 - github.com/pierrec/lz4/v4 v4.1.15 + github.com/lestrrat-go/jwx/v2 v2.0.11 + github.com/otiai10/copy v1.12.0 + github.com/pierrec/lz4/v4 v4.1.16 + github.com/pkg/xattr v0.4.9 github.com/shirou/gopsutil/v3 v3.22.10 - go.elastic.co/apm/module/apmelasticsearch/v2 v2.0.0 - go.elastic.co/apm/module/apmhttp/v2 v2.0.0 - go.elastic.co/apm/v2 v2.0.0 + go.elastic.co/apm/module/apmelasticsearch/v2 v2.4.4 + go.elastic.co/apm/module/apmhttp/v2 v2.4.4 + go.elastic.co/apm/v2 v2.4.4 go.mongodb.org/mongo-driver v1.5.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) require ( aqwari.net/xml v0.0.0-20210331023308-d9421b293817 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v0.8.0 // indirect cloud.google.com/go/longrunning v0.3.0 // indirect code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f // indirect @@ -244,20 +247,22 @@ require ( github.com/apache/thrift v0.18.1 // 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.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.8 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 // indirect + 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/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 github.com/dnephin/pflag v1.0.7 // indirect github.com/docker/go-metrics v0.0.1 // indirect @@ -268,13 +273,13 @@ require ( github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/fearful-symmetry/gomsr v0.0.1 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.3+incompatible // 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-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gobuffalo/here v0.6.7 // indirect - github.com/goccy/go-json v0.9.11 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/godror/knownpb v0.1.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect @@ -292,8 +297,7 @@ require ( github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/go-version v1.2.0 // indirect github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jcchavezs/porto v0.1.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect @@ -308,6 +312,11 @@ require ( github.com/klauspost/compress v1.16.5 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/httprc v1.0.4 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/markbates/pkger v0.17.1 // indirect @@ -330,7 +339,7 @@ require ( github.com/prometheus/client_golang v1.11.1 // indirect github.com/rootless-containers/rootlesskit v1.1.0 // indirect github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b // indirect - github.com/santhosh-tekuri/jsonschema v1.2.4 // indirect + github.com/segmentio/asm v1.2.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect @@ -343,13 +352,13 @@ require ( github.com/xdg-go/scram v1.0.2 // indirect github.com/xdg-go/stringprep v1.0.2 // indirect github.com/xdg/stringprep v1.0.3 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.elastic.co/fastjson v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/term v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -376,6 +385,7 @@ require ( replace ( github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/consumption/armconsumption => github.com/elastic/azure-sdk-for-go/sdk/resourcemanager/consumption/armconsumption v1.0.1-0.20230529151645-4546c1b1f847 github.com/Microsoft/go-winio => github.com/bi-zone/go-winio v0.4.15 + github.com/Microsoft/hcsshim => github.com/Microsoft/hcsshim v0.9.8 github.com/Shopify/sarama => github.com/elastic/sarama v1.19.1-0.20220310193331-ebc2b0d8eef3 github.com/apoydence/eachers => github.com/poy/eachers v0.0.0-20181020210610-23942921fe77 //indirect, see https://github.com/elastic/beats/pull/29780 for details. github.com/cucumber/godog => github.com/cucumber/godog v0.8.1 @@ -389,7 +399,9 @@ replace ( github.com/golang/glog => github.com/elastic/glog v1.0.1-0.20210831205241-7d8b5c89dfc4 github.com/google/gopacket => github.com/elastic/gopacket v1.1.20-0.20211202005954-d412fca7f83a github.com/insomniacslk/dhcp => github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3 // indirect + github.com/snowflakedb/gosnowflake => github.com/snowflakedb/gosnowflake v1.6.19 github.com/tonistiigi/fifo => github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c + k8s.io/kubernetes v1.13.0 => k8s.io/kubernetes v1.24.15 ) // Exclude this version because the version has an invalid checksum. diff --git a/go.sum b/go.sum index 4bdb8d57fdf..93222d899ee 100644 --- a/go.sum +++ b/go.sum @@ -24,16 +24,8 @@ cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECH cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -44,14 +36,13 @@ cloud.google.com/go/bigquery v1.44.0 h1:Wi4dITi+cf9VYp4VH2T9O41w0kCW0uQTELq2Z6tu cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/bigtable v1.3.0/go.mod h1:z5EyKrPE8OQmeg4h5MNdKvuSnI9CCT49Ki3f23aBzio= -cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datacatalog v1.8.0 h1:6kZ4RIOW/uT7QWC5SfPfq/G8sYzr/v+UOmOAxy4Z1TE= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/kms v1.6.0 h1:OWRZzrPmOZUzurjI2FBGtgY2mB1WaJkqhw6oIwSj0Yg= @@ -84,6 +75,10 @@ code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a h1:8rqv2w8xEceN code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/azure-amqp-common-go/v3 v3.2.1 h1:uQyDk81yn5hTP1pW4Za+zHzy97/f4vDz9o1d/exI4j4= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-event-hubs-go/v3 v3.3.15 h1:2yAik9gS5Qjs4Z6EM1B6d0tfZJ506B/0oA08JlRQxb8= @@ -92,18 +87,25 @@ github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9a github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v41.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v55.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v59.0.0+incompatible h1:I1ULJqny1qQhUBFy11yDXHhW3pLvbhwV0PTn7mjp9V0= github.com/Azure/azure-sdk-for-go v59.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0/go.mod h1:tZoQYdDZNOiIjdSn0dVWVfl0NEPGOJqVLzSrcFk4Is0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.2 h1:uqM+VoHjVH6zdlkLF2b6O0ZANcHoj3rO0PoQ3jglUJA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.2/go.mod h1:twTKAa1E6hLmSDjLhaCkbTMQKc7p/rNLU40rLxGEOCI= github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.1/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0 h1:leh5DwKv6Ihwi+h60uHtn6UWAxBbZ0q8DwQVMzf61zw= github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement v1.0.0 h1:8L7OWiGwm6qe2U3zDv3K3WDXwOOgurDu7qw6Mv86Nlw= @@ -112,8 +114,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.8.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.8.0/go.mod h1:kzRLpzzlw6eBUXE7eBw3oqfmKR/kxaHOk4+h9sAe6Yo= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1 h1:QSdcrd/UFJv6Bp/CfoVf2SrENpFn9P6Yh8yb+xNhYMM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1/go.mod h1:eZ4g6GUvXiGulfIbbhh1Xr4XwUYaYaWMqzGD/284wCA= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= @@ -122,12 +124,14 @@ github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fw github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.10.1/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.19 h1:7/IqD2fEYVha1EPeaiytVKhzmPV223pfkRIQUGOK2IE= @@ -137,6 +141,7 @@ github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.14 h1:G8hexQdV5D4khOXrWG2YuLCFKhWYmWD8bHYaXN5ophk= @@ -152,6 +157,7 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= @@ -167,6 +173,7 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/AzureAD/microsoft-authentication-library-for-go v0.9.0 h1:UE9n9rkJF62ArLb1F3DEjRt8O3jLwMWdSoypKV4f3MU= github.com/AzureAD/microsoft-authentication-library-for-go v0.9.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= @@ -183,7 +190,9 @@ github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.16.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.9.8/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -199,6 +208,7 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= @@ -210,7 +220,10 @@ github.com/aerospike/aerospike-client-go v1.27.1-0.20170612174108-0f3b54da6bdc h github.com/aerospike/aerospike-client-go v1.27.1-0.20170612174108-0f3b54da6bdc/go.mod h1:zj8LBEnWBDOVEIJt8LvaRvDG5ARAoa5dBeHaB472NRc= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -219,11 +232,13 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20 h1:7rj9qZ63knnVo2ZeepYHvHuRdG76f3tRUTdIQDzRBeI= github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20/go.mod h1:cI59GRkC2FRaFYtgbYEqMlgnnfvAwXzjojyZKXwklNg= github.com/andrewkroh/sys v0.0.0-20151128191922-287798fe3e43 h1:WFwa9pqou0Nb4DdfBOyaBTH0GqLE74Qwdf61E7ITHwQ= github.com/andrewkroh/sys v0.0.0-20151128191922-287798fe3e43/go.mod h1:tJPYQG4mnMeUtQvQKNkbsFrnmZOg59Qnf8CcctFv5v4= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -233,6 +248,7 @@ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/g github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v12 v12.0.1-0.20230605094802-c153c6d36ccf h1:s5MDQXJmEalr0Urt0rPlX5UAE2BcHTiex/2Lt2O9p84= github.com/apache/arrow/go/v12 v12.0.1-0.20230605094802-c153c6d36ccf/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -244,7 +260,6 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC 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= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -258,6 +273,7 @@ github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:o github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.29.16/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= @@ -268,30 +284,34 @@ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZw github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2 v1.16.6/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= +github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3 h1:S/ZBwevQkr7gv5YxONYpGQxlMFFYSRfz3RMcjsC9Qhk= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= -github.com/aws/aws-sdk-go-v2/config v1.15.12 h1:D4mdf0cOSmZRgJe0DDOd1Qm6tkwHJ7r5i1lz0asa+AA= -github.com/aws/aws-sdk-go-v2/config v1.15.12/go.mod h1:oxRNnH11J580bxDEXyfTqfB3Auo2fxzhV052LD4HnyA= -github.com/aws/aws-sdk-go-v2/credentials v1.12.7 h1:e2DcCR0gP+T2zVj5eQPMQoRdxo+vd2p9BkpJ72BdyzA= -github.com/aws/aws-sdk-go-v2/credentials v1.12.7/go.mod h1:8b1nSHdDaKLho9VEK+K8WivifA/2K5pPm4sfI21NlQ8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.7 h1:8yi2ORCwXpXEPnj0vP3DjYhejwDQD/5klgBoxXcKOxY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.7/go.mod h1:81k6q0UUZj6AdQZ1E/VQ27cLrTUpJGraZR6/hVHRxjE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.17 h1:9Y+OvoIvC8KocGNqbbBNDvMu0zsIgzKg3r+ZllSuH5Y= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.17/go.mod h1:z/7g6Z78jPG0l3HeShseUWzA+aBJDK4Mu5DkKkYdIW0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8 h1:tcFliCWne+zOuUfKNRn8JdFBuWPDuISDH08wD2ULkhk= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8/go.mod h1:JTnlBSot91steJeti4ryyu/tLd4Sk84O5W22L7O2EQU= +github.com/aws/aws-sdk-go-v2/config v1.17.7 h1:odVM52tFHhpqZBKNjVW5h+Zt1tKHbhdTQRb+0WHrNtw= +github.com/aws/aws-sdk-go-v2/config v1.17.7/go.mod h1:dN2gja/QXxFF15hQreyrqYhLBaQo1d9ZKe/v/uplQoI= +github.com/aws/aws-sdk-go-v2/credentials v1.12.20 h1:9+ZhlDY7N9dPnUmf7CDfW9In4sW5Ff3bh7oy4DzS1IE= +github.com/aws/aws-sdk-go-v2/credentials v1.12.20/go.mod h1:UKY5HyIux08bbNA7Blv4PcXQ8cTkGh7ghHMFklaviR4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 h1:r08j4sbZu/RVi+BNxkBJwPMUYY3P8mgSDuKkZ/ZN1lE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17/go.mod h1:yIkQcCDYNsZfXpd5UX2Cy+sWA1jPgIhGTw9cOBzfVnQ= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33 h1:fAoVmNGhir6BR+RU0/EI+6+D7abM+MCwWf8v4ip5jNI= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33/go.mod h1:84XgODVR8uRhmOnUkKGUZKqIMxmjmLOR8Uyp7G/TPwc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.10/go.mod h1:F+EZtuIwjlv35kRJPyBGcsA4f7bnSoz15zOQ2lJq1Z4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.13/go.mod h1:wLLesU+LdMZDM3U0PP9vZXJW39zmD/7L4nY2pSrYZ/g= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.4/go.mod h1:8glyUqVIM4AmeenIsPo0oVh3+NUwnsQml2OFupfQW+0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.7/go.mod h1:93Uot80ddyVzSl//xEJreNKMhxntr71WtR3v/A1cRYk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.14 h1:bJv4Y9QOiW0GZPStgLgpGrpdfRDSR3XM4V4M3YCQRZo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.14/go.mod h1:R1HF8ZDdcRFfAGF+13En4LSHi2IrrNuPQCaxgWCeGyY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.4 h1:wusoY1MJ9JNrPoX3n4kxY4MTIUivCiXvTYQbYh59yxs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.4/go.mod h1:cHTMyJVEXRUZ25f8V+pq6CAwoYARarJRFGf3XH4eIxE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 h1:wj5Rwc05hvUSvKuOF29IYb9QrCLjU+rHAy/x/o0DK2c= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24/go.mod h1:jULHjqqjDlbyTa7pfM7WICATnOv+iOhjletM3N0Xbu8= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14 h1:ZSIPAkAsCCjYrhqfw2+lNzWDzxzHXEckFkTePL5RSWQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14/go.mod h1:AyGgqiKv9ECM6IZeNQtdT8NnMvUb3/2wokeq2Fgryto= github.com/aws/aws-sdk-go-v2/service/cloudformation v1.20.4 h1:faP794ma9ZY/24XAV8cm/lkQzRFSg3zBHCi5Nc8+CaM= github.com/aws/aws-sdk-go-v2/service/cloudformation v1.20.4/go.mod h1:ybjChNDMfPtc7f8ILTb+ov6CpE/KtAae9fD8HHtYfzU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 h1:sSzrsKQULJmPtmu6By4wR6g0701nGqonssKOy35uOd0= @@ -306,15 +326,15 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.18.4 h1:ZBYifRGfN github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.18.4/go.mod h1:9wKR88sRRyxrUAw5iVSDTfcCz90BLEFcAiyzP4v39uY= github.com/aws/aws-sdk-go-v2/service/iam v1.18.4 h1:E41guA79mjEbwJdh0zXz1d8+Zt4zxRr+b1ipiVbKXzs= github.com/aws/aws-sdk-go-v2/service/iam v1.18.4/go.mod h1:FpNvAfCZyIQ3qeNJUOw4CShKvdizHblXqAvSk0qmyL4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.3 h1:4n4KCtv5SUoT5Er5XV41huuzrCqepxlW3SDI9qHQebc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.3/go.mod h1:gkb2qADY+OHaGLKNTYxMaQNacfeyQpZ4csDTQMeFmcw= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.8 h1:BzBekDihMMeBexBhdK7xS3AIh2Jg/mECyLWO5RRwwHY= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.8/go.mod h1:a1BSeQI9IVr1j5Dwn73cdAKi4MdizTaV9YovUaHefGI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 h1:Lh1AShsuIJTwMkoxVCAYPJgNG5H+eN6SmoUn8nOZ5wE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9/go.mod h1:a9j48l6yL5XINLHLcOKInjdvknN+vWqPBxqeIDw7ktw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18 h1:BBYoNQt2kUZUUK4bIPsKrCcjVPUMNsgQpNAwhznK/zo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18/go.mod h1:NS55eQ4YixUJPTC+INxi2/jCqe1y2Uw3rnh9wEOVJxY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.4/go.mod h1:uKkN7qmSIsNJVyMtxNQoCEYMvFEXbOg9fwCJPdfp2u8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.7 h1:M7/BzQNsu0XXiJRe3gUn8UA8tExF6kLMAfvo5PT/KJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.7/go.mod h1:HvVdEh/x4jsPBsjNvDy+MH3CDCPy4gTZEzFe2r4uJY8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.7 h1:imb0NhTQZaTDSAQvgFyiZbKTwl0F+AkZL1ZNoEHtuQc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.7/go.mod h1:V952z/yIT247sKya+CB+Ls3sxpB9jeBj5TkLraCGKGU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 h1:Jrd/oMh0PKQc6+BowB+pLEwLIgaQF29eYbe7E1Av9Ug= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17 h1:HfVVR1vItaG6le+Bpw6P4midjBDMKnjMyZnw9MXYUcE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17/go.mod h1:YqMdV+gEKCQ59NrB7rzrJdALeBIsYiVi8Inj3+KcqHI= github.com/aws/aws-sdk-go-v2/service/kinesis v1.6.0/go.mod h1:9O7UG2pELnP0hq35+Gd7XDjOLBkg7tmgRQ0y14ZjoJI= github.com/aws/aws-sdk-go-v2/service/kinesis v1.15.8 h1:iXRv1ZOF6riNcy5UR6LPTaGa64wZQH8tKj5LHsiajY8= github.com/aws/aws-sdk-go-v2/service/kinesis v1.15.8/go.mod h1:oWvoK8MyYnXi6ZxSpgU7kFxIPGX8EfbCrdQCNgPnhCc= @@ -324,17 +344,20 @@ github.com/aws/aws-sdk-go-v2/service/rds v1.20.1 h1:5PrsAmuF3r9bvZMxKxHnJlHSh0IY github.com/aws/aws-sdk-go-v2/service/rds v1.20.1/go.mod h1:PBfhG/hYU+oCP1uT7fNfaqaAvxQGbB0POqh1GE/7OdM= github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.13.5 h1:nAHv/rx0pSqpECdrNtmKKb7RzYOpqXda+Dt8xBJifiM= github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.13.5/go.mod h1:LQ8mizR4n/TdYBwmU4ZXfbKceeBSrdIzZBM7jZqMK0U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.12 h1:/JTTdNObz+GygQqnbdBzummuxFIcuB6hbra1mqS+Wic= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.12/go.mod h1:eas8WnpTDJtCvEjRXAINFuox9TmEGeevxiUKEKv2tQ8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11 h1:3/gm/JTX9bX8CpzTgIlrtYpB3EVBDxyg/GY/QdcIEZw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11/go.mod h1:fmgDANqTUCxciViKl9hb/zD5LFbvPINFRgWhDbR+vZo= github.com/aws/aws-sdk-go-v2/service/sqs v1.18.4 h1:/O5+Nzs3k9gVx7gGUblbGf7rHZz71tYaOq9czgBaQZs= github.com/aws/aws-sdk-go-v2/service/sqs v1.18.4/go.mod h1:j65jgKI0Gnc6SO25l2q0qV+X3b9S40571AOZ53bEXRI= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.10 h1:icon5WWg9Yg5nkB0pJF6bfKw6M0xozukeGKSNKtnqzw= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.10/go.mod h1:UHxA35uPrCykRySBV5iSPZhZRlYnWSS2c/aaZVsoU94= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.8 h1:GLGfpqX+1bmjNvUJkwB1ZaDpNFXQwJ3z9RkQDA58OBY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.8/go.mod h1:50YdFq1WIuxA0AGrygvYGucnNYrG24WYzu5fNp7lMgY= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 h1:pwvCchFUEnlceKIgPUouBJwK81aCkQ8UDMORfeFtW10= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.23/go.mod h1:/w0eg9IhFGjGyyncHIQrXtU8wvNsTJOP0R6PPj0wf80= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.5 h1:GUnZ62TevLqIoDyHeiWj2P7EqaosgakBKVvWriIdLQY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.5/go.mod h1:csZuQY65DAdFBt1oIjO5hhBR49kQqop4+lcuCjf2arA= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 h1:9pPi0PsFNAGILFfPCk8Y0iyEBGc6lu6OQ97U7hmdesg= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.19/go.mod h1:h4J3oPZQbxLhzGnk+j9dfYHi5qIOVJ5kczZd658/ydM= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/awslabs/goformation/v3 v3.1.0/go.mod h1:hQ5RXo3GNm2laHWKizDzU5DsDy+yNcenSca2UxN0850= @@ -346,6 +369,7 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLj github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -353,14 +377,25 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bi-zone/go-winio v0.4.15 h1:viLHm+U7bzIkfVHuWgc3Wp/sT5zaLoRG7XdOEy1b12w= github.com/bi-zone/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blakesmith/ar v0.0.0-20150311145944-8bd4349a67f2 h1:oMCHnXa6CCCafdPDbMh/lWRhRByN0VFLvv+g+ayx1SI= github.com/blakesmith/ar v0.0.0-20150311145944-8bd4349a67f2/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bonitoo-io/go-sql-bigquery v0.3.4-1.4.0/go.mod h1:J4Y6YJm0qTWB9aFziB7cPeSyc6dOZFyJdteSeybVpXQ= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bsm/sarama-cluster v2.1.14-0.20180625083203-7e67d87a6b3f+incompatible h1:4g18+HnTDwEtO0n7K8B1Kjq+04MEKJRkhJNQ/hb9d5A= github.com/bsm/sarama-cluster v2.1.14-0.20180625083203-7e67d87a6b3f+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -371,17 +406,23 @@ github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e/go.mod h1:AZI github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -397,35 +438,104 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -433,7 +543,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbp github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -441,25 +552,36 @@ 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/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= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o= github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 h1:6+hM8KeYKV0Z9EIINNqIEDyyIRAcNc2FW+/TUYNmWyw= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgraph-io/badger/v3 v3.2103.1 h1:zaX53IRg7ycxVlkd5pYdCeFp1FynD6qBGQoQql3R3Hk= github.com/dgraph-io/badger/v3 v3.2103.1/go.mod h1:dULbq6ehJ5K0cGW/1TQ9iSfUk0gbSiToDWmWmTsJ53E= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/go-libvirt v0.0.0-20180301200012-6075ea3c39a1 h1:eG5K5GNAAHvQlFmfIuy0Ocjg5dvyX22g/KknwTpmBko= @@ -470,25 +592,35 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20170802015333-8af4db6f002a/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dolmen-go/contextio v0.0.0-20200217195037-68fc5150bcd5 h1:BzN9o4IS1Hj+AM5qDggsfMDQGFXau5KagipEFmnyIbc= @@ -499,6 +631,7 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -518,14 +651,15 @@ github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3 h1:lnDkqiRFKm0rxdljqr github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3/go.mod h1:aPqzac6AYkipvp4hufTyMj5PDIphF3+At8zr7r51xjY= github.com/elastic/elastic-agent-autodiscover v0.6.2 h1:7P3cbMBWXjbzA80rxitQjc+PiWyZ4I4F4LqrCYgYlNc= github.com/elastic/elastic-agent-autodiscover v0.6.2/go.mod h1:yXYKFAG+Py+TcE4CCR8EAbJiYb+6Dz9sCDoWgOveqtU= -github.com/elastic/elastic-agent-client/v7 v7.1.2 h1:p6KvvDMoFCBPvchxcx9cRXpRjsDaii0m/wE3lqQxpmM= -github.com/elastic/elastic-agent-client/v7 v7.1.2/go.mod h1:G3Mk1pHXxvj3wC5FvsGUlPOsvapTB5SfrUmWiJDXT6Q= -github.com/elastic/elastic-agent-libs v0.3.9 h1:2xbZUOM20Q9ni3dkNjj8r274fub22SuLqi6SedknV7g= -github.com/elastic/elastic-agent-libs v0.3.9/go.mod h1:Fy5QqIOax0EOVeQJ2l5Ux+GmJsX549Obllru5R1bHLI= +github.com/elastic/elastic-agent-client/v7 v7.3.0 h1:LugKtBXK7bp4SFL/uQqGU/f4Ppx12Jk5a36voGabLa0= +github.com/elastic/elastic-agent-client/v7 v7.3.0/go.mod h1:9/amG2K2y2oqx39zURcc+hnqcX+nyJ1cZrLgzsgo5c0= +github.com/elastic/elastic-agent-libs v0.3.13 h1:qFiBWeBfjsBId+i31rggyW2ZjzA9qBRz7wIiy+rkcvc= +github.com/elastic/elastic-agent-libs v0.3.13/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-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= github.com/elastic/fsevents v0.0.0-20181029231046-e1d381a4d270 h1:cWPqxlPtir4RoQVCpGSRXmLqjEHpJKbR60rxh1nQZY4= @@ -533,11 +667,10 @@ github.com/elastic/fsevents v0.0.0-20181029231046-e1d381a4d270/go.mod h1:Msl1pdb github.com/elastic/glog v1.0.1-0.20210831205241-7d8b5c89dfc4/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/elastic/go-concert v0.2.0 h1:GAQrhRVXprnNjtvTP9pWJ1d4ToEA4cU5ci7TwTa20xg= github.com/elastic/go-concert v0.2.0/go.mod h1:HWjpO3IAEJUxOeaJOWXWEp7imKd27foxz9V5vegC/38= -github.com/elastic/go-elasticsearch/v8 v8.8.1 h1:/OiP5Yex40q5eWpzFVQIS8jRE7SaEZrFkG9JbE6TXtY= -github.com/elastic/go-elasticsearch/v8 v8.8.1/go.mod h1:GU1BJHO7WeamP7UhuElYwzzHtvf9SDmeVpSSy9+o6Qg= -github.com/elastic/go-libaudit/v2 v2.3.2 h1:qWNcA3nkwNEGh1UBDbDTVF55KR6SM1W2Ji1LGDqFEpw= -github.com/elastic/go-libaudit/v2 v2.3.2/go.mod h1:+ZE0czqmbqtnRkl0fNgpI+HvVVRo/ZMJdcXv/PaKcOo= -github.com/elastic/go-licenser v0.4.0/go.mod h1:V56wHMpmdURfibNBggaSBfqgPxyT1Tldns1i87iTEvU= +github.com/elastic/go-elasticsearch/v8 v8.9.0 h1:8xtmYjUkqtahl50E0Bg/wjKI7K63krJrrLipbNj/fCU= +github.com/elastic/go-elasticsearch/v8 v8.9.0/go.mod h1:NGmpvohKiRHXI0Sw4fuUGn6hYOmAXlyCphKpzVBiqDE= +github.com/elastic/go-libaudit/v2 v2.3.3 h1:PO+9/HDSn65UAyydkkoTf81QET14fWmocHFiGEX/E6M= +github.com/elastic/go-libaudit/v2 v2.3.3/go.mod h1:+ZE0czqmbqtnRkl0fNgpI+HvVVRo/ZMJdcXv/PaKcOo= github.com/elastic/go-licenser v0.4.1 h1:1xDURsc8pL5zYT9R29425J3vkHdt4RT5TNEMeRN48x4= github.com/elastic/go-licenser v0.4.1/go.mod h1:V56wHMpmdURfibNBggaSBfqgPxyT1Tldns1i87iTEvU= github.com/elastic/go-lookslike v0.3.0 h1:HDI/DQ65V85ZqM7D/sbxcK2wFFnh3+7iFvBk2v2FTHs= @@ -552,20 +685,18 @@ github.com/elastic/go-seccomp-bpf v1.3.0 h1:e6teyX946lvPOnZERSYRrMYmsjxaQcWhoiGT github.com/elastic/go-seccomp-bpf v1.3.0/go.mod h1:wIMxjTbKpWGQk4CV9WltlG6haB4brjSH/dvAohBPM1I= github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/elastic/go-sysinfo v1.7.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-sysinfo v1.11.0 h1:QW+6BF1oxBoAprH3w2yephF7xLkrrSXj7gl2xC2BM4w= -github.com/elastic/go-sysinfo v1.11.0/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= +github.com/elastic/go-sysinfo v1.11.1 h1:g9mwl05njS4r69TisC+vwHWTSKywZFYYUu3so3T/Lao= +github.com/elastic/go-sysinfo v1.11.1/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= github.com/elastic/go-ucfg v0.8.6 h1:stUeyh2goTgGX+/wb9gzKvTv0YB0231LTpKUgCKj4U0= github.com/elastic/go-ucfg v0.8.6/go.mod h1:4E8mPOLSUV9hQ7sgLEJ4bvt0KhMuDJa8joDT2QGAEKA= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elastic/gopacket v1.1.20-0.20211202005954-d412fca7f83a h1:8WfL/X6fK11iyX5t3Dd9dDMMNqPfEZNc//JsWGIhEgQ= 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.4.0 h1:RgosnKOfjIIBeKfSP7h1x6YHrqfBNaao8I5+BMmKXpE= -github.com/elastic/mito v1.4.0/go.mod h1:J0LW+SbpiAoiBUBEBrbH8epwNDFhWWgEWyR/9DpY04c= +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/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= @@ -576,6 +707,7 @@ github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkg github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -584,10 +716,8 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= @@ -604,9 +734,11 @@ github.com/fearful-symmetry/gorapl v0.0.4/go.mod h1:XoeZ+5v0tJX9WMvzqdPaaKAdX7y1 github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15 h1:nLPjjvpUAODOR6vY/7o0hBIk8iTr19Fvmf8aFx/kC7A= @@ -615,6 +747,9 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -623,13 +758,21 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0 github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -737,6 +880,8 @@ github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0 github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-sourcemap/sourcemap v2.1.2+incompatible h1:0b/xya7BKGhXuqFESKM4oIiRo9WOt2ebz7KxfreD6ug= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= @@ -779,9 +924,12 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gocarina/gocsv v0.0.0-20170324095351-ffef3ffc77be h1:zXHeEEJ231bTf/IXqvCfeaqjLpXsq42ybLoT4ROSR6Y= github.com/gocarina/gocsv v0.0.0-20170324095351-ffef3ffc77be/go.mod h1:/oj50ZdPq/cUjA02lMZhijk5kR31SEydKyqah1OgBuo= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= @@ -794,17 +942,22 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= @@ -814,6 +967,7 @@ github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EO github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -862,6 +1016,7 @@ github.com/google/cel-go v0.15.3 h1:W1wIeGuEs81+lBVU+cQRg1hkRT58Q6bNxvM5yn008S8= github.com/google/cel-go v0.15.3/go.mod h1:YzWEoI07MC/a/wj9in8GeVatqfypkldgBlwXh9bCwqY= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v23.3.3+incompatible h1:5PJI/WbJkaMTvpGxsHVKG/LurN/KnWXNyGpwSCDgen0= github.com/google/flatbuffers v23.3.3+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -880,6 +1035,7 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -909,7 +1065,6 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230426061923-93006964c1fc h1:AGDHt781oIcL4EFk7cPnvBUYTwU8BEU6GDTO3ZMn1sE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -917,14 +1072,13 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -941,34 +1095,38 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 h1:f0n1xnMSmBLzVfsMMvriDyA75NB/oBgILX2GcHXIQzY= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/cronexpr v1.1.0 h1:dnNsWtH0V2ReN7JccYe8m//Bj14+PjJDntR1dz0Cixk= github.com/hashicorp/cronexpr v1.1.0/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -981,12 +1139,10 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.12.2 h1:F1fdYblUEsxKiailtkhCCG2g4bipEgaHiDc8vffNpD4= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= @@ -1018,36 +1174,35 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.3/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/nomad/api v0.0.0-20201203164818-6318a8ac7bf8 h1:Yrz9yGVJf5Ce2KS7x8hS/MUTIeBmGEhF8nhzolRpSqY= github.com/hashicorp/nomad/api v0.0.0-20201203164818-6318a8ac7bf8/go.mod h1:vYHP9jMXk4/T2qNUbWlQ1OHCA1hHLil3nvqSmz8mtgc= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= github.com/hetznercloud/hcloud-go v1.26.2/go.mod h1:2C5uMtBiMoFr3m7lBFPf7wXTdh33CevmZpQIIDPGYJI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= github.com/influxdata/flux v0.113.0/go.mod h1:3TJtvbm/Kwuo5/PEo5P6HUzwVg4bXWkb2wPQHPtQdlU= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= @@ -1064,10 +1219,9 @@ github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bS github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= -github.com/jcchavezs/porto v0.1.0 h1:Xmxxn25zQMmgE7/yHYmh19KcItG81hIwfbEEFnd6w/Q= -github.com/jcchavezs/porto v0.1.0/go.mod h1:fESH0gzDHiutHRdX2hv27ojnOVFco37hg1W6E9EZF4A= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -1082,6 +1236,8 @@ github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -1090,6 +1246,7 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= @@ -1120,6 +1277,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= @@ -1137,8 +1295,12 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -1150,12 +1312,12 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kortschak/utter v1.5.0 h1:1vHGHPZmJ6zU5XbfllIAG3eQBoHT97ePrZJ+pT3RoiQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1164,6 +1326,19 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= +github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx/v2 v2.0.11 h1:ViHMnaMeaO0qV16RZWBHM7GTrAnX2aFLVKofc7FuKLQ= +github.com/lestrrat-go/jwx/v2 v2.0.11/go.mod h1:ZtPtMFlrfDrH2Y0iwfa3dRFn8VzwBrB+cyrm3IBWdDg= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= @@ -1171,15 +1346,14 @@ github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linode/linodego v0.28.5/go.mod h1:BR0gVkCJffEdIGJSl6bHR80Ty+Uvg/2jkjmrWaFectM= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= -github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1194,6 +1368,7 @@ github.com/markbates/pkger v0.17.0/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQ github.com/markbates/pkger v0.17.1 h1:/MKEtWqtc0mZvu9OinB9UzVN9iYCwLWuyUv4Bw+PCno= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1213,31 +1388,37 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.42 h1:gWGe42RGaIqXQZ+r3WUGEKBEtvPHY2SXo4dqixDNxuY= github.com/miekg/dns v1.1.42/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1260,11 +1441,16 @@ github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -1277,10 +1463,14 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= @@ -1291,6 +1481,7 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -1304,35 +1495,54 @@ github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOE github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.5.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.2.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= @@ -1347,6 +1557,9 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh 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/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= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= @@ -1358,31 +1571,38 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.16 h1:kQPfno+wyx6C5572ABwV+Uo3pDFzQ7yhyGchSyRda0c= +github.com/pierrec/lz4/v4 v4.1.16/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0 h1:i5VIxp6QB8oWZ8IkK8zrDgeT6ORGIUeiN+61iETwJbI= github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0/go.mod h1:4xpMLz7RBWyB+ElzHu8Llua96TRCB3YwX+l5EP1wmHk= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE= +github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -1391,10 +1611,13 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/poy/eachers v0.0.0-20181020210610-23942921fe77 h1:SNdqPRvRsVmYR0gKqFvrUKhFizPJ6yDiGQ++VAJIoDg= github.com/poy/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:x1vqpbcMW9T/KRcQ4b48diSiSVtYgvwQ5xzDByEg4WE= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= github.com/prometheus/alertmanager v0.22.2/go.mod h1:rYinOWxFuCnNssc3iOjn2oMTlhLaPcUuqV5yk5JKUAE= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= @@ -1406,6 +1629,7 @@ github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3e github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1413,7 +1637,10 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -1428,32 +1655,38 @@ github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/exporter-toolkit v0.6.0/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= github.com/prometheus/prometheus v1.8.2-0.20210701133801-b0944590a1c9 h1:If7jYp33vwa8ZQ7GGwrAs0SBjiW0aWeAB/oV1aG7bZ4= github.com/prometheus/prometheus v1.8.2-0.20210701133801-b0944590a1c9/go.mod h1:A97P+iwS3Ffpxpejz4+ASZl6i9EqSJDzxObq8DjV2SU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rootless-containers/rootlesskit v1.1.0 h1:cRaRIYxY8oce4eE/zeAUZhgKu/4tU1p9YHN4+suwV7M= github.com/rootless-containers/rootlesskit v1.1.0/go.mod h1:H+o9ndNe7tS91WqU0/+vpvc+VaCd7TCIWaJjnV0ujUo= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -1461,9 +1694,11 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-parser v0.0.0-20130731160455-ca8abbf65d0e h1:hUGyBE/4CXRPThr4b6kt+f1CN90no4Fs5CNrYOKYSIg= github.com/samuel/go-parser v0.0.0-20130731160455-ca8abbf65d0e/go.mod h1:Sb6li54lXV0yYEjI4wX8cucdQ9gqUJV3+Ngg3l9g30I= github.com/samuel/go-thrift v0.0.0-20140522043831-2187045faa54 h1:jbchLJWyhKcmOjkbC4zDvT/n5EEd7g6hnnF760rEyRA= @@ -1474,12 +1709,15 @@ github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAa github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= github.com/sanathkr/yaml v1.0.1-0.20170819201035-0056894fa522 h1:39BJIaZIhIBmXATIhdlTBlTQpAiGXHnz17CrO7vF2Ss= github.com/sanathkr/yaml v1.0.1-0.20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis= -github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210223165440-c65ae3540d44/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -1497,11 +1735,14 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= @@ -1509,7 +1750,7 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.3.4/go.mod h1:NsRq2QeiMUuoNUJhp5Q6xGC4uBrsS9g6LwZVEkTWgsE= +github.com/snowflakedb/gosnowflake v1.6.19/go.mod h1:FM1+PWUdwB9udFDsXdfD58NONC0m+MlOSmQRvimobSM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1517,17 +1758,14 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1535,18 +1773,22 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1557,10 +1799,12 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -1570,6 +1814,7 @@ github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYa github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b h1:X/8hkb4rQq3+QuOxpJK7gWmAXmZucF0EI1s1BfBLq6U= github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b/go.mod h1:jAqhj/JBVC1PwcLTWd6rjQyGyItxxrhpiBl8LSuAGmw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -1579,28 +1824,35 @@ github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.8/go.mod h1:0lNM99SwWUIRhCXnigEMClngXBk/EmpTXa7mgiewYWA= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.8 h1:4dryPvxMP9OtkjIbuNeK2nb27M38XMHLGlfNSNph/5s= github.com/ugorji/go/codec v1.1.8/go.mod h1:X00B19HDtwvKbQY2DcYjvZxKQp8mzrJoQ6EgoIY/D2E= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urso/diag v0.0.0-20200210123136-21b3cc8eb797 h1:OHNw/6pXODJAB32NujjdQO/KIYQ3KAbHQfCzH81XdCs= github.com/urso/diag v0.0.0-20200210123136-21b3cc8eb797/go.mod h1:pNWFTeQ+V1OYT/TzWpnWb6eQBdoXpdx+H+lrH97/Oyo= github.com/urso/sderr v0.0.0-20210525210834-52b04e8f5c71 h1:CehQeKbysHV8J2V7AD0w8NL2x1h04kmmo/Ft5su4lU0= github.com/urso/sderr v0.0.0-20210525210834-52b04e8f5c71/go.mod h1:Wp40HwmjM59FkDIVFfcCb9LzBbnc0XAMp8++hJuWvSU= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmware/govmomi v0.0.0-20170802214208-2cad15190b41 h1:NeNpIvfvaFOh0BH7nMEljE5Rk/VJlxhm58M41SeOD20= github.com/vmware/govmomi v0.0.0-20170802214208-2cad15190b41/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= @@ -1622,8 +1874,9 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1631,32 +1884,37 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v0.0.0-20170403160031-b402f3114ec7 h1:0gYLpmzecnaDCoeWxSfEJ7J1b6B/67+NV++4HKQXx+Y= github.com/yuin/gopher-lua v0.0.0-20170403160031-b402f3114ec7/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.0.0 h1:5UaI4agfuGoGRhpFVb6s63Hj/9xtqYxF7kd6T77tNAw= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.0.0/go.mod h1:GmYz+KDp2LDAa2nd/qJ+OkrjWVEoCRIPAWarbUvyt6Y= -go.elastic.co/apm/module/apmhttp/v2 v2.0.0 h1:GNfmK1LD4nE5fYqbLxROCpg1ucyjSFG5iwulxwAJ+3o= -go.elastic.co/apm/module/apmhttp/v2 v2.0.0/go.mod h1:5KmxcNN7hkJh8sVW3Ggl/pYgnwiNenygE46bZoUb9RE= -go.elastic.co/apm/v2 v2.0.0 h1:5BeBh+oIrVbMwPrW3uO9Uxm4w7HpKy92lYl5Rfj69Kg= -go.elastic.co/apm/v2 v2.0.0/go.mod h1:KGQn56LtRmkQjt2qw4+c1Jz8gv9rCBUU/m21uxrqcps= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.4.4 h1:TVcEjy/gs/DVk3aaBYNGm6B7uOkC6BTlDFRzyvBkMlw= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.4.4/go.mod h1:xWKnT5lKqFwNgT3nkWumBCXCt597cHkSuyIWWMXpv78= +go.elastic.co/apm/module/apmhttp/v2 v2.4.4 h1:BcJDLFztZByHiJRXXvAHY7bue9+vhzMLn2OBK5N8HDw= +go.elastic.co/apm/module/apmhttp/v2 v2.4.4/go.mod h1:694qsHWRPVkfYqQ224ZSeRx9Dt2FS/xF1igNBGkHi6o= +go.elastic.co/apm/v2 v2.4.4 h1:KGbmUEtLNQ6sCFGpqTMhfRjqDOKP8IliO+efErKY5lU= +go.elastic.co/apm/v2 v2.4.4/go.mod h1:+CiBUdrrAGnGCL9TNx7tQz3BrfYV23L8Ljvotoc87so= go.elastic.co/ecszap v1.0.1 h1:mBxqEJAEXBlpi5+scXdzL7LTFGogbuxipJC0KTZicyA= go.elastic.co/ecszap v1.0.1/go.mod h1:SVjazT+QgNeHSGOCUHvRgN+ZRj5FkB7IXQQsncdF57A= go.elastic.co/fastjson v1.1.0 h1:3MrGBWWVIxe/xvsbpghtkFoPciPhOCmjsR/HfwEeQR4= go.elastic.co/fastjson v1.1.0/go.mod h1:boNGISWMjQsUPy/t6yqt2/1Wx4YNPSe+mZjlyw9vKKI= go.elastic.co/go-licence-detector v0.6.0 h1:QJ+cUIHC0JpxEKgp5Bj0pabEiOOt9H1O9CCcUNe6yRQ= go.elastic.co/go-licence-detector v0.6.0/go.mod h1:fSJQU8au4SAgDK+UQFbgUPsXKYNBDv4E/dwWevrMpXU= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -1668,6 +1926,7 @@ go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4S go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1681,6 +1940,7 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1707,13 +1967,13 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1727,7 +1987,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1736,17 +1995,23 @@ golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1754,17 +2019,29 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e h1:Ctm9yurWsg7aWwIpH9Bnap/IdSVxixymIb3MhiMEQQA= golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1789,8 +2066,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1798,6 +2076,7 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1810,8 +2089,10 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1842,6 +2123,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1853,19 +2136,24 @@ golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1879,11 +2167,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1899,6 +2183,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1923,15 +2209,18 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1941,18 +2230,20 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1969,14 +2260,23 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1984,14 +2284,15 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2000,31 +2301,38 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211102192858-4dd72447c267/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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/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= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2035,13 +2343,17 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2074,10 +2386,12 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2112,6 +2426,7 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -2120,7 +2435,9 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200821192610-3366bbee4705/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2129,25 +2446,32 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -2172,15 +2496,6 @@ google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBz google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -2192,11 +2507,13 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -2209,6 +2526,7 @@ google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2223,6 +2541,7 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2230,6 +2549,7 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2241,28 +2561,9 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37 h1:jmIfw8+gSvXcZSgaFAGyInDXeWzUhvYH57G/5GKMn70= -google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2292,13 +2593,10 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2313,15 +2611,18 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -2333,7 +2634,6 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/hjson/hjson-go.v3 v3.0.1/go.mod h1:X6zrTSVeImfwfZLfgQdInl9mWjqPqgH90jom9nym/lw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= @@ -2347,6 +2647,9 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -2383,38 +2686,62 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= k8s.io/api v0.23.4 h1:85gnfXQOWbJa1SiWGpE9EEtHs0UVvDyIsSMpEtl2D4E= k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= k8s.io/apimachinery v0.23.4 h1:fhnuMd/xUL3Cjfl64j5ULKZ1/J9n8NuQEgNL+WXWfdM= k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.17.5/go.mod h1:S8uZpBpjJJdEH/fEyxcqg7Rn0P5jH+ilkgBHjriSmNo= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= k8s.io/client-go v0.23.4 h1:YVWvPeerA2gpUudLelvsolzH7c2sFoXXR5wM/sWqNFU= k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -2425,16 +2752,54 @@ kernel.org/pub/linux/libs/security/libcap/cap v1.2.57 h1:2nmqI+aw7EQZuelYktkQHBE kernel.org/pub/linux/libs/security/libcap/cap v1.2.57/go.mod h1:uI99C3r4SXvJeuqoEtx/eWt7UbmfqqZ80H8q+9t/A7I= kernel.org/pub/linux/libs/security/libcap/psx v1.2.57 h1:NOFATXSf5z/cMR3HIwQ3Xrd3nwnWl5xThmNr5U/F0pI= kernel.org/pub/linux/libs/security/libcap/psx v1.2.57/go.mod h1:+l6Ee2F59XiJ2I6WR5ObpC1utCQJZ/VLsEbQCD8RG24= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= mvdan.cc/garble v0.7.1 h1:9Qffp7HzKLBfQxYZ8mBF/EoYefV54ooY8v9UR4ByTPw= mvdan.cc/garble v0.7.1/go.mod h1:7F2EWpOklhK2qWzv1Hbin8sP2TYBO+EALIx4kFTmtu8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= diff --git a/heartbeat/Dockerfile b/heartbeat/Dockerfile index 4f063983998..dade8329713 100644 --- a/heartbeat/Dockerfile +++ b/heartbeat/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 RUN \ apt-get update \ @@ -10,7 +10,7 @@ RUN \ && rm -rf /var/lib/apt/lists/* # Use a virtualenv to avoid the PEP668 "externally managed environment" error caused by conflicts -# with the system Python installation. golang:1.19.10 uses Debian 12 which now enforces PEP668. +# with the system Python installation. golang:1.20.6 uses Debian 12 which now enforces PEP668. ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" diff --git a/heartbeat/Jenkinsfile.yml b/heartbeat/Jenkinsfile.yml index dbd9b4a4ec0..8132410f71a 100644 --- a/heartbeat/Jenkinsfile.yml +++ b/heartbeat/Jenkinsfile.yml @@ -64,6 +64,11 @@ stages: - "macosM1Test" tags: false ## for all the tags stage: extended + rhel-9: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "rhel-9" + stage: mandatory windows-2022: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/heartbeat/_meta/fields.common.yml b/heartbeat/_meta/fields.common.yml index dc0f5bb7c43..b710fdde2e5 100644 --- a/heartbeat/_meta/fields.common.yml +++ b/heartbeat/_meta/fields.common.yml @@ -175,6 +175,26 @@ type: integer description: > The number of endpoints that failed + - name: status + type: keyword + description: > + The status of this check as a whole. Either up or down. + - name: attempt + type: short + description: > + When performing a check this number is 1 for the first check, and increments in the event of a retry. + - name: max_attempts + type: short + description: > + The maximum number of checks that may be performed. Note, the actual number may be smaller. + - name: final_attempt + type: boolean + description: > + True if no further checks will be performed in this retry group. + - name: retry_group + type: keyword + description: > + A unique token used to group checks across attempts. - key: service title: "APM Service" description: diff --git a/heartbeat/autodiscover/builder/hints/monitors.go b/heartbeat/autodiscover/builder/hints/monitors.go index 3998fa0958b..66487868e91 100644 --- a/heartbeat/autodiscover/builder/hints/monitors.go +++ b/heartbeat/autodiscover/builder/hints/monitors.go @@ -170,7 +170,7 @@ func (hb *heartbeatHints) getHostsWithPort(hints mapstr.M, port int, podEvent bo return nil, fmt.Errorf("no hosts selected for port %d with hints: %+v", port, thosts) } - var result []string + result := make([]string, 0, len(hostSet)) for host := range hostSet { result = append(result, host) } diff --git a/heartbeat/beater/heartbeat.go b/heartbeat/beater/heartbeat.go index 26a58af7301..71aae20668a 100644 --- a/heartbeat/beater/heartbeat.go +++ b/heartbeat/beater/heartbeat.go @@ -44,7 +44,6 @@ import ( "github.com/elastic/beats/v7/libbeat/common/reload" "github.com/elastic/beats/v7/libbeat/esleg/eslegclient" "github.com/elastic/beats/v7/libbeat/management" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" ) // Heartbeat represents the root datastructure of this beat. @@ -117,17 +116,8 @@ func New(b *beat.Beat, rawConfig *conf.C) (beat.Beater, error) { sched := scheduler.Create(limit, hbregistry.SchedulerRegistry, location, jobConfig, parsedConfig.RunOnce) - pipelineClientFactory := func(p beat.Pipeline) (pipeline.ISyncClient, error) { - if parsedConfig.RunOnce { - client, err := pipeline.NewSyncClient(logp.L(), p, beat.ClientConfig{}) - if err != nil { - return nil, fmt.Errorf("could not create pipeline sync client for run_once: %w", err) - } - return client, nil - } else { - client, err := p.Connect() - return monitors.SyncPipelineClientAdaptor{C: client}, err - } + pipelineClientFactory := func(p beat.Pipeline) (beat.Client, error) { + return p.Connect() } bt := &Heartbeat{ @@ -160,23 +150,33 @@ func (bt *Heartbeat) Run(b *beat.Beat) error { bt.trace.Start() defer bt.trace.Close() + // Adapt local pipeline to synchronized mode if run_once is enabled + pipeline := b.Publisher + var pipelineWrapper monitors.PipelineWrapper = &monitors.NoopPipelineWrapper{} + if bt.config.RunOnce { + sync := &monitors.SyncPipelineWrapper{} + + pipeline = monitors.WithSyncPipelineWrapper(pipeline, sync) + pipelineWrapper = sync + } + logp.L().Info("heartbeat is running! Hit CTRL-C to stop it.") groups, _ := syscall.Getgroups() logp.L().Info("Effective user/group ids: %d/%d, with groups: %v", syscall.Geteuid(), syscall.Getegid(), groups) + waitMonitors := monitors.NewSignalWait() + // It is important this appear before we check for run once mode // In run once mode we depend on these monitors being loaded, but not other more // dynamic types. - stopStaticMonitors, err := bt.RunStaticMonitors(b) + stopStaticMonitors, err := bt.RunStaticMonitors(b, pipeline) if err != nil { return err } defer stopStaticMonitors() if bt.config.RunOnce { - bt.scheduler.WaitForRunOnce() - logp.L().Info("Ending run_once run") - return nil + waitMonitors.Add(monitors.WithLog(bt.scheduler.WaitForRunOnce, "Ending run_once run.")) } if b.Manager.Enabled() { @@ -211,20 +211,34 @@ func (bt *Heartbeat) Run(b *beat.Beat) error { defer bt.scheduler.Stop() - <-bt.done + // Wait until run_once ends or bt is being shut down + waitMonitors.AddChan(bt.done) + waitMonitors.Wait() - if err != nil { - logp.L().Errorf("could not write trace stop event: %s", err) + logp.L().Info("Shutting down, waiting for output to complete") + + // Due to defer's LIFO execution order, waitPublished.Wait() has to be + // located _after_ b.Manager.Stop() or else it will exit early + waitPublished := monitors.NewSignalWait() + defer waitPublished.Wait() + + // Three possible events: global beat, run_once pipeline done and publish timeout + waitPublished.AddChan(bt.done) + waitPublished.Add(monitors.WithLog(pipelineWrapper.Wait, "shutdown: finished publishing events.")) + if bt.config.PublishTimeout > 0 { + logp.Info("shutdown: output timer started. Waiting for max %v.", bt.config.PublishTimeout) + waitPublished.Add(monitors.WithLog(monitors.WaitDuration(bt.config.PublishTimeout), + "shutdown: timed out waiting for pipeline to publish events.")) } - logp.L().Info("Shutting down.") + return nil } // RunStaticMonitors runs the `heartbeat.monitors` portion of the yaml config if present. -func (bt *Heartbeat) RunStaticMonitors(b *beat.Beat) (stop func(), err error) { +func (bt *Heartbeat) RunStaticMonitors(b *beat.Beat, pipeline beat.Pipeline) (stop func(), err error) { runners := make([]cfgfile.Runner, 0, len(bt.config.Monitors)) for _, cfg := range bt.config.Monitors { - created, err := bt.monitorFactory.Create(b.Publisher, cfg) + created, err := bt.monitorFactory.Create(pipeline, cfg) if err != nil { if errors.Is(err, monitors.ErrMonitorDisabled) { logp.L().Info("skipping disabled monitor: %s", err) diff --git a/heartbeat/config/config.go b/heartbeat/config/config.go index 4aaccabd1e4..8a396d46fe8 100644 --- a/heartbeat/config/config.go +++ b/heartbeat/config/config.go @@ -41,6 +41,7 @@ type LocationWithID struct { // Config defines the structure of heartbeat.yml. type Config struct { RunOnce bool `config:"run_once"` + PublishTimeout time.Duration `config:"publish_timeout"` Monitors []*conf.C `config:"monitors"` ConfigMonitors *conf.C `config:"config.monitors"` Scheduler Scheduler `config:"scheduler"` diff --git a/heartbeat/docs/fields.asciidoc b/heartbeat/docs/fields.asciidoc index cb5516ecf5d..bda22729449 100644 --- a/heartbeat/docs/fields.asciidoc +++ b/heartbeat/docs/fields.asciidoc @@ -16427,6 +16427,56 @@ type: integer -- +*`summary.status`*:: ++ +-- +The status of this check as a whole. Either up or down. + + +type: keyword + +-- + +*`summary.attempt`*:: ++ +-- +When performing a check this number is 1 for the first check, and increments in the event of a retry. + + +type: short + +-- + +*`summary.max_attempts`*:: ++ +-- +The maximum number of checks that may be performed. Note, the actual number may be smaller. + + +type: short + +-- + +*`summary.final_attempt`*:: ++ +-- +True if no further checks will be performed in this retry group. + + +type: boolean + +-- + +*`summary.retry_group`*:: ++ +-- +A unique token used to group checks across attempts. + + +type: keyword + +-- + [[exported-fields-synthetics]] == Synthetics types fields diff --git a/heartbeat/docs/heartbeat-options.asciidoc b/heartbeat/docs/heartbeat-options.asciidoc index 3db44656302..65ca08a938f 100644 --- a/heartbeat/docs/heartbeat-options.asciidoc +++ b/heartbeat/docs/heartbeat-options.asciidoc @@ -133,3 +133,21 @@ heartbeat.run_once: true heartbeat.monitors: # your monitor config here... ---------------------------------------------------------------------- + +[float] +[[publish-timeout]] +=== Publish timeout (Experimental) + +You can configure {beatname_uc} to exit after an elapsed timeout if unable to publish pending events. +This is an experimental feature and is subject to change. + +Note, the `heartbeat.run_once` flag is required for `publish_timeout` to take effect. + +[source,yaml] +---------------------------------------------------------------------- +# heartbeat.yml +heartbeat.publish_timeout: 30s +heartbeat.run_once: true +heartbeat.monitors: +# your monitor config here... +---------------------------------------------------------------------- diff --git a/heartbeat/docs/troubleshooting.asciidoc b/heartbeat/docs/troubleshooting.asciidoc index 12c429715df..ebed4a6863f 100644 --- a/heartbeat/docs/troubleshooting.asciidoc +++ b/heartbeat/docs/troubleshooting.asciidoc @@ -8,6 +8,7 @@ following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -26,5 +27,14 @@ include::{libbeat-dir}/getting-help.asciidoc[] include::{libbeat-dir}/debugging.asciidoc[] +//sets block macro for metrics-in-logs.asciidoc included in next section +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] diff --git a/heartbeat/hbtest/hbtestutil.go b/heartbeat/hbtest/hbtestutil.go index eae7fb73e58..86c1e4a34d2 100644 --- a/heartbeat/hbtest/hbtestutil.go +++ b/heartbeat/hbtest/hbtestutil.go @@ -39,6 +39,7 @@ import ( "github.com/elastic/beats/v7/heartbeat/ecserr" "github.com/elastic/beats/v7/heartbeat/monitors/active/dialchain/tlsmeta" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer/summarizertesthelper" "github.com/elastic/beats/v7/heartbeat/hbtestllext" @@ -142,17 +143,13 @@ func TLSChecks(chainIndex, certIndex int, certificate *x509.Certificate) validat PeerCertificates: []*x509.Certificate{certificate}, }, time.Duration(1)) - //nolint:errcheck // There are no new changes to this line but - // linter has been activated in the meantime. We'll cleanup separately. - expected.Put("tls.rtt.handshake.us", hbtestllext.IsInt64) + _, _ = expected.Put("tls.rtt.handshake.us", hbtestllext.IsInt64) // Generally, the exact cipher will match, but on windows 7 32bit this is not true! // We don't actually care about the exact cipher matching, since we're not testing the TLS // implementation, we trust go there, just that most of the metadata is present if runtime.GOOS == "windows" && bits.UintSize == 32 { - //nolint:errcheck // There are no new changes to this line but - // linter has been activated in the meantime. We'll cleanup separately. - expected.Put("tls.cipher", isdef.IsString) + _, _ = expected.Put("tls.cipher", isdef.IsString) } return lookslike.MustCompile(expected) @@ -190,15 +187,14 @@ func BaseChecks(ip string, status string, typ string) validator.Validator { ) } -// SummaryChecks validates the "summary" + "state" fields -func SummaryChecks(up int, down int) validator.Validator { - return lookslike.MustCompile(map[string]interface{}{ - "summary": map[string]interface{}{ - "up": uint16(up), - "down": uint16(down), - }, - "state": hbtestllext.IsMonitorState, - }) +// SummaryStateChecks validates the "summary" + "state" fields +func SummaryStateChecks(up uint16, down uint16) validator.Validator { + return lookslike.Compose( + summarizertesthelper.SummaryValidator(up, down), + lookslike.MustCompile(map[string]interface{}{ + "state": hbtestllext.IsMonitorState, + }), + ) } // ResolveChecks returns a lookslike matcher for the 'resolve' fields. @@ -289,8 +285,7 @@ func StartHTTPSServer(t *testing.T, tlsCert tls.Certificate) (host string, port require.NoError(t, err) // No need to start a real server, since this is invalid, we just - //nolint:gosec // There are no new changes to this line but - // linter has been activated in the meantime. We'll cleanup separately. + //nolint:gosec // it's a test, sec issues don't apply l, err := tls.Listen("tcp", "127.0.0.1:0", &tls.Config{ Certificates: []tls.Certificate{tlsCert}, }) diff --git a/heartbeat/include/fields.go b/heartbeat/include/fields.go index 88552169280..d5323f72605 100644 --- a/heartbeat/include/fields.go +++ b/heartbeat/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetFieldsYml returns asset data. // This is the base64 encoded zlib format compressed contents of fields.yml. func AssetFieldsYml() string { - return "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" + return "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" } diff --git a/heartbeat/monitors/active/dialchain/dialchain.go b/heartbeat/monitors/active/dialchain/dialchain.go index 62f2730a790..f7c82aa0bec 100644 --- a/heartbeat/monitors/active/dialchain/dialchain.go +++ b/heartbeat/monitors/active/dialchain/dialchain.go @@ -56,7 +56,7 @@ func (c *DialerChain) Clone() *DialerChain { func (c *DialerChain) Build(event *beat.Event) (d transport.Dialer, err error) { d, err = c.Net.build(event) if err != nil { - return + return d, err } for _, layer := range c.Layers { diff --git a/heartbeat/monitors/active/http/http_test.go b/heartbeat/monitors/active/http/http_test.go index 27501c32da1..78a2f24599c 100644 --- a/heartbeat/monitors/active/http/http_test.go +++ b/heartbeat/monitors/active/http/http_test.go @@ -49,6 +49,7 @@ import ( "github.com/elastic/beats/v7/heartbeat/ecserr" "github.com/elastic/beats/v7/heartbeat/hbtest" "github.com/elastic/beats/v7/heartbeat/hbtestllext" + "github.com/elastic/beats/v7/heartbeat/monitors/jobs" "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers" "github.com/elastic/beats/v7/heartbeat/scheduler/schedule" @@ -262,7 +263,7 @@ func TestUpStatuses(t *testing.T) { lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "up", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), respondingHTTPChecks(server.URL, "text/plain; charset=utf-8", status), ), event.Fields, @@ -279,7 +280,7 @@ func TestHeadersDisabled(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "up", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), respondingHTTPChecks(server.URL, "text/plain; charset=utf-8", 200), )), event.Fields, @@ -297,7 +298,7 @@ func TestDownStatuses(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "down", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), respondingHTTPChecks(server.URL, "text/plain; charset=utf-8", status), hbtest.ECSErrChecks(ecserr.NewBadHTTPStatusErr(status)), respondingHTTPBodyChecks("hello, world!"), @@ -336,7 +337,7 @@ func TestLargeResponse(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "up", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), respondingHTTPChecks(server.URL, "text/plain; charset=utf-8", 200), )), event.Fields, @@ -453,7 +454,7 @@ func TestJsonBody(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "up", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), respondingHTTPChecks(server.URL, tc.expectedContentType, 200), )), event.Fields, @@ -464,7 +465,7 @@ func TestJsonBody(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "down", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.ErrorChecks(tc.expectedErrMsg, "validate"), respondingHTTPChecks(server.URL, tc.expectedContentType, 200), )), @@ -530,7 +531,7 @@ func runHTTPSServerCheck( hbtest.BaseChecks("127.0.0.1", "up", "http"), hbtest.RespondingTCPChecks(), hbtest.TLSChecks(0, 0, cert), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), respondingHTTPChecks(server.URL, "text/plain; charset=utf-8", http.StatusOK), )), event.Fields, @@ -559,7 +560,7 @@ func TestExpiredHTTPSServer(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "down", "http"), hbtest.RespondingTCPChecks(), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.ExpiredCertChecks(cert), hbtest.URLChecks(t, &url.URL{Scheme: "https", Host: net.JoinHostPort(host, port)}), // No HTTP fields expected because we fail at the TCP level @@ -617,7 +618,7 @@ func TestConnRefusedJob(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks(ip, "down", "http"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.ECSErrCodeChecks(ecserr.CODE_NET_COULD_NOT_CONNECT, fmt.Sprintf("%s:%d", ip, port)), urlChecks(url), )), @@ -639,7 +640,7 @@ func TestUnreachableJob(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks(ip, "down", "http"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.ECSErrCodeChecks(ecserr.CODE_NET_COULD_NOT_CONNECT, fmt.Sprintf("%s:%d", ip, port)), urlChecks(url), )), @@ -673,33 +674,30 @@ func TestRedirect(t *testing.T) { sched, _ := schedule.Parse("@every 1s") job := wrappers.WrapCommon(p.Jobs, stdfields.StdMonitorFields{ID: "test", Type: "http", Schedule: sched, Timeout: 1}, nil)[0] - // Run this test multiple times since in the past we had an issue where the redirects - // list was added onto by each request. See https://github.com/elastic/beats/pull/15944 - for i := 0; i < 10; i++ { - event := &beat.Event{} - _, err = job(event) - require.NoError(t, err) - - testslike.Test( - t, - lookslike.Compose( - hbtest.BaseChecks("", "up", "http"), - hbtest.SummaryChecks(1, 0), - minimalRespondingHTTPChecks(testURL, "text/plain; charset=utf-8", 200), - respondingHTTPHeaderChecks(), - lookslike.MustCompile(map[string]interface{}{ - // For redirects that are followed we shouldn't record this header because there's no sensible - // value - "http.response.headers.Location": isdef.KeyMissing, - "http.response.redirects": []string{ - server.URL + redirectingPaths["/redirect_one"], - server.URL + redirectingPaths["/redirect_two"], - }, - }), - ), - event.Fields, - ) - } + events, err := jobs.ExecJobAndConts(t, job) + require.NoError(t, err) + require.Len(t, events, 1) + event := events[0] + + testslike.Test( + t, + lookslike.Compose( + hbtest.BaseChecks("", "up", "http"), + minimalRespondingHTTPChecks(testURL, "text/plain; charset=utf-8", 200), + respondingHTTPHeaderChecks(), + hbtest.SummaryStateChecks(1, 0), + lookslike.MustCompile(map[string]interface{}{ + // For redirects that are followed we shouldn't record this header because there's no sensible + // value + "http.response.headers.Location": isdef.KeyMissing, + "http.response.redirects": []string{ + server.URL + redirectingPaths["/redirect_one"], + server.URL + redirectingPaths["/redirect_two"], + }, + }), + ), + event.Fields, + ) } func TestNoHeaders(t *testing.T) { @@ -728,7 +726,7 @@ func TestNoHeaders(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("127.0.0.1", "up", "http"), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.RespondingTCPChecks(), respondingHTTPStatusAndTimingChecks(200), minimalRespondingHTTPChecks(server.URL, "text/plain; charset=utf-8", 200), diff --git a/heartbeat/monitors/active/icmp/icmp_test.go b/heartbeat/monitors/active/icmp/icmp_test.go index f4597d0a4db..59ffc257505 100644 --- a/heartbeat/monitors/active/icmp/icmp_test.go +++ b/heartbeat/monitors/active/icmp/icmp_test.go @@ -50,7 +50,7 @@ func TestICMPFields(t *testing.T) { validator := lookslike.Strict( lookslike.Compose( hbtest.BaseChecks(ip, "up", "icmp"), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.URLChecks(t, hostURL), hbtest.ResolveChecks(ip), lookslike.MustCompile(map[string]interface{}{ diff --git a/heartbeat/monitors/active/tcp/socks5_test.go b/heartbeat/monitors/active/tcp/socks5_test.go index 466253365c3..e9d1af35921 100644 --- a/heartbeat/monitors/active/tcp/socks5_test.go +++ b/heartbeat/monitors/active/tcp/socks5_test.go @@ -78,7 +78,7 @@ func TestSocks5Job(t *testing.T) { hbtest.BaseChecks(ip, "up", "tcp"), hbtest.RespondingTCPChecks(), hbtest.SimpleURLChecks(t, "tcp", host, port), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.ResolveChecks(ip), lookslike.MustCompile(map[string]interface{}{ "tcp": map[string]interface{}{ diff --git a/heartbeat/monitors/active/tcp/tcp_test.go b/heartbeat/monitors/active/tcp/tcp_test.go index 62b01f4a4ea..c5cc0dd614e 100644 --- a/heartbeat/monitors/active/tcp/tcp_test.go +++ b/heartbeat/monitors/active/tcp/tcp_test.go @@ -100,7 +100,7 @@ func TestUpEndpointJob(t *testing.T) { validators := []validator.Validator{ hbtest.BaseChecks(serverURL.Hostname(), "up", "tcp"), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.URLChecks(t, hostURL), hbtest.RespondingTCPChecks(), } @@ -130,7 +130,7 @@ func TestConnectionRefusedEndpointJob(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks(ip, "down", "tcp"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.SimpleURLChecks(t, "tcp", ip, port), hbtest.ECSErrCodeChecks(ecserr.CODE_NET_COULD_NOT_CONNECT, dialErr), )), @@ -148,7 +148,7 @@ func TestUnreachableEndpointJob(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks(ip, "down", "tcp"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.SimpleURLChecks(t, "tcp", ip, port), hbtest.ECSErrCodeChecks(ecserr.CODE_NET_COULD_NOT_CONNECT, dialErr), )), @@ -177,7 +177,7 @@ func TestCheckUp(t *testing.T) { hbtest.BaseChecks(ip, "up", "tcp"), hbtest.RespondingTCPChecks(), hbtest.SimpleURLChecks(t, "tcp", host, port), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.ResolveChecks(ip), lookslike.MustCompile(map[string]interface{}{ "tcp": map[string]interface{}{ @@ -209,7 +209,7 @@ func TestCheckDown(t *testing.T) { hbtest.BaseChecks(ip, "down", "tcp"), hbtest.RespondingTCPChecks(), hbtest.SimpleURLChecks(t, "tcp", host, port), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.ResolveChecks(ip), lookslike.MustCompile(map[string]interface{}{ "tcp": map[string]interface{}{ @@ -233,7 +233,7 @@ func TestNXDomainJob(t *testing.T) { t, lookslike.Strict(lookslike.Compose( hbtest.BaseChecks("", "down", "tcp"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.SimpleURLChecks(t, "tcp", host, port), hbtest.ErrorChecks(dialErr, "io"), )), diff --git a/heartbeat/monitors/active/tcp/tls_test.go b/heartbeat/monitors/active/tcp/tls_test.go index 0cf3110360b..1a67a7945ae 100644 --- a/heartbeat/monitors/active/tcp/tls_test.go +++ b/heartbeat/monitors/active/tcp/tls_test.go @@ -57,7 +57,7 @@ func TestTLSSANIPConnection(t *testing.T) { hbtest.TLSChecks(0, 0, cert), hbtest.RespondingTCPChecks(), hbtest.BaseChecks(ip, "up", "tcp"), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.SimpleURLChecks(t, "ssl", ip, port), )), event.Fields, @@ -77,7 +77,7 @@ func TestTLSHostname(t *testing.T) { hbtest.TLSChecks(0, 0, cert), hbtest.RespondingTCPChecks(), hbtest.BaseChecks(ip, "up", "tcp"), - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), hbtest.SimpleURLChecks(t, "ssl", hostname, port), hbtest.ResolveChecks(ip), )), @@ -103,7 +103,7 @@ func TestTLSInvalidCert(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.RespondingTCPChecks(), hbtest.BaseChecks(ip, "down", "tcp"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.SimpleURLChecks(t, "ssl", mismatchedHostname, port), hbtest.ResolveChecks(ip), lookslike.MustCompile(map[string]interface{}{ @@ -137,7 +137,7 @@ func TestTLSExpiredCert(t *testing.T) { lookslike.Strict(lookslike.Compose( hbtest.RespondingTCPChecks(), hbtest.BaseChecks(ip, "down", "tcp"), - hbtest.SummaryChecks(0, 1), + hbtest.SummaryStateChecks(0, 1), hbtest.SimpleURLChecks(t, "ssl", host, port), hbtest.ResolveChecks(ip), hbtest.ExpiredCertChecks(cert), diff --git a/heartbeat/monitors/factory.go b/heartbeat/monitors/factory.go index 0ba9cbb04d4..9e6d4449d31 100644 --- a/heartbeat/monitors/factory.go +++ b/heartbeat/monitors/factory.go @@ -38,7 +38,6 @@ import ( "github.com/elastic/beats/v7/libbeat/processors/add_data_stream" "github.com/elastic/beats/v7/libbeat/processors/add_formatted_index" "github.com/elastic/beats/v7/libbeat/processors/util" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" "github.com/elastic/beats/v7/libbeat/publisher/pipetool" ) @@ -56,7 +55,7 @@ type RunnerFactory struct { beatLocation *config.LocationWithID } -type PipelineClientFactory func(pipeline beat.Pipeline) (pipeline.ISyncClient, error) +type PipelineClientFactory func(pipeline beat.Pipeline) (beat.Client, error) type publishSettings struct { // Fields and tags to add to monitor. diff --git a/heartbeat/monitors/factory_test.go b/heartbeat/monitors/factory_test.go index bce72f63ccb..e32ac671c8e 100644 --- a/heartbeat/monitors/factory_test.go +++ b/heartbeat/monitors/factory_test.go @@ -325,8 +325,11 @@ func TestDuplicateMonitorIDs(t *testing.T) { } } + c, err := mockPipeline.Connect() + require.NoError(t, err) + // Ensure that an error is returned on a bad config - _, m0Err := newMonitor(badConf, reg, mockPipeline.ConnectSync(), sched.Add, nil, nil) + _, m0Err := newMonitor(badConf, reg, c, sched.Add, nil, nil) require.Error(t, m0Err) // Would fail if the previous newMonitor didn't free the monitor.id diff --git a/heartbeat/monitors/jobs/job.go b/heartbeat/monitors/jobs/job.go index b24377fd28b..70811478cb3 100644 --- a/heartbeat/monitors/jobs/job.go +++ b/heartbeat/monitors/jobs/job.go @@ -48,24 +48,6 @@ func WrapAll(jobs []Job, wrappers ...JobWrapper) []Job { return wrapped } -// JobWrapperFactory can be used to created new instances of JobWrappers. -type JobWrapperFactory func() JobWrapper - -// WrapAllSeparately wraps the given jobs using the given JobWrapperFactory instances. -// This enables us to use a different JobWrapper for the jobs passed in, but recursively apply -// the same wrapper to their children. -func WrapAllSeparately(jobs []Job, factories ...JobWrapperFactory) []Job { - var wrapped = make([]Job, 0, len(jobs)) - for _, j := range jobs { - for _, factory := range factories { - wrapper := factory() - j = Wrap(j, wrapper) - } - wrapped = append(wrapped, j) - } - return wrapped -} - // Wrap wraps the given Job and also any continuations with the given JobWrapper. func Wrap(job Job, wrapper JobWrapper) Job { return func(event *beat.Event) ([]Job, error) { diff --git a/heartbeat/monitors/jobs/testing.go b/heartbeat/monitors/jobs/testing.go index 2eed89a587d..a28ca7a8002 100644 --- a/heartbeat/monitors/jobs/testing.go +++ b/heartbeat/monitors/jobs/testing.go @@ -25,6 +25,7 @@ import ( // ExecJobsAndConts recursively executes multiple jobs. func ExecJobsAndConts(t *testing.T, jobs []Job) ([]*beat.Event, error) { + t.Helper() var results []*beat.Event for _, j := range jobs { resultEvents, err := ExecJobAndConts(t, j) @@ -39,21 +40,17 @@ func ExecJobsAndConts(t *testing.T, jobs []Job) ([]*beat.Event, error) { // ExecJobAndConts will recursively execute a job and gather its results func ExecJobAndConts(t *testing.T, j Job) ([]*beat.Event, error) { + t.Helper() var results []*beat.Event event := &beat.Event{} results = append(results, event) cont, err := j(event) - if err != nil { - return nil, err - } for _, cj := range cont { - cjResults, err := ExecJobAndConts(t, cj) - if err != nil { - return nil, err - } + var cjResults []*beat.Event + cjResults, err = ExecJobAndConts(t, cj) results = append(results, cjResults...) } - return results, nil + return results, err } diff --git a/heartbeat/monitors/mocks.go b/heartbeat/monitors/mocks.go index bc6695f3be9..0a7227c9986 100644 --- a/heartbeat/monitors/mocks.go +++ b/heartbeat/monitors/mocks.go @@ -43,7 +43,6 @@ import ( "github.com/elastic/beats/v7/heartbeat/scheduler" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common/atomic" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" beatversion "github.com/elastic/beats/v7/libbeat/version" ) @@ -80,9 +79,8 @@ func makeMockFactory(pluginsReg *plugin.PluginsReg) (factory *RunnerFactory, sch AddTask: sched.Add, StateLoader: monitorstate.NilStateLoader, PluginsReg: pluginsReg, - PipelineClientFactory: func(pipeline beat.Pipeline) (pipeline.ISyncClient, error) { - c, _ := pipeline.Connect() - return SyncPipelineClientAdaptor{C: c}, nil + PipelineClientFactory: func(pipeline beat.Pipeline) (beat.Client, error) { + return pipeline.Connect() }, }), sched, @@ -164,12 +162,6 @@ func (pc *MockPipeline) ConnectWith(cc beat.ClientConfig) (beat.Client, error) { return c, nil } -// Convenience function for tests -func (pc *MockPipeline) ConnectSync() pipeline.ISyncClient { - c, _ := pc.Connect() - return SyncPipelineClientAdaptor{C: c} -} - func (pc *MockPipeline) PublishedEvents() []*beat.Event { pc.mtx.Lock() defer pc.mtx.Unlock() @@ -205,7 +197,7 @@ func mockEventMonitorValidator(id string, name string) validator.Validator { return lookslike.Strict(lookslike.Compose( baseMockEventMonitorValidator(id, name, "up"), hbtestllext.MonitorTimespanValidator, - hbtest.SummaryChecks(1, 0), + hbtest.SummaryStateChecks(1, 0), lookslike.MustCompile(mockEventCustomFields()), )) } diff --git a/heartbeat/monitors/monitor.go b/heartbeat/monitors/monitor.go index 17271086d16..6a16c7d3f30 100644 --- a/heartbeat/monitors/monitor.go +++ b/heartbeat/monitors/monitor.go @@ -22,7 +22,6 @@ import ( "sync" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" "github.com/mitchellh/hashstructure" @@ -63,13 +62,15 @@ type Monitor struct { internalsMtx sync.Mutex close func() error - // pubClient accepts an ISyncClient as the lowest common denominator of client - // since async clients are a subset of sync clients - pubClient pipeline.ISyncClient + // pubClient accepts a generic beat.Client. Pipeline synchronicity is implemented + // at client wrapper-level + pubClient beat.Client // stats is the countersRecorder used to record lifecycle events // for global metrics + telemetry stats plugin.RegistryRecorder + + monitorStateTracker *monitorstate.Tracker } // String prints a description of the monitor in a threadsafe way. It is important that this use threadsafe @@ -89,7 +90,7 @@ func checkMonitorConfig(config *conf.C, registrar *plugin.PluginsReg) error { func newMonitor( config *conf.C, registrar *plugin.PluginsReg, - pubClient pipeline.ISyncClient, + pubClient beat.Client, taskAdder scheduler.AddTask, stateLoader monitorstate.StateLoader, onStop func(*Monitor), @@ -106,7 +107,7 @@ func newMonitor( func newMonitorUnsafe( config *conf.C, registrar *plugin.PluginsReg, - pubClient pipeline.ISyncClient, + pubClient beat.Client, addTask scheduler.AddTask, stateLoader monitorstate.StateLoader, onStop func(*Monitor), @@ -125,15 +126,16 @@ func newMonitorUnsafe( } m := &Monitor{ - stdFields: standardFields, - pluginName: pluginFactory.Name, - addTask: addTask, - configuredJobs: []*configuredJob{}, - pubClient: pubClient, - internalsMtx: sync.Mutex{}, - config: config, - stats: pluginFactory.Stats, - state: MON_INIT, + stdFields: standardFields, + pluginName: pluginFactory.Name, + addTask: addTask, + configuredJobs: []*configuredJob{}, + pubClient: pubClient, + internalsMtx: sync.Mutex{}, + config: config, + stats: pluginFactory.Stats, + state: MON_INIT, + monitorStateTracker: monitorstate.NewTracker(stateLoader, false), } if m.stdFields.ID == "" { @@ -179,7 +181,10 @@ func newMonitorUnsafe( // We need to use the lightweight wrapping for error jobs // since browser wrapping won't write summaries, but the fake job here is // effectively a lightweight job - wrappedJobs = wrappers.WrapLightweight(p.Jobs, m.stdFields, monitorstate.NewTracker(stateLoader, false)) + m.stdFields.BadConfig = true + // No need to retry bad configs + m.stdFields.MaxAttempts = 1 + wrappedJobs = wrappers.WrapCommon(p.Jobs, m.stdFields, stateLoader) } m.endpoints = p.Endpoints diff --git a/heartbeat/monitors/monitor_test.go b/heartbeat/monitors/monitor_test.go index 560e46fcdea..3176d27a2fa 100644 --- a/heartbeat/monitors/monitor_test.go +++ b/heartbeat/monitors/monitor_test.go @@ -69,7 +69,9 @@ func testMonitorConfig(t *testing.T, conf *conf.C, eventValidator validator.Vali sched := scheduler.Create(1, monitoring.NewRegistry(), time.Local, nil, false) defer sched.Stop() - mon, err := newMonitor(conf, reg, pipel.ConnectSync(), sched.Add, nil, nil) + c, err := pipel.Connect() + require.NoError(t, err) + mon, err := newMonitor(conf, reg, c, sched.Add, nil, nil) require.NoError(t, err) mon.Start() @@ -116,7 +118,9 @@ func TestCheckInvalidConfig(t *testing.T) { sched := scheduler.Create(1, monitoring.NewRegistry(), time.Local, nil, false) defer sched.Stop() - m, err := newMonitor(serverMonConf, reg, pipel.ConnectSync(), sched.Add, nil, nil) + c, err := pipel.Connect() + require.NoError(t, err) + m, err := newMonitor(serverMonConf, reg, c, sched.Add, nil, nil) require.Error(t, err) // This could change if we decide the contract for newMonitor should always return a monitor require.Nil(t, m, "For this test to work we need a nil value for the monitor.") diff --git a/heartbeat/monitors/pipeline.go b/heartbeat/monitors/pipeline.go new file mode 100644 index 00000000000..cde1f8b9256 --- /dev/null +++ b/heartbeat/monitors/pipeline.go @@ -0,0 +1,91 @@ +// 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 monitors + +import ( + "sync" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common/acker" + "github.com/elastic/beats/v7/libbeat/publisher/pipetool" + "github.com/elastic/elastic-agent-libs/logp" +) + +// Defines a synchronous pipeline wrapper interface +type PipelineWrapper interface { + Wait() +} + +type NoopPipelineWrapper struct { +} + +// Noop +func (n *NoopPipelineWrapper) Wait() { +} + +// Pipeline wrapper that implements synchronous op. Calling Wait() on this client will block until all +// events passed through this pipeline (and any of the linked clients) are ACKed, safe to use concurrently. +type SyncPipelineWrapper struct { + wg sync.WaitGroup +} + +// Used to wrap every client and track emitted vs acked events. +type wrappedClient struct { + wg *sync.WaitGroup + client beat.Client +} + +// returns a new pipeline with the provided SyncPipelineClientWrapper. +func WithSyncPipelineWrapper(pipeline beat.Pipeline, pw *SyncPipelineWrapper) beat.Pipeline { + pipeline = pipetool.WithACKer(pipeline, acker.TrackingCounter(func(_, total int) { + logp.L().Debugf("ack callback receives with events count of %d", total) + pw.onACK(total) + })) + + pipeline = pipetool.WithClientWrapper(pipeline, func(client beat.Client) beat.Client { + return &wrappedClient{ + wg: &pw.wg, + client: client, + } + }) + + return pipeline +} + +func (c *wrappedClient) Publish(event beat.Event) { + c.wg.Add(1) + c.client.Publish(event) +} + +func (c *wrappedClient) PublishAll(events []beat.Event) { + c.wg.Add(len(events)) + c.client.PublishAll(events) +} + +func (c *wrappedClient) Close() error { + return c.client.Close() +} + +// waits until ACK is received for every event that was sent +func (s *SyncPipelineWrapper) Wait() { + s.wg.Wait() +} + +func (s *SyncPipelineWrapper) onACK(n int) { + s.wg.Add(-1 * n) +} diff --git a/heartbeat/monitors/pipeline_test.go b/heartbeat/monitors/pipeline_test.go new file mode 100644 index 00000000000..2a7e6a24457 --- /dev/null +++ b/heartbeat/monitors/pipeline_test.go @@ -0,0 +1,126 @@ +// 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 monitors + +import ( + "context" + "testing" + "time" + + "github.com/elastic/beats/v7/heartbeat/eventext" + "github.com/elastic/beats/v7/heartbeat/monitors/jobs" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/mapstr" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSyncPipelineWrapper(t *testing.T) { + defineJob := func(fields mapstr.M) func(event *beat.Event) (j []jobs.Job, e error) { + return func(event *beat.Event) (j []jobs.Job, e error) { + eventext.MergeEventFields(event, fields) + return nil, nil + } + } + simpleJob := defineJob(mapstr.M{"foo": "bar"}) + + testCases := []struct { + name string + job jobs.Job + acks int + }{ + { + "simple", + simpleJob, + 1, + }, + { + "one cont", + func(event *beat.Event) (j []jobs.Job, e error) { + _, _ = simpleJob(event) + return []jobs.Job{simpleJob}, nil + }, + 2, + }, + { + "multiple conts", + func(event *beat.Event) (j []jobs.Job, e error) { + _, _ = simpleJob(event) + return []jobs.Job{ + defineJob(mapstr.M{"baz": "bot"}), + defineJob(mapstr.M{"blah": "blargh"}), + }, nil + }, + 3, + }, + { + "cancelled cont", + func(event *beat.Event) (j []jobs.Job, e error) { + eventext.CancelEvent(event) + return []jobs.Job{simpleJob}, nil + }, + 1, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + done := make(chan bool) + pipel := &MockPipeline{} + sync := &SyncPipelineWrapper{} + wrapped := WithSyncPipelineWrapper(pipel, sync) + + client, err := wrapped.Connect() + require.NoError(t, err) + queue := runPublishJob(tc.job, client) + for { + if len(queue) == 0 { + break + } + tf := queue[0] + queue = queue[1:] + conts := tf(context.Background()) + queue = append(queue, conts...) + } + err = client.Close() + require.NoError(t, err) + + go func() { + sync.Wait() + done <- true + }() + + wait := time.After(1000 * time.Millisecond) + select { + case <-done: + assert.Fail(t, "pipeline exited before events were published") + case <-wait: + } + + sync.onACK(tc.acks) + + wait = time.After(1000 * time.Millisecond) + select { + case <-done: + case <-wait: + assert.Fail(t, "pipeline exceeded timeout after every event acked") + } + }) + } +} diff --git a/heartbeat/monitors/signalwait.go b/heartbeat/monitors/signalwait.go new file mode 100644 index 00000000000..5832ac9a3af --- /dev/null +++ b/heartbeat/monitors/signalwait.go @@ -0,0 +1,90 @@ +// 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 monitors + +import ( + "time" + + "github.com/elastic/elastic-agent-libs/logp" +) + +type signalWait struct { + count int // number of potential 'alive' signals + signals chan struct{} +} + +type signaler func() + +func NewSignalWait() *signalWait { + return &signalWait{ + signals: make(chan struct{}, 1), + } +} + +func (s *signalWait) Wait() { + if s.count == 0 { + return + } + + <-s.signals + s.count-- +} + +func (s *signalWait) Add(fn signaler) { + s.count++ + go func() { + fn() + var v struct{} + s.signals <- v + }() +} + +func (s *signalWait) AddChan(c <-chan struct{}) { + s.Add(WaitChannel(c)) +} + +func (s *signalWait) AddTimer(t *time.Timer) { + s.Add(WaitTimer(t)) +} + +func (s *signalWait) AddTimeout(d time.Duration) { + s.Add(WaitDuration(d)) +} + +func (s *signalWait) Signal() { + s.Add(func() {}) +} + +func WaitChannel(c <-chan struct{}) signaler { + return func() { <-c } +} + +func WaitTimer(t *time.Timer) signaler { + return func() { <-t.C } +} + +func WaitDuration(d time.Duration) signaler { + return WaitTimer(time.NewTimer(d)) +} + +func WithLog(s signaler, msg string) signaler { + return func() { + s() + logp.L().Infof("%v", msg) + } +} diff --git a/heartbeat/monitors/signalwait_test.go b/heartbeat/monitors/signalwait_test.go new file mode 100644 index 00000000000..4e3ecd7b5d6 --- /dev/null +++ b/heartbeat/monitors/signalwait_test.go @@ -0,0 +1,235 @@ +// 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 monitors + +import ( + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestSimpleWait(t *testing.T) { + tests := map[string]struct { + number int + }{ + "one wait signals": { + number: 1, + }, + "50 wait signals": { + number: 50, + }, + "100 wait signals": { + number: 100, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + done := make(chan bool) + + gl := sync.WaitGroup{} + gl.Add(1) // Lock routines indefinitely + + addFn := func(s *signalWait) { + s.Add(func() { + gl.Wait() + done <- true // Just in case, shared channel + }) + } + + signalWait := NewSignalWait() + + for i := 0; i < tt.number; i++ { + addFn(signalWait) + } + + go func() { + signalWait.Wait() + done <- true + }() + + wait := time.After(500 * time.Millisecond) + select { + case <-done: + assert.Fail(t, "found early exit signal") + case <-wait: + } + + signalWait.Add(func() {}) + + wait = time.After(500 * time.Millisecond) + select { + case <-done: + case <-wait: + assert.Fail(t, "signal did not exit on time") + } + }) + } +} + +func TestChannelWait(t *testing.T) { + tests := map[string]struct { + number int + }{ + "one wait signals": { + number: 1, + }, + "50 wait signals": { + number: 50, + }, + "100 wait signals": { + number: 100, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + done := make(chan bool) + gl := make(chan struct{}) + signalWait := NewSignalWait() + + for i := 0; i < tt.number; i++ { + signalWait.AddChan(gl) + } + + go func() { + signalWait.Wait() + done <- true + }() + + wait := time.After(500 * time.Millisecond) + select { + case <-done: + assert.Fail(t, "found early exit signal") + case <-wait: + } + + d := make(chan struct{}) + signalWait.AddChan(d) + d <- struct{}{} + + wait = time.After(500 * time.Millisecond) + select { + case <-done: + case <-wait: + assert.Fail(t, "signal did not exit on time") + } + }) + } +} + +func TestTimeoutWait(t *testing.T) { + tests := map[string]struct { + number int + }{ + "one wait signals": { + number: 1, + }, + "50 wait signals": { + number: 50, + }, + "100 wait signals": { + number: 100, + }, + } + + for name, tt := range tests { + + t.Run(name, func(t *testing.T) { + done := make(chan bool) + + signalWait := NewSignalWait() + + for i := 0; i < tt.number; i++ { + signalWait.AddTimer(time.NewTimer(time.Hour)) + } + + go func() { + signalWait.Wait() + done <- true + }() + + wait := time.After(500 * time.Millisecond) + select { + case <-done: + assert.Fail(t, "found early exit signal") + case <-wait: + } + + signalWait.AddTimer(time.NewTimer(time.Microsecond)) + + wait = time.After(500 * time.Millisecond) + select { + case <-done: + case <-wait: + assert.Fail(t, "signal did not exit on time") + } + }) + } +} +func TestDurationWait(t *testing.T) { + tests := map[string]struct { + number int + }{ + "one wait signals": { + number: 1, + }, + "50 wait signals": { + number: 50, + }, + "100 wait signals": { + number: 100, + }, + } + + for name, tt := range tests { + + t.Run(name, func(t *testing.T) { + done := make(chan bool) + + signalWait := NewSignalWait() + + for i := 0; i < tt.number; i++ { + signalWait.AddTimeout(time.Hour) + } + + go func() { + signalWait.Wait() + done <- true + }() + + wait := time.After(500 * time.Millisecond) + select { + case <-done: + assert.Fail(t, "found early exit signal") + case <-wait: + } + + signalWait.AddTimeout(time.Microsecond) + + wait = time.After(500 * time.Millisecond) + select { + case <-done: + case <-wait: + assert.Fail(t, "signal did not exit on time") + } + }) + } +} diff --git a/heartbeat/monitors/stdfields/stdfields.go b/heartbeat/monitors/stdfields/stdfields.go index d0773a49e79..ae721a74611 100644 --- a/heartbeat/monitors/stdfields/stdfields.go +++ b/heartbeat/monitors/stdfields/stdfields.go @@ -40,6 +40,7 @@ type StdMonitorFields struct { Service ServiceFields `config:"service"` Origin string `config:"origin"` LegacyServiceName string `config:"service_name"` + MaxAttempts uint16 `config:"max_attempts"` // Used by zip_url and local monitors // kibana originating monitors only run one journey at a time // and just use the `fields` syntax / manually set monitor IDs @@ -51,10 +52,13 @@ type StdMonitorFields struct { Local *config.C `config:"local"` } `config:"source"` RunFrom *hbconfig.LocationWithID `config:"run_from"` + // Set to true by monitor.go if monitor configuration is unrunnable + // Maybe there's a more elegant way to handle this + BadConfig bool } func ConfigToStdMonitorFields(conf *config.C) (StdMonitorFields, error) { - sFields := StdMonitorFields{Enabled: true} + sFields := StdMonitorFields{Enabled: true, MaxAttempts: 1} if err := conf.Unpack(&sFields); err != nil { return sFields, fmt.Errorf("error unpacking monitor plugin config: %w", err) diff --git a/heartbeat/monitors/task.go b/heartbeat/monitors/task.go index 35563d7cd36..ee0839fe14e 100644 --- a/heartbeat/monitors/task.go +++ b/heartbeat/monitors/task.go @@ -21,8 +21,6 @@ import ( "context" "fmt" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" - "github.com/elastic/beats/v7/heartbeat/eventext" "github.com/elastic/beats/v7/heartbeat/monitors/jobs" "github.com/elastic/beats/v7/heartbeat/scheduler" @@ -39,7 +37,7 @@ type configuredJob struct { config jobConfig monitor *Monitor cancelFn context.CancelFunc - pubClient pipeline.ISyncClient + pubClient beat.Client } func newConfiguredJob(job jobs.Job, config jobConfig, monitor *Monitor) *configuredJob { @@ -76,7 +74,7 @@ func (t *configuredJob) makeSchedulerTaskFunc() scheduler.TaskFunc { } // Start schedules this configuredJob for execution. -func (t *configuredJob) Start(pubClient pipeline.ISyncClient) { +func (t *configuredJob) Start(pubClient beat.Client) { var err error t.pubClient = pubClient @@ -86,8 +84,7 @@ func (t *configuredJob) Start(pubClient pipeline.ISyncClient) { return } - tf := t.makeSchedulerTaskFunc() - t.cancelFn, err = t.monitor.addTask(t.config.Schedule, t.monitor.stdFields.ID, tf, t.config.Type, pubClient.Wait) + t.cancelFn, err = t.monitor.addTask(t.config.Schedule, t.monitor.stdFields.ID, t.makeSchedulerTaskFunc(), t.config.Type) if err != nil { logp.L().Info("could not start monitor: %v", err) } @@ -103,7 +100,7 @@ func (t *configuredJob) Stop() { } } -func runPublishJob(job jobs.Job, pubClient pipeline.ISyncClient) []scheduler.TaskFunc { +func runPublishJob(job jobs.Job, pubClient beat.Client) []scheduler.TaskFunc { event := &beat.Event{ Fields: mapstr.M{}, } @@ -125,10 +122,10 @@ func runPublishJob(job jobs.Job, pubClient pipeline.ISyncClient) []scheduler.Tas Meta: event.Meta.Clone(), Fields: event.Fields.Clone(), } - _ = pubClient.Publish(clone) + pubClient.Publish(clone) } else { // no clone needed if no continuations - _ = pubClient.Publish(*event) + pubClient.Publish(*event) } } diff --git a/heartbeat/monitors/task_test.go b/heartbeat/monitors/task_test.go index f2fddccc4e6..37a7f421442 100644 --- a/heartbeat/monitors/task_test.go +++ b/heartbeat/monitors/task_test.go @@ -96,7 +96,8 @@ func Test_runPublishJob(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { pipel := &MockPipeline{} - client := pipel.ConnectSync() + client, err := pipel.Connect() + require.NoError(t, err) queue := runPublishJob(tc.job, client) for { if len(queue) == 0 { @@ -107,8 +108,7 @@ func Test_runPublishJob(t *testing.T) { conts := tf(context.Background()) queue = append(queue, conts...) } - client.Wait() - err := client.Close() + err = client.Close() require.NoError(t, err) require.Len(t, pipel.PublishedEvents(), len(tc.validators)) diff --git a/heartbeat/monitors/wrappers/monitorstate/esloader_test.go b/heartbeat/monitors/wrappers/monitorstate/esloader_test.go index a35ddcccb87..42b1c6c31c3 100644 --- a/heartbeat/monitors/wrappers/monitorstate/esloader_test.go +++ b/heartbeat/monitors/wrappers/monitorstate/esloader_test.go @@ -51,7 +51,7 @@ func TestStatesESLoader(t *testing.T) { monID := etc.createTestMonitorStateInES(t, testStatus) // Since we've continued this state it should register the initial state - ms := etc.tracker.getCurrentState(monID) + ms := etc.tracker.GetCurrentState(monID) require.True(t, ms.StartedAt.After(testStart.Add(-time.Nanosecond)), "timestamp for new state is off") requireMSStatusCount(t, ms, testStatus, 1) @@ -59,7 +59,7 @@ func TestStatesESLoader(t *testing.T) { count := FlappingThreshold * 2 var lastId string for i := 0; i < count; i++ { - ms = etc.tracker.RecordStatus(monID, testStatus) + ms = etc.tracker.RecordStatus(monID, testStatus, true) if i == 0 { lastId = ms.ID } @@ -77,7 +77,7 @@ func TestStatesESLoader(t *testing.T) { origMsId := ms.ID for i := 0; i < count; i++ { - ms = etc.tracker.RecordStatus(monID, testStatus) + ms = etc.tracker.RecordStatus(monID, testStatus, true) require.NotEqual(t, origMsId, ms.ID) if i == 0 { lastId = ms.ID diff --git a/heartbeat/monitors/wrappers/monitorstate/monitorstate.go b/heartbeat/monitors/wrappers/monitorstate/monitorstate.go index c39afd2df72..56034d7ab4f 100644 --- a/heartbeat/monitors/wrappers/monitorstate/monitorstate.go +++ b/heartbeat/monitors/wrappers/monitorstate/monitorstate.go @@ -37,6 +37,8 @@ const ( StatusUp StateStatus = "up" StatusDown StateStatus = "down" StatusFlapping StateStatus = "flap" + // Nil, essentially + StatusEmpty StateStatus = "" ) func newMonitorState(sf stdfields.StdMonitorFields, status StateStatus, ctr int, flappingEnabled bool) *State { @@ -52,7 +54,7 @@ func newMonitorState(sf stdfields.StdMonitorFields, status StateStatus, ctr int, flappingEnabled: flappingEnabled, ctr: ctr + 1, } - ms.recordCheck(sf, status) + ms.recordCheck(sf, status, false) return ms } @@ -111,7 +113,7 @@ func (s *State) truncateFlapHistory() { // If the current state is continued it just updates counters and other record keeping, // if the state ends it actually swaps out the full value the state points to // and sets state.Ends. -func (s *State) recordCheck(sf stdfields.StdMonitorFields, newStatus StateStatus) { +func (s *State) recordCheck(sf stdfields.StdMonitorFields, newStatus StateStatus, isFinalAttempt bool) { if s.Status == StatusFlapping { s.truncateFlapHistory() @@ -124,14 +126,16 @@ func (s *State) recordCheck(sf stdfields.StdMonitorFields, newStatus StateStatus } } - if !hasStabilized { // continue flapping + if !hasStabilized || !isFinalAttempt { // continue flapping // Use the new flap history as part of the state s.FlapHistory = append(s.FlapHistory, newStatus) s.incrementCounters(newStatus) } else { // flap has ended s.transitionTo(sf, newStatus) } - } else if s.Status == newStatus { // stable state, status has not changed + // stable state, status has not changed + // or this will be retried, so no state change yet + } else if s.Status == newStatus || !isFinalAttempt { // The state is stable, no changes needed s.incrementCounters(newStatus) } else if s.Checks < FlappingThreshold && s.flappingEnabled { @@ -178,5 +182,6 @@ func LoaderDBKey(sf stdfields.StdMonitorFields, at time.Time, ctr int) string { rfid = normalizeRunFromIDRegexp.ReplaceAllString(sf.RunFrom.ID, "_") } - return fmt.Sprintf("%s-%x-%x", rfid, at.UnixMilli(), ctr) + key := fmt.Sprintf("%s-%x-%x", rfid, at.UnixMilli(), ctr) + return key } diff --git a/heartbeat/monitors/wrappers/monitorstate/monitorstate_test.go b/heartbeat/monitors/wrappers/monitorstate/monitorstate_test.go index f60ddb2a40f..5a7f4f2d6e1 100644 --- a/heartbeat/monitors/wrappers/monitorstate/monitorstate_test.go +++ b/heartbeat/monitors/wrappers/monitorstate/monitorstate_test.go @@ -44,16 +44,16 @@ func TestRecordingAndFlapping(t *testing.T) { require.Nil(t, ms.Ends, "expected nil ends after a stable series") // Since we're now in a stable state a single up check should create a new state from a stable one - ms.recordCheck(TestSf, StatusUp) + ms.recordCheck(TestSf, StatusUp, true) require.Equal(t, StatusUp, ms.Status) requireMSCounts(t, ms, 1, 0) } func TestDuration(t *testing.T) { ms := newMonitorState(TestSf, StatusUp, 0, true) - ms.recordCheck(TestSf, StatusUp) + ms.recordCheck(TestSf, StatusUp, true) time.Sleep(time.Millisecond * 10) - ms.recordCheck(TestSf, StatusUp) + ms.recordCheck(TestSf, StatusUp, true) // Pretty forgiving upper bound to account for flaky CI require.True(t, ms.DurationMs > 9 && ms.DurationMs < 900, "Expected duration to be ~10ms, got %d", ms.DurationMs) } @@ -62,9 +62,9 @@ func TestDuration(t *testing.T) { func recordFlappingSeries(TestSf stdfields.StdMonitorFields, ms *State) { for i := 0; i < FlappingThreshold; i++ { if i%2 == 0 { - ms.recordCheck(TestSf, StatusUp) + ms.recordCheck(TestSf, StatusUp, true) } else { - ms.recordCheck(TestSf, StatusDown) + ms.recordCheck(TestSf, StatusDown, true) } } } @@ -72,7 +72,7 @@ func recordFlappingSeries(TestSf stdfields.StdMonitorFields, ms *State) { // recordStableSeries is a test helper for repeatedly recording one status func recordStableSeries(TestSf stdfields.StdMonitorFields, ms *State, count int, s StateStatus) { for i := 0; i < count; i++ { - ms.recordCheck(TestSf, s) + ms.recordCheck(TestSf, s, true) } } diff --git a/heartbeat/monitors/wrappers/monitorstate/tracker.go b/heartbeat/monitors/wrappers/monitorstate/tracker.go index d3e9d7ff178..03909d55aa8 100644 --- a/heartbeat/monitors/wrappers/monitorstate/tracker.go +++ b/heartbeat/monitors/wrappers/monitorstate/tracker.go @@ -56,25 +56,33 @@ type Tracker struct { // other than ES if necessary type StateLoader func(stdfields.StdMonitorFields) (*State, error) -func (t *Tracker) RecordStatus(sf stdfields.StdMonitorFields, newStatus StateStatus) (ms *State) { +func (t *Tracker) RecordStatus(sf stdfields.StdMonitorFields, newStatus StateStatus, isFinalAttempt bool) (ms *State) { //note: the return values have no concurrency controls, they may be unsafely read unless //copied to the stack, copying the structs before returning t.mtx.Lock() defer t.mtx.Unlock() - state := t.getCurrentState(sf) + state := t.GetCurrentState(sf) if state == nil { state = newMonitorState(sf, newStatus, 0, t.flappingEnabled) logp.L().Infof("initializing new state for monitor %s: %s", sf.ID, state.String()) t.states[sf.ID] = state } else { - state.recordCheck(sf, newStatus) + state.recordCheck(sf, newStatus, isFinalAttempt) } // return a copy since the state itself is a pointer that is frequently mutated return state.copy() } -func (t *Tracker) getCurrentState(sf stdfields.StdMonitorFields) (state *State) { +func (t *Tracker) GetCurrentStatus(sf stdfields.StdMonitorFields) StateStatus { + s := t.GetCurrentState(sf) + if s == nil { + return StatusEmpty + } + return s.Status +} + +func (t *Tracker) GetCurrentState(sf stdfields.StdMonitorFields) (state *State) { if state, ok := t.states[sf.ID]; ok { return state } diff --git a/heartbeat/monitors/wrappers/monitorstate/tracker_test.go b/heartbeat/monitors/wrappers/monitorstate/tracker_test.go index a1221ecc072..ec1217b8615 100644 --- a/heartbeat/monitors/wrappers/monitorstate/tracker_test.go +++ b/heartbeat/monitors/wrappers/monitorstate/tracker_test.go @@ -28,43 +28,43 @@ import ( func TestTrackerRecord(t *testing.T) { mst := NewTracker(NilStateLoader, true) - ms := mst.RecordStatus(TestSf, StatusUp) + ms := mst.RecordStatus(TestSf, StatusUp, true) require.Equal(t, StatusUp, ms.Status) requireMSStatusCount(t, ms, StatusUp, 1) for i := 0; i < FlappingThreshold; i++ { - _ = mst.RecordStatus(TestSf, StatusDown) - ms = mst.RecordStatus(TestSf, StatusUp) + _ = mst.RecordStatus(TestSf, StatusDown, true) + ms = mst.RecordStatus(TestSf, StatusUp, true) } require.Equal(t, StatusFlapping, ms.Status) requireMSCounts(t, ms, FlappingThreshold+1, FlappingThreshold) // Restore stable state for i := 0; i < FlappingThreshold; i++ { - _ = mst.RecordStatus(TestSf, StatusDown) + _ = mst.RecordStatus(TestSf, StatusDown, true) } - ms = mst.RecordStatus(TestSf, StatusDown) + ms = mst.RecordStatus(TestSf, StatusDown, true) require.Equal(t, StatusDown, ms.Status) requireMSStatusCount(t, ms, StatusDown, FlappingThreshold-1) } func TestTrackerRecordFlappingDisabled(t *testing.T) { mst := NewTracker(NilStateLoader, false) - ms := mst.RecordStatus(TestSf, StatusUp) + ms := mst.RecordStatus(TestSf, StatusUp, true) require.Equal(t, StatusUp, ms.Status) requireMSStatusCount(t, ms, StatusUp, 1) for i := 0; i < FlappingThreshold; i++ { - _ = mst.RecordStatus(TestSf, StatusDown) - ms = mst.RecordStatus(TestSf, StatusUp) + _ = mst.RecordStatus(TestSf, StatusDown, true) + ms = mst.RecordStatus(TestSf, StatusUp, true) } // with flapping disabled it only shows as up require.Equal(t, StatusUp, ms.Status) requireMSCounts(t, ms, 1, 0) - ms = mst.RecordStatus(TestSf, StatusDown) + ms = mst.RecordStatus(TestSf, StatusDown, true) require.Equal(t, StatusDown, ms.Status) requireMSStatusCount(t, ms, StatusDown, 1) } diff --git a/heartbeat/monitors/wrappers/summarizer/summarizer.go b/heartbeat/monitors/wrappers/summarizer/summarizer.go new file mode 100644 index 00000000000..49d3ca9422a --- /dev/null +++ b/heartbeat/monitors/wrappers/summarizer/summarizer.go @@ -0,0 +1,167 @@ +// 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 summarizer + +import ( + "fmt" + "sync" + "time" + + "github.com/gofrs/uuid" + + "github.com/elastic/beats/v7/heartbeat/eventext" + "github.com/elastic/beats/v7/heartbeat/monitors/jobs" + "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +type Summarizer struct { + rootJob jobs.Job + contsRemaining uint16 + mtx *sync.Mutex + jobSummary *JobSummary + checkGroup string + stateTracker *monitorstate.Tracker + sf stdfields.StdMonitorFields + retryDelay time.Duration +} + +type JobSummary struct { + Attempt uint16 `json:"attempt"` + MaxAttempts uint16 `json:"max_attempts"` + FinalAttempt bool `json:"final_attempt"` + Up uint16 `json:"up"` + Down uint16 `json:"down"` + Status monitorstate.StateStatus `json:"status"` + RetryGroup string `json:"retry_group"` +} + +func NewSummarizer(rootJob jobs.Job, sf stdfields.StdMonitorFields, mst *monitorstate.Tracker) *Summarizer { + uu, err := uuid.NewV1() + if err != nil { + logp.L().Errorf("could not create v1 UUID for retry group: %s", err) + } + return &Summarizer{ + rootJob: rootJob, + contsRemaining: 1, + mtx: &sync.Mutex{}, + jobSummary: NewJobSummary(1, sf.MaxAttempts, uu.String()), + checkGroup: uu.String(), + stateTracker: mst, + sf: sf, + // private property, but can be overridden in tests to speed them up + retryDelay: time.Second, + } +} + +func NewJobSummary(attempt uint16, maxAttempts uint16, retryGroup string) *JobSummary { + if maxAttempts < 1 { + maxAttempts = 1 + } + + return &JobSummary{ + MaxAttempts: maxAttempts, + Attempt: attempt, + RetryGroup: retryGroup, + } +} + +// Wrap wraps the given job in such a way that the last event summarizes all previous events +// and additionally adds some common fields like monitor.check_group to all events. +// This adds the state and summary top level fields. +func (s *Summarizer) Wrap(j jobs.Job) jobs.Job { + return func(event *beat.Event) ([]jobs.Job, error) { + conts, jobErr := j(event) + + _, _ = event.PutValue("monitor.check_group", fmt.Sprintf("%s-%d", s.checkGroup, s.jobSummary.Attempt)) + + s.mtx.Lock() + defer s.mtx.Unlock() + + js := s.jobSummary + + s.contsRemaining-- // we just ran one cont, discount it + // these many still need to be processed + s.contsRemaining += uint16(len(conts)) + + monitorStatus, err := event.GetValue("monitor.status") + if err == nil && !eventext.IsEventCancelled(event) { // if this event contains a status... + mss := monitorstate.StateStatus(monitorStatus.(string)) + + if mss == monitorstate.StatusUp { + js.Up++ + } else { + js.Down++ + } + } + + if s.contsRemaining == 0 { + if js.Down > 0 { + js.Status = monitorstate.StatusDown + } else { + js.Status = monitorstate.StatusUp + } + + // Get the last status of this monitor, we use this later to + // determine if a retry is needed + lastStatus := s.stateTracker.GetCurrentStatus(s.sf) + + // FinalAttempt is true if no retries will occur + js.FinalAttempt = js.Status != monitorstate.StatusDown || js.Attempt >= js.MaxAttempts + + ms := s.stateTracker.RecordStatus(s.sf, js.Status, js.FinalAttempt) + + eventext.MergeEventFields(event, mapstr.M{ + "summary": js, + "state": ms, + }) + + logp.L().Debugf("attempt info: %v == %v && %d < %d", js.Status, lastStatus, js.Attempt, js.MaxAttempts) + if !js.FinalAttempt { + // Reset the job summary for the next attempt + // We preserve `s` across attempts + s.jobSummary = NewJobSummary(js.Attempt+1, js.MaxAttempts, js.RetryGroup) + s.contsRemaining = 1 + + // Delay retries by 1s for two reasons: + // 1. Since ES timestamps are millisecond resolution they can happen so fast + // that it's hard to tell the sequence in which jobs executed apart in our + // kibana queries + // 2. If the site error is very short 1s gives it a tiny bit of time to recover + delayedRootJob := jobs.Wrap(s.rootJob, func(j jobs.Job) jobs.Job { + return func(event *beat.Event) ([]jobs.Job, error) { + time.Sleep(s.retryDelay) + return j(event) + } + }) + conts = []jobs.Job{delayedRootJob} + } + } + + // Wrap downstream jobs using the same state object this lets us create new state + // on the first job, but re-use that same object on continuations. + for i, cont := range conts { + conts[i] = s.Wrap(cont) + } + + return conts, jobErr + } +} diff --git a/heartbeat/monitors/wrappers/summarizer/summarizer_test.go b/heartbeat/monitors/wrappers/summarizer/summarizer_test.go new file mode 100644 index 00000000000..de86cd7b49a --- /dev/null +++ b/heartbeat/monitors/wrappers/summarizer/summarizer_test.go @@ -0,0 +1,181 @@ +// 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 summarizer + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/heartbeat/monitors/jobs" + "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +func TestSummarizer(t *testing.T) { + t.Parallel() + charToStatus := func(c uint8) monitorstate.StateStatus { + if c == 'u' { + return monitorstate.StatusUp + } else { + return monitorstate.StatusDown + } + } + + // these tests use strings to describe sequences of events + tests := []struct { + name string + maxAttempts int + // The sequence of up down states the monitor should emit + // Equivalent to monitor.status + statusSequence string + // The expected states on each event + expectedStates string + // the attempt number of the given event + expectedAttempts string + }{ + { + "start down, transition to up", + 2, + "du", + "du", + "12", + }, + { + "start up, stay up", + 2, + "uuuuuuuu", + "uuuuuuuu", + "11111111", + }, + { + "start down, stay down", + 2, + "dddddddd", + "dddddddd", + "12121212", + }, + { + "start up - go down with one retry - thenrecover", + 2, + "udddduuu", + "uuddduuu", + "11212111", + }, + { + "start up, transient down, recover", + 2, + "uuuduuuu", + "uuuuuuuu", + "11112111", + }, + { + "start up, multiple transient down, recover", + 2, + "uuudududu", + "uuuuuuuuu", + "111121212", + }, + { + "no retries, single down", + 1, + "uuuduuuu", + "uuuduuuu", + "11111111", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + dummyErr := fmt.Errorf("dummyerr") + + // The job runs through each char in the status sequence and + // returns an error if it's set to 'd' + pos := 0 + job := func(event *beat.Event) (j []jobs.Job, retErr error) { + status := charToStatus(tt.statusSequence[pos]) + if status == monitorstate.StatusDown { + retErr = dummyErr + } + event.Fields = mapstr.M{ + "monitor": mapstr.M{ + "id": "test", + "status": string(status), + }, + } + + pos++ + return nil, retErr + } + + tracker := monitorstate.NewTracker(monitorstate.NilStateLoader, false) + sf := stdfields.StdMonitorFields{ID: "testmon", Name: "testmon", MaxAttempts: uint16(tt.maxAttempts)} + + rcvdStatuses := "" + rcvdStates := "" + rcvdAttempts := "" + i := 0 + var lastSummary *JobSummary + for { + s := NewSummarizer(job, sf, tracker) + // Shorten retry delay to make tests run faster + s.retryDelay = 2 * time.Millisecond + wrapped := s.Wrap(job) + events, _ := jobs.ExecJobAndConts(t, wrapped) + for _, event := range events { + eventStatus, _ := event.GetValue("monitor.status") + eventStatusStr := eventStatus.(string) + rcvdStatuses += eventStatusStr[:1] + state, _ := event.GetValue("state") + if state != nil { + rcvdStates += string(state.(*monitorstate.State).Status)[:1] + } else { + rcvdStates += "_" + } + summaryIface, _ := event.GetValue("summary") + summary := summaryIface.(*JobSummary) + + if summary == nil { + rcvdAttempts += "!" + } else if lastSummary != nil { + if summary.Attempt > 1 { + require.Equal(t, lastSummary.RetryGroup, summary.RetryGroup) + } else { + require.NotEqual(t, lastSummary.RetryGroup, summary.RetryGroup) + } + } + rcvdAttempts += fmt.Sprintf("%d", summary.Attempt) + lastSummary = summary + } + i += len(events) + if i >= len(tt.statusSequence) { + break + } + } + require.Equal(t, tt.statusSequence, rcvdStatuses) + require.Equal(t, tt.expectedStates, rcvdStates) + require.Equal(t, tt.expectedAttempts, rcvdAttempts) + }) + } +} diff --git a/heartbeat/monitors/wrappers/summarizer/summarizertesthelper/testhelper.go b/heartbeat/monitors/wrappers/summarizer/summarizertesthelper/testhelper.go new file mode 100644 index 00000000000..def27bde0b0 --- /dev/null +++ b/heartbeat/monitors/wrappers/summarizer/summarizertesthelper/testhelper.go @@ -0,0 +1,56 @@ +// 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 summarizertesthelper + +// summarizertest exists to provide a helper function +// for the summarizer. We need a separate package to +// prevent import cycles. + +import ( + "fmt" + + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer" + "github.com/elastic/go-lookslike" + "github.com/elastic/go-lookslike/isdef" + "github.com/elastic/go-lookslike/llpath" + "github.com/elastic/go-lookslike/llresult" + "github.com/elastic/go-lookslike/validator" +) + +// This duplicates hbtest.SummaryChecks to avoid an import cycle. +// It could be refactored out, but it just isn't worth it. +func SummaryValidator(up uint16, down uint16) validator.Validator { + return lookslike.MustCompile(map[string]interface{}{ + "summary": summaryIsdef(up, down), + }) +} + +func summaryIsdef(up uint16, down uint16) isdef.IsDef { + return isdef.Is("summary", func(path llpath.Path, v interface{}) *llresult.Results { + js, ok := v.(summarizer.JobSummary) + if !ok { + return llresult.SimpleResult(path, false, fmt.Sprintf("expected a *JobSummary, got %v", v)) + } + + if js.Up != up || js.Down != down { + return llresult.SimpleResult(path, false, fmt.Sprintf("expected up/down to be %d/%d, got %d/%d", up, down, js.Up, js.Down)) + } + + return llresult.ValidResult(path) + }) +} diff --git a/heartbeat/monitors/wrappers/wrappers.go b/heartbeat/monitors/wrappers/wrappers.go index b4ba0c344e5..233effa0ace 100644 --- a/heartbeat/monitors/wrappers/wrappers.go +++ b/heartbeat/monitors/wrappers/wrappers.go @@ -20,10 +20,8 @@ package wrappers import ( "errors" "fmt" - "sync" "time" - "github.com/gofrs/uuid" "github.com/mitchellh/hashstructure" "github.com/elastic/elastic-agent-libs/logp" @@ -36,42 +34,44 @@ import ( "github.com/elastic/beats/v7/heartbeat/monitors/logger" "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer" "github.com/elastic/beats/v7/heartbeat/scheduler/schedule" "github.com/elastic/beats/v7/libbeat/beat" ) // WrapCommon applies the common wrappers that all monitor jobs get. func WrapCommon(js []jobs.Job, stdMonFields stdfields.StdMonitorFields, stateLoader monitorstate.StateLoader) []jobs.Job { - // flapping is disabled by default until we sort out how it should work mst := monitorstate.NewTracker(stateLoader, false) - if stdMonFields.Type == "browser" { - return WrapBrowser(js, stdMonFields, mst) + var wrapped []jobs.Job + if stdMonFields.Type != "browser" || stdMonFields.BadConfig { + wrapped = WrapLightweight(js, stdMonFields, mst) } else { - return WrapLightweight(js, stdMonFields, mst) + wrapped = WrapBrowser(js, stdMonFields, mst) } + // Wrap just the root jobs with the summarizer + // The summarizer itself wraps the continuations in a stateful way + for i, j := range wrapped { + j := j + wrapped[i] = func(event *beat.Event) ([]jobs.Job, error) { + s := summarizer.NewSummarizer(j, stdMonFields, mst) + return s.Wrap(j)(event) + } + } + return wrapped } // WrapLightweight applies to http/tcp/icmp, everything but journeys involving node func WrapLightweight(js []jobs.Job, stdMonFields stdfields.StdMonitorFields, mst *monitorstate.Tracker) []jobs.Job { - return jobs.WrapAllSeparately( - jobs.WrapAll( - js, - addMonitorTimespan(stdMonFields), - addServiceName(stdMonFields), - addMonitorMeta(stdMonFields, len(js) > 1), - addMonitorStatus(nil), - addMonitorErr, - addMonitorDuration, - logMonitorRun(nil), - ), - func() jobs.JobWrapper { - return makeAddSummary() - }, - func() jobs.JobWrapper { - return addMonitorState(stdMonFields, mst) - }, + return jobs.WrapAll( + js, + addMonitorTimespan(stdMonFields), + addServiceName(stdMonFields), + addMonitorMeta(stdMonFields, len(js) > 1), + addMonitorStatus(nil), + addMonitorErr, + addMonitorDuration, + logMonitorRun(nil), ) - } // WrapBrowser is pretty minimal in terms of fields added. The browser monitor @@ -85,37 +85,10 @@ func WrapBrowser(js []jobs.Job, stdMonFields stdfields.StdMonitorFields, mst *mo addMonitorMeta(stdMonFields, false), addMonitorStatus(byEventType("heartbeat/summary")), addMonitorErr, - addBrowserSummary(stdMonFields, byEventType("heartbeat/summary")), - addMonitorState(stdMonFields, mst), logMonitorRun(byEventType("heartbeat/summary")), ) } -// addMonitorState computes the various state fields -func addMonitorState(sf stdfields.StdMonitorFields, mst *monitorstate.Tracker) jobs.JobWrapper { - return func(job jobs.Job) jobs.Job { - return func(event *beat.Event) ([]jobs.Job, error) { - cont, err := job(event) - - hasSummary, _ := event.Fields.HasKey("summary.up") - if !hasSummary { - return cont, err - } - - status, err := event.GetValue("monitor.status") - if err != nil { - return nil, fmt.Errorf("could not wrap state for '%s', no status assigned: %w", sf.ID, err) - } - - ms := mst.RecordStatus(sf, monitorstate.StateStatus(status.(string))) - - eventext.MergeEventFields(event, mapstr.M{"state": ms}) - - return cont, nil - } - } -} - // addMonitorMeta adds the id, name, and type fields to the monitor. func addMonitorMeta(sFields stdfields.StdMonitorFields, hashURLIntoID bool) jobs.JobWrapper { return func(job jobs.Job) jobs.Job { @@ -279,113 +252,6 @@ func logMonitorRun(match EventMatcher) jobs.JobWrapper { } } -// makeAddSummary summarizes the job, adding the `summary` field to the last event emitted. -func makeAddSummary() jobs.JobWrapper { - // This is a tricky method. The way this works is that we track the state across jobs in the - // state struct here. - state := struct { - mtx sync.Mutex - monitorId string - remaining uint16 - up uint16 - down uint16 - checkGroup string - generation uint64 - }{ - mtx: sync.Mutex{}, - } - // Note this is not threadsafe, must be called from a mutex - resetState := func() { - state.remaining = 1 - state.up = 0 - state.down = 0 - state.generation++ - u, err := uuid.NewV1() - if err != nil { - panic(fmt.Sprintf("cannot generate UUIDs on this system: %s", err)) - } - state.checkGroup = u.String() - } - resetState() - - return func(job jobs.Job) jobs.Job { - return func(event *beat.Event) ([]jobs.Job, error) { - cont, jobErr := job(event) - state.mtx.Lock() - defer state.mtx.Unlock() - - // If the event is cancelled we don't record it as being either up or down since - // we discard the event anyway. - var eventStatus interface{} - if !eventext.IsEventCancelled(event) { - // After each job - eventStatus, _ = event.GetValue("monitor.status") - if eventStatus == "up" { - state.up++ - } else { - state.down++ - } - } - - _, _ = event.PutValue("monitor.check_group", state.checkGroup) - - // Adjust the total remaining to account for new continuations - state.remaining += uint16(len(cont)) - // Reduce total remaining to account for the just executed job - state.remaining-- - - // After last job - if state.remaining == 0 { - up := state.up - down := state.down - - eventext.MergeEventFields(event, mapstr.M{ - "summary": mapstr.M{ - "up": up, - "down": down, - }, - }) - resetState() - } - - return cont, jobErr - } - } -} - -type EventMatcher func(event *beat.Event) bool - -func addBrowserSummary(sf stdfields.StdMonitorFields, match EventMatcher) jobs.JobWrapper { - return func(job jobs.Job) jobs.Job { - return func(event *beat.Event) ([]jobs.Job, error) { - cont, jobErr := job(event) - - if match != nil && !match(event) { - return cont, jobErr - } - - status, err := event.GetValue("monitor.status") - if err != nil { - return nil, fmt.Errorf("could not wrap summary for '%s', no status assigned: %w", sf.ID, err) - } - - up, down := 1, 0 - if monitorstate.StateStatus(status.(string)) == monitorstate.StatusDown { - up, down = 0, 1 - } - - eventext.MergeEventFields(event, mapstr.M{ - "summary": mapstr.M{ - "up": up, - "down": down, - }, - }) - - return cont, jobErr - } - } -} - func byEventType(t string) func(event *beat.Event) bool { return func(event *beat.Event) bool { eventType, err := event.Fields.GetValue("event.type") @@ -396,3 +262,5 @@ func byEventType(t string) func(event *beat.Event) bool { return eventType == t } } + +type EventMatcher func(event *beat.Event) bool diff --git a/heartbeat/monitors/wrappers/wrappers_test.go b/heartbeat/monitors/wrappers/wrappers_test.go index ff1acd84b35..4ebc653d8fc 100644 --- a/heartbeat/monitors/wrappers/wrappers_test.go +++ b/heartbeat/monitors/wrappers/wrappers_test.go @@ -43,6 +43,9 @@ import ( "github.com/elastic/beats/v7/heartbeat/monitors/jobs" "github.com/elastic/beats/v7/heartbeat/monitors/logger" "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer/summarizertesthelper" "github.com/elastic/beats/v7/heartbeat/scheduler/schedule" "github.com/elastic/beats/v7/libbeat/beat" ) @@ -57,11 +60,12 @@ type testDef struct { } var testMonFields = stdfields.StdMonitorFields{ - ID: "myid", - Name: "myname", - Type: "mytype", - Schedule: schedule.MustParse("@every 1s"), - Timeout: 1, + ID: "myid", + Name: "myname", + Type: "mytype", + Schedule: schedule.MustParse("@every 1s"), + Timeout: 1, + MaxAttempts: 1, } var testBrowserMonFields = stdfields.StdMonitorFields{ @@ -71,6 +75,7 @@ var testBrowserMonFields = stdfields.StdMonitorFields{ } func testCommonWrap(t *testing.T, tt testDef) { + t.Helper() t.Run(tt.name, func(t *testing.T) { wrapped := WrapCommon(tt.jobs, tt.sFields, nil) @@ -82,7 +87,7 @@ func testCommonWrap(t *testing.T, tt testDef) { results, err := jobs.ExecJobsAndConts(t, wrapped) assert.NoError(t, err) - require.Equal(t, len(results), len(tt.want), "Expected test def wants to correspond exactly to number results.") + assert.Len(t, results, len(tt.want), "Expected test def wants to correspond exactly to number results.") for idx, r := range results { t.Run(fmt.Sprintf("result at index %d", idx), func(t *testing.T) { @@ -123,7 +128,7 @@ func TestSimpleJob(t *testing.T) { }), hbtestllext.MonitorTimespanValidator, stateValidator(), - summaryValidator(1, 0), + summarizertesthelper.SummaryValidator(1, 0), )}, nil, func(t *testing.T, results []*beat.Event, observed []observer.LoggedEntry) { @@ -201,7 +206,7 @@ func TestAdditionalStdFields(t *testing.T) { }), stateValidator(), hbtestllext.MonitorTimespanValidator, - summaryValidator(1, 0), + summarizertesthelper.SummaryValidator(1, 0), )}, nil, nil, @@ -239,7 +244,7 @@ func TestErrorJob(t *testing.T) { lookslike.Compose( errorJobValidator, hbtestllext.MonitorTimespanValidator, - summaryValidator(0, 1), + summarizertesthelper.SummaryValidator(0, 1), )}, nil, nil, @@ -264,7 +269,7 @@ func TestMultiJobNoConts(t *testing.T) { }), stateValidator(), hbtestllext.MonitorTimespanValidator, - summaryValidator(1, 0), + summarizertesthelper.SummaryValidator(1, 0), ) } @@ -319,17 +324,20 @@ func TestMultiJobConts(t *testing.T) { testCommonWrap(t, testDef{ "multi-job-continuations", testMonFields, - []jobs.Job{makeContJob(t, "http://foo.com"), makeContJob(t, "http://bar.com")}, + []jobs.Job{ + makeContJob(t, "http://foo.com"), + makeContJob(t, "http://bar.com"), + }, []validator.Validator{ contJobValidator("http://foo.com", "1st"), lookslike.Compose( contJobValidator("http://foo.com", "2nd"), - summaryValidator(2, 0), + summarizertesthelper.SummaryValidator(2, 0), ), contJobValidator("http://bar.com", "1st"), lookslike.Compose( contJobValidator("http://bar.com", "2nd"), - summaryValidator(2, 0), + summarizertesthelper.SummaryValidator(2, 0), ), }, nil, @@ -337,6 +345,132 @@ func TestMultiJobConts(t *testing.T) { }) } +func TestRetryMultiCont(t *testing.T) { + uniqScope := isdef.ScopedIsUnique() + + expected := []struct { + monStatus string + js summarizer.JobSummary + state monitorstate.State + }{ + { + "down", + summarizer.JobSummary{ + Status: "down", + FinalAttempt: true, + // we expect two up since this is a lightweight + // job and all events get a monitor status + // since no errors are returned that's 2 + Up: 0, + Down: 2, + Attempt: 1, + MaxAttempts: 2, + }, + monitorstate.State{ + Status: "down", + Up: 0, + Down: 2, + Checks: 2, + }, + }, + { + "down", + summarizer.JobSummary{ + Status: "down", + FinalAttempt: true, + Up: 0, + Down: 2, + Attempt: 2, + MaxAttempts: 2, + }, + monitorstate.State{ + Status: "down", + Up: 0, + Down: 2, + Checks: 2, + }, + }, + } + + jobErr := fmt.Errorf("down") + + makeContJob := func(t *testing.T, u string) jobs.Job { + expIdx := 0 + return func(event *beat.Event) ([]jobs.Job, error) { + eventext.MergeEventFields(event, mapstr.M{"cont": "1st"}) + u, err := url.Parse(u) + require.NoError(t, err) + eventext.MergeEventFields(event, mapstr.M{"url": URLFields(u)}) + + return []jobs.Job{ + func(event *beat.Event) ([]jobs.Job, error) { + eventext.MergeEventFields(event, mapstr.M{"cont": "2nd"}) + eventext.MergeEventFields(event, mapstr.M{"url": URLFields(u)}) + + expIdx++ + if expIdx >= len(expected)-1 { + expIdx = 0 + } + exp := expected[expIdx] + if exp.js.Status == "down" { + return nil, jobErr + } + + return nil, nil + }, + }, jobErr + } + } + + contJobValidator := func(u string, msg string) validator.Validator { + return lookslike.Compose( + urlValidator(t, u), + lookslike.MustCompile(map[string]interface{}{"cont": msg}), + lookslike.MustCompile(map[string]interface{}{ + "error": map[string]interface{}{ + "message": isdef.IsString, + "type": isdef.IsString, + }, + "monitor": map[string]interface{}{ + "duration.us": hbtestllext.IsInt64, + "id": uniqScope.IsUniqueTo(u), + "name": testMonFields.Name, + "type": testMonFields.Type, + "status": "down", + "check_group": uniqScope.IsUniqueTo(u), + }, + "state": isdef.Optional(hbtestllext.IsMonitorState), + }), + hbtestllext.MonitorTimespanValidator, + ) + } + + retryMonFields := testMonFields + retryMonFields.MaxAttempts = 2 + + for _, expected := range expected { + testCommonWrap(t, testDef{ + "multi-job-continuations-retry", + retryMonFields, + []jobs.Job{makeContJob(t, "http://foo.com")}, + []validator.Validator{ + contJobValidator("http://foo.com", "1st"), + lookslike.Compose( + contJobValidator("http://foo.com", "2nd"), + summarizertesthelper.SummaryValidator(expected.js.Up, expected.js.Down), + ), + contJobValidator("http://foo.com", "1st"), + lookslike.Compose( + contJobValidator("http://foo.com", "2nd"), + summarizertesthelper.SummaryValidator(expected.js.Up, expected.js.Down), + ), + }, + nil, + nil, + }) + } +} + func TestMultiJobContsCancelledEvents(t *testing.T) { uniqScope := isdef.ScopedIsUnique() @@ -387,14 +521,14 @@ func TestMultiJobContsCancelledEvents(t *testing.T) { ), lookslike.Compose( contJobValidator("http://foo.com", "2nd"), - summaryValidator(1, 0), + summarizertesthelper.SummaryValidator(1, 0), ), lookslike.Compose( contJobValidator("http://bar.com", "1st"), ), lookslike.Compose( contJobValidator("http://bar.com", "2nd"), - summaryValidator(1, 0), + summarizertesthelper.SummaryValidator(1, 0), ), }, []validator.Validator{ @@ -428,17 +562,6 @@ func stateValidator() validator.Validator { }) } -// This duplicates hbtest.SummaryChecks to avoid an import cycle. -// It could be refactored out, but it just isn't worth it. -func summaryValidator(up int, down int) validator.Validator { - return lookslike.MustCompile(map[string]interface{}{ - "summary": map[string]interface{}{ - "up": uint16(up), - "down": uint16(down), - }, - }) -} - func TestTimespan(t *testing.T) { now := time.Now() sched10s, err := schedule.Parse("@every 10s") @@ -485,10 +608,6 @@ type BrowserMonitor struct { name string checkGroup string durationMs int64 - // Used for testing legacy zip_url and local monitors - // where the top-level id/name are used to populate monitor.project - legacyProjectId string - legacyProjectName string } var inlineMonitorValues = BrowserMonitor{ @@ -504,16 +623,14 @@ func makeInlineBrowserJob(t *testing.T, u string) jobs.Job { eventext.MergeEventFields(event, mapstr.M{ "url": URLFields(parsed), "monitor": mapstr.M{ - "type": "browser", - "check_group": inlineMonitorValues.checkGroup, + "type": "browser", + "status": "up", }, }) return nil, nil } } -// Browser inline jobs monitor information should not be altered -// by the wrappers as they are handled separately in synth enricher func TestInlineBrowserJob(t *testing.T) { sFields := testBrowserMonFields sFields.ID = inlineMonitorValues.id @@ -527,13 +644,16 @@ func TestInlineBrowserJob(t *testing.T) { lookslike.Compose( urlValidator(t, "http://foo.com"), lookslike.MustCompile(map[string]interface{}{ + "state": isdef.Optional(hbtestllext.IsMonitorState), "monitor": map[string]interface{}{ "type": "browser", "id": inlineMonitorValues.id, "name": inlineMonitorValues.name, - "check_group": inlineMonitorValues.checkGroup, + "check_group": isdef.IsString, + "status": "up", }, }), + summarizertesthelper.SummaryValidator(1, 0), hbtestllext.MonitorTimespanValidator, ), ), @@ -550,15 +670,6 @@ var projectMonitorValues = BrowserMonitor{ durationMs: time.Second.Microseconds(), } -// Used for testing legacy zip_url / local monitorss -var legacyProjectMonitorValues = BrowserMonitor{ - id: "journey-1", - name: "Journey 1", - checkGroup: "acheckgroup", - legacyProjectId: "my-project", - legacyProjectName: "My Project", -} - func makeProjectBrowserJob(t *testing.T, u string, summary bool, projectErr error, bm BrowserMonitor) jobs.Job { parsed, err := url.Parse(u) require.NoError(t, err) @@ -567,11 +678,11 @@ func makeProjectBrowserJob(t *testing.T, u string, summary bool, projectErr erro eventext.MergeEventFields(event, mapstr.M{ "url": URLFields(parsed), "monitor": mapstr.M{ - "type": "browser", - "id": bm.id, - "name": bm.name, - "check_group": bm.checkGroup, - "duration": mapstr.M{"us": bm.durationMs}, + "type": "browser", + "id": bm.id, + "name": bm.name, + "status": "up", + "duration": mapstr.M{"us": bm.durationMs}, }, }) if summary { @@ -621,11 +732,12 @@ func TestProjectBrowserJob(t *testing.T) { "name": projectMonitorValues.name, "duration": mapstr.M{"us": time.Second.Microseconds()}, "origin": "my-origin", - "check_group": projectMonitorValues.checkGroup, + "check_group": isdef.IsString, "timespan": mapstr.M{ "gte": hbtestllext.IsTime, "lt": hbtestllext.IsTime, }, + "status": isdef.IsString, }, "url": URLFields(urlU), }), @@ -638,6 +750,7 @@ func TestProjectBrowserJob(t *testing.T) { []validator.Validator{ lookslike.Strict( lookslike.Compose( + summarizertesthelper.SummaryValidator(1, 0), urlValidator(t, urlStr), expectedMonFields, ))}, @@ -653,9 +766,9 @@ func TestProjectBrowserJob(t *testing.T) { lookslike.Compose( urlValidator(t, urlStr), expectedMonFields, + summarizertesthelper.SummaryValidator(1, 0), lookslike.MustCompile(map[string]interface{}{ "monitor": map[string]interface{}{"status": "up"}, - "summary": map[string]interface{}{"up": 1, "down": 0}, "event": map[string]interface{}{ "type": "heartbeat/summary", }, @@ -673,9 +786,9 @@ func TestProjectBrowserJob(t *testing.T) { lookslike.Compose( urlValidator(t, urlStr), expectedMonFields, + summarizertesthelper.SummaryValidator(0, 1), lookslike.MustCompile(map[string]interface{}{ "monitor": map[string]interface{}{"status": "down"}, - "summary": map[string]interface{}{"up": 0, "down": 1}, "error": map[string]interface{}{ "type": isdef.IsString, "message": "testerr", @@ -688,40 +801,6 @@ func TestProjectBrowserJob(t *testing.T) { nil, browserLogValidator(projectMonitorValues.id, time.Second.Microseconds(), 2, "down"), }) - - legacySFields := testBrowserMonFields - legacySFields.ID = legacyProjectMonitorValues.legacyProjectId - legacySFields.Name = legacyProjectMonitorValues.legacyProjectName - legacySFields.IsLegacyBrowserSource = true - - expectedLegacyMonFields := lookslike.MustCompile(map[string]interface{}{ - "monitor": map[string]interface{}{ - "type": "browser", - "id": legacyProjectMonitorValues.legacyProjectId, - "name": legacyProjectMonitorValues.legacyProjectName, - "duration": mapstr.M{"us": int64(0)}, - "check_group": legacyProjectMonitorValues.checkGroup, - "timespan": mapstr.M{ - "gte": hbtestllext.IsTime, - "lt": hbtestllext.IsTime, - }, - }, - "url": URLFields(urlU), - }) - - testCommonWrap(t, testDef{ - "legacy", // has no summary fields! - legacySFields, - []jobs.Job{makeProjectBrowserJob(t, urlStr, false, nil, legacyProjectMonitorValues)}, - []validator.Validator{ - lookslike.Strict( - lookslike.Compose( - urlValidator(t, urlStr), - expectedLegacyMonFields, - ))}, - nil, - nil, - }) } func TestECSErrors(t *testing.T) { diff --git a/heartbeat/scheduler/scheduler.go b/heartbeat/scheduler/scheduler.go index 87f25de1af5..eb9ba2f463c 100644 --- a/heartbeat/scheduler/scheduler.go +++ b/heartbeat/scheduler/scheduler.go @@ -161,11 +161,11 @@ func (s *Scheduler) WaitForRunOnce() { // has already stopped. var ErrAlreadyStopped = errors.New("attempted to add job to already stopped scheduler") -type AddTask func(sched Schedule, id string, entrypoint TaskFunc, jobType string, waitForPublish func()) (removeFn context.CancelFunc, err error) +type AddTask func(sched Schedule, id string, entrypoint TaskFunc, jobType string) (removeFn context.CancelFunc, err error) // Add adds the given TaskFunc to the current scheduler. Will return an error if the scheduler // is done. -func (s *Scheduler) Add(sched Schedule, id string, entrypoint TaskFunc, jobType string, waitForPublish func()) (removeFn context.CancelFunc, err error) { +func (s *Scheduler) Add(sched Schedule, id string, entrypoint TaskFunc, jobType string) (removeFn context.CancelFunc, err error) { if errors.Is(s.ctx.Err(), context.Canceled) { return nil, ErrAlreadyStopped } @@ -193,7 +193,6 @@ func (s *Scheduler) Add(sched Schedule, id string, entrypoint TaskFunc, jobType s.stats.activeJobs.Dec() if s.runOnce { - waitForPublish() s.runOnceWg.Done() } else { // Schedule the next run diff --git a/heartbeat/scheduler/scheduler_test.go b/heartbeat/scheduler/scheduler_test.go index 867a50c2962..a133f8cd8e4 100644 --- a/heartbeat/scheduler/scheduler_test.go +++ b/heartbeat/scheduler/scheduler_test.go @@ -93,7 +93,7 @@ func TestSchedulerRun(t *testing.T) { return nil } return []TaskFunc{cont} - }), "http", nil) + }), "http") require.NoError(t, err) removedEvents := uint32(1) @@ -109,7 +109,7 @@ func TestSchedulerRun(t *testing.T) { } // Attempt to execute this twice to see if remove() had any effect removeMtx.Lock() - remove, err = s.Add(testSchedule{}, "removed", testTaskTimes(removedEvents+1, testFn), "http", nil) + remove, err = s.Add(testSchedule{}, "removed", testTaskTimes(removedEvents+1, testFn), "http") require.NoError(t, err) require.NotNil(t, remove) removeMtx.Unlock() @@ -122,7 +122,7 @@ func TestSchedulerRun(t *testing.T) { return nil } return []TaskFunc{cont} - }), "http", nil) + }), "http") require.NoError(t, err) received := make([]string, 0) @@ -160,7 +160,6 @@ func TestScheduler_WaitForRunOnce(t *testing.T) { defer s.Stop() executed := new(uint32) - waits := new(uint32) _, err := s.Add(testSchedule{0}, "runOnce", func(_ context.Context) []TaskFunc { cont := func(_ context.Context) []TaskFunc { @@ -170,12 +169,11 @@ func TestScheduler_WaitForRunOnce(t *testing.T) { return nil } return []TaskFunc{cont} - }, "http", func() { atomic.AddUint32(waits, 1) }) + }, "http") require.NoError(t, err) s.WaitForRunOnce() require.Equal(t, uint32(1), atomic.LoadUint32(executed)) - require.Equal(t, uint32(1), atomic.LoadUint32(waits)) } func TestScheduler_Stop(t *testing.T) { @@ -188,7 +186,7 @@ func TestScheduler_Stop(t *testing.T) { _, err := s.Add(testSchedule{}, "testPostStop", testTaskTimes(1, func(_ context.Context) []TaskFunc { executed <- struct{}{} return nil - }), "http", nil) + }), "http") assert.Equal(t, ErrAlreadyStopped, err) } @@ -287,7 +285,7 @@ func BenchmarkScheduler(b *testing.B) { _, err := s.Add(sched, "testPostStop", func(_ context.Context) []TaskFunc { executed <- struct{}{} return nil - }, "http", nil) + }, "http") assert.NoError(b, err) } diff --git a/heartbeat/tracer/tracer_test.go b/heartbeat/tracer/tracer_test.go index fc7d2276248..87953d5de5a 100644 --- a/heartbeat/tracer/tracer_test.go +++ b/heartbeat/tracer/tracer_test.go @@ -123,7 +123,8 @@ func listenTilClosed(t *testing.T, sockPath string) []string { conn, err := listener.Accept() require.NoError(t, err) - var received []string + // no need to pre-allocate, but it seems to make the linter happy + received := make([]string, 0, 10) scanner := bufio.NewScanner(conn) for scanner.Scan() { received = append(received, scanner.Text()) diff --git a/libbeat/api/make_listener_posix.go b/libbeat/api/make_listener_posix.go index f2a52da3dc7..5bfd17fa0b8 100644 --- a/libbeat/api/make_listener_posix.go +++ b/libbeat/api/make_listener_posix.go @@ -20,12 +20,11 @@ package api import ( + "errors" "fmt" "net" "os" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/api/npipe" ) @@ -53,10 +52,9 @@ func makeListener(cfg Config) (net.Listener, error) { if network == "unix" { if _, err := os.Stat(path); !os.IsNotExist(err) { if err := os.Remove(path); err != nil { - return nil, errors.Wrapf( - err, - "cannot remove existing unix socket file at location %s", - path, + return nil, fmt.Errorf( + "cannot remove existing unix socket file at location %s: %w", + path, err, ) } } @@ -70,11 +68,11 @@ func makeListener(cfg Config) (net.Listener, error) { // Ensure file mode if network == "unix" { if err := os.Chmod(path, socketFileMode); err != nil { - return nil, errors.Wrapf( - err, - "could not set mode %d for unix socket file at location %s", + return nil, fmt.Errorf( + "could not set mode %d for unix socket file at location %s: %w", socketFileMode, path, + err, ) } } diff --git a/libbeat/api/make_listener_windows.go b/libbeat/api/make_listener_windows.go index 4f72fcfec2d..3fb5a301da0 100644 --- a/libbeat/api/make_listener_windows.go +++ b/libbeat/api/make_listener_windows.go @@ -20,11 +20,10 @@ package api import ( + "errors" "fmt" "net" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/api/npipe" ) @@ -40,7 +39,7 @@ func makeListener(cfg Config) (net.Listener, error) { if len(cfg.SecurityDescriptor) == 0 { sd, err = npipe.DefaultSD(cfg.User) if err != nil { - return nil, errors.Wrap(err, "cannot generate security descriptor for the named pipe") + return nil, fmt.Errorf("cannot generate security descriptor for the named pipe: %w", err) } } else { sd = cfg.SecurityDescriptor diff --git a/libbeat/beat/event.go b/libbeat/beat/event.go index 28549001c56..54fc3e27cc3 100644 --- a/libbeat/beat/event.go +++ b/libbeat/beat/event.go @@ -110,45 +110,62 @@ func (e *Event) deepUpdate(d mapstr.M, overwrite bool) { if len(d) == 0 { return } - fieldsUpdate := d.Clone() // so we can delete redundant keys - var metaUpdate mapstr.M + // It's supported to update the timestamp using this function. + // However, we must handle it separately since it's a separate field of the event. + timestampValue, timestampExists := d[timestampFieldKey] + if timestampExists { + if overwrite { + _ = e.setTimestamp(timestampValue) + } - for fieldKey, value := range d { - switch fieldKey { + // Temporary delete it from the update map, + // so we can do `e.Fields.DeepUpdate(d)` or + // `e.Fields.DeepUpdateNoOverwrite(d)` later + delete(d, timestampFieldKey) + } - // one of the updates is the timestamp which is not a part of the event fields - case timestampFieldKey: - if overwrite { - _ = e.setTimestamp(value) - } - delete(fieldsUpdate, fieldKey) + // It's supported to update the metadata using this function. + // However, we must handle it separately since it's a separate field of the event. + metaValue, metaExists := d[metadataFieldKey] + if metaExists { + var metaUpdate mapstr.M - // some updates are addressed for the metadata not the fields - case metadataFieldKey: - switch meta := value.(type) { - case mapstr.M: - metaUpdate = meta - case map[string]interface{}: - metaUpdate = mapstr.M(meta) - } + switch meta := metaValue.(type) { + case mapstr.M: + metaUpdate = meta + case map[string]interface{}: + metaUpdate = mapstr.M(meta) + } - delete(fieldsUpdate, fieldKey) + if metaUpdate != nil { + if e.Meta == nil { + e.Meta = mapstr.M{} + } + if overwrite { + e.Meta.DeepUpdate(metaUpdate) + } else { + e.Meta.DeepUpdateNoOverwrite(metaUpdate) + } } + + // Temporary delete it from the update map, + // so we can do `e.Fields.DeepUpdate(d)` or + // `e.Fields.DeepUpdateNoOverwrite(d)` later + delete(d, metadataFieldKey) } - if metaUpdate != nil { - if e.Meta == nil { - e.Meta = mapstr.M{} + // At the end we revert all changes we made to the update map + defer func() { + if timestampExists { + d[timestampFieldKey] = timestampValue } - if overwrite { - e.Meta.DeepUpdate(metaUpdate) - } else { - e.Meta.DeepUpdateNoOverwrite(metaUpdate) + if metaExists { + d[metadataFieldKey] = metaValue } - } + }() - if len(fieldsUpdate) == 0 { + if len(d) == 0 { return } @@ -157,9 +174,9 @@ func (e *Event) deepUpdate(d mapstr.M, overwrite bool) { } if overwrite { - e.Fields.DeepUpdate(fieldsUpdate) + e.Fields.DeepUpdate(d) } else { - e.Fields.DeepUpdateNoOverwrite(fieldsUpdate) + e.Fields.DeepUpdateNoOverwrite(d) } } @@ -228,9 +245,18 @@ func metadataKey(key string) (string, bool) { return "", false } -// SetErrorWithOption sets jsonErr value in the event fields according to addErrKey value. -func (e *Event) SetErrorWithOption(jsonErr mapstr.M, addErrKey bool) { +// SetErrorWithOption sets the event error field with the message when the addErrKey is set to true. +// If you want to include the data and field you can pass them as parameters and will be appended into the +// error as fields with the corresponding name. +func (e *Event) SetErrorWithOption(message string, addErrKey bool, data string, field string) { if addErrKey { - e.Fields["error"] = jsonErr + errorField := mapstr.M{"message": message, "type": "json"} + if data != "" { + errorField["data"] = data + } + if field != "" { + errorField["field"] = field + } + e.Fields["error"] = errorField } } diff --git a/libbeat/beat/event_test.go b/libbeat/beat/event_test.go index 5575f495106..cd165a3c459 100644 --- a/libbeat/beat/event_test.go +++ b/libbeat/beat/event_test.go @@ -18,6 +18,7 @@ package beat import ( + "crypto/rand" "testing" "time" @@ -26,11 +27,59 @@ import ( "github.com/elastic/elastic-agent-libs/mapstr" ) +const ( + propSize = 1024 * 2014 * 10 +) + +var largeProp string + +func init() { + b := make([]byte, propSize) + _, _ = rand.Read(b) + largeProp = string(b) +} + func newEmptyEvent() *Event { return &Event{Fields: mapstr.M{}} } -func TestEventPutGetTimestamp(t *testing.T) { +func newEvent(e mapstr.M) *Event { + n := &mapstr.M{ + "Fields": mapstr.M{ + "large_prop": largeProp, + }, + } + n.DeepUpdate(e) + var ts time.Time + var meta mapstr.M + var fields mapstr.M + var private mapstr.M + + v, ex := (*n)["Timestamp"] + if ex { + ts = v.(time.Time) + } + v, ex = (*n)["Meta"] + if ex { + meta = v.(mapstr.M) + } + v, ex = (*n)["Fields"] + if ex { + fields = v.(mapstr.M) + } + v, ex = (*n)["Private"] + if ex { + private = v.(mapstr.M) + } + return &Event{ + Timestamp: ts, + Meta: meta, + Fields: fields, + Private: private, + } +} + +func BenchmarkTestEventPutGetTimestamp(b *testing.B) { evt := newEmptyEvent() ts := time.Now() @@ -38,17 +87,17 @@ func TestEventPutGetTimestamp(t *testing.T) { v, err := evt.GetValue("@timestamp") if err != nil { - t.Fatal(err) + b.Fatal(err) } - assert.Equal(t, ts, v) - assert.Equal(t, ts, evt.Timestamp) + assert.Equal(b, ts, v) + assert.Equal(b, ts, evt.Timestamp) // The @timestamp is not written into Fields. - assert.Nil(t, evt.Fields["@timestamp"]) + assert.Nil(b, evt.Fields["@timestamp"]) } -func TestDeepUpdate(t *testing.T) { +func BenchmarkTestDeepUpdate(b *testing.B) { ts := time.Now() cases := []struct { @@ -60,37 +109,43 @@ func TestDeepUpdate(t *testing.T) { }{ { name: "does nothing if no update", - event: &Event{}, + event: newEvent(mapstr.M{}), update: mapstr.M{}, - expected: &Event{}, + expected: newEvent(mapstr.M{}), }, { name: "updates timestamp", - event: &Event{}, + event: newEvent(mapstr.M{}), update: mapstr.M{ timestampFieldKey: ts, }, overwrite: true, expected: &Event{ Timestamp: ts, + Fields: mapstr.M{ + "large_prop": largeProp, + }, }, }, { name: "does not overwrite timestamp", - event: &Event{ - Timestamp: ts, - }, + event: newEvent(mapstr.M{ + "Timestamp": ts, + }), update: mapstr.M{ timestampFieldKey: time.Now().Add(time.Hour), }, overwrite: false, expected: &Event{ Timestamp: ts, + Fields: mapstr.M{ + "large_prop": largeProp, + }, }, }, { name: "initializes metadata if nil", - event: &Event{}, + event: newEvent(mapstr.M{}), update: mapstr.M{ metadataFieldKey: mapstr.M{ "first": "new", @@ -102,15 +157,18 @@ func TestDeepUpdate(t *testing.T) { "first": "new", "second": 42, }, + Fields: mapstr.M{ + "large_prop": largeProp, + }, }, }, { name: "updates metadata but does not overwrite", - event: &Event{ - Meta: mapstr.M{ + event: newEvent(mapstr.M{ + "Meta": mapstr.M{ "first": "initial", }, - }, + }), update: mapstr.M{ metadataFieldKey: mapstr.M{ "first": "new", @@ -123,15 +181,18 @@ func TestDeepUpdate(t *testing.T) { "first": "initial", "second": 42, }, + Fields: mapstr.M{ + "large_prop": largeProp, + }, }, }, { name: "updates metadata and overwrites", - event: &Event{ - Meta: mapstr.M{ + event: newEvent(mapstr.M{ + "Meta": mapstr.M{ "first": "initial", }, - }, + }), update: mapstr.M{ metadataFieldKey: mapstr.M{ "first": "new", @@ -144,15 +205,18 @@ func TestDeepUpdate(t *testing.T) { "first": "new", "second": 42, }, + Fields: mapstr.M{ + "large_prop": largeProp, + }, }, }, { name: "updates fields but does not overwrite", - event: &Event{ - Fields: mapstr.M{ + event: newEvent(mapstr.M{ + "Fields": mapstr.M{ "first": "initial", }, - }, + }), update: mapstr.M{ "first": "new", "second": 42, @@ -160,18 +224,19 @@ func TestDeepUpdate(t *testing.T) { overwrite: false, expected: &Event{ Fields: mapstr.M{ - "first": "initial", - "second": 42, + "first": "initial", + "second": 42, + "large_prop": largeProp, }, }, }, { name: "updates metadata and overwrites", - event: &Event{ - Fields: mapstr.M{ + event: newEvent(mapstr.M{ + "Fields": mapstr.M{ "first": "initial", }, - }, + }), update: mapstr.M{ "first": "new", "second": 42, @@ -179,123 +244,125 @@ func TestDeepUpdate(t *testing.T) { overwrite: true, expected: &Event{ Fields: mapstr.M{ - "first": "new", - "second": 42, + "first": "new", + "second": 42, + "large_prop": largeProp, }, }, }, { name: "initializes fields if nil", - event: &Event{}, + event: newEvent(mapstr.M{}), update: mapstr.M{ "first": "new", "second": 42, }, expected: &Event{ Fields: mapstr.M{ - "first": "new", - "second": 42, + "first": "new", + "second": 42, + "large_prop": largeProp, }, }, }, } for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { + b.Run(tc.name, func(b *testing.B) { tc.event.deepUpdate(tc.update, tc.overwrite) - assert.Equal(t, tc.expected.Timestamp, tc.event.Timestamp) - assert.Equal(t, tc.expected.Fields, tc.event.Fields) - assert.Equal(t, tc.expected.Meta, tc.event.Meta) + assert.Equal(b, tc.expected.Timestamp, tc.event.Timestamp) + assert.Equal(b, tc.expected.Fields, tc.event.Fields) + assert.Equal(b, tc.expected.Meta, tc.event.Meta) }) } } -func TestEventMetadata(t *testing.T) { +func BenchmarkTestEventMetadata(b *testing.B) { const id = "123" newMeta := func() mapstr.M { return mapstr.M{"_id": id} } - t.Run("put", func(t *testing.T) { + b.Run("put", func(b *testing.B) { evt := newEmptyEvent() meta := newMeta() evt.PutValue("@metadata", meta) - assert.Equal(t, meta, evt.Meta) - assert.Empty(t, evt.Fields) + assert.Equal(b, meta, evt.Meta) + assert.Empty(b, evt.Fields) }) - t.Run("get", func(t *testing.T) { + b.Run("get", func(b *testing.B) { evt := newEmptyEvent() evt.Meta = newMeta() meta, err := evt.GetValue("@metadata") - assert.NoError(t, err) - assert.Equal(t, evt.Meta, meta) + assert.NoError(b, err) + assert.Equal(b, evt.Meta, meta) }) - t.Run("put sub-key", func(t *testing.T) { + b.Run("put sub-key", func(b *testing.B) { evt := newEmptyEvent() evt.PutValue("@metadata._id", id) - assert.Equal(t, newMeta(), evt.Meta) - assert.Empty(t, evt.Fields) + assert.Equal(b, newMeta(), evt.Meta) + assert.Empty(b, evt.Fields) }) - t.Run("get sub-key", func(t *testing.T) { + b.Run("get sub-key", func(b *testing.B) { evt := newEmptyEvent() evt.Meta = newMeta() v, err := evt.GetValue("@metadata._id") - assert.NoError(t, err) - assert.Equal(t, id, v) + assert.NoError(b, err) + assert.Equal(b, id, v) }) - t.Run("delete", func(t *testing.T) { + b.Run("delete", func(b *testing.B) { evt := newEmptyEvent() evt.Meta = newMeta() err := evt.Delete("@metadata") - assert.NoError(t, err) - assert.Nil(t, evt.Meta) + assert.NoError(b, err) + assert.Nil(b, evt.Meta) }) - t.Run("delete sub-key", func(t *testing.T) { + b.Run("delete sub-key", func(b *testing.B) { evt := newEmptyEvent() evt.Meta = newMeta() err := evt.Delete("@metadata._id") - assert.NoError(t, err) - assert.Empty(t, evt.Meta) + assert.NoError(b, err) + assert.Empty(b, evt.Meta) }) - t.Run("setID", func(t *testing.T) { + b.Run("setID", func(b *testing.B) { evt := newEmptyEvent() evt.SetID(id) - assert.Equal(t, newMeta(), evt.Meta) + assert.Equal(b, newMeta(), evt.Meta) }) - t.Run("put non-metadata", func(t *testing.T) { + b.Run("put non-metadata", func(b *testing.B) { evt := newEmptyEvent() evt.PutValue("@metadataSpecial", id) - assert.Equal(t, mapstr.M{"@metadataSpecial": id}, evt.Fields) + assert.Equal(b, mapstr.M{"@metadataSpecial": id}, evt.Fields) }) - t.Run("delete non-metadata", func(t *testing.T) { + b.Run("delete non-metadata", func(b *testing.B) { evt := newEmptyEvent() evt.Meta = newMeta() err := evt.Delete("@metadataSpecial") - assert.Error(t, err) - assert.Equal(t, newMeta(), evt.Meta) + assert.Error(b, err) + assert.Equal(b, newMeta(), evt.Meta) }) } diff --git a/libbeat/cfgfile/list.go b/libbeat/cfgfile/list.go index e329a19411a..1f16e23ab4f 100644 --- a/libbeat/cfgfile/list.go +++ b/libbeat/cfgfile/list.go @@ -137,6 +137,16 @@ func (r *RunnerList) Reload(configs []*reload.ConfigWithMeta) error { } else { r.logger.Errorf("Error creating runner from config: %s", err) } + + // If InputUnitID is not empty, then we're running under Elastic-Agent + // and we need to report the errors per unit. + if config.InputUnitID != "" { + err = UnitError{ + Err: err, + UnitID: config.InputUnitID, + } + } + errs = append(errs, fmt.Errorf("Error creating runner from config: %w", err)) continue } @@ -226,3 +236,16 @@ func createRunner(factory RunnerFactory, pipeline beat.PipelineConnector, cfg *r c, _ := config.NewConfigFrom(cfg.Config) return factory.Create(pipetool.WithDynamicFields(pipeline, cfg.Meta), c) } + +type UnitError struct { + UnitID string + Err error +} + +func (u UnitError) Error() string { + return u.Err.Error() +} + +func (u UnitError) Unwrap() error { + return u.Err +} diff --git a/libbeat/cmd/instance/beat.go b/libbeat/cmd/instance/beat.go index 0f1d44a777c..b881fc4bdee 100644 --- a/libbeat/cmd/instance/beat.go +++ b/libbeat/cmd/instance/beat.go @@ -201,7 +201,6 @@ func initRand() { // instance. // XXX Move this as a *Beat method? func Run(settings Settings, bt beat.Creator) error { - return handleError(func() error { defer func() { if r := recover(); r != nil { @@ -502,7 +501,7 @@ func (b *Beat) launch(settings Settings, bt beat.Creator) error { } ctx, cancel := context.WithCancel(context.Background()) - var stopBeat = func() { + stopBeat := func() { b.Instrumentation.Tracer().Close() beater.Stop() } @@ -615,8 +614,9 @@ type SetupSettings struct { // Deprecated: use IndexManagementKey instead Template bool // Deprecated: use IndexManagementKey instead - ILMPolicy bool - EnableAllFilesets bool + ILMPolicy bool + EnableAllFilesets bool + ForceEnableModuleFilesets bool } // Setup registers ES index template, kibana dashboards, ml jobs and pipelines. @@ -628,16 +628,19 @@ func (b *Beat) Setup(settings Settings, bt beat.Creator, setup SetupSettings) er if err != nil { return err } - // Tell the beat that we're in the setup command b.InSetupCmd = true + if setup.ForceEnableModuleFilesets { + if err := b.Beat.BeatConfig.SetBool("config.modules.force_enable_module_filesets", -1, true); err != nil { + return fmt.Errorf("error setting force_enable_module_filesets config option %w", err) + } + } // Create beater to give it the opportunity to set loading callbacks _, err = b.createBeater(bt) if err != nil { return err } - if setup.IndexManagement || setup.Template || setup.ILMPolicy { outCfg := b.Config.Output if !isElasticsearchOutput(outCfg.Name()) { @@ -648,7 +651,7 @@ func (b *Beat) Setup(settings Settings, bt beat.Creator, setup SetupSettings) er return err } - var loadTemplate, loadILM = idxmgmt.LoadModeUnset, idxmgmt.LoadModeUnset + loadTemplate, loadILM := idxmgmt.LoadModeUnset, idxmgmt.LoadModeUnset if setup.IndexManagement || setup.Template { loadTemplate = idxmgmt.LoadModeOverwrite } @@ -687,6 +690,7 @@ func (b *Beat) Setup(settings Settings, bt beat.Creator, setup SetupSettings) er return fmt.Errorf("error setting enable_all_filesets config option %w", err) } } + esConfig := b.Config.Output.Config() err = b.OverwritePipelinesCallback(esConfig) if err != nil { @@ -900,7 +904,7 @@ func (b *Beat) loadMeta(metaPath string) error { // write temporary file first tempFile := metaPath + ".new" - f, err = os.OpenFile(tempFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + f, err = os.OpenFile(tempFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600) if err != nil { return fmt.Errorf("failed to create Beat meta file: %w", err) } diff --git a/libbeat/cmd/setup.go b/libbeat/cmd/setup.go index f1d2432ead9..49a2cb5cfbe 100644 --- a/libbeat/cmd/setup.go +++ b/libbeat/cmd/setup.go @@ -28,14 +28,18 @@ import ( ) const ( - //DashboardKey used for registering dashboards in setup cmd + // DashboardKey used for registering dashboards in setup cmd DashboardKey = "dashboards" - //PipelineKey used for registering pipelines in setup cmd + // PipelineKey used for registering pipelines in setup cmd PipelineKey = "pipelines" - //IndexManagementKey used for loading all components related to ES index management in setup cmd + // IndexManagementKey used for loading all components related to ES index management in setup cmd IndexManagementKey = "index-management" - //EnableAllFilesetsKey enables all modules and filesets regardless of config + // EnableAllFilesetsKey enables all modules and filesets regardless of config EnableAllFilesetsKey = "enable-all-filesets" + // ForceEnableModuleFilesets enables all the filesets contained + // in the modules that have been explicitly enabled. The + // requires "modules" to be used. + ForceEnableModuleFilesets = "force-enable-module-filesets" ) func genSetupCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Command { @@ -56,32 +60,33 @@ func genSetupCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Co os.Exit(1) } - var registeredFlags = map[string]bool{ - DashboardKey: false, - PipelineKey: false, - IndexManagementKey: false, - EnableAllFilesetsKey: false, + registeredFlags := map[string]bool{ + DashboardKey: false, + PipelineKey: false, + IndexManagementKey: false, + EnableAllFilesetsKey: false, + ForceEnableModuleFilesets: false, } - var setupAll = true + setupAll := true // create collection with registered flags and their values for k := range registeredFlags { val, err := cmd.Flags().GetBool(k) - //if flag is not registered, an error is thrown + // if flag is not registered, an error is thrown if err != nil { delete(registeredFlags, k) continue } registeredFlags[k] = val - //if any flag is set via cmd line then only this flag should be run + // if any flag is set via cmd line then only this flag should be run if val { setupAll = false } } - //create the struct to pass on - var s = instance.SetupSettings{} + // create the struct to pass on + s := instance.SetupSettings{} for k, v := range registeredFlags { if setupAll || v { switch k { @@ -93,6 +98,8 @@ func genSetupCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Co s.IndexManagement = true case EnableAllFilesetsKey: s.EnableAllFilesets = true + case ForceEnableModuleFilesets: + s.ForceEnableModuleFilesets = true } } } @@ -108,6 +115,7 @@ func genSetupCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Co setup.Flags().Bool(IndexManagementKey, false, "Setup all components related to Elasticsearch index management, including template, ilm policy and rollover alias") setup.Flags().Bool("enable-all-filesets", false, "Behave as if all modules and filesets had been enabled") + setup.Flags().Bool("force-enable-module-filesets", false, "Behave as if all filesets, within enabled modules, are enabled") return &setup } diff --git a/libbeat/common/jsontransform/expand.go b/libbeat/common/jsontransform/expand.go index c026343a3b0..be07c420074 100644 --- a/libbeat/common/jsontransform/expand.go +++ b/libbeat/common/jsontransform/expand.go @@ -34,7 +34,7 @@ import ( func ExpandFields(logger *logp.Logger, event *beat.Event, m mapstr.M, addErrorKey bool) { if err := expandFields(m); err != nil { logger.Errorf("JSON: failed to expand fields: %s", err) - event.SetErrorWithOption(createJSONError(err.Error()), addErrorKey) + event.SetErrorWithOption(err.Error(), addErrorKey, "", "") } } diff --git a/libbeat/common/jsontransform/jsonhelper.go b/libbeat/common/jsontransform/jsonhelper.go index 87c3c1a1eb2..15d70ae929a 100644 --- a/libbeat/common/jsontransform/jsonhelper.go +++ b/libbeat/common/jsontransform/jsonhelper.go @@ -23,7 +23,6 @@ import ( "time" "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -39,11 +38,9 @@ var ( // WriteJSONKeys writes the json keys to the given event based on the overwriteKeys option and the addErrKey func WriteJSONKeys(event *beat.Event, keys map[string]interface{}, expandKeys, overwriteKeys, addErrKey bool) { - logger := logp.NewLogger("jsonhelper") if expandKeys { if err := expandFields(keys); err != nil { - logger.Errorf("JSON: failed to expand fields: %s", err) - event.SetErrorWithOption(createJSONError(err.Error()), addErrKey) + event.SetErrorWithOption(err.Error(), addErrKey, "", "") return } } @@ -62,16 +59,14 @@ func WriteJSONKeys(event *beat.Event, keys map[string]interface{}, expandKeys, o case "@timestamp": vstr, ok := v.(string) if !ok { - logger.Error("JSON: Won't overwrite @timestamp because value is not string") - event.SetErrorWithOption(createJSONError("@timestamp not overwritten (not string)"), addErrKey) + event.SetErrorWithOption("@timestamp not overwritten (not string)", addErrKey, "", "") continue } // @timestamp must be of format RFC3339 or ISO8601 ts, err := parseTimestamp(vstr) if err != nil { - logger.Errorf("JSON: Won't overwrite @timestamp because of parsing error: %v", err) - event.SetErrorWithOption(createJSONError(fmt.Sprintf("@timestamp not overwritten (parse error on %s)", vstr)), addErrKey) + event.SetErrorWithOption(fmt.Sprintf("@timestamp not overwritten (parse error on %s)", vstr), addErrKey, "", "") continue } event.Timestamp = ts @@ -93,19 +88,17 @@ func WriteJSONKeys(event *beat.Event, keys map[string]interface{}, expandKeys, o event.Meta.DeepUpdate(mapstr.M(m)) default: - event.SetErrorWithOption(createJSONError("failed to update @metadata"), addErrKey) + event.SetErrorWithOption("failed to update @metadata", addErrKey, "", "") } case "type": vstr, ok := v.(string) if !ok { - logger.Error("JSON: Won't overwrite type because value is not string") - event.SetErrorWithOption(createJSONError("type not overwritten (not string)"), addErrKey) + event.SetErrorWithOption("type not overwritten (not string)", addErrKey, "", "") continue } if len(vstr) == 0 || vstr[0] == '_' { - logger.Error("JSON: Won't overwrite type because value is empty or starts with an underscore") - event.SetErrorWithOption(createJSONError(fmt.Sprintf("type not overwritten (invalid value [%s])", vstr)), addErrKey) + event.SetErrorWithOption(fmt.Sprintf("type not overwritten (invalid value [%s])", vstr), addErrKey, "", "") continue } event.Fields[k] = vstr @@ -118,10 +111,6 @@ func WriteJSONKeys(event *beat.Event, keys map[string]interface{}, expandKeys, o event.Fields.DeepUpdate(keys) } -func createJSONError(message string) mapstr.M { - return mapstr.M{"message": message, "type": "json"} -} - func removeKeys(keys map[string]interface{}, names ...string) { for _, name := range names { delete(keys, name) diff --git a/libbeat/common/jsontransform/jsonhelper_test.go b/libbeat/common/jsontransform/jsonhelper_test.go index bed1de4c0fd..c8791b3c610 100644 --- a/libbeat/common/jsontransform/jsonhelper_test.go +++ b/libbeat/common/jsontransform/jsonhelper_test.go @@ -53,6 +53,7 @@ func TestWriteJSONKeys(t *testing.T) { expectedMetadata mapstr.M expectedTimestamp time.Time expectedFields mapstr.M + addErrorKeys bool }{ "overwrite_true": { overwriteKeys: true, @@ -192,6 +193,32 @@ func TestWriteJSONKeys(t *testing.T) { }, }, }, + // This benchmark makes sure that when an error is found in the event, the proper fields are defined and measured + "error_case": { + expandKeys: false, + overwriteKeys: true, + keys: map[string]interface{}{ + "top_b": map[string]interface{}{ + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + "@timestamp": map[string]interface{}{"when": "now", "another": "yesterday"}, + }, + expectedMetadata: eventMetadata.Clone(), + expectedTimestamp: eventTimestamp, + expectedFields: mapstr.M{ + "error": mapstr.M{ + "message": "@timestamp not overwritten (not string)", + "type": "json", + }, + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "dee", + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + }, + addErrorKeys: true, + }, } for name, test := range tests { @@ -202,10 +229,207 @@ func TestWriteJSONKeys(t *testing.T) { Fields: eventFields.Clone(), } - WriteJSONKeys(event, test.keys, test.expandKeys, test.overwriteKeys, false) + WriteJSONKeys(event, test.keys, test.expandKeys, test.overwriteKeys, test.addErrorKeys) require.Equal(t, test.expectedMetadata, event.Meta) require.Equal(t, test.expectedTimestamp.UnixNano(), event.Timestamp.UnixNano()) require.Equal(t, test.expectedFields, event.Fields) }) } } + +func BenchmarkWriteJSONKeys(b *testing.B) { + now := time.Now() + now = now.Round(time.Second) + + eventTimestamp := time.Date(2020, 01, 01, 01, 01, 00, 0, time.UTC) + eventMetadata := mapstr.M{ + "foo": "bar", + "baz": mapstr.M{ + "qux": 17, + }, + } + eventFields := mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "dee", + }, + } + + tests := map[string]struct { + keys map[string]interface{} + expandKeys bool + overwriteKeys bool + expectedFields mapstr.M + addErrorKeys bool + }{ + "overwrite_true": { + overwriteKeys: true, + keys: map[string]interface{}{ + "@metadata": map[string]interface{}{ + "foo": "NEW_bar", + "baz": map[string]interface{}{ + "qux": "NEW_qux", + "durrr": "COMPLETELY_NEW", + }, + }, + "@timestamp": now.Format(time.RFC3339), + "top_b": map[string]interface{}{ + "inner_d": "NEW_dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + expectedFields: mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "NEW_dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + }, + "overwrite_true_ISO8601": { + overwriteKeys: true, + keys: map[string]interface{}{ + "@metadata": map[string]interface{}{ + "foo": "NEW_bar", + "baz": map[string]interface{}{ + "qux": "NEW_qux", + "durrr": "COMPLETELY_NEW", + }, + }, + "@timestamp": now.Format(iso8601), + "top_b": map[string]interface{}{ + "inner_d": "NEW_dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + expectedFields: mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "NEW_dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + }, + "overwrite_false": { + overwriteKeys: false, + keys: map[string]interface{}{ + "@metadata": map[string]interface{}{ + "foo": "NEW_bar", + "baz": map[string]interface{}{ + "qux": "NEW_qux", + "durrr": "COMPLETELY_NEW", + }, + }, + "@timestamp": now.Format(time.RFC3339), + "top_b": map[string]interface{}{ + "inner_d": "NEW_dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + expectedFields: mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "dee", + "inner_e": "COMPLETELY_NEW_e", + }, + "top_c": "COMPLETELY_NEW_c", + }, + }, + "expand_true": { + expandKeys: true, + overwriteKeys: true, + keys: map[string]interface{}{ + "top_b": map[string]interface{}{ + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + }, + expectedFields: mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": mapstr.M{ + "inner_e": "COMPLETELY_NEW_e", + }, + }, + }, + }, + "expand_false": { + expandKeys: false, + overwriteKeys: true, + keys: map[string]interface{}{ + "top_b": map[string]interface{}{ + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + }, + expectedFields: mapstr.M{ + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "dee", + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + }, + }, + // This benchmark makes sure that when an error is found in the event, the proper fields are defined and measured + "error_case": { + expandKeys: false, + overwriteKeys: true, + keys: map[string]interface{}{ + "top_b": map[string]interface{}{ + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + "@timestamp": "invalid string", + }, + expectedFields: mapstr.M{ + "error": mapstr.M{ + "message": "@timestamp not overwritten (parse error on invalid string)", + "type": "json", + }, + "top_a": 23, + "top_b": mapstr.M{ + "inner_c": "see", + "inner_d": "dee", + "inner_d.inner_e": "COMPLETELY_NEW_e", + }, + }, + addErrorKeys: true, + }, + } + + for name, test := range tests { + b.Run(name, func(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + b.StopTimer() + event := &beat.Event{ + Timestamp: eventTimestamp, + Meta: eventMetadata.Clone(), + Fields: eventFields.Clone(), + } + // The WriteJSONKeys will override the keys, so we need to clone it. + keys := clone(test.keys) + b.StartTimer() + WriteJSONKeys(event, keys, test.expandKeys, test.overwriteKeys, test.addErrorKeys) + require.Equal(b, test.expectedFields, event.Fields) + } + }) + } +} + +func clone(a map[string]interface{}) map[string]interface{} { + newMap := make(map[string]interface{}) + for k, v := range a { + newMap[k] = v + } + return newMap +} diff --git a/libbeat/common/reload/reload.go b/libbeat/common/reload/reload.go index 21012ad1090..279b7fd26b0 100644 --- a/libbeat/common/reload/reload.go +++ b/libbeat/common/reload/reload.go @@ -44,6 +44,9 @@ type ConfigWithMeta struct { // DiagCallback is a diagnostic handler associated with the underlying unit that maps to the config DiagCallback DiagnosticHandler + + // InputUnitID is the unit's ID that generated this ConfigWithMeta + InputUnitID string } // ReloadableList provides a method to reload the configuration of a list of entities diff --git a/libbeat/common/streambuf/streambuf.go b/libbeat/common/streambuf/streambuf.go index f28c2157792..48bbabae0d5 100644 --- a/libbeat/common/streambuf/streambuf.go +++ b/libbeat/common/streambuf/streambuf.go @@ -155,7 +155,9 @@ func (b *Buffer) doAppend(data []byte, retainable bool, newCap int) error { b.data = tmp } } - b.data = append(b.data, data...) + tBuf := bytes.NewBuffer(b.data) + tBuf.Write(data) + b.data = tBuf.Bytes() } b.available += len(data) diff --git a/libbeat/docs/command-reference.asciidoc b/libbeat/docs/command-reference.asciidoc index d3d88a57ab8..a4246e8c5e3 100644 --- a/libbeat/docs/command-reference.asciidoc +++ b/libbeat/docs/command-reference.asciidoc @@ -842,6 +842,12 @@ would have to list every module with the <> command and enable every fileset within the module with a `-M` option, to load all of the ingest pipelines. +*`--force-enable-module-filesets`*:: +Enables all filesets in the enabled modules. This is useful with +`--pipelines` if you want to load ingest pipelines. Without this +option you enable every fileset within the module with a `-M` option, +to load the ingest pipelines. + endif::[] *`--index-management`*:: diff --git a/libbeat/docs/index.asciidoc b/libbeat/docs/index.asciidoc index f182d625022..10bf384c7d2 100644 --- a/libbeat/docs/index.asciidoc +++ b/libbeat/docs/index.asciidoc @@ -31,8 +31,8 @@ include::./config-file-format.asciidoc[] include::./upgrading.asciidoc[] -include::./release-notes/breaking/breaking.asciidoc[] - include::./release.asciidoc[] +include::./release-notes/breaking/breaking.asciidoc[] + include::{libbeat-dir}/contributing-to-beats.asciidoc[] diff --git a/libbeat/docs/metrics-in-logs.asciidoc b/libbeat/docs/metrics-in-logs.asciidoc new file mode 100644 index 00000000000..c499e7462f4 --- /dev/null +++ b/libbeat/docs/metrics-in-logs.asciidoc @@ -0,0 +1,242 @@ + + +Every 30 seconds (by default), {beatname_uc} collects a _snapshot_ of metrics about itself. From this snapshot, {beatname_uc} computes a _delta snapshot_; this delta snapshot contains any metrics that have _changed_ since the last snapshot. Note that the values of the metrics are the values when the snapshot is taken, _NOT_ the _difference_ in values from the last snapshot. + +If this delta snapshot contains _any_ metrics (indicating at least one metric that has changed since the last snapshot), this delta snapshot is serialized as JSON and emitted in {beatname_uc}'s logs at the `INFO` log level. Here is an example of such a log entry: + +[source,json] +---- +{"log.level":"info","@timestamp":"2023-07-14T12:50:36.811Z","log.logger":"monitoring","log.origin":{"file.name":"log/log.go","file.line":187},"message":"Non-zero metrics in the last 30s","service.name":"filebeat","monitoring":{"metrics":{"beat":{"cgroup":{"memory":{"mem":{"usage":{"bytes":0}}}},"cpu":{"system":{"ticks":692690,"time":{"ms":60}},"total":{"ticks":3167250,"time":{"ms":150},"value":3167250},"user":{"ticks":2474560,"time":{"ms":90}}},"handles":{"limit":{"hard":1048576,"soft":1048576},"open":32},"info":{"ephemeral_id":"2bab8688-34c0-4522-80af-db86948d547d","uptime":{"ms":617670096},"version":"8.6.2"},"memstats":{"gc_next":57189272,"memory_alloc":43589824,"memory_total":275281335792,"rss":183574528},"runtime":{"goroutines":212}},"filebeat":{"events":{"active":5,"added":52,"done":49},"harvester":{"open_files":6,"running":6,"started":1}},"libbeat":{"config":{"module":{"running":15}},"output":{"events":{"acked":48,"active":0,"batches":6,"total":48},"read":{"bytes":210},"write":{"bytes":26923}},"pipeline":{"clients":15,"events":{"active":5,"filtered":1,"published":51,"total":52},"queue":{"acked":48}}},"registrar":{"states":{"current":14,"update":49},"writes":{"success":6,"total":6}},"system":{"load":{"1":0.91,"15":0.37,"5":0.4,"norm":{"1":0.1138,"15":0.0463,"5":0.05}}}},"ecs.version":"1.6.0"}} +---- + +[discrete] +== Details + +Focussing on the `.monitoring.metrics` field, and formatting the JSON, it's value is: + +[source,json] +---- +{ + "beat": { + "cgroup": { + "memory": { + "mem": { + "usage": { + "bytes": 0 + } + } + } + }, + "cpu": { + "system": { + "ticks": 692690, + "time": { + "ms": 60 + } + }, + "total": { + "ticks": 3167250, + "time": { + "ms": 150 + }, + "value": 3167250 + }, + "user": { + "ticks": 2474560, + "time": { + "ms": 90 + } + } + }, + "handles": { + "limit": { + "hard": 1048576, + "soft": 1048576 + }, + "open": 32 + }, + "info": { + "ephemeral_id": "2bab8688-34c0-4522-80af-db86948d547d", + "uptime": { + "ms": 617670096 + }, + "version": "8.6.2" + }, + "memstats": { + "gc_next": 57189272, + "memory_alloc": 43589824, + "memory_total": 275281335792, + "rss": 183574528 + }, + "runtime": { + "goroutines": 212 + } + }, + "filebeat": { + "events": { + "active": 5, + "added": 52, + "done": 49 + }, + "harvester": { + "open_files": 6, + "running": 6, + "started": 1 + } + }, + "libbeat": { + "config": { + "module": { + "running": 15 + } + }, + "output": { + "events": { + "acked": 48, + "active": 0, + "batches": 6, + "total": 48 + }, + "read": { + "bytes": 210 + }, + "write": { + "bytes": 26923 + } + }, + "pipeline": { + "clients": 15, + "events": { + "active": 5, + "filtered": 1, + "published": 51, + "total": 52 + }, + "queue": { + "acked": 48 + } + } + }, + "registrar": { + "states": { + "current": 14, + "update": 49 + }, + "writes": { + "success": 6, + "total": 6 + } + }, + "system": { + "load": { + "1": 0.91, + "5": 0.4, + "15": 0.37, + "norm": { + "1": 0.1138, + "5": 0.05, + "15": 0.0463 + } + } + } +} +---- + +The following tables explain the meaning of the most important fields under `.monitoring.metrics` and also provide hints that might be helpful in troubleshooting {beatname_uc} issues. + +[cols="1,1,2,2"] +|=== +| Field path (relative to `.monitoring.metrics`) | Type | Meaning | Troubleshooting hints + +| `.beat` | Object | Information that is common to all Beats, e.g. version, goroutines, file handles, CPU, memory | +| `.libbeat` | Object | Information about the publisher pipeline and output, also common to all Beats | +ifeval::["{beatname_lc}"=="filebeat"] +| `.filebeat` | Object | Information specific to {filebeat}, e.g. harvester, events | +endif::[] +|=== + +[cols="1,1,2,2"] +|=== +| Field path (relative to `.monitoring.metrics.beat`) | Type | Meaning | Troubleshooting hints + +| `.runtime.goroutines` | Integer | Number of goroutines running | If this number grows over time, it indicates a goroutine leak +|=== + +[cols="1,1,2,2"] +|=== +| Field path (relative to `.monitoring.metrics.libbeat`) | Type | Meaning | Troubleshooting hints + +| `.pipeline.events.active` | Integer | Number of events currently in the libbeat publisher pipeline. | If this number grows over time, it may indicate that {beatname_uc} is producing events faster than the output can consume them. Consider increasing the number of output workers (if this setting is supported by the output; {es} and {ls} outputs support this setting). The pipeline includes events currently being processed as well as events in the queue. So this metric can sometimes end up slightly higher than the queue size. If this metric reaches the maximum queue size (`queue.mem.events` for the in-memory queue), it almost certainly indicates backpressure on {beatname_uc}, implying that {beatname_uc} may need to temporarily stop ingesting more events from the source until this backpressure is relieved. +| `.output.events.total` | Integer | Number of events currently being processed by the output. | If this number grows over time, it may indicate that the output destination (e.g. {ls} pipeline or {es} cluster) is not able to accept events at the same or faster rate than what {beatname_uc} is sending to it. +| `.output.events.acked` | Integer | Number of events acknowledged by the output destination. | Generally, we want this number to be the same as `.output.events.total` as this indicates that the output destination has reliably received all the events sent to it. +| `.output.events.failed` | Integer | Number of events that {beatname_uc} tried to send to the output destination, but the destination failed to receive them. | Generally, we want this field to be absent or its value to be zero. When the value is greater than zero, it's useful to check {beatname_uc}'s logs right before this log entry's `@timestamp` to see if there are any connectivity issues with the output destination. Note that failed events are not lost or dropped; they will be sent back to the publisher pipeline for retrying later. +|=== + +ifeval::["{beatname_lc}"=="filebeat"] +[cols="1,1,2,2"] +|=== +| Field path (relative to `.monitoring.metrics.filebeat`) | Type | Meaning | Troubleshooting hints + +| `.events.active` | Integer | Number of events being actively processed by {filebeat} (including events {filebeat} has already sent to the libbeat publisher pipeline, but not including events the pipeline has sent to the output). | If this number grows over time, it may indicate that {filebeat} inputs are harvesting events too fast for the pipeline and output to keep up. +|=== +endif::[] + +[discrete] +== Useful commands + +[discrete] +=== Parse monitoring metrics from unstructured {beatname_uc} logs + +For {beatname_uc} versions that emit unstructured logs, the following script can be +used to parse monitoring metrics from such logs: https://github.com/elastic/beats/blob/main/script/metrics_from_log_file.sh. + + +ifeval::["{beatname_lc}"=="filebeat"] +[discrete] +=== Check if {filebeat} is processing events + +[source] +---- +$ cat beat.log | jq -r '[.["@timestamp"],.monitoring.metrics.filebeat.events.active,.monitoring.metrics.libbeat.pipeline.events.active,.monitoring.metrics.libbeat.output.events.total,.monitoring.metrics.libbeat.output.events.acked,.monitoring.metrics.libbeat.output.events.failed//0] | @tsv' | sort +---- + +Example output: + +[source] +---- +2023-07-14T11:24:36.811Z 1 1 38033 38033 0 +2023-07-14T11:25:06.811Z 1 1 17 17 0 +2023-07-14T11:25:36.812Z 1 1 16 16 0 +2023-07-14T11:26:06.811Z 1 1 17 17 0 +2023-07-14T11:26:36.811Z 2 2 21 21 0 +2023-07-14T11:27:06.812Z 1 1 18 18 0 +2023-07-14T11:27:36.811Z 1 1 17 17 0 +2023-07-14T11:28:06.811Z 1 1 18 18 0 +2023-07-14T11:28:36.811Z 1 1 16 16 0 +2023-07-14T11:37:06.811Z 1 1 270 270 0 +2023-07-14T11:37:36.811Z 1 1 16 16 0 +2023-07-14T11:38:06.811Z 1 1 17 17 0 +2023-07-14T11:38:36.811Z 1 1 16 16 0 +2023-07-14T11:41:36.811Z 3 3 323 323 0 +2023-07-14T11:42:06.811Z 3 3 17 17 0 +2023-07-14T11:42:36.812Z 4 4 18 18 0 +2023-07-14T11:43:06.811Z 4 4 17 17 0 +2023-07-14T11:43:36.811Z 2 2 17 17 0 +2023-07-14T11:47:06.811Z 0 0 117 117 0 +2023-07-14T11:47:36.811Z 2 2 14 14 0 +2023-07-14T11:48:06.811Z 3 3 17 17 0 +2023-07-14T11:48:36.811Z 2 2 17 17 0 +2023-07-14T12:49:36.811Z 3 3 2008 1960 48 +2023-07-14T12:50:06.812Z 2 2 18 18 0 +2023-07-14T12:50:36.811Z 5 5 48 48 0 +---- + +The columns here are: + +1. `.@timestamp` +2. `.monitoring.metrics.filebeat.events.active` +3. `.monitoring.metrics.libbeat.pipeline.events.active` +4. `.monitoring.metrics.libbeat.output.events.total` +5. `.monitoring.metrics.libbeat.output.events.acked` +6. `.monitoring.metrics.libbeat.output.events.failed` +endif::[] diff --git a/libbeat/docs/output-cloud.asciidoc b/libbeat/docs/output-cloud.asciidoc index 4ac2b98ef24..2502dfb1a3c 100644 --- a/libbeat/docs/output-cloud.asciidoc +++ b/libbeat/docs/output-cloud.asciidoc @@ -42,8 +42,6 @@ The Cloud ID, which can be found in the {ess} web console, is used by overwrites the `output.elasticsearch.hosts` and `setup.kibana.host` settings. For more on locating and configuring the Cloud ID, see {ece-ref}/ece-cloud-id.html[Configure Beats and Logstash with Cloud ID]. -NOTE: The base64 encoded `cloud.id` found in the {ess} web console does not explicitly specify a port. This means that {beatname_uc} will default to using port 443 when using `cloud.id`, not the commonly configured cloud endpoint port 9243. - ==== `cloud.auth` When specified, the `cloud.auth` overwrites the `output.elasticsearch.username` and diff --git a/libbeat/docs/release-notes/breaking/breaking-7.17.asciidoc b/libbeat/docs/release-notes/breaking/breaking-7.17.asciidoc index 20c0ed20905..d7d73508c6d 100644 --- a/libbeat/docs/release-notes/breaking/breaking-7.17.asciidoc +++ b/libbeat/docs/release-notes/breaking/breaking-7.17.asciidoc @@ -5,14 +5,7 @@ 7.17 ++++ -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -// tag::notable-breaking-changes[] - The Docker base image has changed from CentOS 7 to Ubuntu 20.04. This change affects all {beats}. -// end::notable-breaking-changes[] - {see-relnotes} diff --git a/libbeat/docs/release-notes/breaking/breaking-8.0.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.0.asciidoc index 858e7c55fee..7fe56f44053 100644 --- a/libbeat/docs/release-notes/breaking/breaking-8.0.asciidoc +++ b/libbeat/docs/release-notes/breaking/breaking-8.0.asciidoc @@ -9,11 +9,6 @@ See the <> for a complete list of breaking changes, bug fixes, and enhancements, including changes to beta or experimental functionality. -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - [discrete] ==== {beats} logs are now ECS-compliant @@ -92,7 +87,3 @@ However this caused problems for some users. Starting in version 8.0.0, filesets are disabled by default. You must explicitly enable the filesets you want {filebeat} to use. - -// end::notable-breaking-changes[] - - diff --git a/libbeat/docs/release-notes/breaking/breaking-8.1.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.1.asciidoc deleted file mode 100644 index 1286a36fb8d..00000000000 --- a/libbeat/docs/release-notes/breaking/breaking-8.1.asciidoc +++ /dev/null @@ -1,19 +0,0 @@ -[[breaking-changes-8.1]] - -=== Breaking changes in 8.1 -++++ -8.1 -++++ - -See the <> for a complete list of breaking changes, -bug fixes, and enhancements, including changes to beta or experimental -functionality. - -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - -There are no important breaking changes in this release. - -// end::notable-breaking-changes[] diff --git a/libbeat/docs/release-notes/breaking/breaking-8.2.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.2.asciidoc deleted file mode 100644 index 26dd74239bd..00000000000 --- a/libbeat/docs/release-notes/breaking/breaking-8.2.asciidoc +++ /dev/null @@ -1,19 +0,0 @@ -[[breaking-changes-8.2]] - -=== Breaking changes in 8.2 -++++ -8.2 -++++ - -See the <> for a complete list of breaking changes, -bug fixes, and enhancements, including changes to beta or experimental -functionality. - -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - -There are no breaking changes in this release. - -// end::notable-breaking-changes[] diff --git a/libbeat/docs/release-notes/breaking/breaking-8.3.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.3.asciidoc deleted file mode 100644 index 2922f1e3d9b..00000000000 --- a/libbeat/docs/release-notes/breaking/breaking-8.3.asciidoc +++ /dev/null @@ -1,19 +0,0 @@ -[[breaking-changes-8.3]] - -=== Breaking changes in 8.3 -++++ -8.3 -++++ - -See the <> for a complete list of breaking changes, -bug fixes, and enhancements, including changes to beta or experimental -functionality. - -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - -There are no breaking changes in this release. - -// end::notable-breaking-changes[] diff --git a/libbeat/docs/release-notes/breaking/breaking-8.4.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.4.asciidoc deleted file mode 100644 index 7a39b2e2cd5..00000000000 --- a/libbeat/docs/release-notes/breaking/breaking-8.4.asciidoc +++ /dev/null @@ -1,19 +0,0 @@ -[[breaking-changes-8.4]] - -=== Breaking changes in 8.4 -++++ -8.4 -++++ - -See the <> for a complete list of breaking changes, -bug fixes, and enhancements, including changes to beta or experimental -functionality. - -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - -There are no notable breaking changes in this release. - -// end::notable-breaking-changes[] diff --git a/libbeat/docs/release-notes/breaking/breaking-8.5.asciidoc b/libbeat/docs/release-notes/breaking/breaking-8.5.asciidoc deleted file mode 100644 index 35141ecfb9c..00000000000 --- a/libbeat/docs/release-notes/breaking/breaking-8.5.asciidoc +++ /dev/null @@ -1,19 +0,0 @@ -[[breaking-changes-8.5]] - -=== Breaking changes in 8.5 -++++ -8.5 -++++ - -See the <> for a complete list of breaking changes, -bug fixes, and enhancements, including changes to beta or experimental -functionality. - -//NOTE: The notable-breaking-changes tagged regions are re-used in the -//Installation and Upgrade Guide - -//tag::notable-breaking-changes[] - -There are no notable breaking changes in this release. - -// end::notable-breaking-changes[] diff --git a/libbeat/docs/release-notes/breaking/breaking.asciidoc b/libbeat/docs/release-notes/breaking/breaking.asciidoc index bdf4bd8cef0..b66dc6008c7 100644 --- a/libbeat/docs/release-notes/breaking/breaking.asciidoc +++ b/libbeat/docs/release-notes/breaking/breaking.asciidoc @@ -9,23 +9,10 @@ changes, but there are breaking changes between major versions (e.g. 7.x to 8.y). Migrating directly between non consecutive major versions (e.g. 6.x to 8.x) is not recommended. -See the following topics for a description of breaking changes: +See the following topics for a description of breaking changes between major versions: -* <> -* <> -* <> -* <> -* <> * <> -include::breaking-8.5.asciidoc[] - -include::breaking-8.4.asciidoc[] - -include::breaking-8.3.asciidoc[] - -include::breaking-8.2.asciidoc[] - -include::breaking-8.1.asciidoc[] +For breaking changes between minor versions, see the <>. include::breaking-8.0.asciidoc[] diff --git a/libbeat/docs/release-notes/redirects.asciidoc b/libbeat/docs/release-notes/redirects.asciidoc index fd5c8316c64..cd6585651ce 100644 --- a/libbeat/docs/release-notes/redirects.asciidoc +++ b/libbeat/docs/release-notes/redirects.asciidoc @@ -3,3 +3,33 @@ This page has moved. Please see {observability-guide}/whats-new.html[What's new in Observability {minor-version}]. + +[role="exclude",id="breaking-changes-8.5"] +== Breaking changes in 8.5 + +This page no longer exists. +There are no notable breaking changes for 8.5. + +[role="exclude",id="breaking-changes-8.4"] +== Breaking changes in 8.4 + +This page no longer exists. +There are no notable breaking changes for 8.4. + +[role="exclude",id="breaking-changes-8.3"] +== Breaking changes in 8.3 + +This page no longer exists. +There are no notable breaking changes for 8.3. + +[role="exclude",id="breaking-changes-8.2"] +== Breaking changes in 8.2 + +This page no longer exists. +There are no notable breaking changes for 8.2. + +[role="exclude",id="breaking-changes-8.1"] +== Breaking changes in 8.1 + +This page no longer exists. +There are no notable breaking changes for 8.1. diff --git a/libbeat/docs/release.asciidoc b/libbeat/docs/release.asciidoc index f242bd0fb83..e750d59a2e8 100644 --- a/libbeat/docs/release.asciidoc +++ b/libbeat/docs/release.asciidoc @@ -8,6 +8,10 @@ This section summarizes the changes in each release. Also read <> for more detail about changes that affect upgrade. +* <> +* <> +* <> +* <> * <> * <> * <> diff --git a/libbeat/docs/shared-autodiscover.asciidoc b/libbeat/docs/shared-autodiscover.asciidoc index fb7614b35f1..ed116fd6595 100644 --- a/libbeat/docs/shared-autodiscover.asciidoc +++ b/libbeat/docs/shared-autodiscover.asciidoc @@ -371,9 +371,9 @@ endif::autodiscoverJolokia[] ifdef::autodiscoverAWSELB[] [float] -===== Amazon ELBs +===== Amazon ELBs (Deprecated) -*Note: This provider is experimental* +*Note: This provider is now deprecated and will be removed in a future release.* The Amazon ELB autodiscover provider discovers https://aws.amazon.com/elasticloadbalancing/[ELBs] and their listeners. This is useful when you don't want to connect directly to a service, but rather to the ELB fronting a pool of services. diff --git a/libbeat/docs/version.asciidoc b/libbeat/docs/version.asciidoc index a73f993a283..c40537b0704 100644 --- a/libbeat/docs/version.asciidoc +++ b/libbeat/docs/version.asciidoc @@ -1,6 +1,6 @@ -:stack-version: 8.9.0 -:doc-branch: master -:go-version: 1.19.10 +:stack-version: 8.11.0 +:doc-branch: main +:go-version: 1.20.7 :release-state: unreleased :python: 3.7 :docker: 1.12 diff --git a/libbeat/esleg/eslegclient/api.go b/libbeat/esleg/eslegclient/api.go index 980c358df32..9c757fc25a1 100644 --- a/libbeat/esleg/eslegclient/api.go +++ b/libbeat/esleg/eslegclient/api.go @@ -139,7 +139,7 @@ func readCountResult(obj []byte) (*CountResults, error) { // searchable. In case id is empty, a new id is created over a HTTP POST request. // Otherwise, a HTTP PUT request is issued. // Implements: http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html -func (es *Connection) Index( +func (conn *Connection) Index( index, docType, id string, params map[string]string, body interface{}, @@ -148,11 +148,11 @@ func (es *Connection) Index( if id == "" { method = "POST" } - return withQueryResult(es.apiCall(method, index, docType, id, "", params, body)) + return withQueryResult(conn.apiCall(method, index, docType, id, "", params, body)) } // Ingest pushes a pipeline of updates. -func (es *Connection) Ingest( +func (conn *Connection) Ingest( index, docType, pipeline, id string, params map[string]string, body interface{}, @@ -161,39 +161,39 @@ func (es *Connection) Ingest( if id == "" { method = "POST" } - return withQueryResult(es.apiCall(method, index, docType, id, pipeline, params, body)) + return withQueryResult(conn.apiCall(method, index, docType, id, pipeline, params, body)) } // Refresh an index. Call this after doing inserts or creating/deleting // indexes in unit tests. -func (es *Connection) Refresh(index string) (int, *QueryResult, error) { - return withQueryResult(es.apiCall("POST", index, "", "_refresh", "", nil, nil)) +func (conn *Connection) Refresh(index string) (int, *QueryResult, error) { + return withQueryResult(conn.apiCall("POST", index, "", "_refresh", "", nil, nil)) } // CreateIndex creates a new index, optionally with settings and mappings passed in // the body. // Implements: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html -func (es *Connection) CreateIndex(index string, body interface{}) (int, *QueryResult, error) { - return withQueryResult(es.apiCall("PUT", index, "", "", "", nil, body)) +func (conn *Connection) CreateIndex(index string, body interface{}) (int, *QueryResult, error) { + return withQueryResult(conn.apiCall("PUT", index, "", "", "", nil, body)) } // IndexExists checks if an index exists. // Implements: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-exists.html -func (es *Connection) IndexExists(index string) (int, error) { - status, _, err := es.apiCall("HEAD", index, "", "", "", nil, nil) +func (conn *Connection) IndexExists(index string) (int, error) { + status, _, err := conn.apiCall("HEAD", index, "", "", "", nil, nil) return status, err } // Delete deletes a typed JSON document from a specific index based on its id. // Implements: http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html -func (es *Connection) Delete(index string, docType string, id string, params map[string]string) (int, *QueryResult, error) { - return withQueryResult(es.apiCall("DELETE", index, docType, id, "", params, nil)) +func (conn *Connection) Delete(index string, docType string, id string, params map[string]string) (int, *QueryResult, error) { + return withQueryResult(conn.apiCall("DELETE", index, docType, id, "", params, nil)) } // PipelineExists checks if a pipeline with name id already exists. // Using: https://www.elastic.co/guide/en/elasticsearch/reference/current/get-pipeline-api.html -func (es *Connection) PipelineExists(id string) (bool, error) { - status, _, err := es.apiCall("GET", "_ingest", "pipeline", id, "", nil, nil) +func (conn *Connection) PipelineExists(id string) (bool, error) { + status, _, err := conn.apiCall("GET", "_ingest", "pipeline", id, "", nil, nil) if status == 404 { return false, nil } @@ -202,41 +202,41 @@ func (es *Connection) PipelineExists(id string) (bool, error) { // CreatePipeline create a new ingest pipeline with name id. // Implements: https://www.elastic.co/guide/en/elasticsearch/reference/current/put-pipeline-api.html -func (es *Connection) CreatePipeline( +func (conn *Connection) CreatePipeline( id string, params map[string]string, body interface{}, ) (int, *QueryResult, error) { - return withQueryResult(es.apiCall("PUT", "_ingest", "pipeline", id, "", params, body)) + return withQueryResult(conn.apiCall("PUT", "_ingest", "pipeline", id, "", params, body)) } // DeletePipeline deletes an ingest pipeline by id. // Implements: https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html -func (es *Connection) DeletePipeline( +func (conn *Connection) DeletePipeline( id string, params map[string]string, ) (int, *QueryResult, error) { - return withQueryResult(es.apiCall("DELETE", "_ingest", "pipeline", id, "", params, nil)) + return withQueryResult(conn.apiCall("DELETE", "_ingest", "pipeline", id, "", params, nil)) } // SearchURI executes a search request using a URI by providing request parameters. // Implements: http://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html -func (es *Connection) SearchURI(index string, docType string, params map[string]string) (int, *SearchResults, error) { - return es.SearchURIWithBody(index, docType, params, nil) +func (conn *Connection) SearchURI(index string, docType string, params map[string]string) (int, *SearchResults, error) { + return conn.SearchURIWithBody(index, docType, params, nil) } // SearchURIWithBody executes a search request using a URI by providing request // parameters and a request body. -func (es *Connection) SearchURIWithBody( +func (conn *Connection) SearchURIWithBody( index string, docType string, params map[string]string, body interface{}, ) (int, *SearchResults, error) { - if !es.version.LessThan(&version.V{Major: 8}) { + if !conn.version.LessThan(&version.V{Major: 8}) { docType = "" } - status, resp, err := es.apiCall("GET", index, docType, "_search", "", params, body) + status, resp, err := conn.apiCall("GET", index, docType, "_search", "", params, body) if err != nil { return status, nil, err } @@ -245,11 +245,11 @@ func (es *Connection) SearchURIWithBody( } // CountSearchURI counts the results for a search request. -func (es *Connection) CountSearchURI( +func (conn *Connection) CountSearchURI( index string, docType string, params map[string]string, ) (int, *CountResults, error) { - status, resp, err := es.apiCall("GET", index, docType, "_count", "", params, nil) + status, resp, err := conn.apiCall("GET", index, docType, "_count", "", params, nil) if err != nil { return status, nil, err } @@ -257,7 +257,7 @@ func (es *Connection) CountSearchURI( return status, result, err } -func (es *Connection) apiCall( +func (conn *Connection) apiCall( method, index, docType, id, pipeline string, params map[string]string, body interface{}, @@ -266,5 +266,5 @@ func (es *Connection) apiCall( if err != nil { return 0, nil, err } - return es.Request(method, path, pipeline, params, body) + return conn.Request(method, path, pipeline, params, body) } diff --git a/libbeat/esleg/eslegclient/bulkapi.go b/libbeat/esleg/eslegclient/bulkapi.go index b1352f193a9..56a36ccf145 100644 --- a/libbeat/esleg/eslegclient/bulkapi.go +++ b/libbeat/esleg/eslegclient/bulkapi.go @@ -27,7 +27,7 @@ import ( "net/http" "strings" - "go.elastic.co/apm/module/apmhttp/v2" + apmHttpV2 "go.elastic.co/apm/module/apmhttp/v2" "go.elastic.co/apm/v2" "github.com/elastic/elastic-agent-libs/logp" @@ -88,7 +88,7 @@ func (conn *Connection) Bulk( apm.CaptureError(ctx, err).Send() return 0, nil, err } - requ.requ = apmhttp.RequestWithContext(ctx, requ.requ) + requ.requ = apmHttpV2.RequestWithContext(ctx, requ.requ) return conn.sendBulkRequest(requ) } diff --git a/libbeat/esleg/eslegclient/bulkapi_mock_test.go b/libbeat/esleg/eslegclient/bulkapi_mock_test.go index cc261faf425..bd3f1252569 100644 --- a/libbeat/esleg/eslegclient/bulkapi_mock_test.go +++ b/libbeat/esleg/eslegclient/bulkapi_mock_test.go @@ -36,8 +36,8 @@ import ( ) func TestOneHostSuccessResp_Bulk(t *testing.T) { - logp.TestingSetup(logp.WithSelectors("elasticsearch")) - + setupErr := logp.TestingSetup(logp.WithSelectors("elasticsearch")) + require.NoError(t, setupErr) index := fmt.Sprintf("packetbeat-unittest-%d", os.Getpid()) expectedResp := []byte(`{"took":7,"errors":false,"items":[]}`) @@ -73,8 +73,8 @@ func TestOneHostSuccessResp_Bulk(t *testing.T) { } func TestOneHost500Resp_Bulk(t *testing.T) { - logp.TestingSetup(logp.WithSelectors("elasticsearch")) - + setupErr := logp.TestingSetup(logp.WithSelectors("elasticsearch")) + require.NoError(t, setupErr) index := fmt.Sprintf("packetbeat-unittest-%d", os.Getpid()) ops := []map[string]interface{}{ @@ -113,8 +113,8 @@ func TestOneHost500Resp_Bulk(t *testing.T) { } func TestOneHost503Resp_Bulk(t *testing.T) { - logp.TestingSetup(logp.WithSelectors("elasticsearch")) - + setupErr := logp.TestingSetup(logp.WithSelectors("elasticsearch")) + require.NoError(t, setupErr) index := fmt.Sprintf("packetbeat-unittest-%d", os.Getpid()) ops := []map[string]interface{}{ diff --git a/libbeat/esleg/eslegclient/connection.go b/libbeat/esleg/eslegclient/connection.go index 640d1df3c94..f12dbefbc4a 100644 --- a/libbeat/esleg/eslegclient/connection.go +++ b/libbeat/esleg/eslegclient/connection.go @@ -18,11 +18,11 @@ package eslegclient import ( + "bytes" "encoding/base64" "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "time" @@ -48,7 +48,8 @@ type esHTTPClient interface { CloseIdleConnections() } -// Connection manages the connection for a given client. +// Connection manages the connection for a given client. Each connection is not-thread-safe and should not be shared +// between 2 different goroutines. type Connection struct { ConnectionSettings @@ -58,6 +59,7 @@ type Connection struct { apiKeyAuthHeader string // Authorization HTTP request header with base64-encoded API key version libversion.V log *logp.Logger + responseBuffer *bytes.Buffer } // ConnectionSettings are the settings needed for a Connection @@ -152,7 +154,7 @@ func NewConnection(s ConnectionSettings) (*Connection, error) { if err != nil { return nil, err } - logp.Info("kerberos client created") + logger.Info("kerberos client created") } conn := Connection{ @@ -160,6 +162,7 @@ func NewConnection(s ConnectionSettings) (*Connection, error) { HTTP: esClient, Encoder: encoder, log: logger, + responseBuffer: bytes.NewBuffer(nil), } if s.APIKey != "" { @@ -173,6 +176,7 @@ func NewConnection(s ConnectionSettings) (*Connection, error) { // configuration. It accepts the same configuration parameters as the Elasticsearch // output, except for the output specific configuration options. If multiple hosts // are defined in the configuration, a client is returned for each of them. +// The returned Connection is a non-thread-safe connection. func NewClients(cfg *cfg.C, beatname string) ([]Connection, error) { config := defaultConfig() if err := cfg.Unpack(&config); err != nil { @@ -220,6 +224,7 @@ func NewClients(cfg *cfg.C, beatname string) ([]Connection, error) { return clients, nil } +// NewConnectedClient returns a non-thread-safe connection. Make sure for each goroutine you initialize a new connection. func NewConnectedClient(cfg *cfg.C, beatname string) (*Connection, error) { clients, err := NewClients(cfg, beatname) if err != nil { @@ -418,6 +423,8 @@ func (conn *Connection) LoadJSON(path string, json map[string]interface{}) ([]by return body, nil } +// execHTTPRequest executes the http request and consumes the response in a non-thread-safe way. +// The return is a triple of status code, response as byte array, error if the request produced any error. func (conn *Connection) execHTTPRequest(req *http.Request) (int, []byte, error) { req.Header.Add("Accept", "application/json") @@ -452,17 +459,18 @@ func (conn *Connection) execHTTPRequest(req *http.Request) (int, []byte, error) defer closing(resp.Body, conn.log) status := resp.StatusCode - obj, err := ioutil.ReadAll(resp.Body) + conn.responseBuffer.Reset() + _, err = io.Copy(conn.responseBuffer, resp.Body) if err != nil { return status, nil, err } if status >= 300 { // add the response body with the error returned by Elasticsearch - err = fmt.Errorf("%v: %s", resp.Status, obj) + err = fmt.Errorf("%v: %s", resp.Status, conn.responseBuffer.Bytes()) } - return status, obj, err + return status, conn.responseBuffer.Bytes(), err } func closing(c io.Closer, logger *logp.Logger) { diff --git a/libbeat/esleg/eslegclient/connection_test.go b/libbeat/esleg/eslegclient/connection_test.go index af553d71c09..de9e134414a 100644 --- a/libbeat/esleg/eslegclient/connection_test.go +++ b/libbeat/esleg/eslegclient/connection_test.go @@ -20,6 +20,7 @@ package eslegclient import ( "bufio" "bytes" + "context" "encoding/base64" "net/http" "testing" @@ -41,7 +42,7 @@ func TestAPIKeyEncoding(t *testing.T) { httpClient := newMockClient() conn.HTTP = httpClient - req, err := http.NewRequest("GET", "http://fakehost/some/path", nil) + req, err := http.NewRequestWithContext(context.Background(), "GET", "http://fakehost/some/path", nil) require.NoError(t, err) _, _, err = conn.execHTTPRequest(req) @@ -97,7 +98,7 @@ func TestHeaders(t *testing.T) { httpClient := newMockClient() conn.HTTP = httpClient - req, err := http.NewRequest("GET", "http://fakehost/some/path", nil) + req, err := http.NewRequestWithContext(context.Background(), "GET", "http://fakehost/some/path", nil) require.NoError(t, err) _, _, err = conn.execHTTPRequest(req) require.NoError(t, err) @@ -105,3 +106,55 @@ func TestHeaders(t *testing.T) { require.Equal(t, req.Header, http.Header(td.expected)) } } + +func BenchmarkExecHTTPRequest(b *testing.B) { + for _, td := range []struct { + input map[string]string + expected map[string][]string + }{ + { + input: map[string]string{ + "Accept": "application/vnd.elasticsearch+json;compatible-with=7", + "Content-Type": "application/vnd.elasticsearch+json;compatible-with=7", + productorigin.Header: "elastic-product", + "X-My-Header": "true", + }, + expected: map[string][]string{ + "Accept": {"application/vnd.elasticsearch+json;compatible-with=7"}, + "Content-Type": {"application/vnd.elasticsearch+json;compatible-with=7"}, + productorigin.Header: {"elastic-product"}, + "X-My-Header": {"true"}, + }, + }, + { + input: map[string]string{ + "X-My-Header": "true", + }, + expected: map[string][]string{ + "Accept": {"application/json"}, + productorigin.Header: {productorigin.Beats}, + "X-My-Header": {"true"}, + }, + }, + } { + conn, err := NewConnection(ConnectionSettings{ + Headers: td.input, + }) + require.NoError(b, err) + + httpClient := newMockClient() + conn.HTTP = httpClient + + var bb []byte + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + req, err := http.NewRequestWithContext(context.Background(), "GET", "http://fakehost/some/path", nil) + require.NoError(b, err) + _, bb, err = conn.execHTTPRequest(req) + require.NoError(b, err) + require.Equal(b, req.Header, http.Header(td.expected)) + require.NotEmpty(b, bb) + } + } +} diff --git a/libbeat/esleg/eslegclient/enc.go b/libbeat/esleg/eslegclient/enc.go index ae5520a1281..644a2b7d8cc 100644 --- a/libbeat/esleg/eslegclient/enc.go +++ b/libbeat/esleg/eslegclient/enc.go @@ -170,62 +170,62 @@ func (g *gzipEncoder) resetState() { } } -func (b *gzipEncoder) Reset() { - b.buf.Reset() - b.gzip.Reset(b.buf) +func (g *gzipEncoder) Reset() { + g.buf.Reset() + g.gzip.Reset(g.buf) } -func (b *gzipEncoder) Reader() io.Reader { - b.gzip.Close() - return b.buf +func (g *gzipEncoder) Reader() io.Reader { + g.gzip.Close() + return g.buf } -func (b *gzipEncoder) AddHeader(header *http.Header) { +func (g *gzipEncoder) AddHeader(header *http.Header) { header.Add("Content-Type", "application/json; charset=UTF-8") header.Add("Content-Encoding", "gzip") } -func (b *gzipEncoder) Marshal(obj interface{}) error { - b.Reset() - return b.AddRaw(obj) +func (g *gzipEncoder) Marshal(obj interface{}) error { + g.Reset() + return g.AddRaw(obj) } var nl = []byte("\n") -func (b *gzipEncoder) AddRaw(obj interface{}) error { +func (g *gzipEncoder) AddRaw(obj interface{}) error { var err error switch v := obj.(type) { case beat.Event: - err = b.folder.Fold(event{Timestamp: v.Timestamp, Fields: v.Fields}) + err = g.folder.Fold(event{Timestamp: v.Timestamp, Fields: v.Fields}) case *beat.Event: - err = b.folder.Fold(event{Timestamp: v.Timestamp, Fields: v.Fields}) + err = g.folder.Fold(event{Timestamp: v.Timestamp, Fields: v.Fields}) default: - err = b.folder.Fold(obj) + err = g.folder.Fold(obj) } if err != nil { - b.resetState() + g.resetState() } - _, err = b.gzip.Write(nl) + _, err = g.gzip.Write(nl) if err != nil { - b.resetState() + g.resetState() } return nil } -func (b *gzipEncoder) Add(meta, obj interface{}) error { - pos := b.buf.Len() - if err := b.AddRaw(meta); err != nil { - b.buf.Truncate(pos) +func (g *gzipEncoder) Add(meta, obj interface{}) error { + pos := g.buf.Len() + if err := g.AddRaw(meta); err != nil { + g.buf.Truncate(pos) return err } - if err := b.AddRaw(obj); err != nil { - b.buf.Truncate(pos) + if err := g.AddRaw(obj); err != nil { + g.buf.Truncate(pos) return err } - b.gzip.Flush() + g.gzip.Flush() return nil } diff --git a/libbeat/magefile.go b/libbeat/magefile.go index 2c3ae40f7b8..5c4b7ada17e 100644 --- a/libbeat/magefile.go +++ b/libbeat/magefile.go @@ -75,7 +75,7 @@ func IntegTest() { // GoIntegTest starts the docker containers and executes the Go integration tests. func GoIntegTest(ctx context.Context) error { - mg.Deps(Fields) + mg.Deps(Fields, devtools.BuildSystemTestBinary) args := devtools.DefaultGoTestIntegrationFromHostArgs() // ES_USER must be admin in order for the Go Integration tests to function because they require // indices:data/read/search diff --git a/libbeat/monitoring/inputmon/httphandler.go b/libbeat/monitoring/inputmon/httphandler.go index 46368ee5f79..d4a8d9e4499 100644 --- a/libbeat/monitoring/inputmon/httphandler.go +++ b/libbeat/monitoring/inputmon/httphandler.go @@ -64,7 +64,14 @@ func (h *handler) allInputs(w http.ResponseWriter, req *http.Request) { return } - metrics := monitoring.CollectStructSnapshot(h.registry, monitoring.Full, false) + filtered := filteredSnapshot(h.registry, requestedType) + + w.Header().Set(contentType, applicationJSON) + serveJSON(w, filtered, requestedPretty) +} + +func filteredSnapshot(r *monitoring.Registry, requestedType string) []map[string]any { + metrics := monitoring.CollectStructSnapshot(r, monitoring.Full, false) filtered := make([]map[string]any, 0, len(metrics)) for _, ifc := range metrics { @@ -84,9 +91,7 @@ func (h *handler) allInputs(w http.ResponseWriter, req *http.Request) { filtered = append(filtered, m) } - - w.Header().Set(contentType, applicationJSON) - serveJSON(w, filtered, requestedPretty) + return filtered } func serveJSON(w http.ResponseWriter, value any, pretty bool) { diff --git a/libbeat/monitoring/inputmon/input.go b/libbeat/monitoring/inputmon/input.go index 39d51d94cbe..7814f79234f 100644 --- a/libbeat/monitoring/inputmon/input.go +++ b/libbeat/monitoring/inputmon/input.go @@ -18,6 +18,7 @@ package inputmon import ( + "encoding/json" "strings" "github.com/google/uuid" @@ -78,3 +79,9 @@ func sanitizeID(id string) string { func globalRegistry() *monitoring.Registry { return monitoring.GetNamespace("dataset").GetRegistry() } + +// MetricSnapshotJSON returns a snapshot of the input metric values from the +// global 'dataset' monitoring namespace encoded as a JSON array (pretty formatted). +func MetricSnapshotJSON() ([]byte, error) { + return json.MarshalIndent(filteredSnapshot(globalRegistry(), ""), "", " ") +} diff --git a/libbeat/monitoring/inputmon/input_test.go b/libbeat/monitoring/inputmon/input_test.go index 011113fb543..e74c463bee2 100644 --- a/libbeat/monitoring/inputmon/input_test.go +++ b/libbeat/monitoring/inputmon/input_test.go @@ -22,6 +22,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/elastic/elastic-agent-libs/monitoring" ) @@ -79,3 +80,27 @@ func TestNewInputMonitor(t *testing.T) { }) } } + +func TestMetricSnapshotJSON(t *testing.T) { + require.NoError(t, globalRegistry().Clear()) + t.Cleanup(func() { + require.NoError(t, globalRegistry().Clear()) + }) + + r, cancel := NewInputRegistry("test", "my-id", nil) + defer cancel() + monitoring.NewInt(r, "foo_total").Set(100) + + jsonBytes, err := MetricSnapshotJSON() + require.NoError(t, err) + + const expected = `[ + { + "foo_total": 100, + "id": "my-id", + "input": "test" + } +]` + + assert.Equal(t, expected, string(jsonBytes)) +} diff --git a/libbeat/outputs/elasticsearch/client.go b/libbeat/outputs/elasticsearch/client.go index ce4b714215f..c80e95ebc90 100644 --- a/libbeat/outputs/elasticsearch/client.go +++ b/libbeat/outputs/elasticsearch/client.go @@ -245,7 +245,8 @@ func (client *Client) publishEvents(ctx context.Context, data []publisher.Event) return nil, nil } - status, result, sendErr := client.conn.Bulk(ctx, "", "", nil, bulkItems) + params := map[string]string{"filter_path": "errors,items.*.error,items.*.status"} + status, result, sendErr := client.conn.Bulk(ctx, "", "", params, bulkItems) if sendErr != nil { if status == http.StatusRequestEntityTooLarge { diff --git a/libbeat/outputs/elasticsearch/client_test.go b/libbeat/outputs/elasticsearch/client_test.go index f9f413f702c..3df6e1229ad 100644 --- a/libbeat/outputs/elasticsearch/client_test.go +++ b/libbeat/outputs/elasticsearch/client_test.go @@ -25,6 +25,7 @@ import ( "io" "net/http" "net/http/httptest" + "net/url" "strings" "testing" "time" @@ -801,3 +802,127 @@ func TestClientWithAPIKey(t *testing.T) { client.Connect() assert.Equal(t, "ApiKey aHlva0hHNEJmV2s1dmlLWjE3Mlg6bzQ1SlVreXVTLS15aVNBdXV4bDhVdw==", headers.Get("Authorization")) } + +func TestPublishEventsWithBulkFiltering(t *testing.T) { + makePublishTestClient := func(t *testing.T, url string, configParams map[string]string) *Client { + client, err := NewClient( + ClientSettings{ + Observer: outputs.NewNilObserver(), + ConnectionSettings: eslegclient.ConnectionSettings{ + URL: url, + Parameters: configParams, + }, + Index: testIndexSelector{}, + }, + nil, + ) + require.NoError(t, err) + return client + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + event1 := publisher.Event{Content: beat.Event{Fields: mapstr.M{"field": 1}}} + + t.Run("Single event with response filtering", func(t *testing.T) { + var expectedFilteringParams = map[string]string{ + "filter_path": "errors,items.*.error,items.*.status", + } + var recParams url.Values + + esMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + if strings.ContainsAny("_bulk", r.URL.Path) { + recParams = r.URL.Query() + response := []byte(`{"took":85,"errors":false,"items":[{"index":{"status":200}}]}`) + _, _ = w.Write(response) + } + if strings.Contains("/", r.URL.Path) { + response := []byte(`{}`) + _, _ = w.Write(response) + } + })) + defer esMock.Close() + client := makePublishTestClient(t, esMock.URL, nil) + + // Try publishing a batch that can be split + events := []publisher.Event{event1} + evt, err := client.publishEvents(ctx, events) + require.NoError(t, err) + require.Equal(t, len(recParams), len(expectedFilteringParams)) + require.Nil(t, evt) + }) + t.Run("Single event with response filtering and preconfigured client params", func(t *testing.T) { + var configParams = map[string]string{ + "hardcoded": "yes", + } + var expectedFilteringParams = map[string]string{ + "filter_path": "errors,items.*.error,items.*.status", + } + var recParams url.Values + + esMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + if strings.ContainsAny("_bulk", r.URL.Path) { + recParams = r.URL.Query() + response := []byte(`{"took":85,"errors":false,"items":[{"index":{"status":200}}]}`) + _, _ = w.Write(response) + } + if strings.Contains("/", r.URL.Path) { + response := []byte(`{}`) + _, _ = w.Write(response) + } + })) + defer esMock.Close() + client := makePublishTestClient(t, esMock.URL, configParams) + + // Try publishing a batch that can be split + events := []publisher.Event{event1} + evt, err := client.publishEvents(ctx, events) + require.NoError(t, err) + require.Equal(t, len(recParams), len(expectedFilteringParams)+len(configParams)) + require.Nil(t, evt) + }) + t.Run("Single event without response filtering", func(t *testing.T) { + var recParams url.Values + + esMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if strings.ContainsAny("_bulk", r.URL.Path) { + recParams = r.URL.Query() + response := []byte(`{ + "took":85, + "errors":false, + "items":[ + { + "index":{ + "_index":"test", + "_id":"1", + "_version":1, + "result":"created", + "_shards":{"total":2,"successful":1,"failed":0}, + "_seq_no":0, + "_primary_term":1, + "status":201 + } + } + ]}`) + _, _ = w.Write(response) + } + if strings.Contains("/", r.URL.Path) { + response := []byte(`{}`) + _, _ = w.Write(response) + } + w.WriteHeader(http.StatusOK) + + })) + defer esMock.Close() + client := makePublishTestClient(t, esMock.URL, nil) + + // Try publishing a batch that can be split + events := []publisher.Event{event1} + _, err := client.publishEvents(ctx, events) + require.NoError(t, err) + require.Equal(t, len(recParams), 1) + }) +} diff --git a/libbeat/processors/actions/decode_json_fields.go b/libbeat/processors/actions/decode_json_fields.go index 8dcc39e0dbc..b47ebd646d9 100644 --- a/libbeat/processors/actions/decode_json_fields.go +++ b/libbeat/processors/actions/decode_json_fields.go @@ -122,11 +122,7 @@ func (f *decodeJSONFields) Run(event *beat.Event) (*beat.Event, error) { if err != nil { f.logger.Debugf("Error trying to unmarshal %s", text) errs = append(errs, err.Error()) - event.SetErrorWithOption(mapstr.M{ - "message": "parsing input as JSON: " + err.Error(), - "data": text, - "field": field, - }, f.addErrorKey) + event.SetErrorWithOption(fmt.Sprintf("parsing input as JSON: %s", err.Error()), f.addErrorKey, text, field) continue } diff --git a/libbeat/processors/add_cloud_metadata/provider_aws_ec2_test.go b/libbeat/processors/add_cloud_metadata/provider_aws_ec2_test.go index a66ac00546c..92e3ae7ec2e 100644 --- a/libbeat/processors/add_cloud_metadata/provider_aws_ec2_test.go +++ b/libbeat/processors/add_cloud_metadata/provider_aws_ec2_test.go @@ -310,7 +310,7 @@ func TestRetrieveAWSMetadataEC2(t *testing.T) { Tags: []types.TagDescription{}, }, nil }, - processorOverwrite: false, + processorOverwrite: true, previousEvent: mapstr.M{ "cloud.provider": "aws", }, @@ -349,6 +349,7 @@ func TestRetrieveAWSMetadataEC2(t *testing.T) { config, err := conf.NewConfigFrom(map[string]interface{}{ "overwrite": tc.processorOverwrite, + "providers": []string{"aws"}, }) if err != nil { t.Fatalf("error creating config from map: %s", err.Error()) diff --git a/libbeat/processors/add_process_metadata/add_process_metadata_test.go b/libbeat/processors/add_process_metadata/add_process_metadata_test.go index cd2042d8b89..b31481e8ebc 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata_test.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata_test.go @@ -21,6 +21,8 @@ import ( "errors" "math" "os" + "runtime" + "strings" "testing" "time" "unsafe" @@ -819,9 +821,10 @@ func TestUsingCache(t *testing.T) { } config, err := conf.NewConfigFrom(mapstr.M{ - "match_pids": []string{"system.process.ppid"}, - "include_fields": []string{"container.id"}, - "target": "meta", + "match_pids": []string{"system.process.ppid"}, + "include_fields": []string{"container.id", "process.env"}, + "target": "meta", + "restricted_fields": true, }) if err != nil { t.Fatal(err) @@ -853,6 +856,24 @@ func TestUsingCache(t *testing.T) { } assert.Equal(t, "b5285682fba7449c86452b89a800609440ecc88a7ba5f2d38bedfb85409b30b1", containerID) + // check environment for GOOSes that support it. + switch runtime.GOOS { + case "darwin", "linux": + env, err := result.Fields.GetValue("meta.process.env") + if err != nil { + t.Fatal(err) + } + // The event is for this process, so we can just grab our env to compare. + want := make(map[string]string) + for _, kv := range os.Environ() { + k, v, ok := strings.Cut(kv, "=") + if ok { + want[k] = v + } + } + assert.Equal(t, want, env) + } + ev = beat.Event{ Fields: mapstr.M{ "system": mapstr.M{ diff --git a/libbeat/processors/add_process_metadata/gosigar_provider.go b/libbeat/processors/add_process_metadata/gosigar_provider.go deleted file mode 100644 index a94f5ef9630..00000000000 --- a/libbeat/processors/add_process_metadata/gosigar_provider.go +++ /dev/null @@ -1,68 +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. - -//go:build ignore - -package add_process_metadata - -import ( - "strings" - "time" - - "github.com/elastic/gosigar" -) - -type gosigarProvider struct{} - -func (p gosigarProvider) GetProcessMetadata(pid int) (result *processMetadata, err error) { - var procExe gosigar.ProcExe - var procArgs gosigar.ProcArgs - var procEnv gosigar.ProcEnv - var procState gosigar.ProcState - var procTime gosigar.ProcTime - - for _, act := range []struct { - getter func(int) error - required bool - }{ - {procExe.Get, true}, - {procArgs.Get, false}, - {procEnv.Get, false}, - {procState.Get, false}, - {procTime.Get, false}, - } { - if err := act.getter(pid); err != nil { - if act.required { - return nil, err - } - } - } - - r := processMetadata{ - name: procExe.Name, - title: strings.Join(procArgs.List, " "), - exe: procExe.Name, - args: procArgs.List, - env: procEnv.Vars, - pid: pid, - ppid: procState.Ppid, - username: procState.Username, - startTime: time.Unix(int64(procTime.StartTime/1000), int64(procTime.StartTime%1000)*1000000), - } - r.fields = r.toMap() - return &r, nil -} diff --git a/libbeat/processors/add_process_metadata/gosysinfo_provider.go b/libbeat/processors/add_process_metadata/gosysinfo_provider.go index e20c5c0b7ff..ecc94233dce 100644 --- a/libbeat/processors/add_process_metadata/gosysinfo_provider.go +++ b/libbeat/processors/add_process_metadata/gosysinfo_provider.go @@ -28,8 +28,7 @@ import ( type gosysinfoProvider struct{} func (p gosysinfoProvider) GetProcessMetadata(pid int) (result *processMetadata, err error) { - var proc types.Process - proc, err = sysinfo.Process(pid) + proc, err := sysinfo.Process(pid) if err != nil { return nil, err } @@ -40,6 +39,11 @@ func (p gosysinfoProvider) GetProcessMetadata(pid int) (result *processMetadata, return nil, err } + var env map[string]string + if e, ok := proc.(types.Environment); ok { + env, _ = e.Environment() + } + username, userid := "", "" if userInfo, err := proc.User(); err == nil { userid = userInfo.UID @@ -51,6 +55,7 @@ func (p gosysinfoProvider) GetProcessMetadata(pid int) (result *processMetadata, r := processMetadata{ name: info.Name, args: info.Args, + env: env, title: strings.Join(info.Args, " "), exe: info.Exe, pid: info.PID, diff --git a/libbeat/processors/dns/cache.go b/libbeat/processors/dns/cache.go index 6e77af02888..6427fb9f98e 100644 --- a/libbeat/processors/dns/cache.go +++ b/libbeat/processors/dns/cache.go @@ -24,23 +24,23 @@ import ( "github.com/elastic/elastic-agent-libs/monitoring" ) -type ptrRecord struct { - host string +type successRecord struct { + data []string expires time.Time } -func (r ptrRecord) IsExpired(now time.Time) bool { +func (r successRecord) IsExpired(now time.Time) bool { return now.After(r.expires) } -type ptrCache struct { +type successCache struct { sync.RWMutex - data map[string]ptrRecord + data map[string]successRecord maxSize int minSuccessTTL time.Duration } -func (c *ptrCache) set(now time.Time, key string, ptr *PTR) { +func (c *successCache) set(now time.Time, key string, result *result) { c.Lock() defer c.Unlock() @@ -48,14 +48,14 @@ func (c *ptrCache) set(now time.Time, key string, ptr *PTR) { c.evict() } - c.data[key] = ptrRecord{ - host: ptr.Host, - expires: now.Add(time.Duration(ptr.TTL) * time.Second), + c.data[key] = successRecord{ + data: result.Data, + expires: now.Add(time.Duration(result.TTL) * time.Second), } } // evict removes a single random key from the cache. -func (c *ptrCache) evict() { +func (c *successCache) evict() { var key string for k := range c.data { key = k @@ -64,13 +64,13 @@ func (c *ptrCache) evict() { delete(c.data, key) } -func (c *ptrCache) get(now time.Time, key string) *PTR { +func (c *successCache) get(now time.Time, key string) *result { c.RLock() defer c.RUnlock() r, found := c.data[key] if found && !r.IsExpired(now) { - return &PTR{r.host, uint32(r.expires.Sub(now) / time.Second)} + return &result{r.data, uint32(r.expires.Sub(now) / time.Second)} } return nil } @@ -132,13 +132,13 @@ type cachedError struct { func (ce *cachedError) Error() string { return ce.err.Error() + " (from failure cache)" } func (ce *cachedError) Cause() error { return ce.err } -// PTRLookupCache is a cache for storing and retrieving the results of -// reverse DNS queries. It caches the results of queries regardless of their +// lookupCache is a cache for storing and retrieving the results of +// DNS queries. It caches the results of queries regardless of their // outcome (success or failure). -type PTRLookupCache struct { - success *ptrCache +type lookupCache struct { + success *successCache failure *failureCache - resolver PTRResolver + resolver resolver stats cacheStats } @@ -147,15 +147,15 @@ type cacheStats struct { Miss *monitoring.Int } -// NewPTRLookupCache returns a new cache. -func NewPTRLookupCache(reg *monitoring.Registry, conf CacheConfig, resolver PTRResolver) (*PTRLookupCache, error) { +// newLookupCache returns a new cache. +func newLookupCache(reg *monitoring.Registry, conf cacheConfig, resolver resolver) (*lookupCache, error) { if err := conf.Validate(); err != nil { return nil, err } - c := &PTRLookupCache{ - success: &ptrCache{ - data: make(map[string]ptrRecord, conf.SuccessCache.InitialCapacity), + c := &lookupCache{ + success: &successCache{ + data: make(map[string]successRecord, conf.SuccessCache.InitialCapacity), maxSize: conf.SuccessCache.MaxCapacity, minSuccessTTL: conf.SuccessCache.MinTTL, }, @@ -174,36 +174,36 @@ func NewPTRLookupCache(reg *monitoring.Registry, conf CacheConfig, resolver PTRR return c, nil } -// LookupPTR performs a reverse lookup on the given IP address. A cached result +// Lookup performs a lookup on the given query string. A cached result // will be returned if it is contained in the cache, otherwise a lookup is // performed. -func (c PTRLookupCache) LookupPTR(ip string) (*PTR, error) { +func (c lookupCache) Lookup(q string, qt queryType) (*result, error) { now := time.Now() - ptr := c.success.get(now, ip) - if ptr != nil { + r := c.success.get(now, q) + if r != nil { c.stats.Hit.Inc() - return ptr, nil + return r, nil } - err := c.failure.get(now, ip) + err := c.failure.get(now, q) if err != nil { c.stats.Hit.Inc() return nil, err } c.stats.Miss.Inc() - ptr, err = c.resolver.LookupPTR(ip) + r, err = c.resolver.Lookup(q, qt) if err != nil { - c.failure.set(now, ip, &cachedError{err}) + c.failure.set(now, q, &cachedError{err}) return nil, err } - // We set the ptr.TTL to the minimum TTL in case it is less than that. - ptr.TTL = max(ptr.TTL, uint32(c.success.minSuccessTTL/time.Second)) + // We set the result TTL to the minimum TTL in case it is less than that. + r.TTL = max(r.TTL, uint32(c.success.minSuccessTTL/time.Second)) - c.success.set(now, ip, ptr) - return ptr, nil + c.success.set(now, q, r) + return r, nil } func max(a, b uint32) uint32 { diff --git a/libbeat/processors/dns/cache_test.go b/libbeat/processors/dns/cache_test.go index fdc531c54fb..ffb081d9fcc 100644 --- a/libbeat/processors/dns/cache_test.go +++ b/libbeat/processors/dns/cache_test.go @@ -29,85 +29,85 @@ import ( type stubResolver struct{} -func (r *stubResolver) LookupPTR(ip string) (*PTR, error) { +func (r *stubResolver) Lookup(ip string, _ queryType) (*result, error) { switch ip { case gatewayIP: - return &PTR{Host: gatewayName, TTL: gatewayTTL}, nil + return &result{Data: []string{gatewayName}, TTL: gatewayTTL}, nil case gatewayIP + "1": return nil, io.ErrUnexpectedEOF case gatewayIP + "2": - return &PTR{Host: gatewayName, TTL: 0}, nil + return &result{Data: []string{gatewayName}, TTL: 0}, nil } return nil, &dnsError{"fake lookup returned NXDOMAIN"} } func TestCache(t *testing.T) { - c, err := NewPTRLookupCache( + c, err := newLookupCache( monitoring.NewRegistry(), - defaultConfig.CacheConfig, + defaultConfig().cacheConfig, &stubResolver{}) if err != nil { t.Fatal(err) } // Initial success query. - ptr, err := c.LookupPTR(gatewayIP) + r, err := c.Lookup(gatewayIP, typePTR) if assert.NoError(t, err) { - assert.EqualValues(t, gatewayName, ptr.Host) - assert.EqualValues(t, gatewayTTL, ptr.TTL) + assert.EqualValues(t, []string{gatewayName}, r.Data) + assert.EqualValues(t, gatewayTTL, r.TTL) assert.EqualValues(t, 0, c.stats.Hit.Get()) assert.EqualValues(t, 1, c.stats.Miss.Get()) } // Cached success query. - ptr, err = c.LookupPTR(gatewayIP) + r, err = c.Lookup(gatewayIP, typePTR) if assert.NoError(t, err) { - assert.EqualValues(t, gatewayName, ptr.Host) + assert.EqualValues(t, []string{gatewayName}, r.Data) // TTL counts down while in cache. - assert.InDelta(t, gatewayTTL, ptr.TTL, 1) + assert.InDelta(t, gatewayTTL, r.TTL, 1) assert.EqualValues(t, 1, c.stats.Hit.Get()) assert.EqualValues(t, 1, c.stats.Miss.Get()) } // Initial failure query (like a dns error response code). - ptr, err = c.LookupPTR(gatewayIP + "0") + r, err = c.Lookup(gatewayIP+"0", typePTR) if assert.Error(t, err) { - assert.Nil(t, ptr) + assert.Nil(t, r) assert.EqualValues(t, 1, c.stats.Hit.Get()) assert.EqualValues(t, 2, c.stats.Miss.Get()) } // Cached failure query. - ptr, err = c.LookupPTR(gatewayIP + "0") + r, err = c.Lookup(gatewayIP+"0", typePTR) if assert.Error(t, err) { - assert.Nil(t, ptr) + assert.Nil(t, r) assert.EqualValues(t, 2, c.stats.Hit.Get()) assert.EqualValues(t, 2, c.stats.Miss.Get()) } // Initial network failure (like I/O timeout). - ptr, err = c.LookupPTR(gatewayIP + "1") + r, err = c.Lookup(gatewayIP+"1", typePTR) if assert.Error(t, err) { - assert.Nil(t, ptr) + assert.Nil(t, r) assert.EqualValues(t, 2, c.stats.Hit.Get()) assert.EqualValues(t, 3, c.stats.Miss.Get()) } // Check for a cache hit for the network failure. - ptr, err = c.LookupPTR(gatewayIP + "1") + r, err = c.Lookup(gatewayIP+"1", typePTR) if assert.Error(t, err) { - assert.Nil(t, ptr) + assert.Nil(t, r) assert.EqualValues(t, 3, c.stats.Hit.Get()) assert.EqualValues(t, 3, c.stats.Miss.Get()) // Cache miss. } - minTTL := defaultConfig.CacheConfig.SuccessCache.MinTTL + minTTL := defaultConfig().cacheConfig.SuccessCache.MinTTL // Initial success returned TTL=0 with MinTTL. - ptr, err = c.LookupPTR(gatewayIP + "2") + r, err = c.Lookup(gatewayIP+"2", typePTR) if assert.NoError(t, err) { - assert.EqualValues(t, gatewayName, ptr.Host) + assert.EqualValues(t, []string{gatewayName}, r.Data) - assert.EqualValues(t, minTTL/time.Second, ptr.TTL) + assert.EqualValues(t, minTTL/time.Second, r.TTL) assert.EqualValues(t, 3, c.stats.Hit.Get()) assert.EqualValues(t, 4, c.stats.Miss.Get()) @@ -117,11 +117,11 @@ func TestCache(t *testing.T) { } // Cached success from a previous TTL=0 response. - ptr, err = c.LookupPTR(gatewayIP + "2") + r, err = c.Lookup(gatewayIP+"2", typePTR) if assert.NoError(t, err) { - assert.EqualValues(t, gatewayName, ptr.Host) + assert.EqualValues(t, []string{gatewayName}, r.Data) // TTL counts down while in cache. - assert.InDelta(t, minTTL/time.Second, ptr.TTL, 1) + assert.InDelta(t, minTTL/time.Second, r.TTL, 1) assert.EqualValues(t, 4, c.stats.Hit.Get()) assert.EqualValues(t, 4, c.stats.Miss.Get()) } diff --git a/libbeat/processors/dns/config.go b/libbeat/processors/dns/config.go index fb8a13eaf21..07aefe5303a 100644 --- a/libbeat/processors/dns/config.go +++ b/libbeat/processors/dns/config.go @@ -23,38 +23,40 @@ import ( "strings" "time" + "github.com/miekg/dns" + "github.com/elastic/elastic-agent-libs/mapstr" ) -// Config defines the configuration options for the DNS processor. -type Config struct { - CacheConfig `config:",inline"` +// config defines the configuration options for the DNS processor. +type config struct { + cacheConfig `config:",inline"` Nameservers []string `config:"nameservers"` // Required on Windows. /etc/resolv.conf is used if none are given. Timeout time.Duration `config:"timeout"` // Per request timeout (with 2 nameservers the total timeout would be 2x). - Type string `config:"type" validate:"required"` // Reverse is the only supported type currently. - Action FieldAction `config:"action"` // Append or replace (defaults to append) when target exists. + Type queryType `config:"type" validate:"required"` // One of A, AAAA, TXT or PTR (or reverse). + Action fieldAction `config:"action"` // Append or replace (defaults to append) when target exists. TagOnFailure []string `config:"tag_on_failure"` // Tags to append when a failure occurs. Fields mapstr.M `config:"fields"` // Mapping of source fields to target fields. Transport string `config:"transport"` // Can be tls or udp. reverseFlat map[string]string } -// FieldAction defines the behavior when the target field exists. -type FieldAction uint8 +// fieldAction defines the behavior when the target field exists. +type fieldAction uint8 -// List of FieldAction types. +// List of fieldAction types. const ( - ActionAppend FieldAction = iota - ActionReplace + actionAppend fieldAction = iota + actionReplace ) -var fieldActionNames = map[FieldAction]string{ - ActionAppend: "append", - ActionReplace: "replace", +var fieldActionNames = map[fieldAction]string{ + actionAppend: "append", + actionReplace: "replace", } // String returns a field action name. -func (fa FieldAction) String() string { +func (fa fieldAction) String() string { name, found := fieldActionNames[fa] if found { return name @@ -62,27 +64,62 @@ func (fa FieldAction) String() string { return "unknown (" + strconv.Itoa(int(fa)) + ")" } -// Unpack unpacks a string to a FieldAction. -func (fa *FieldAction) Unpack(v string) error { +// Unpack unpacks a string to a fieldAction. +func (fa *fieldAction) Unpack(v string) error { switch strings.ToLower(v) { case "", "append": - *fa = ActionAppend + *fa = actionAppend case "replace": - *fa = ActionReplace + *fa = actionReplace default: return fmt.Errorf("invalid dns field action value '%v'", v) } return nil } -// CacheConfig defines the success and failure caching parameters. -type CacheConfig struct { - SuccessCache CacheSettings `config:"success_cache"` - FailureCache CacheSettings `config:"failure_cache"` +// queryType represents a DNS query type. +type queryType uint16 + +const ( + typePTR = queryType(dns.TypePTR) + typeA = queryType(dns.TypeA) + typeAAAA = queryType(dns.TypeAAAA) + typeTXT = queryType(dns.TypeTXT) +) + +func (qt queryType) String() string { + if name := dns.TypeToString[uint16(qt)]; name != "" { + return name + } + return strconv.FormatUint(uint64(qt), 10) +} + +// Unpack unpacks a string to a queryType. +func (qt *queryType) Unpack(v string) error { + switch strings.ToLower(v) { + case "a": + *qt = typeA + case "aaaa": + *qt = typeAAAA + case "reverse", "ptr": + *qt = typePTR + case "txt": + *qt = typeTXT + default: + return fmt.Errorf("invalid dns lookup type '%s' specified in "+ + "config (valid values are: A, AAAA, PTR, reverse, TXT)", v) + } + return nil +} + +// cacheConfig defines the success and failure caching parameters. +type cacheConfig struct { + SuccessCache cacheSettings `config:"success_cache"` + FailureCache cacheSettings `config:"failure_cache"` } -// CacheSettings define the caching behavior for an individual cache. -type CacheSettings struct { +// cacheSettings define the caching behavior for an individual cache. +type cacheSettings struct { // TTL value for items in cache. Not used for success because we use TTL // from the DNS record. TTL time.Duration `config:"ttl"` @@ -99,16 +136,7 @@ type CacheSettings struct { } // Validate validates the data contained in the config. -func (c *Config) Validate() error { - // Validate lookup type. - c.Type = strings.ToLower(c.Type) - switch c.Type { - case "reverse": - default: - return fmt.Errorf("invalid dns lookup type '%v' specified in "+ - "config (valid values are: reverse)", c.Type) - } - +func (c *config) Validate() error { // Flatten the mapping of source fields to target fields. c.reverseFlat = map[string]string{} for k, v := range c.Fields.Flatten() { @@ -131,8 +159,8 @@ func (c *Config) Validate() error { return nil } -// Validate validates the data contained in the CacheConfig. -func (c *CacheConfig) Validate() error { +// Validate validates the data contained in the cacheConfig. +func (c *cacheConfig) Validate() error { if c.SuccessCache.MinTTL <= 0 { return fmt.Errorf("success_cache.min_ttl must be > 0") } @@ -157,20 +185,22 @@ func (c *CacheConfig) Validate() error { return nil } -var defaultConfig = Config{ - CacheConfig: CacheConfig{ - SuccessCache: CacheSettings{ - MinTTL: time.Minute, - InitialCapacity: 1000, - MaxCapacity: 10000, +func defaultConfig() config { + return config{ + cacheConfig: cacheConfig{ + SuccessCache: cacheSettings{ + MinTTL: time.Minute, + InitialCapacity: 1000, + MaxCapacity: 10000, + }, + FailureCache: cacheSettings{ + MinTTL: time.Minute, + TTL: time.Minute, + InitialCapacity: 1000, + MaxCapacity: 10000, + }, }, - FailureCache: CacheSettings{ - MinTTL: time.Minute, - TTL: time.Minute, - InitialCapacity: 1000, - MaxCapacity: 10000, - }, - }, - Transport: "udp", - Timeout: 500 * time.Millisecond, + Transport: "udp", + Timeout: 500 * time.Millisecond, + } } diff --git a/libbeat/processors/dns/dns.go b/libbeat/processors/dns/dns.go index ee8dd918ebc..d4f3d2ba57b 100644 --- a/libbeat/processors/dns/dns.go +++ b/libbeat/processors/dns/dns.go @@ -27,7 +27,7 @@ import ( "github.com/elastic/beats/v7/libbeat/common/atomic" "github.com/elastic/beats/v7/libbeat/processors" jsprocessor "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/processor" - "github.com/elastic/elastic-agent-libs/config" + 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/monitoring" @@ -44,14 +44,14 @@ func init() { } type processor struct { - Config - resolver PTRResolver + config + resolver resolver log *logp.Logger } // New constructs a new DNS processor. -func New(cfg *config.C) (beat.Processor, error) { - c := defaultConfig +func New(cfg *conf.C) (beat.Processor, error) { + c := defaultConfig() if err := cfg.Unpack(&c); err != nil { return nil, fmt.Errorf("fail to unpack the dns configuration: %w", err) } @@ -64,17 +64,17 @@ func New(cfg *config.C) (beat.Processor, error) { ) log.Debugf("DNS processor config: %+v", c) - resolver, err := NewMiekgResolver(metrics, c.Timeout, c.Transport, c.Nameservers...) + resolver, err := newMiekgResolver(metrics, c.Timeout, c.Transport, c.Nameservers...) if err != nil { return nil, err } - cache, err := NewPTRLookupCache(metrics.NewRegistry("cache"), c.CacheConfig, resolver) + cache, err := newLookupCache(metrics.NewRegistry("cache"), c.cacheConfig, resolver) if err != nil { return nil, err } - return &processor{Config: c, resolver: cache, log: log}, nil + return &processor{config: c, resolver: cache, log: log}, nil } func (p *processor) Run(event *beat.Event) (*beat.Event, error) { @@ -88,32 +88,36 @@ func (p *processor) Run(event *beat.Event) (*beat.Event, error) { return event, nil } -func (p *processor) processField(source, target string, action FieldAction, event *beat.Event) error { +func (p *processor) processField(source, target string, action fieldAction, event *beat.Event) error { v, err := event.GetValue(source) if err != nil { //nolint:nilerr // an empty source field isn't considered an error for this processor return nil } - maybeIP, ok := v.(string) + strVal, ok := v.(string) if !ok { return nil } - ptrRecord, err := p.resolver.LookupPTR(maybeIP) + result, err := p.resolver.Lookup(strVal, p.Type) if err != nil { - return fmt.Errorf("reverse lookup of %v value '%v' failed: %w", source, maybeIP, err) + return fmt.Errorf("dns lookup (%s) of %s value '%s' failed: %w", p.Type, source, strVal, err) } - return setFieldValue(action, event, target, ptrRecord.Host) + // PTR lookups return a scalar. All other lookup types return a string slice. + if p.Type == typePTR { + return setFieldValue(action, event, target, result.Data[0]) + } + return setFieldSliceValue(action, event, target, result.Data) } -func setFieldValue(action FieldAction, event *beat.Event, key string, value string) error { +func setFieldValue(action fieldAction, event *beat.Event, key, value string) error { switch action { - case ActionReplace: + case actionReplace: _, err := event.PutValue(key, value) return err - case ActionAppend: + case actionAppend: old, err := event.PutValue(key, value) if err != nil { return err @@ -129,7 +133,32 @@ func setFieldValue(action FieldAction, event *beat.Event, key string, value stri } return err default: - panic(fmt.Errorf("Unexpected dns field action value encountered: %v", action)) + panic(fmt.Errorf("unexpected dns field action value encountered: %s", action)) + } +} + +func setFieldSliceValue(action fieldAction, event *beat.Event, key string, value []string) error { + switch action { + case actionReplace: + _, err := event.PutValue(key, value) + return err + case actionAppend: + old, err := event.PutValue(key, value) + if err != nil { + return err + } + + if old != nil { + switch v := old.(type) { + case string: + _, err = event.PutValue(key, append([]string{v}, value...)) + case []string: + _, err = event.PutValue(key, append(v, value...)) + } + } + return err + default: + panic(fmt.Errorf("unexpected dns field action value encountered: %s", action)) } } diff --git a/libbeat/processors/dns/dns_test.go b/libbeat/processors/dns/dns_test.go index fa3b2d67f41..e4571cb4240 100644 --- a/libbeat/processors/dns/dns_test.go +++ b/libbeat/processors/dns/dns_test.go @@ -32,12 +32,14 @@ import ( ) func TestDNSProcessorRun(t *testing.T) { + c := defaultConfig() + c.Type = typePTR p := &processor{ - Config: defaultConfig, + config: c, resolver: &stubResolver{}, log: logp.NewLogger(logName), } - p.Config.reverseFlat = map[string]string{ + p.config.reverseFlat = map[string]string{ "source.ip": "source.domain", } t.Log(p.String()) @@ -58,7 +60,7 @@ func TestDNSProcessorRun(t *testing.T) { const forwardDomain = "www." + gatewayName t.Run("append", func(t *testing.T) { - p.Config.Action = ActionAppend + p.config.Action = actionAppend event, err := p.Run(&beat.Event{ Fields: mapstr.M{ @@ -77,7 +79,7 @@ func TestDNSProcessorRun(t *testing.T) { }) t.Run("replace", func(t *testing.T) { - p.Config.Action = ActionReplace + p.config.Action = actionReplace event, err := p.Run(&beat.Event{ Fields: mapstr.M{ @@ -94,13 +96,14 @@ func TestDNSProcessorRun(t *testing.T) { }) t.Run("metadata target", func(t *testing.T) { - config := defaultConfig + config := defaultConfig() + config.Type = typePTR config.reverseFlat = map[string]string{ "@metadata.ip": "@metadata.domain", } p := &processor{ - Config: config, + config: config, resolver: &stubResolver{}, log: logp.NewLogger(logName), } @@ -121,17 +124,16 @@ func TestDNSProcessorRun(t *testing.T) { assert.Equal(t, expMeta, newEvent.Meta) assert.Equal(t, event.Fields, newEvent.Fields) }) - } func TestDNSProcessorTagOnFailure(t *testing.T) { p := &processor{ - Config: defaultConfig, + config: defaultConfig(), resolver: &stubResolver{}, log: logp.NewLogger(logName), } - p.Config.TagOnFailure = []string{"_lookup_failed"} - p.Config.reverseFlat = map[string]string{ + p.config.TagOnFailure = []string{"_lookup_failed"} + p.config.reverseFlat = map[string]string{ "source.ip": "source.domain", "destination.ip": "destination.domain", } @@ -149,7 +151,7 @@ func TestDNSProcessorTagOnFailure(t *testing.T) { v, _ := event.GetValue("tags") if assert.Len(t, v, 1) { - assert.ElementsMatch(t, v, p.Config.TagOnFailure) + assert.ElementsMatch(t, v, p.config.TagOnFailure) } } @@ -157,14 +159,14 @@ func TestDNSProcessorRunInParallel(t *testing.T) { // This is a simple smoke test to make sure that there are no concurrency // issues. It is most effective when run with the race detector. - conf := defaultConfig + conf := defaultConfig() reg := monitoring.NewRegistry() - cache, err := NewPTRLookupCache(reg, conf.CacheConfig, &stubResolver{}) + cache, err := newLookupCache(reg, conf.cacheConfig, &stubResolver{}) if err != nil { t.Fatal(err) } - p := &processor{Config: conf, resolver: cache, log: logp.NewLogger(logName)} - p.Config.reverseFlat = map[string]string{"source.ip": "source.domain"} + p := &processor{config: conf, resolver: cache, log: logp.NewLogger(logName)} + p.config.reverseFlat = map[string]string{"source.ip": "source.domain"} const numGoroutines = 10 const numEvents = 500 diff --git a/libbeat/processors/dns/doc.go b/libbeat/processors/dns/doc.go index 8c895b26800..781d7e5284d 100644 --- a/libbeat/processors/dns/doc.go +++ b/libbeat/processors/dns/doc.go @@ -16,7 +16,7 @@ // under the License. // Package dns implements a processor that can perform DNS lookups by sending -// a DNS request over UDP to a recursive nameserver. Each instance of the +// a DNS request over UDP or TLS to a recursive nameserver. Each instance of the // processor is independent (no shared cache) so it's best to only define one // instance of the processor. // diff --git a/libbeat/processors/dns/docs/dns.asciidoc b/libbeat/processors/dns/docs/dns.asciidoc index 8d03e8b4c0a..9350b109a85 100644 --- a/libbeat/processors/dns/docs/dns.asciidoc +++ b/libbeat/processors/dns/docs/dns.asciidoc @@ -5,10 +5,10 @@ dns ++++ -The `dns` processor performs reverse DNS lookups of IP addresses. It caches the -responses that it receives in accordance to the time-to-live (TTL) value -contained in the response. It also caches failures that occur during lookups. -Each instance of this processor maintains its own independent cache. +The `dns` processor performs DNS queries. It caches the responses that it +receives in accordance to the time-to-live (TTL) value contained in the +response. It also caches failures that occur during lookups. Each instance +of this processor maintains its own independent cache. The processor uses its own DNS resolver to send requests to nameservers and does not use the operating system's resolver. It does not read any values contained @@ -24,6 +24,16 @@ throughput you can achieve is 500 events per second (1000 milliseconds / 2 milliseconds). If you have a high cache hit ratio then your throughput can be higher. +The processor can send the following query types: + +- `A` - IPv4 addresses +- `AAAA` - IPv6 addresses +- `TXT` - arbitrary human-readable text data +- `PTR` - reverse IP address lookups + +The output value is a list of strings for all query types except `PTR`. For +`PTR` queries the output value is a string. + This is a minimal configuration example that resolves the IP addresses contained in two fields. @@ -33,8 +43,8 @@ processors: - dns: type: reverse fields: - source.ip: source.hostname - destination.ip: destination.hostname + source.ip: source.domain + destination.ip: destination.domain ---- Next is a configuration example showing all options. @@ -47,8 +57,8 @@ processors: action: append transport: tls fields: - server.ip: server.hostname - client.ip: client.hostname + server.ip: server.domain + client.ip: client.domain success_cache: capacity.initial: 1000 capacity.max: 10000 @@ -64,8 +74,8 @@ processors: The `dns` processor has the following configuration settings: -`type`:: The type of DNS lookup to perform. The only supported type is -`reverse` which queries for a PTR record. +`type`:: The type of DNS query to perform. The supported types are `A`, `AAAA`, +`PTR` (or `reverse`), and `TXT`. `action`:: This defines the behavior of the processor when the target field already exists in the event. The options are `append` (default) and `replace`. @@ -82,8 +92,10 @@ the memory for this number of items. Default value is `1000`. cache can hold. When the maximum capacity is reached a random item is evicted. Default value is `10000`. -`success_cache.min_ttl`:: The duration of the minimum alternative cache TTL for successful DNS responses. Ensures that `TTL=0` successful reverse DNS responses can be cached. -Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". Default value is `1m`. +`success_cache.min_ttl`:: The duration of the minimum alternative cache TTL for +successful DNS responses. Ensures that `TTL=0` successful reverse DNS responses +can be cached. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". +Default value is `1m`. `failure_cache.capacity.initial`:: The initial number of items that the failure cache will be allocated to hold. When initialized the processor will allocate @@ -107,7 +119,7 @@ for each DNS request so if you have 2 nameservers then the total timeout will be "h". Default value is `500ms`. `tag_on_failure`:: A list of tags to add to the event when any lookup fails. The -tags are only added once even if multiple lookups fail. By default no tags are +tags are only added once even if multiple lookups fail. By default, no tags are added upon failure. `transport`:: The type of transport connection that should be used can either be diff --git a/libbeat/processors/dns/resolver.go b/libbeat/processors/dns/resolver.go index 7e0f160315c..537051c5a5a 100644 --- a/libbeat/processors/dns/resolver.go +++ b/libbeat/processors/dns/resolver.go @@ -19,6 +19,7 @@ package dns import ( "errors" + "math" "net" "strconv" "strings" @@ -34,20 +35,20 @@ import ( const etcResolvConf = "/etc/resolv.conf" -// PTR represents a DNS pointer record (IP to hostname). -type PTR struct { - Host string // Hostname. - TTL uint32 // Time to live in seconds. +// result represents a DNS lookup result. +type result struct { + Data []string // Hostname. + TTL uint32 // Time to live in seconds. } -// PTRResolver performs PTR record lookups. -type PTRResolver interface { - LookupPTR(ip string) (*PTR, error) +// resolver performs result record lookups. +type resolver interface { + Lookup(q string, qt queryType) (*result, error) } -// MiekgResolver is a PTRResolver that is implemented using github.com/miekg/dns +// miekgResolver is a resolver that is implemented using github.com/miekg/dns // to send requests to DNS servers. It does not use the Go resolver. -type MiekgResolver struct { +type miekgResolver struct { client *dns.Client servers []string @@ -57,14 +58,14 @@ type MiekgResolver struct { } type nameserverStats struct { - success *monitoring.Int // Number of responses from server. - failure *monitoring.Int // Number of failures (e.g. I/O timeout) (not NXDOMAIN). - ptrResponse metrics.Sample // Histogram of response times. + success *monitoring.Int // Number of responses from server. + failure *monitoring.Int // Number of failures (e.g. I/O timeout) (not NXDOMAIN). + requestDuration metrics.Sample // Histogram of response times. } -// NewMiekgResolver returns a new MiekgResolver. It returns an error if no +// newMiekgResolver returns a new miekgResolver. It returns an error if no // nameserver are given and none can be read from /etc/resolv.conf. -func NewMiekgResolver(reg *monitoring.Registry, timeout time.Duration, transport string, servers ...string) (*MiekgResolver, error) { +func newMiekgResolver(reg *monitoring.Registry, timeout time.Duration, transport string, servers ...string) (*miekgResolver, error) { // Use /etc/resolv.conf if no nameservers are given. (Won't work for Windows). if len(servers) == 0 { config, err := dns.ClientConfigFromFile(etcResolvConf) @@ -94,7 +95,7 @@ func NewMiekgResolver(reg *monitoring.Registry, timeout time.Duration, transport } if timeout == 0 { - timeout = defaultConfig.Timeout + timeout = defaultConfig().Timeout } var clientTransferType string @@ -105,7 +106,7 @@ func NewMiekgResolver(reg *monitoring.Registry, timeout time.Duration, transport clientTransferType = "udp" } - return &MiekgResolver{ + return &miekgResolver{ client: &dns.Client{ Net: clientTransferType, Timeout: timeout, @@ -129,37 +130,42 @@ func (e *dnsError) Error() string { return "dns: " + e.err } -// LookupPTR performs a reverse lookup on the given IP address. -func (res *MiekgResolver) LookupPTR(ip string) (*PTR, error) { +// Lookup performs a DNS query. +func (res *miekgResolver) Lookup(q string, qt queryType) (*result, error) { if len(res.servers) == 0 { return nil, errors.New("no dns servers configured") } - // Create PTR (reverse) DNS request. + // Create DNS request. m := new(dns.Msg) - arpa, err := dns.ReverseAddr(ip) - if err != nil { - return nil, err + switch qt { + case typePTR: + arpa, err := dns.ReverseAddr(q) + if err != nil { + return nil, err + } + m.SetQuestion(arpa, dns.TypePTR) + case typeA, typeAAAA, typeTXT: + m.SetQuestion(dns.Fqdn(q), uint16(qt)) } - m.SetQuestion(arpa, dns.TypePTR) m.RecursionDesired = true // Try the nameservers until we get a response. - var rtnErr error + var nameserverErr error for _, server := range res.servers { stats := res.getOrCreateNameserverStats(server) r, rtt, err := res.client.Exchange(m, server) if err != nil { - // Try next server if any. Otherwise return retErr. - rtnErr = err + // Try next server if any. Otherwise, return nameserverErr. + nameserverErr = err stats.failure.Inc() continue } // We got a response. stats.success.Inc() - stats.ptrResponse.Update(int64(rtt)) + stats.requestDuration.Update(int64(rtt)) if r.Rcode != dns.RcodeSuccess { name, found := dns.RcodeToString[r.Rcode] if !found { @@ -168,27 +174,48 @@ func (res *MiekgResolver) LookupPTR(ip string) (*PTR, error) { return nil, &dnsError{"nameserver " + server + " returned " + name} } + var rtn result + rtn.TTL = math.MaxUint32 for _, a := range r.Answer { - if ptr, ok := a.(*dns.PTR); ok { - return &PTR{ - Host: strings.TrimSuffix(ptr.Ptr, "."), - TTL: ptr.Hdr.Ttl, + // Ignore records that don't match the query type. + if a.Header().Rrtype != uint16(qt) { + continue + } + + switch rr := a.(type) { + case *dns.PTR: + return &result{ + Data: []string{strings.TrimSuffix(rr.Ptr, ".")}, + TTL: rr.Hdr.Ttl, }, nil + case *dns.A: + rtn.Data = append(rtn.Data, rr.A.String()) + rtn.TTL = min(rtn.TTL, rr.Hdr.Ttl) + case *dns.AAAA: + rtn.Data = append(rtn.Data, rr.AAAA.String()) + rtn.TTL = min(rtn.TTL, rr.Hdr.Ttl) + case *dns.TXT: + rtn.Data = append(rtn.Data, rr.Txt...) + rtn.TTL = min(rtn.TTL, rr.Hdr.Ttl) } } - return nil, &dnsError{"no PTR record was found in the response"} + if len(rtn.Data) == 0 { + return nil, &dnsError{"no " + qt.String() + " resource records were found in the response"} + } + + return &rtn, nil } - if rtnErr != nil { - return nil, rtnErr + if nameserverErr != nil { + return nil, nameserverErr } // This should never get here. - panic("LookupPTR should have returned a response.") + panic("dns resolver Lookup() should have returned a response.") } -func (res *MiekgResolver) getOrCreateNameserverStats(ns string) *nameserverStats { +func (res *miekgResolver) getOrCreateNameserverStats(ns string) *nameserverStats { // Trim port. ns = ns[:strings.LastIndex(ns, ":")] @@ -212,13 +239,22 @@ func (res *MiekgResolver) getOrCreateNameserverStats(ns string) *nameserverStats // Create stats for the nameserver. reg := res.registry.NewRegistry(strings.Replace(ns, ".", "_", -1)) stats = &nameserverStats{ - success: monitoring.NewInt(reg, "success"), - failure: monitoring.NewInt(reg, "failure"), - ptrResponse: metrics.NewUniformSample(1028), + success: monitoring.NewInt(reg, "success"), + failure: monitoring.NewInt(reg, "failure"), + requestDuration: metrics.NewUniformSample(1028), } - adapter.NewGoMetrics(reg, "response.ptr", adapter.Accept). - Register("histogram", metrics.NewHistogram(stats.ptrResponse)) + + //nolint:errcheck // Register should never fail because this is a new empty registry. + adapter.NewGoMetrics(reg, "request_duration", adapter.Accept). + Register("histogram", metrics.NewHistogram(stats.requestDuration)) res.nsStats[ns] = stats return stats } + +func min(a, b uint32) uint32 { + if a < b { + return a + } + return b +} diff --git a/libbeat/processors/dns/resolver_test.go b/libbeat/processors/dns/resolver_test.go index 1e2e56b8628..1786883a671 100644 --- a/libbeat/processors/dns/resolver_test.go +++ b/libbeat/processors/dns/resolver_test.go @@ -19,41 +19,45 @@ package dns import ( "crypto/tls" + "errors" "net" "strings" "testing" "github.com/miekg/dns" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/elastic/elastic-agent-libs/monitoring" ) -var _ PTRResolver = (*MiekgResolver)(nil) +var _ resolver = (*miekgResolver)(nil) func TestMiekgResolverLookupPTR(t *testing.T) { - stop, addr, err := ServeDNS(FakeDNSHandler) + stop, addr, err := serveDNS(fakeDNSHandler) if err != nil { t.Fatal(err) } - defer stop() + defer func() { + require.NoError(t, stop()) + }() reg := monitoring.NewRegistry() - res, err := NewMiekgResolver(reg.NewRegistry(logName), 0, "udp", addr) + res, err := newMiekgResolver(reg.NewRegistry(logName), 0, "udp", addr) if err != nil { t.Fatal(err) } // Success - ptr, err := res.LookupPTR("8.8.8.8") + ptr, err := res.Lookup("8.8.8.8", typePTR) if err != nil { t.Fatal(err) } - assert.EqualValues(t, "google-public-dns-a.google.com", ptr.Host) + assert.EqualValues(t, "google-public-dns-a.google.com", ptr.Data[0]) assert.EqualValues(t, 19273, ptr.TTL) // NXDOMAIN - _, err = res.LookupPTR("1.1.1.1") + _, err = res.Lookup("1.1.1.1", typePTR) if assert.Error(t, err) { assert.Contains(t, err.Error(), "NXDOMAIN") } @@ -70,42 +74,45 @@ func TestMiekgResolverLookupPTR(t *testing.T) { } func TestMiekgResolverLookupPTRTLS(t *testing.T) { - //Build Cert - cert, err := tls.X509KeyPair(CertPEMBlock, KeyPEMBlock) + // Build Cert + cert, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock) if err != nil { t.Fatalf("unable to build certificate: %v", err) } config := tls.Config{ Certificates: []tls.Certificate{cert}, + MinVersion: tls.VersionTLS13, } // serve TLS with cert - stop, addr, err := ServeDNSTLS(FakeDNSHandler, &config) + stop, addr, err := serveDNSTLS(fakeDNSHandler, &config) if err != nil { t.Fatal(err) } - defer stop() + defer func() { + require.NoError(t, stop()) + }() reg := monitoring.NewRegistry() - res, err := NewMiekgResolver(reg.NewRegistry(logName), 0, "tls", addr) + res, err := newMiekgResolver(reg.NewRegistry(logName), 0, "tls", addr) if err != nil { t.Fatal(err) } - // we use a self signed certificate for localhost - // we have to pass InsecureSSL to the DNS resolver + //nolint:gosec // Don't verify the self-signed cert. This is only for testing purposes. res.client.TLSConfig = &tls.Config{ InsecureSkipVerify: true, } + // Success - ptr, err := res.LookupPTR("8.8.8.8") + ptr, err := res.Lookup("8.8.8.8", typePTR) if err != nil { t.Fatal(err) } - assert.EqualValues(t, "google-public-dns-a.google.com", ptr.Host) + assert.EqualValues(t, "google-public-dns-a.google.com", ptr.Data[0]) assert.EqualValues(t, 19273, ptr.TTL) // NXDOMAIN - _, err = res.LookupPTR("1.1.1.1") + _, err = res.Lookup("1.1.1.1", typePTR) if assert.Error(t, err) { assert.Contains(t, err.Error(), "NXDOMAIN") } @@ -121,7 +128,7 @@ func TestMiekgResolverLookupPTRTLS(t *testing.T) { assert.Equal(t, 12, metricCount) } -func ServeDNS(h dns.HandlerFunc) (cancel func() error, addr string, err error) { +func serveDNS(h dns.HandlerFunc) (cancel func() error, addr string, err error) { // Setup listener on ephemeral port. a, err := net.ResolveUDPAddr("udp4", "localhost:0") @@ -136,11 +143,23 @@ func ServeDNS(h dns.HandlerFunc) (cancel func() error, addr string, err error) { var s dns.Server s.PacketConn = l s.Handler = h - go s.ActivateAndServe() - return s.Shutdown, s.PacketConn.LocalAddr().String(), err + + serveErr := make(chan error, 1) + go func() { + defer close(serveErr) + serveErr <- s.ActivateAndServe() + }() + + cancel = func() error { + return errors.Join( + s.Shutdown(), + <-serveErr, + ) + } + return cancel, s.PacketConn.LocalAddr().String(), err } -func ServeDNSTLS(h dns.HandlerFunc, config *tls.Config) (cancel func() error, addr string, err error) { +func serveDNSTLS(h dns.HandlerFunc, config *tls.Config) (cancel func() error, addr string, err error) { // Setup listener on ephemeral port. l, err := tls.Listen("tcp", "localhost:0", config) if err != nil { @@ -150,11 +169,23 @@ func ServeDNSTLS(h dns.HandlerFunc, config *tls.Config) (cancel func() error, ad var s dns.Server s.Handler = h s.Listener = l - go s.ActivateAndServe() - return s.Shutdown, l.Addr().String(), err + + serveErr := make(chan error, 1) + go func() { + defer close(serveErr) + serveErr <- s.ActivateAndServe() + }() + + cancel = func() error { + return errors.Join( + s.Shutdown(), + <-serveErr, + ) + } + return cancel, l.Addr().String(), err } -func FakeDNSHandler(w dns.ResponseWriter, msg *dns.Msg) { +func fakeDNSHandler(w dns.ResponseWriter, msg *dns.Msg) { m := new(dns.Msg) m.SetReply(msg) switch { @@ -164,11 +195,11 @@ func FakeDNSHandler(w dns.ResponseWriter, msg *dns.Msg) { default: m.SetRcode(msg, dns.RcodeNameError) } - w.WriteMsg(m) + _ = w.WriteMsg(m) } var ( - KeyPEMBlock = []byte(`-----BEGIN RSA PRIVATE KEY----- + keyPEMBlock = []byte(`-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA2g2zpEtWaIUx5o6MEnWnGsf0Ba1SDc3AwgOmxeNIPBJYVCrk sWe8Qt/5nymReVFcum76995ncr/zT+e4e8l+hXuGzTKZJpOj27Igb0/wa3j2hIcu rnbzfwkJ+KMag2UUKdSo31ChMU+64bwziEXunF347Ot7dBLtw3PJKbabNCP+/oil @@ -196,7 +227,7 @@ LatVl7h6ud25ZJYnP7DelGxHsZnDXNirLFlSB0CL4F6I5xNoBvCoH0Q8ckDSh4C7 tlAyD5m9gwvgdkNFWq6/lcUPxGksTtTk8dGnhJz8pGlZvp6+dZCM -----END RSA PRIVATE KEY-----`) - CertPEMBlock = []byte(`-----BEGIN CERTIFICATE----- + certPEMBlock = []byte(`-----BEGIN CERTIFICATE----- MIIDaTCCAlGgAwIBAgIQGqg47wLgbjwwrZASuakmwjANBgkqhkiG9w0BAQsFADAy MRQwEgYDVQQKEwtMb2cgQ291cmllcjEaMBgGA1UEAxMRYmVhdHMuZWxhc3RpYy5j b20wHhcNMjAwNjIzMDY0NDEwWhcNMjEwNjIzMDY0NDEwWjAyMRQwEgYDVQQKEwtM diff --git a/libbeat/processors/syslog/docs/syslog.asciidoc b/libbeat/processors/syslog/docs/syslog.asciidoc index 0cabf4f07f9..bf8af6a9283 100644 --- a/libbeat/processors/syslog/docs/syslog.asciidoc +++ b/libbeat/processors/syslog/docs/syslog.asciidoc @@ -5,7 +5,12 @@ syslog ++++ -experimental[] +The syslog processor parses RFC 3146 and/or RFC 5424 formatted syslog messages +that are stored in a field. The processor itself does not handle receiving syslog +messages from external sources. This is done through an input, such as the TCP +input. Certain integrations, when enabled through configuration, will embed the +syslog processor to process syslog messages, such as Custom TCP Logs and +Custom UDP Logs. [float] ==== Configuration diff --git a/libbeat/processors/translate_sid/docs/translate_sid.asciidoc b/libbeat/processors/translate_sid/docs/translate_sid.asciidoc index 9878e0667c0..09063b5a41b 100644 --- a/libbeat/processors/translate_sid/docs/translate_sid.asciidoc +++ b/libbeat/processors/translate_sid/docs/translate_sid.asciidoc @@ -5,8 +5,6 @@ translate_sid ++++ -beta[] - The `translate_sid` processor translates a Windows security identifier (SID) into an account name. It retrieves the name of the account associated with the SID, the first domain on which the SID is found, and the type of account. This diff --git a/libbeat/publisher/pipeline/client.go b/libbeat/publisher/pipeline/client.go index b47380befb1..c566a07942f 100644 --- a/libbeat/publisher/pipeline/client.go +++ b/libbeat/publisher/pipeline/client.go @@ -203,12 +203,10 @@ func (c *client) onPublished() { } func (c *client) onFilteredOut(e beat.Event) { - c.logger.Debugf("Pipeline client receives callback 'onFilteredOut' for event: %+v", e) c.observer.filteredEvent() } func (c *client) onDroppedOnPublish(e beat.Event) { - c.logger.Debugf("Pipeline client receives callback 'onDroppedOnPublish' for event: %+v", e) c.observer.failedPublishEvent() if c.clientListener != nil { c.clientListener.DroppedOnPublish(e) diff --git a/libbeat/reader/parser/parser_test.go b/libbeat/reader/parser/parser_test.go index 50b416a11d4..d49cf3f2fe0 100644 --- a/libbeat/reader/parser/parser_test.go +++ b/libbeat/reader/parser/parser_test.go @@ -367,6 +367,54 @@ func TestJSONParsersWithFields(t *testing.T) { }, }, }, + "JSON post processor with dotted target key": { + message: reader.Message{ + Content: []byte("{\"key\":\"value\"}"), + Fields: mapstr.M{}, + }, + config: map[string]interface{}{ + "parsers": []map[string]interface{}{ + map[string]interface{}{ + "ndjson": map[string]interface{}{ + "target": "kubernetes.audit", + }, + }, + }, + }, + expectedMessage: reader.Message{ + Content: []byte(""), + Fields: mapstr.M{ + "kubernetes": mapstr.M{ + "audit": mapstr.M{ + "key": "value", + }, + }, + }, + }, + }, + "JSON post processor with non-dotted target key": { + message: reader.Message{ + Content: []byte("{\"key\":\"value\"}"), + Fields: mapstr.M{}, + }, + config: map[string]interface{}{ + "parsers": []map[string]interface{}{ + map[string]interface{}{ + "ndjson": map[string]interface{}{ + "target": "kubernetes", + }, + }, + }, + }, + expectedMessage: reader.Message{ + Content: []byte(""), + Fields: mapstr.M{ + "kubernetes": mapstr.M{ + "key": "value", + }, + }, + }, + }, "JSON post processor with document ID": { message: reader.Message{ Content: []byte("{\"key\":\"value\", \"my-id-field\":\"my-id\"}"), diff --git a/heartbeat/monitors/syncpipeclient.go b/libbeat/reader/readfile/fs_metafields_other.go similarity index 57% rename from heartbeat/monitors/syncpipeclient.go rename to libbeat/reader/readfile/fs_metafields_other.go index 461d53293b2..425b7435fe8 100644 --- a/heartbeat/monitors/syncpipeclient.go +++ b/libbeat/reader/readfile/fs_metafields_other.go @@ -15,28 +15,33 @@ // specific language governing permissions and limitations // under the License. -package monitors +//go:build !windows -import "github.com/elastic/beats/v7/libbeat/beat" +package readfile -type SyncPipelineClientAdaptor struct { - C beat.Client -} +import ( + "fmt" + "os" -func (s SyncPipelineClientAdaptor) Publish(event beat.Event) error { - s.C.Publish(event) - return nil -} + "github.com/elastic/beats/v7/libbeat/common/file" + "github.com/elastic/elastic-agent-libs/mapstr" +) -func (s SyncPipelineClientAdaptor) PublishAll(events []beat.Event) error { - s.C.PublishAll(events) - return nil -} +const ( + deviceIDKey = "log.file.device_id" + inodeKey = "log.file.inode" +) -func (s SyncPipelineClientAdaptor) Close() error { - return s.C.Close() -} +func setFileSystemMetadata(fi os.FileInfo, fields mapstr.M) error { + osstate := file.GetOSState(fi) + _, err := fields.Put(deviceIDKey, osstate.Device) + if err != nil { + return fmt.Errorf("failed to set %q: %w", deviceIDKey, err) + } + _, err = fields.Put(inodeKey, osstate.Inode) + if err != nil { + return fmt.Errorf("failed to set %q: %w", inodeKey, err) + } -func (s SyncPipelineClientAdaptor) Wait() { - // intentionally blank, async pipelines should be empty + return nil } diff --git a/libbeat/reader/readfile/fs_metafields_windows.go b/libbeat/reader/readfile/fs_metafields_windows.go new file mode 100644 index 00000000000..113a74cf829 --- /dev/null +++ b/libbeat/reader/readfile/fs_metafields_windows.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. + +package readfile + +import ( + "fmt" + "os" + + "github.com/elastic/beats/v7/libbeat/common/file" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +const ( + idxhiKey = "log.file.idxhi" + idxloKey = "log.file.idxlo" + volKey = "log.file.vol" +) + +func setFileSystemMetadata(fi os.FileInfo, fields mapstr.M) error { + osstate := file.GetOSState(fi) + _, err := fields.Put(idxhiKey, osstate.IdxHi) + if err != nil { + return fmt.Errorf("failed to set %q: %w", idxhiKey, err) + } + _, err = fields.Put(idxloKey, osstate.IdxLo) + if err != nil { + return fmt.Errorf("failed to set %q: %w", idxloKey, err) + } + _, err = fields.Put(volKey, osstate.Vol) + if err != nil { + return fmt.Errorf("failed to set %q: %w", volKey, err) + } + + return nil +} diff --git a/libbeat/reader/readfile/metafields.go b/libbeat/reader/readfile/metafields.go index 5117bc6ec9b..c4c41e980f6 100644 --- a/libbeat/reader/readfile/metafields.go +++ b/libbeat/reader/readfile/metafields.go @@ -18,6 +18,9 @@ package readfile import ( + "fmt" + "os" + "github.com/elastic/beats/v7/libbeat/reader" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -25,15 +28,17 @@ import ( // Reader produces lines by reading lines from an io.Reader // through a decoder converting the reader it's encoding to utf-8. type FileMetaReader struct { - reader reader.Reader - path string - offset int64 + reader reader.Reader + path string + fi os.FileInfo + fingerprint string + offset int64 } // New creates a new Encode reader from input reader by applying // the given codec. -func NewFilemeta(r reader.Reader, path string, offset int64) reader.Reader { - return &FileMetaReader{r, path, offset} +func NewFilemeta(r reader.Reader, path string, fi os.FileInfo, fingerprint string, offset int64) reader.Reader { + return &FileMetaReader{r, path, fi, fingerprint, offset} } // Next reads the next line from it's initial io.Reader @@ -56,6 +61,17 @@ func (r *FileMetaReader) Next() (reader.Message, error) { }, }) + err = setFileSystemMetadata(r.fi, message.Fields) + if err != nil { + return message, fmt.Errorf("failed to set file system metadata: %w", err) + } + + if r.fingerprint != "" { + _, err = message.Fields.Put("log.file.fingerprint", r.fingerprint) + if err != nil { + return message, fmt.Errorf("failed to set fingerprint: %w", err) + } + } r.offset += int64(message.Bytes) return message, err diff --git a/libbeat/reader/readfile/metafields_other_test.go b/libbeat/reader/readfile/metafields_other_test.go new file mode 100644 index 00000000000..7874d24d4ae --- /dev/null +++ b/libbeat/reader/readfile/metafields_other_test.go @@ -0,0 +1,58 @@ +// 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 !windows + +package readfile + +import ( + "os" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/elastic/elastic-agent-libs/mapstr" +) + +func createTestFileInfo() os.FileInfo { + return testFileInfo{ + name: "filename", + size: 42, + time: time.Now(), + sys: &syscall.Stat_t{Dev: 17, Ino: 999}, + } +} + +func checkFields(t *testing.T, expected, actual mapstr.M) { + t.Helper() + + dev, err := actual.GetValue(deviceIDKey) + require.NoError(t, err) + require.Equal(t, uint64(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) + err = actual.Delete(inodeKey) + require.NoError(t, err) + + require.Equal(t, expected, actual) +} diff --git a/libbeat/reader/readfile/metafields_test.go b/libbeat/reader/readfile/metafields_test.go index 0bc4a2d72ec..e759368c268 100644 --- a/libbeat/reader/readfile/metafields_test.go +++ b/libbeat/reader/readfile/metafields_test.go @@ -18,8 +18,11 @@ package readfile import ( + "errors" "io" + "os" "testing" + "time" "github.com/stretchr/testify/require" @@ -27,19 +30,19 @@ import ( "github.com/elastic/elastic-agent-libs/mapstr" ) -func TestMetaFieldsOffset(t *testing.T) { +func TestMetaFields(t *testing.T) { messages := []reader.Message{ - reader.Message{ + { Content: []byte("my line"), Bytes: 7, Fields: mapstr.M{}, }, - reader.Message{ + { Content: []byte("my line again"), Bytes: 13, Fields: mapstr.M{}, }, - reader.Message{ + { Content: []byte(""), Bytes: 10, Fields: mapstr.M{}, @@ -48,10 +51,11 @@ func TestMetaFieldsOffset(t *testing.T) { path := "test/path" offset := int64(0) - in := &FileMetaReader{msgReader(messages), path, offset} + + in := &FileMetaReader{msgReader(messages), path, createTestFileInfo(), "hash", offset} for { msg, err := in.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } @@ -60,15 +64,18 @@ func TestMetaFieldsOffset(t *testing.T) { expectedFields = mapstr.M{ "log": mapstr.M{ "file": mapstr.M{ - "path": path, + "path": path, + "fingerprint": "hash", }, "offset": offset, }, } + checkFields(t, expectedFields, msg.Fields) + } else { + require.Equal(t, expectedFields, msg.Fields) } offset += int64(msg.Bytes) - require.Equal(t, expectedFields, msg.Fields) require.Equal(t, offset, in.offset) } } @@ -96,3 +103,17 @@ func (r *messageReader) Next() (reader.Message, error) { func (r *messageReader) Close() error { return nil } + +type testFileInfo struct { + name string + size int64 + time time.Time + sys interface{} +} + +func (t testFileInfo) Name() string { return t.name } +func (t testFileInfo) Size() int64 { return t.size } +func (t testFileInfo) Mode() os.FileMode { return 0 } +func (t testFileInfo) ModTime() time.Time { return t.time } +func (t testFileInfo) IsDir() bool { return false } +func (t testFileInfo) Sys() interface{} { return t.sys } diff --git a/libbeat/reader/readfile/metafields_windows_test.go b/libbeat/reader/readfile/metafields_windows_test.go new file mode 100644 index 00000000000..37ff5cb4bda --- /dev/null +++ b/libbeat/reader/readfile/metafields_windows_test.go @@ -0,0 +1,72 @@ +// 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 readfile + +import ( + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/elastic/elastic-agent-libs/mapstr" +) + +type winTestInfo struct { + testFileInfo + idxhi uint32 + idxlo uint32 + vol uint32 +} + +func createTestFileInfo() os.FileInfo { + return &winTestInfo{ + testFileInfo: testFileInfo{ + name: "filename", + size: 42, + time: time.Now(), + }, + idxhi: 100, + idxlo: 200, + vol: 300, + } +} + +func checkFields(t *testing.T, expected, actual mapstr.M) { + t.Helper() + + idxhi, err := actual.GetValue(idxhiKey) + require.NoError(t, err) + require.Equal(t, uint64(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) + err = actual.Delete(idxloKey) + require.NoError(t, err) + + vol, err := actual.GetValue(volKey) + require.NoError(t, err) + require.Equal(t, uint64(300), vol) + err = actual.Delete(volKey) + require.NoError(t, err) + + require.Equal(t, expected, actual) +} diff --git a/libbeat/reader/readjson/json.go b/libbeat/reader/readjson/json.go index f3690a79bb7..340503ec8f7 100644 --- a/libbeat/reader/readjson/json.go +++ b/libbeat/reader/readjson/json.go @@ -195,7 +195,9 @@ func (p *JSONParser) Next() (reader.Message, error) { message.Fields = event.Fields message.Meta = event.Meta } else { - message.AddFields(mapstr.M{p.target: jsonFields}) + fields := mapstr.M{} + fields.Put(p.target, jsonFields) + message.AddFields(fields) } return message, err diff --git a/libbeat/reader/syslog/rfc3164_test.go b/libbeat/reader/syslog/rfc3164_test.go index 2f14fd9e22b..d1c75fe574e 100644 --- a/libbeat/reader/syslog/rfc3164_test.go +++ b/libbeat/reader/syslog/rfc3164_test.go @@ -156,7 +156,7 @@ func TestParseRFC3164(t *testing.T) { hostname: "test-host", msg: "this is the message", }, - wantErr: `validation error at position 5: parsing time "24-08-2003T05:14:15-07:00" as "2006-01-02T15:04:05.999999999Z07:00": cannot parse "8-2003T05:14:15-07:00" as "2006"`, + wantErr: `validation error at position 5: parsing time "24-08-2003T05:14:15-07:00" as "2006-01-02T15:04:05.999999999Z07:00": cannot parse "24-08-2003T05:14:15-07:00" as "2006"`, }, "err-eof": { in: "<13>Oct 11 22:14:15 test-", diff --git a/libbeat/reader/syslog/rfc5424_test.go b/libbeat/reader/syslog/rfc5424_test.go index 539278a8c69..47cb9ee0e36 100644 --- a/libbeat/reader/syslog/rfc5424_test.go +++ b/libbeat/reader/syslog/rfc5424_test.go @@ -153,7 +153,7 @@ func TestParseRFC5424(t *testing.T) { msgID: "ID47", rawSDValue: `[exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"][examplePriority@32473 class="high"]`, }, - wantErr: `validation error at position 8: parsing time "10-11-2003T22:14:15.003Z" as "2006-01-02T15:04:05.999999999Z07:00": cannot parse "1-2003T22:14:15.003Z" as "2006"`, + wantErr: "validation error at position 8: parsing time \"10-11-2003T22:14:15.003Z\" as \"2006-01-02T15:04:05.999999999Z07:00\": cannot parse \"10-11-2003T22:14:15.003Z\" as \"2006\"", }, "err-eof": { in: `<13>1 2003-08-24T05:14:15.000003-07:00 test-host su 1234 msg-`, diff --git a/libbeat/tests/compose/compose.go b/libbeat/tests/compose/compose.go index 8588dcb19cd..14c2fe5bd3b 100644 --- a/libbeat/tests/compose/compose.go +++ b/libbeat/tests/compose/compose.go @@ -42,7 +42,7 @@ type HostInfo interface { } // EnsureUp starts all the requested services (must be defined in docker-compose.yml) -// with a default timeout of 300 seconds +// with a default timeout of 60 seconds. func EnsureUp(t testing.TB, service string, options ...UpOption) HostInfo { t.Helper() @@ -76,7 +76,7 @@ func EnsureUp(t testing.TB, service string, options ...UpOption) HostInfo { // Start container err := compose.Start(service, upOptions) if err != nil { - return fmt.Errorf("failed to start service '%s: %v", service, err) + return fmt.Errorf("failed to start service '%s': %w", service, err) } // Wait for health @@ -86,7 +86,7 @@ func EnsureUp(t testing.TB, service string, options ...UpOption) HostInfo { if inspectErr != nil { t.Logf("inspection error: %v", err) } else { - t.Logf("Container state (service: '%s'): %s", service, inspected) + t.Logf("container state (service: '%s'): %s", service, inspected) } return err @@ -102,8 +102,16 @@ func EnsureUp(t testing.TB, service string, options ...UpOption) HostInfo { break } t.Log(err) + // Ignore errors here - compose.Kill(service) + err = compose.Kill(service) + if err != nil { + t.Logf("kill container error: %v", err) + } + err = compose.Remove(service, true) + if err != nil { + t.Logf("remove container error: %v", err) + } } if err != nil { t.FailNow() diff --git a/libbeat/tests/compose/project.go b/libbeat/tests/compose/project.go index 685cc69ba42..13c3a9bac48 100644 --- a/libbeat/tests/compose/project.go +++ b/libbeat/tests/compose/project.go @@ -91,6 +91,7 @@ type Driver interface { Kill(ctx context.Context, signal string, service string) error KillOld(ctx context.Context, except []string) error Ps(ctx context.Context, filter ...string) ([]ContainerStatus, error) + Remove(ctx context.Context, service string, force bool) error Inspect(ctx context.Context, serviceName string) (string, error) LockFile() string @@ -213,15 +214,24 @@ func (c *Project) Kill(service string) error { return c.Driver.Kill(context.Background(), "KILL", service) } -// KillOld kills old containers +// Remove a container +func (c *Project) Remove(service string, force bool) error { + c.Lock() + defer c.Unlock() + + return c.Driver.Remove(context.Background(), service, force) +} + +// KillOld kills and removes old containers. func (c *Project) KillOld(except []string) error { // Do not kill ourselves ;) except = append(except, "beat") - // These services take very long to start up and stop. If they are stopped - // it can happen that an other package tries to start them at the same time - // which leads to a conflict. We need a better solution long term but that should - // solve the problem for now. + // These services take very long to start up and stop. If they are stopped, one or more + // packages may try to start them at the same time which would lead to a conflict. + // + // NOTE: We need a better solution long term but the current implementation should solve + // the problem for now. except = append(except, "elasticsearch", "kibana", "logstash", "kubernetes", "kafka") return c.Driver.KillOld(context.TODO(), except) @@ -265,7 +275,7 @@ func (c *Project) Lock() { } // This should rarely happen as we lock for start only, less than a second - panic(errors.New("Timeout waiting for lock")) + panic("timeout waiting for lock") } func acquireLock(path string) bool { @@ -277,7 +287,7 @@ func acquireLock(path string) bool { _, err = fmt.Fprintf(file, "%d", os.Getpid()) if err != nil { - panic(fmt.Errorf("Failed to write pid to lock file: %w", err)) + panic(fmt.Errorf("failed to write pid to lock file: %w", err)) } return true } diff --git a/libbeat/tests/compose/wrapper.go b/libbeat/tests/compose/wrapper.go index a0c40afd6de..68f0a670c90 100644 --- a/libbeat/tests/compose/wrapper.go +++ b/libbeat/tests/compose/wrapper.go @@ -36,9 +36,9 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/client" - "github.com/pkg/errors" "github.com/elastic/elastic-agent-autodiscover/docker" + "github.com/elastic/elastic-agent-libs/logp" ) const ( @@ -81,6 +81,9 @@ func (c *wrapperContainer) Running() bool { var statusOldRe = regexp.MustCompile(`(\d+) (minute|hour)s?`) +// Old returns true when info.Status indicates that container is more than +// 3 minutes old. +// Else, it returns false even when status is not in the expected format. func (c *wrapperContainer) Old() bool { match := statusOldRe.FindStringSubmatch(c.info.Status) if len(match) < 3 { @@ -149,11 +152,15 @@ func (d *wrapperDriver) LockFile() string { } func (d *wrapperDriver) Close() error { - return errors.Wrap(d.client.Close(), "failed to close wrapper driver") + err := d.client.Close() + if err != nil { + return fmt.Errorf("failed to close wrapper driver: %w", err) + } + return nil } func (d *wrapperDriver) cmd(ctx context.Context, command string, arg ...string) *exec.Cmd { - var args []string + args := make([]string, 0, 4+len(d.Files)+len(arg)) // preallocate as much as possible args = append(args, "--no-ansi", "--project-name", d.Name) for _, f := range d.Files { args = append(args, "--file", f) @@ -231,7 +238,7 @@ func writeToContainer(ctx context.Context, cli *client.Client, id, filename, con opts := types.CopyToContainerOptions{} err = cli.CopyToContainer(ctx, id, filepath.Dir(filename), bytes.NewReader(buf.Bytes()), opts) if err != nil { - return errors.Wrapf(err, "failed to copy environment to container %s", id) + return fmt.Errorf("failed to copy environment to container %s: %w", id, err) } return nil } @@ -260,6 +267,10 @@ func (d *wrapperDriver) setupAdvertisedHost(ctx context.Context, service string, return nil } +// Kill force stops the service containers based on the SIGNAL provided. +// If SIGKILL is used, then termination happens immediately whereas SIGTERM +// is used for graceful termination. +// See: https://docs.docker.com/engine/reference/commandline/compose_kill/ func (d *wrapperDriver) Kill(ctx context.Context, signal string, service string) error { var args []string @@ -274,6 +285,23 @@ func (d *wrapperDriver) Kill(ctx context.Context, signal string, service string) return d.cmd(ctx, "kill", args...).Run() } +// Remove removes the stopped service containers. Removal of the containers can be forced as +// well where no confirmation of removal is required. +// See: https://docs.docker.com/engine/reference/commandline/compose_rm/ +func (d *wrapperDriver) Remove(ctx context.Context, service string, force bool) error { + var args []string + + if force { + args = append(args, "-f") + } + + if service != "" { + args = append(args, service) + } + + return d.cmd(ctx, "rm", args...).Run() +} + func (d *wrapperDriver) Ps(ctx context.Context, filter ...string) ([]ContainerStatus, error) { containers, err := d.containers(ctx, Filter{State: AnyState}, filter...) if err != nil { @@ -341,12 +369,19 @@ func (d *wrapperDriver) containers(ctx context.Context, projectFilter Filter, fi // KillOld is a workaround for issues in CI with heavy load caused by having too many // running containers. -// It kills all containers not related to services in `except`. +// It kills and removes all containers except the excluded services in 'except'. func (d *wrapperDriver) KillOld(ctx context.Context, except []string) error { list, err := d.client.ContainerList(ctx, types.ContainerListOptions{All: true}) if err != nil { return fmt.Errorf("listing containers to be killed: %w", err) } + + rmOpts := types.ContainerRemoveOptions{ + RemoveVolumes: true, + Force: true, + RemoveLinks: true, + } + for _, container := range list { container := wrapperContainer{info: container} serviceName, ok := container.info.Labels[labelComposeService] @@ -355,9 +390,13 @@ func (d *wrapperDriver) KillOld(ctx context.Context, except []string) error { } if container.Running() && container.Old() { - d.client.ContainerKill(ctx, container.info.ID, "KILL") + err = d.client.ContainerRemove(ctx, container.info.ID, rmOpts) + if err != nil { + logp.Err("container remove: %v", err) + } } } + return nil } diff --git a/libbeat/tests/integration/base_test.go b/libbeat/tests/integration/base_test.go new file mode 100644 index 00000000000..38bebb59f2c --- /dev/null +++ b/libbeat/tests/integration/base_test.go @@ -0,0 +1,209 @@ +// 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 integration + +import ( + "runtime" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestBase(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + mockbeat.Stop() + mockbeat.WaitForLogs("mockbeat stopped.", 30*time.Second) +} + +func TestSigHUP(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("sighup not supported on windows") + } + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + err := mockbeat.Process.Signal(syscall.SIGHUP) + require.NoErrorf(t, err, "error sending SIGHUP to mockbeat") + mockbeat.Stop() + mockbeat.WaitForLogs("mockbeat stopped.", 30*time.Second) +} + +func TestNoConfig(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("error loading config file", 10*time.Second) +} + +func TestInvalidConfig(t *testing.T) { + cfg := ` +test: + test were + : invalid yml +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("error loading config file", 10*time.Second) +} + +func TestInvalidCLI(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-d", "config", "-E", "output.console=invalid") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("error unpacking config data", 10*time.Second) +} + +func TestConsoleOutput(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-e") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdErrContains("mockbeat start running.", 10*time.Second) + mockbeat.WaitStdOutContains("Mockbeat is alive", 10*time.Second) +} + +func TestConsoleBulkMaxSizeOutput(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false + bulk_max_size: 1 +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-e") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdErrContains("mockbeat start running.", 10*time.Second) + mockbeat.WaitStdOutContains("Mockbeat is alive", 10*time.Second) +} + +func TestLoggingMetrics(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +logging: + metrics: + period: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-e") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdErrContains("mockbeat start running.", 10*time.Second) + mockbeat.WaitStdErrContains("Non-zero metrics in the last", 10*time.Second) + mockbeat.Stop() + mockbeat.WaitStdErrContains("Total metrics", 10*time.Second) +} + +func TestPersistentUuid(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-e") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdErrContains("mockbeat start running.", 10*time.Second) + + metaFile1, err := mockbeat.LoadMeta() + require.NoError(t, err, "error opening meta.json file") + mockbeat.Stop() + mockbeat.WaitStdErrContains("Beat ID: "+metaFile1.UUID.String(), 10*time.Second) + mockbeat.Start() + mockbeat.WaitStdErrContains("mockbeat start running.", 10*time.Second) + metaFile2, err := mockbeat.LoadMeta() + require.Equal(t, metaFile1.UUID.String(), metaFile2.UUID.String()) +} diff --git a/libbeat/tests/integration/ca_pinning_test.go b/libbeat/tests/integration/ca_pinning_test.go new file mode 100644 index 00000000000..51e098885ea --- /dev/null +++ b/libbeat/tests/integration/ca_pinning_test.go @@ -0,0 +1,89 @@ +// 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 integration + +import ( + "fmt" + "path/filepath" + "testing" + "time" +) + +func TestCAPinningGoodSHA(t *testing.T) { + EnsureESIsRunning(t) + esURL := GetESURL(t, "https") + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + caPath := filepath.Join(mockbeat.TempDir(), "../../../../", "testing", "environments", "docker", "elasticsearch", "pki", "ca", "ca.crt") + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.elasticsearch: + hosts: + - %s + username: admin + password: testing + allow_older_versions: true + ssl: + verification_mode: certificate + certificate_authorities: %s + ca_sha256: FDFOtqdUyXZw74YgvAJUC+I67ED1WfcI1qK44Qy2WQM= +` + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), caPath)) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + mockbeat.WaitForLogs("PublishEvents: 1 events have been published", 60*time.Second) +} + +func TestCAPinningBadSHA(t *testing.T) { + EnsureESIsRunning(t) + esURL := GetESURL(t, "https") + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + caPath := filepath.Join(mockbeat.TempDir(), "../../../../", "testing", "environments", "docker", "elasticsearch", "pki", "ca", "ca.crt") + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.elasticsearch: + hosts: + - %s + username: admin + password: testing + allow_older_versions: true + ssl: + verification_mode: certificate + certificate_authorities: %s + ca_sha256: bad +` + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), caPath)) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + mockbeat.WaitForLogs("provided CA certificate pins doesn't match any of the certificate authorities used to validate the certificate", 60*time.Second) +} diff --git a/libbeat/tests/integration/cmd_completion_test.go b/libbeat/tests/integration/cmd_completion_test.go new file mode 100644 index 00000000000..ee79b48a683 --- /dev/null +++ b/libbeat/tests/integration/cmd_completion_test.go @@ -0,0 +1,55 @@ +// 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 integration + +import ( + "testing" + "time" +) + +func TestShellCompletion(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + tests := map[string]struct { + shell string + expected string + }{ + "bash completion": {shell: "bash", expected: "bash completion for mockbeat"}, + "zsh completion": {shell: "zsh", expected: "zsh completion for mockbeat"}, + "awesomeshell": {shell: "awesomeshell", expected: "Unknown shell awesomeshell"}, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "completion", tc.shell) + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdOutContains(tc.expected, 10*time.Second) + }) + } +} diff --git a/libbeat/tests/integration/cmd_export_config_test.go b/libbeat/tests/integration/cmd_export_config_test.go new file mode 100644 index 00000000000..9d5b5b73590 --- /dev/null +++ b/libbeat/tests/integration/cmd_export_config_test.go @@ -0,0 +1,61 @@ +// 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 integration + +import ( + "testing" + "time" +) + +func TestExportConfig(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "export", "config") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdOutContains("events: 4096", 10*time.Second) +} + +func TestExportConfigEnvVar(t *testing.T) { + cfg := ` +mockbeat: +name: ${GOOS} +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "export", "config") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdOutContains("name: ${GOOS}", 10*time.Second) +} diff --git a/libbeat/tests/integration/cmd_keystore_test.go b/libbeat/tests/integration/cmd_keystore_test.go new file mode 100644 index 00000000000..eb4b697cafa --- /dev/null +++ b/libbeat/tests/integration/cmd_keystore_test.go @@ -0,0 +1,215 @@ +// 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 integration + +import ( + "fmt" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +var cfg = ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +keystore: + path: %s +` + +func TestKeystoreCreate(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "keystore", "create") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start() + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + require.FileExists(t, keystorePath) +} + +func TestKeystoreCreateForce(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "keystore", "create", "--force") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start() + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + mockbeat.Stop() + require.FileExists(t, keystorePath) + keystore1, err := os.ReadFile(keystorePath) + require.NoError(t, err) + + mockbeat.Start() + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + require.FileExists(t, keystorePath) + keystore2, err := os.ReadFile(keystorePath) + require.NoError(t, err) + require.NotEqual(t, keystore1, keystore2, "keystores should be different") +} + +func TestKeystoreRemoveNoKeyNoKeystore(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "keystore", "remove", "mykey") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start() + mockbeat.WaitStdErrContains("keystore doesn't exist.", 10*time.Second) +} + +func TestKeystoreRemoveNoExistingKey(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start("keystore", "create") + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + mockbeat.Stop() + + mockbeat.Start("keystore", "remove", "mykey") + mockbeat.WaitStdErrContains("could not find key 'mykey' in the keystore", 10*time.Second) +} + +func TestKeystoreRemoveMultipleExistingKeys(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start("keystore", "create") + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + mockbeat.Stop() + + mockbeat.Start("keystore", "add", "key1", "--stdin") + fmt.Fprintf(os.Stdin, "pass1") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key2", "--stdin") + fmt.Fprintf(os.Stdin, "pass2") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key3", "--stdin") + fmt.Fprintf(os.Stdin, "pass3") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "remove", "key2", "key3") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "list") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("key1", 10*time.Second) +} + +func TestKeystoreList(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start("keystore", "create") + mockbeat.WaitStdOutContains("Created mockbeat keystore", 10*time.Second) + mockbeat.Stop() + + mockbeat.Start("keystore", "add", "key1", "--stdin") + fmt.Fprintf(os.Stdin, "pass1") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key2", "--stdin") + fmt.Fprintf(os.Stdin, "pass2") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key3", "--stdin") + fmt.Fprintf(os.Stdin, "pass3") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "list") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.WaitStdOutContains("key1", 10*time.Second) + mockbeat.WaitStdOutContains("key2", 10*time.Second) + mockbeat.WaitStdOutContains("key3", 10*time.Second) +} + +func TestKeystoreListEmptyKeystore(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start("keystore", "list") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") +} + +func TestKeystoreAddSecretFromStdin(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + + mockbeat.Start("keystore", "create") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key1", "--stdin") + fmt.Fprintf(os.Stdin, "pass1") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") +} + +func TestKeystoreUpdateForce(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + keystorePath := filepath.Join(mockbeat.TempDir(), "test.keystore") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, keystorePath)) + mockbeat.Start("keystore", "create") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key1", "--stdin") + fmt.Fprintf(os.Stdin, "pass1") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + mockbeat.Start("keystore", "add", "key1", "--force", "--stdin") + fmt.Fprintf(os.Stdin, "pass2") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") +} diff --git a/libbeat/tests/integration/cmd_setup_index_management_test.go b/libbeat/tests/integration/cmd_setup_index_management_test.go new file mode 100644 index 00000000000..f099b692445 --- /dev/null +++ b/libbeat/tests/integration/cmd_setup_index_management_test.go @@ -0,0 +1,150 @@ +// 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 integration + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +var IdxMgmtCfg = ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +logging: + level: debug +output.elasticsearch: + hosts: + - %s + username: admin + password: testing + allow_older_versions: true + ` + +func TestSetupIdxMgmt(t *testing.T) { + EnsureESIsRunning(t) + esURL := GetESURL(t, "http") + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + t.Cleanup(func() { + dsURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, dsURL) + require.NoError(t, err) + }) + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(IdxMgmtCfg, esURL.String())) + mockbeat.Start("setup", "--index-management", "-v", "-e") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + require.True(t, isTemplateLoaded(t, dataStream)) + require.True(t, isIndexPatternSet(t, "mockbeat-9.9.9")) + require.True(t, isPolicyCreated(t, policy)) +} + +func TestSetupTemplateDisabled(t *testing.T) { + EnsureESIsRunning(t) + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + esURL := GetESURL(t, "http") + t.Cleanup(func() { + dsURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, dsURL) + require.NoError(t, err) + }) + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(IdxMgmtCfg, esURL.String())) + mockbeat.Start("setup", "--index-management", "-v", "-e") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + require.True(t, isTemplateLoaded(t, dataStream)) + require.True(t, isIndexPatternSet(t, "mockbeat-9.9.9")) + require.True(t, isPolicyCreated(t, policy)) +} + +func isTemplateLoaded(t *testing.T, dataStream string) bool { + esURL := GetESURL(t, "http") + indexURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + status, body, err := HttpDo(t, http.MethodGet, indexURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var r IndexTemplateResult + json.Unmarshal(body, &r) + for _, t := range r.IndexTemplates { + if t.Name == dataStream { + return true + } + } + return false +} + +func isIndexPatternSet(t *testing.T, dataStream string) bool { + esURL := GetESURL(t, "http") + indexURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + status, body, err := HttpDo(t, http.MethodGet, indexURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var r IndexTemplateResult + json.Unmarshal(body, &r) + for _, t := range r.IndexTemplates { + if t.Name == dataStream { + for _, p := range t.IndexTemplate.IndexPatterns { + if p == dataStream { + return true + } + } + } + } + return false +} + +func isPolicyCreated(t *testing.T, policy string) bool { + esURL := GetESURL(t, "http") + policyURL, err := FormatPolicyURL(t, esURL, policy) + require.NoError(t, err) + status, body, err := HttpDo(t, http.MethodGet, policyURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + if !strings.Contains(string(body), "max_primary_shard_size\":\"50gb") { + return false + } + if !strings.Contains(string(body), "max_age\":\"30d") { + return false + } + return true +} diff --git a/libbeat/tests/integration/cmd_test.go b/libbeat/tests/integration/cmd_test.go new file mode 100644 index 00000000000..08953740014 --- /dev/null +++ b/libbeat/tests/integration/cmd_test.go @@ -0,0 +1,87 @@ +// 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 integration + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +var CmdTestCfg = ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.elasticsearch: + hosts: + - %s + username: admin + password: testing +` + +func TestCmdTest(t *testing.T) { + esURL := GetESURL(t, "http") + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(CmdTestCfg, esURL.String())) + mockbeat.Start("test", "config") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("Config OK", 10*time.Second) +} + +func TestCmdTestNoConfig(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.Start("test", "config") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") +} + +func TestCmdTestOutput(t *testing.T) { + esURL := GetESURL(t, "http") + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(CmdTestCfg, esURL.String())) + mockbeat.Start("test", "output") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("parse url... OK", 10*time.Second) + mockbeat.WaitStdOutContains("TLS... WARN secure connection disabled", 10*time.Second) + mockbeat.WaitStdOutContains("talk to server... OK", 10*time.Second) +} + +func TestCmdTestOutputBadHost(t *testing.T) { + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(CmdTestCfg, "badhost:9200")) + mockbeat.Start("test", "output") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("parse url... OK", 10*time.Second) + mockbeat.WaitStdOutContains("dns lookup... ERROR", 10*time.Second) +} diff --git a/libbeat/tests/integration/cmd_version_test.go b/libbeat/tests/integration/cmd_version_test.go new file mode 100644 index 00000000000..2c078f79c2f --- /dev/null +++ b/libbeat/tests/integration/cmd_version_test.go @@ -0,0 +1,52 @@ +// 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 integration + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestCmdVersion(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: true +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start("version") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("mockbeat", 10*time.Second) + mockbeat.WaitStdOutContains("version", 10*time.Second) + mockbeat.WaitStdOutContains("9.9.9", 10*time.Second) +} diff --git a/libbeat/tests/integration/dashboard_test.go b/libbeat/tests/integration/dashboard_test.go new file mode 100644 index 00000000000..9eaf9fa5c1c --- /dev/null +++ b/libbeat/tests/integration/dashboard_test.go @@ -0,0 +1,213 @@ +// 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 integration + +import ( + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDashboardLoadSkip(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + kURL, _ := GetKibana(t) + esURL := GetESURL(t, "http") + mockbeat.Start("setup", + "--dashboards", + "-E", "setup.dashboards.file="+filepath.Join("./testdata", "testbeat-no-dashboards.zip"), + "-E", "setup.dashboards.beat=testbeat", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-E", "output.elasticsearch.hosts=['"+esURL.String()+"']", + "-E", "output.elasticsearch.username=admin", + "-E", "output.elasticsearch.password=testing", + "-E", "output.file.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("Skipping loading dashboards", 10*time.Second) +} + +func TestDashboardLoad(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + kURL, _ := GetKibana(t) + esURL := GetESURL(t, "http") + mockbeat.Start("setup", + "--dashboards", + "-E", "setup.dashboards.file="+filepath.Join("./testdata", "testbeat-dashboards.zip"), + "-E", "setup.dashboards.beat=testbeat", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-E", "output.elasticsearch.hosts=['"+esURL.String()+"']", + "-E", "output.elasticsearch.username=admin", + "-E", "output.elasticsearch.password=testing", + "-E", "output.file.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitForLogs("Kibana dashboards successfully loaded", 30*time.Second) +} + +func TestDashboardLoadIndexOnly(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + kURL, _ := GetKibana(t) + esURL := GetESURL(t, "http") + mockbeat.Start("setup", + "--dashboards", + "-E", "setup.dashboards.file="+filepath.Join("./testdata", "testbeat-dashboards.zip"), + "-E", "setup.dashboards.beat=testbeat", + "-E", "setup.dashboards.only_index=true", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-E", "output.elasticsearch.hosts=['"+esURL.String()+"']", + "-E", "output.elasticsearch.username=admin", + "-E", "output.elasticsearch.password=testing", + "-E", "output.file.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitForLogs("Kibana dashboards successfully loaded", 30*time.Second) +} + +func TestDashboardExportById(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + kURL, _ := GetKibana(t) + esURL := GetESURL(t, "http") + mockbeat.Start("setup", + "--dashboards", + "-E", "setup.dashboards.file="+filepath.Join("./testdata", "testbeat-dashboards.zip"), + "-E", "setup.dashboards.beat=testbeat", + "-E", "setup.dashboards.only_index=true", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-E", "output.elasticsearch.hosts=['"+esURL.String()+"']", + "-E", "output.elasticsearch.username=admin", + "-E", "output.elasticsearch.password=testing", + "-E", "output.file.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitForLogs("Kibana dashboards successfully loaded", 30*time.Second) + + mockbeat.Start("export", + "dashboard", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-id", "Metricbeat-system-overview", + "-folder", filepath.Join(mockbeat.TempDir(), "system-overview")) + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + dbPath := filepath.Join(mockbeat.TempDir(), "system-overview", "_meta", "kibana", "8", "dashboard", "Metricbeat-system-overview.json") + require.FileExists(t, dbPath, "dashboard file not exported") + b, err := os.ReadFile(dbPath) + require.NoError(t, err) + require.Contains(t, string(b), "Metricbeat-system-overview") +} + +func TestDashboardExportByUnknownId(t *testing.T) { + cfg := ` +mockbeat: +name: +logging: + level: debug +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + kURL, _ := GetKibana(t) + mockbeat.Start("export", + "dashboard", + "-E", "setup.kibana.protocol=http", + "-E", "setup.kibana.host="+kURL.Hostname(), + "-E", "setup.kibana.port="+kURL.Port(), + "-E", "setup.kibana.username=beats", + "-E", "setup.kibana.password=testing", + "-id", "No-such-dashboard", + "-folder", filepath.Join(mockbeat.TempDir(), "system-overview")) + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") +} diff --git a/libbeat/tests/integration/framework.go b/libbeat/tests/integration/framework.go index 7514a9a5bcb..4c2e0935bca 100644 --- a/libbeat/tests/integration/framework.go +++ b/libbeat/tests/integration/framework.go @@ -22,41 +22,90 @@ package integration import ( "bufio" "context" + "encoding/json" + "errors" "fmt" "io" + "io/ioutil" "net/http" "net/url" "os" - "os/exec" "path/filepath" + "regexp" "strings" + "sync" "testing" "time" + "github.com/gofrs/uuid" "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/common/atomic" ) type BeatProc struct { - Binary string - Args []string - Cmd *exec.Cmd - t *testing.T - tempDir string - configFile string - beatName string - logFileOffset int64 + Args []string + baseArgs []string + Binary string + RestartOnBeatOnExit bool + beatName string + cmdMutex sync.Mutex + configFile string + fullPath string + logFileOffset int64 + t *testing.T + tempDir string + stdout *os.File + stderr *os.File + Process *os.Process +} + +type Meta struct { + UUID uuid.UUID `json:"uuid"` + FirstStart time.Time `json:"first_start"` +} + +type IndexTemplateResult struct { + IndexTemplates []IndexTemplateEntry `json:"index_templates"` +} + +type IndexTemplateEntry struct { + Name string `json:"name"` + IndexTemplate IndexTemplate `json:"index_template"` +} + +type IndexTemplate struct { + IndexPatterns []string `json:"index_patterns"` +} + +type SearchResult struct { + Hits Hits `json:"hits"` +} + +type Hits struct { + Total Total `json:"total"` +} + +type Total struct { + Value int `json:"value"` } // NewBeat createa a new Beat process from the system tests binary. // It sets some required options like the home path, logging, etc. // `tempDir` will be used as home and logs directory for the Beat // `args` will be passed as CLI arguments to the Beat -func NewBeat(t *testing.T, beatName, binary string, args ...string) BeatProc { +func NewBeat(t *testing.T, beatName, binary string, args ...string) *BeatProc { + require.FileExistsf(t, binary, "beat binary must exists") tempDir := createTempDir(t) configFile := filepath.Join(tempDir, beatName+".yml") + stdoutFile, err := os.Create(filepath.Join(tempDir, "stdout")) + require.NoError(t, err, "error creating stdout file") + stderrFile, err := os.Create(filepath.Join(tempDir, "stderr")) + require.NoError(t, err, "error creating stderr file") p := BeatProc{ Binary: binary, - Args: append([]string{ + baseArgs: append([]string{ + beatName, "--systemTest", "--path.home", tempDir, "--path.logs", tempDir, @@ -67,32 +116,178 @@ func NewBeat(t *testing.T, beatName, binary string, args ...string) BeatProc { beatName: beatName, configFile: configFile, t: t, + stdout: stdoutFile, + stderr: stderrFile, } - return p + t.Cleanup(func() { + if !t.Failed() { + return + } + var maxlen int64 = 2048 + stderr, err := readLastNBytes(filepath.Join(tempDir, "stderr"), maxlen) + if err != nil { + t.Logf("error reading stderr: %s", err) + } + t.Logf("Last %d bytes of stderr:\n%s", len(stderr), string(stderr)) + + stdout, err := readLastNBytes(filepath.Join(tempDir, "stdout"), maxlen) + if err != nil { + t.Logf("error reading stdout: %s", err) + } + t.Logf("Last %d bytes of stdout:\n%s", len(stdout), string(stdout)) + + glob := fmt.Sprintf("%s-*.ndjson", filepath.Join(tempDir, beatName)) + files, err := filepath.Glob(glob) + for _, f := range files { + contents, err := readLastNBytes(f, maxlen) + if err != nil { + t.Logf("error reading %s: %s", f, err) + } + t.Logf("Last %d bytes of %s:\n%s", len(contents), f, string(contents)) + } + }) + return &p } // Start starts the Beat process -// args are extra arguments to be passed to the Beat +// args are extra arguments to be passed to the Beat. func (b *BeatProc) Start(args ...string) { t := b.t - b.Args = append(b.Args, args...) fullPath, err := filepath.Abs(b.Binary) if err != nil { t.Fatalf("could not get full path from %q, err: %s", b.Binary, err) } - b.Cmd = exec.Command(fullPath, b.Args...) - if err := b.Cmd.Start(); err != nil { - t.Fatalf("could not start process: %s", err) + b.fullPath = fullPath + b.Args = append(b.baseArgs, args...) + + done := atomic.MakeBool(false) + wg := sync.WaitGroup{} + if b.RestartOnBeatOnExit { + wg.Add(1) + go func() { + defer wg.Done() + for !done.Load() { + b.startBeat() + b.waitBeatToExit() + } + }() + } else { + b.startBeat() } + t.Cleanup(func() { - pid := b.Cmd.Process.Pid - if err := b.Cmd.Process.Signal(os.Interrupt); err != nil { - t.Fatalf("could not stop process with PID: %d, err: %s", pid, err) + b.cmdMutex.Lock() + // 1. Kill the Beat + if err := b.Process.Signal(os.Interrupt); err != nil { + if !errors.Is(err, os.ErrProcessDone) { + t.Fatalf("could not stop process with PID: %d, err: %s", + b.Process.Pid, err) + } + } + + // Make sure the goroutine restarting the Beat has exited + if b.RestartOnBeatOnExit { + // 2. Set the done flag so the goroutine loop can exit + done.Store(true) + // 3. Release the mutex, keeping it locked + // until now ensures a new process won't + // start. Lock must be released before + // wg.Wait() or there is a possibility of + // deadlock. + b.cmdMutex.Unlock() + // 4. Wait for the goroutine to finish, this helps ensuring + // no other Beat process was started + wg.Wait() + } else { + b.cmdMutex.Unlock() } }) } +// startBeat starts the Beat process. This method +// does not block nor waits the Beat to finish. +func (b *BeatProc) startBeat() { + b.cmdMutex.Lock() + defer b.cmdMutex.Unlock() + b.stdout.Seek(0, 0) + b.stdout.Truncate(0) + b.stderr.Seek(0, 0) + b.stderr.Truncate(0) + var procAttr os.ProcAttr + procAttr.Files = []*os.File{os.Stdin, b.stdout, b.stderr} + process, err := os.StartProcess(b.fullPath, b.Args, &procAttr) + require.NoError(b.t, err, "error starting beat process") + b.Process = process +} + +// waitBeatToExit blocks until the Beat exits, it returns +// the process' exit code. +// `startBeat` must be called before this method. +func (b *BeatProc) waitBeatToExit() int { + processState, err := b.Process.Wait() + if err != nil { + b.t.Fatalf("error waiting for %q to finish: %s. Exit code: %d", + b.beatName, err, processState.ExitCode()) + } + + return processState.ExitCode() +} + +// Stop stops the Beat process +// Start adds Cleanup function to stop when test ends, only run this if you want to inspect logs after beat shutsdown +func (b *BeatProc) Stop() { + b.cmdMutex.Lock() + defer b.cmdMutex.Unlock() + if err := b.Process.Signal(os.Interrupt); err != nil { + if errors.Is(err, os.ErrProcessDone) { + return + } + b.t.Fatalf("could not stop process with PID: %d, err: %s", b.Process.Pid, err) + } +} + +// LogMatch tests each line of the logfile to see if contains any +// match of the provided regular expression. It will open the log +// file on every call, read until EOF, then close it. LogContains +// will be faster so use that if possible. +func (b *BeatProc) LogMatch(match string) bool { + re := regexp.MustCompile(match) + logFile := b.openLogFile() + _, err := logFile.Seek(b.logFileOffset, os.SEEK_SET) + if err != nil { + b.t.Fatalf("could not set offset for '%s': %s", logFile.Name(), err) + } + + defer func() { + if err := logFile.Close(); err != nil { + // That's not quite a test error, but it can impact + // next executions of LogContains, so treat it as an error + b.t.Errorf("could not close log file: %s", err) + } + }() + + r := bufio.NewReader(logFile) + for { + data, err := r.ReadBytes('\n') + line := string(data) + b.logFileOffset += int64(len(data)) + + if err != nil { + if err != io.EOF { + b.t.Fatalf("error reading log file '%s': %s", logFile.Name(), err) + } + break + } + + if re.MatchString(line) { + return true + } + } + + return false +} + // LogContains looks for `s` as a substring of every log line, // it will open the log file on every call, read it until EOF, // then close it. @@ -105,11 +300,6 @@ func (b *BeatProc) LogContains(s string) bool { } defer func() { - offset, err := logFile.Seek(0, os.SEEK_CUR) - if err != nil { - t.Fatalf("could not read offset for '%s': %s", logFile.Name(), err) - } - b.logFileOffset = offset if err := logFile.Close(); err != nil { // That's not quite a test error, but it can impact // next executions of LogContains, so treat it as an error @@ -119,13 +309,17 @@ func (b *BeatProc) LogContains(s string) bool { r := bufio.NewReader(logFile) for { - line, err := r.ReadString('\n') + data, err := r.ReadBytes('\n') + line := string(data) + b.logFileOffset += int64(len(data)) + if err != nil { if err != io.EOF { t.Fatalf("error reading log file '%s': %s", logFile.Name(), err) } break } + if strings.Contains(line, s) { return true } @@ -156,11 +350,12 @@ func (b *BeatProc) TempDir() string { // WriteConfigFile writes the provided configuration string cfg to a file. // This file will be used as the configuration file for the Beat. func (b *BeatProc) WriteConfigFile(cfg string) { - if err := os.WriteFile(b.configFile, []byte(cfg), 0644); err != nil { + if err := os.WriteFile(b.configFile, []byte(cfg), 0o644); err != nil { b.t.Fatalf("cannot create config file '%s': %s", b.configFile, err) } b.Args = append(b.Args, "-c", b.configFile) + b.baseArgs = append(b.baseArgs, "-c", b.configFile) } // openLogFile opens the log file for reading and returns it. @@ -213,17 +408,17 @@ func createTempDir(t *testing.T) string { t.Fatal(err) } - if err := os.MkdirAll(tempDir, 0766); err != nil { + if err := os.MkdirAll(tempDir, 0o766); err != nil { t.Fatalf("cannot create tmp dir: %s, msg: %s", err, err.Error()) } - t.Logf("Temporary directory: %s", tempDir) cleanup := func() { if !t.Failed() { if err := os.RemoveAll(tempDir); err != nil { t.Errorf("could not remove temp dir '%s': %s", tempDir, err) } - t.Logf("Temporary directory '%s' removed", tempDir) + } else { + t.Logf("Temporary directory saved: %s", tempDir) } } t.Cleanup(cleanup) @@ -235,6 +430,85 @@ func createTempDir(t *testing.T) string { // using the default test credentials or the corresponding environment // variables. func EnsureESIsRunning(t *testing.T) { + esURL := GetESURL(t, "http") + + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(500*time.Second)) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, esURL.String(), nil) + if err != nil { + t.Fatalf("cannot create request to ensure ES is running: %s", err) + } + + u := esURL.User.Username() + p, _ := esURL.User.Password() + req.SetBasicAuth(u, p) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + // If you're reading this message, you probably forgot to start ES + // run `mage compose:Up` from Filebeat's folder to start all + // containers required for integration tests + t.Fatalf("cannot execute HTTP request to ES: '%s', check to make sure ES is running (mage compose:Up)", err) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("unexpected HTTP status: %d, expecting 200 - OK", resp.StatusCode) + } +} + +func (b *BeatProc) FileContains(filename string, match string) string { + file, err := os.Open(filename) + require.NoErrorf(b.t, err, "error opening: %s", filename) + r := bufio.NewReader(file) + for { + line, err := r.ReadString('\n') + if err != nil { + if err != io.EOF { + b.t.Fatalf("error reading log file '%s': %s", file.Name(), err) + } + break + } + if strings.Contains(line, match) { + return line + } + } + return "" +} + +func (b *BeatProc) WaitFileContains(filename string, match string, waitFor time.Duration) string { + var returnValue string + require.Eventuallyf(b.t, + func() bool { + returnValue = b.FileContains(filename, match) + return returnValue != "" + }, waitFor, 100*time.Millisecond, "match string '%s' not found in %s", match, filename) + + return returnValue +} + +func (b *BeatProc) WaitStdErrContains(match string, waitFor time.Duration) string { + return b.WaitFileContains(b.stderr.Name(), match, waitFor) +} + +func (b *BeatProc) WaitStdOutContains(match string, waitFor time.Duration) string { + return b.WaitFileContains(b.stdout.Name(), match, waitFor) +} + +func (b *BeatProc) LoadMeta() (Meta, error) { + m := Meta{} + metaFile, err := os.Open(filepath.Join(b.TempDir(), "data", "meta.json")) + if err != nil { + return m, err + } + defer metaFile.Close() + + metaBytes, err := ioutil.ReadAll(metaFile) + require.NoError(b.t, err, "error reading meta file") + err = json.Unmarshal(metaBytes, &m) + require.NoError(b.t, err, "error unmarshalling meta data") + return m, nil +} + +func GetESURL(t *testing.T, scheme string) url.URL { t.Helper() esHost := os.Getenv("ES_HOST") @@ -244,41 +518,140 @@ func EnsureESIsRunning(t *testing.T) { esPort := os.Getenv("ES_PORT") if esPort == "" { - esPort = "9200" + switch scheme { + case "http": + esPort = "9200" + case "https": + esPort = "9201" + default: + t.Fatalf("could not determine port from env variable: ES_PORT=%s", esPort) + } + } + + user := os.Getenv("ES_USER") + if user == "" { + user = "admin" + } + + pass := os.Getenv("ES_PASS") + if pass == "" { + pass = "testing" } esURL := url.URL{ - Scheme: "http", + Scheme: scheme, Host: fmt.Sprintf("%s:%s", esHost, esPort), + User: url.UserPassword(user, pass), } + return esURL +} - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(500*time.Second)) - defer cancel() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, esURL.String(), nil) +func GetKibana(t *testing.T) (url.URL, *url.Userinfo) { + t.Helper() + + kibanaHost := os.Getenv("KIBANA_HOST") + if kibanaHost == "" { + kibanaHost = "localhost" + } + + kibanaPort := os.Getenv("KIBANA_PORT") + if kibanaPort == "" { + kibanaPort = "5601" + } + + kibanaURL := url.URL{ + Scheme: "http", + Host: fmt.Sprintf("%s:%s", kibanaHost, kibanaPort), + } + kibanaUser := url.UserPassword("beats", "testing") + return kibanaURL, kibanaUser +} + +func HttpDo(t *testing.T, method string, targetURL url.URL) (statusCode int, body []byte, err error) { + t.Helper() + client := &http.Client{} + req, err := http.NewRequest(method, targetURL.String(), nil) if err != nil { - t.Fatalf("cannot create request to ensure ES is running: %s", err) + return 0, nil, fmt.Errorf("error making request, method: %s, url: %s, error: %w", method, targetURL.String(), err) } - user := os.Getenv("ES_USER") - if user == "" { - user = "admin" + resp, err := client.Do(req) + if err != nil { + return 0, nil, fmt.Errorf("error doing request, method: %s, url: %s, error: %w", method, targetURL.String(), err) } + defer resp.Body.Close() + body, err = io.ReadAll(resp.Body) - pass := os.Getenv("ES_PASS") - if pass == "" { - pass = "testing" + if err != nil { + return resp.StatusCode, nil, fmt.Errorf("error reading request, method: %s, url: %s, status code: %d", method, targetURL.String(), resp.StatusCode) } + return resp.StatusCode, body, nil +} - req.SetBasicAuth(user, pass) +func FormatDatastreamURL(t *testing.T, srcURL url.URL, dataStream string) (url.URL, error) { + t.Helper() + path, err := url.JoinPath("/_data_stream", dataStream) + if err != nil { + return url.URL{}, fmt.Errorf("error joining data_stream path: %w", err) + } + srcURL.Path = path + return srcURL, nil +} - resp, err := http.DefaultClient.Do(req) +func FormatIndexTemplateURL(t *testing.T, srcURL url.URL, template string) (url.URL, error) { + t.Helper() + path, err := url.JoinPath("/_index_template", template) if err != nil { - // If you're reading this message, you probably forgot to start ES - // run `mage compose:Up` from Filebeat's folder to start all - // containers required for integration tests - t.Fatalf("cannot execute HTTP request to ES: %s", err) + return url.URL{}, fmt.Errorf("error joining index_template path: %w", err) } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected HTTP status: %d, expecting 200 - OK", resp.StatusCode) + srcURL.Path = path + return srcURL, nil +} + +func FormatPolicyURL(t *testing.T, srcURL url.URL, policy string) (url.URL, error) { + t.Helper() + path, err := url.JoinPath("/_ilm/policy", policy) + if err != nil { + return url.URL{}, fmt.Errorf("error joining ilm policy path: %w", err) + } + srcURL.Path = path + return srcURL, nil +} + +func FormatRefreshURL(t *testing.T, srcURL url.URL) url.URL { + t.Helper() + srcURL.Path = "/_refresh" + return srcURL +} + +func FormatDataStreamSearchURL(t *testing.T, srcURL url.URL, dataStream string) (url.URL, error) { + t.Helper() + path, err := url.JoinPath("/", dataStream, "_search") + if err != nil { + return url.URL{}, fmt.Errorf("error joining ilm policy path: %w", err) + } + srcURL.Path = path + return srcURL, nil +} + +func readLastNBytes(filename string, numBytes int64) ([]byte, error) { + f, err := os.Open(filename) + if err != nil { + return nil, fmt.Errorf("error opening %s: %w", filename, err) + } + fInfo, err := f.Stat() + if err != nil { + return nil, fmt.Errorf("error stating %s: %w", filename, err) + } + var startPosition int64 + if fInfo.Size() >= numBytes { + startPosition = fInfo.Size() - numBytes + } else { + startPosition = 0 + } + _, err = f.Seek(startPosition, io.SeekStart) + if err != nil { + return nil, fmt.Errorf("error seeking to %d in %s: %w", startPosition, filename, err) } + return io.ReadAll(f) } diff --git a/libbeat/tests/integration/http_test.go b/libbeat/tests/integration/http_test.go new file mode 100644 index 00000000000..bb2f7bde924 --- /dev/null +++ b/libbeat/tests/integration/http_test.go @@ -0,0 +1,150 @@ +// 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 integration + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +type Stats struct { + Libbeat Libbeat `json:"libbeat"` +} + +type Libbeat struct { + Config Config `json:"config"` +} + +type Config struct { + Scans int `json:"scans"` +} + +func TestHttpRoot(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-E", "http.enabled=true") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("Starting stats endpoint", 60*time.Second) + + r, err := http.Get("http://localhost:5066") + require.NoError(t, err) + require.Equal(t, http.StatusOK, r.StatusCode, "incorrect status code") + + body, err := ioutil.ReadAll(r.Body) + require.NoError(t, err) + var m map[string]interface{} + err = json.Unmarshal(body, &m) + + require.NoError(t, err) + require.Equal(t, "mockbeat", m["beat"]) + require.Equal(t, "9.9.9", m["version"]) +} + +func TestHttpStats(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-E", "http.enabled=true") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("Starting stats endpoint", 60*time.Second) + + r, err := http.Get("http://localhost:5066/stats") + require.NoError(t, err) + require.Equal(t, http.StatusOK, r.StatusCode, "incorrect status code") + + body, err := ioutil.ReadAll(r.Body) + require.NoError(t, err) + var m Stats + + // Setting the value to 1 to make sure 'body' does have 0 in it + m.Libbeat.Config.Scans = 1 + err = json.Unmarshal(body, &m) + + require.NoError(t, err) + require.Equal(t, 0, m.Libbeat.Config.Scans) +} + +func TestHttpError(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-E", "http.enabled=true") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("Starting stats endpoint", 60*time.Second) + + r, err := http.Get("http://localhost:5066/not-exist") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, r.StatusCode, "incorrect status code") +} + +func TestHttpPProfDisabled(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-E", "http.enabled=true") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("Starting stats endpoint", 60*time.Second) + + r, err := http.Get("http://localhost:5066/debug/pprof/") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, r.StatusCode, "incorrect status code") +} diff --git a/libbeat/tests/integration/logging_test.go b/libbeat/tests/integration/logging_test.go new file mode 100644 index 00000000000..3e7b6fdb83a --- /dev/null +++ b/libbeat/tests/integration/logging_test.go @@ -0,0 +1,77 @@ +// 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 integration + +import ( + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLoggingConsoleECS(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test", "-e") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + line := mockbeat.WaitStdErrContains("ecs.version", 60*time.Second) + + var m map[string]any + require.NoError(t, json.Unmarshal([]byte(line), &m), "Unmarshaling log line as json") + + _, ok := m["log.level"] + assert.True(t, ok) + + _, ok = m["@timestamp"] + assert.True(t, ok) + + _, ok = m["message"] + assert.True(t, ok) +} + +func TestLoggingFileDefault(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitStdOutContains("Mockbeat is alive!", 60*time.Second) +} diff --git a/libbeat/tests/integration/meta_test.go b/libbeat/tests/integration/meta_test.go new file mode 100644 index 00000000000..e4fc44afb4c --- /dev/null +++ b/libbeat/tests/integration/meta_test.go @@ -0,0 +1,69 @@ +// 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 integration + +import ( + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestMetaFileExists(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + _, err := os.Stat(mockbeat.TempDir() + "/data/meta.json") + require.NoError(t, err) +} + +func TestMetaFilePermissions(t *testing.T) { + cfg := ` +mockbeat: +name: +queue.mem: + events: 4096 + flush.min_events: 8 + flush.timeout: 0.1s +output.console: + code.json: + pretty: false +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + stat, err := os.Stat(mockbeat.TempDir() + "/data/meta.json") + require.NoError(t, err) + require.Equal(t, stat.Mode().String(), "-rw-------") +} diff --git a/libbeat/tests/integration/mockserver.go b/libbeat/tests/integration/mockserver.go new file mode 100644 index 00000000000..0a396cb7839 --- /dev/null +++ b/libbeat/tests/integration/mockserver.go @@ -0,0 +1,137 @@ +// 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 integration + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + + "github.com/elastic/beats/v7/libbeat/version" + "github.com/elastic/elastic-agent-client/v7/pkg/client" + "github.com/elastic/elastic-agent-client/v7/pkg/client/mock" + "github.com/elastic/elastic-agent-client/v7/pkg/proto" +) + +// unitKey is used to identify a unique unit in a map +// the `ID` of a unit in itself is not unique without its type, only `Type` + `ID` is unique +type unitKey struct { + Type client.UnitType + ID string +} + +// NewMockServer creates a GRPC server to mock the Elastic-Agent. +// On the first check in call it will send the first element of `unit` +// as the expected unit, on successive calls, if the Beat has reached +// that state, it will move on to sending the next state. +// It will also validate the features. +// +// if `observedCallback` is not nil, it will be called on every +// check in receiving the `proto.CheckinObserved` sent by the +// Beat and index from `units` that was last sent to the Beat. +// +// If `delay` is not zero, when the Beat state matches the last +// sent units, the server will wait for `delay` before sending the +// the next state. This will block the check in call from the Beat. +func NewMockServer( + units [][]*proto.UnitExpected, + featuresIdxs []uint64, + features []*proto.Features, + observedCallback func(*proto.CheckinObserved, int), + delay time.Duration, +) *mock.StubServerV2 { + i := 0 + agentInfo := &proto.CheckinAgentInfo{ + Id: "elastic-agent-id", + Version: version.GetDefaultVersion(), + Snapshot: true, + } + return &mock.StubServerV2{ + CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { + if observedCallback != nil { + observedCallback(observed, i) + } + matches := doesStateMatch(observed, units[i], featuresIdxs[i]) + if !matches { + // send same set of units and features + return &proto.CheckinExpected{ + AgentInfo: agentInfo, + Units: units[i], + Features: features[i], + FeaturesIdx: featuresIdxs[i], + } + } + // delay sending next expected based on delay + if delay > 0 { + <-time.After(delay) + } + // send next set of units and features + i += 1 + if i >= len(units) { + // stay on last index + i = len(units) - 1 + } + return &proto.CheckinExpected{ + AgentInfo: agentInfo, + Units: units[i], + Features: features[i], + FeaturesIdx: featuresIdxs[i], + } + }, + ActionImpl: func(response *proto.ActionResponse) error { + // actions not tested here + return nil + }, + ActionsChan: make(chan *mock.PerformAction, 100), + } +} + +func doesStateMatch( + observed *proto.CheckinObserved, + expectedUnits []*proto.UnitExpected, + expectedFeaturesIdx uint64, +) bool { + if len(observed.Units) != len(expectedUnits) { + return false + } + expectedMap := make(map[unitKey]*proto.UnitExpected) + for _, exp := range expectedUnits { + expectedMap[unitKey{client.UnitType(exp.Type), exp.Id}] = exp + } + for _, unit := range observed.Units { + exp, ok := expectedMap[unitKey{client.UnitType(unit.Type), unit.Id}] + if !ok { + return false + } + if unit.State != exp.State || unit.ConfigStateIdx != exp.ConfigStateIdx { + return false + } + } + + return observed.FeaturesIdx == expectedFeaturesIdx +} + +func RequireNewStruct(t *testing.T, v map[string]interface{}) *structpb.Struct { + str, err := structpb.NewStruct(v) + if err != nil { + require.NoError(t, err, "could not convert map[string]interface{} into structpb") + } + return str +} diff --git a/libbeat/tests/integration/template_test.go b/libbeat/tests/integration/template_test.go new file mode 100644 index 00000000000..aec46e448b9 --- /dev/null +++ b/libbeat/tests/integration/template_test.go @@ -0,0 +1,644 @@ +// 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 integration + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +// Test that beat stops in case elasticsearch index is modified and pattern not +func TestIndexModified(t *testing.T) { + mockbeatConfigWithIndex := ` +mockbeat: +output: + elasticsearch: + index: test +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(mockbeatConfigWithIndex) + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("setup.template.name and setup.template.pattern have to be set if index name is modified", 60*time.Second) +} + +// Test that beat starts running if elasticsearch output is set +func TestIndexNotModified(t *testing.T) { + EnsureESIsRunning(t) + mockbeatConfigWithES := ` +mockbeat: +output: + elasticsearch: + hosts: %s +` + esUrl := GetESURL(t, "http") + cfg := fmt.Sprintf(mockbeatConfigWithES, esUrl.String()) + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) +} + +// Test that beat stops in case elasticsearch index is modified and pattern not +func TestIndexModifiedNoPattern(t *testing.T) { + cfg := ` +mockbeat: +output: + elasticsearch: + index: test +setup.template: + name: test +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("setup.template.name and setup.template.pattern have to be set if index name is modified", 60*time.Second) +} + +// Test that beat stops in case elasticsearch index is modified and name not +func TestIndexModifiedNoName(t *testing.T) { + cfg := ` +mockbeat: +output: + elasticsearch: + index: test +setup.template: + pattern: test +` + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + procState, err := mockbeat.Process.Wait() + require.NoError(t, err, "error waiting for mockbeat to exit") + require.Equal(t, 1, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdErrContains("setup.template.name and setup.template.pattern have to be set if index name is modified", 60*time.Second) +} + +// Test that beat starts running if elasticsearch output with modified index and pattern and name are set +func TestIndexWithPatternName(t *testing.T) { + EnsureESIsRunning(t) + mockbeatConfigWithES := ` +mockbeat: +output: + elasticsearch: + hosts: %s +setup.template: + name: test + pattern: test-* +` + + esUrl := GetESURL(t, "http") + cfg := fmt.Sprintf(mockbeatConfigWithES, esUrl.String()) + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) +} + +// Test loading of json based template +func TestJsonTemplate(t *testing.T) { + EnsureESIsRunning(t) + _, err := os.Stat("../files/template.json") + require.NoError(t, err) + + templateName := "bla" + mockbeatConfigWithES := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +setup.template: + name: test + pattern: test-* + overwrite: true + json: + enabled: true + path: %s + name: %s +logging: + level: debug +` + + // prepare the config + pwd, err := os.Getwd() + path := filepath.Join(pwd, "../files/template.json") + esUrl := GetESURL(t, "http") + user := esUrl.User.Username() + pass, _ := esUrl.User.Password() + cfg := fmt.Sprintf(mockbeatConfigWithES, esUrl.String(), user, pass, path, templateName) + + // start mockbeat and wait for the relevant log lines + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + msg := "Loading json template from file" + mockbeat.WaitForLogs(msg, 60*time.Second) + msg = "Template with name \\\"bla\\\" loaded." + mockbeat.WaitForLogs(msg, 60*time.Second) + + // check effective changes in ES + indexURL, err := FormatIndexTemplateURL(t, esUrl, templateName) + require.NoError(t, err) + status, body, err := HttpDo(t, http.MethodGet, indexURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var m IndexTemplateResult + err = json.Unmarshal(body, &m) + require.NoError(t, err) + require.Equal(t, len(m.IndexTemplates), 1) +} + +// Test run cmd with default settings for template +func TestTemplateDefault(t *testing.T) { + EnsureESIsRunning(t) + + mockbeatConfigWithES := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +logging: + level: debug +` + datastream := "mockbeat-9.9.9" + + // prepare the config + esUrl := GetESURL(t, "http") + user := esUrl.User.Username() + pass, _ := esUrl.User.Password() + cfg := fmt.Sprintf(mockbeatConfigWithES, esUrl.String(), user, pass) + + // make sure Datastream and Index aren't present + dsURL, err := FormatDatastreamURL(t, esUrl, datastream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, dsURL) + require.NoError(t, err) + + indexURL, err := FormatIndexTemplateURL(t, esUrl, datastream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, indexURL) + require.NoError(t, err) + + // start mockbeat and wait for the relevant log lines + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + mockbeat.WaitForLogs("Template with name \\\"mockbeat-9.9.9\\\" loaded.", 20*time.Second) + require.Eventually(t, func() bool { + return mockbeat.LogMatch("PublishEvents: [[:digit:]]+ events have been published") + }, 20*time.Second, 100*time.Millisecond, "looking for PublishEvents") + + status, body, err := HttpDo(t, http.MethodGet, indexURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var m IndexTemplateResult + err = json.Unmarshal(body, &m) + require.NoError(t, err) + + require.Equal(t, len(m.IndexTemplates), 1) + require.Equal(t, datastream, m.IndexTemplates[0].Name) + + refreshURL := FormatRefreshURL(t, esUrl) + require.NoError(t, err) + status, body, err = HttpDo(t, http.MethodPost, refreshURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect http status") + + searchURL, err := FormatDataStreamSearchURL(t, esUrl, datastream) + require.NoError(t, err) + status, body, err = HttpDo(t, http.MethodGet, searchURL) + require.NoError(t, err) + var results SearchResult + err = json.Unmarshal(body, &results) + require.NoError(t, err) + + require.True(t, results.Hits.Total.Value > 0) +} + +// Test run cmd does not load template when disabled in config +func TestTemplateDisabled(t *testing.T) { + EnsureESIsRunning(t) + + mockbeatConfigWithES := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +setup.template: + enabled: false +logging: + level: debug +` + datastream := "mockbeat-9.9.9" + + // prepare the config + esUrl := GetESURL(t, "http") + user := esUrl.User.Username() + pass, _ := esUrl.User.Password() + cfg := fmt.Sprintf(mockbeatConfigWithES, esUrl.String(), user, pass) + + dsURL, err := FormatDatastreamURL(t, esUrl, datastream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, dsURL) + require.NoError(t, err) + + indexURL, err := FormatIndexTemplateURL(t, esUrl, datastream) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, indexURL) + require.NoError(t, err) + + // start mockbeat and wait for the relevant log lines + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start() + mockbeat.WaitForLogs("mockbeat start running.", 60*time.Second) + require.Eventually(t, func() bool { + return mockbeat.LogMatch("PublishEvents: [[:digit:]]+ events have been published") + }, 20*time.Second, 100*time.Millisecond, "looking for PublishEvents") + + u := fmt.Sprintf("%s/_index_template/%s", esUrl.String(), datastream) + r, _ := http.Get(u) + require.Equal(t, 404, r.StatusCode, "incorrect status code") +} + +func TestSetupCmd(t *testing.T) { + EnsureESIsRunning(t) + + cfg := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +logging: + level: debug +` + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + esURL := GetESURL(t, "http") + user := esURL.User.Username() + pass, _ := esURL.User.Password() + dataStreamURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + templateURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + policyURL, err := FormatPolicyURL(t, esURL, policy) + require.NoError(t, err) + t.Cleanup(func() { + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + }) + // Make sure datastream, template and policy don't exist + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), user, pass)) + mockbeat.Start("setup", "--index-management") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + // check template loaded + status, body, err := HttpDo(t, http.MethodGet, templateURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var r IndexTemplateResult + err = json.Unmarshal(body, &r) + require.NoError(t, err) + var found bool + for _, t := range r.IndexTemplates { + if t.Name == dataStream { + found = true + } + } + require.Truef(t, found, "data stream should be in: %v", r.IndexTemplates) + + status, body, err = HttpDo(t, http.MethodGet, policyURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + require.Truef(t, strings.Contains(string(body), "max_primary_shard_size\":\"50gb"), "primary shard not found in %s", string(body)) + + require.Truef(t, strings.Contains(string(body), "max_age\":\"30d"), "max_age not found in %s", string(body)) +} + +func TestSetupCmdTemplateDisabled(t *testing.T) { + EnsureESIsRunning(t) + + cfg := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +logging: + level: debug +setup: + template: + enabled: false +` + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + esURL := GetESURL(t, "http") + user := esURL.User.Username() + pass, _ := esURL.User.Password() + dataStreamURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + templateURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + policyURL, err := FormatPolicyURL(t, esURL, policy) + require.NoError(t, err) + t.Cleanup(func() { + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + }) + // Make sure datastream, template and policy don't exist + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), user, pass)) + mockbeat.Start("setup", "--index-management") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + // check template didn't load + status, body, err := HttpDo(t, http.MethodGet, templateURL) + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, status, "incorrect status code") + + status, body, err = HttpDo(t, http.MethodGet, policyURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + require.Truef(t, strings.Contains(string(body), "max_primary_shard_size\":\"50gb"), "primary shard not found in %s", string(body)) + + require.Truef(t, strings.Contains(string(body), "max_age\":\"30d"), "max_age not found in %s", string(body)) +} + +func TestSetupCmdTemplateWithOpts(t *testing.T) { + EnsureESIsRunning(t) + + cfg := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +logging: + level: debug +` + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + esURL := GetESURL(t, "http") + user := esURL.User.Username() + pass, _ := esURL.User.Password() + dataStreamURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + templateURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + policyURL, err := FormatPolicyURL(t, esURL, policy) + require.NoError(t, err) + t.Cleanup(func() { + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + }) + // Make sure datastream, template and policy don't exist + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), user, pass)) + mockbeat.Start("setup", "--index-management", "-E", "setup.ilm.enabled=false", "-E", "setup.template.settings.index.number_of_shards=2") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + // check template loaded + status, body, err := HttpDo(t, http.MethodGet, templateURL) + require.NoError(t, err) + require.Equalf(t, http.StatusOK, status, "incorrect status code for :%s", templateURL.String()) + require.Truef(t, strings.Contains(string(body), "number_of_shards\":\"2"), "number of shards not found in %s", string(body)) +} + +func TestTemplateCreatedOnIlmPolicyCreated(t *testing.T) { + EnsureESIsRunning(t) + + cfg := ` +mockbeat: +output: + elasticsearch: + hosts: %s + username: %s + password: %s + allow_older_versions: true +logging: + level: debug +` + dataStream := "mockbeat-9.9.9" + policy := "mockbeat" + esURL := GetESURL(t, "http") + user := esURL.User.Username() + pass, _ := esURL.User.Password() + dataStreamURL, err := FormatDatastreamURL(t, esURL, dataStream) + require.NoError(t, err) + templateURL, err := FormatIndexTemplateURL(t, esURL, dataStream) + require.NoError(t, err) + policyURL, err := FormatPolicyURL(t, esURL, policy) + require.NoError(t, err) + t.Cleanup(func() { + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + }) + // Make sure datastream, template and policy don't exist + _, _, err = HttpDo(t, http.MethodDelete, dataStreamURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, templateURL) + require.NoError(t, err) + _, _, err = HttpDo(t, http.MethodDelete, policyURL) + require.NoError(t, err) + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(fmt.Sprintf(cfg, esURL.String(), user, pass)) + mockbeat.Start("setup", "--index-management", "-E", "setup.ilm.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + // check template loaded + status, body, err := HttpDo(t, http.MethodGet, templateURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + var r IndexTemplateResult + err = json.Unmarshal(body, &r) + require.NoError(t, err) + var found bool + for _, t := range r.IndexTemplates { + if t.Name == dataStream { + found = true + } + } + require.Truef(t, found, "data stream should be in: %v", r.IndexTemplates) + + // check policy not created + status, body, err = HttpDo(t, http.MethodGet, policyURL) + require.NoError(t, err) + require.Equalf(t, http.StatusNotFound, status, "incorrect status code for: %s", policyURL.String()) + + mockbeat.Start("setup", "--index-management", "-E", "setup.template.overwrite=false", "-E", "setup.template.settings.index.number_of_shards=2") + procState, err = mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + + // check policy created + status, body, err = HttpDo(t, http.MethodGet, policyURL) + require.NoError(t, err) + require.Equal(t, http.StatusOK, status, "incorrect status code") + + require.Truef(t, strings.Contains(string(body), "max_primary_shard_size\":\"50gb"), "primary shard not found in %s", string(body)) + + require.Truef(t, strings.Contains(string(body), "max_age\":\"30d"), "max_age not found in %s", string(body)) +} + +func TestExportTemplate(t *testing.T) { + cfg := ` +mockbeat: +output: + console: + enabled: true +logging: + level: debug +` + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start("export", "template") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("mockbeat-9.9.9", 5*time.Second) +} + +func TestExportTemplateDisabled(t *testing.T) { + cfg := ` +mockbeat: +output: + console: + enabled: true +logging: + level: debug +` + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + mockbeat.WriteConfigFile(cfg) + mockbeat.Start("export", "template", "-E", "setup.template.enabled=false") + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("mockbeat-9.9.9", 5*time.Second) +} + +func TestExportAbsolutePath(t *testing.T) { + cfg := ` +mockbeat: +output: + console: + enabled: true +logging: + level: debug +` + + mockbeat := NewBeat(t, "mockbeat", "../../libbeat.test") + output := filepath.Join(mockbeat.TempDir(), "template", "mockbeat-9.9.9.json") + t.Cleanup(func() { + os.Remove(output) + }) + mockbeat.WriteConfigFile(cfg) + mockbeat.Start("export", "template", "--dir", mockbeat.TempDir()) + procState, err := mockbeat.Process.Wait() + require.NoError(t, err) + require.Equal(t, 0, procState.ExitCode(), "incorrect exit code") + mockbeat.WaitStdOutContains("Writing to", 5*time.Second) + mockbeat.WaitFileContains(output, "mockbeat-9.9.9", 5*time.Second) +} diff --git a/libbeat/tests/integration/testdata/testbeat-dashboards.zip b/libbeat/tests/integration/testdata/testbeat-dashboards.zip new file mode 100644 index 00000000000..78c185faaaf Binary files /dev/null and b/libbeat/tests/integration/testdata/testbeat-dashboards.zip differ diff --git a/libbeat/tests/integration/testdata/testbeat-no-dashboards.zip b/libbeat/tests/integration/testdata/testbeat-no-dashboards.zip new file mode 100644 index 00000000000..90a9a1a7994 Binary files /dev/null and b/libbeat/tests/integration/testdata/testbeat-no-dashboards.zip differ diff --git a/libbeat/tests/system/requirements.txt b/libbeat/tests/system/requirements.txt index b65d5089c21..6b8cc6d52a0 100644 --- a/libbeat/tests/system/requirements.txt +++ b/libbeat/tests/system/requirements.txt @@ -36,7 +36,7 @@ pyrsistent==0.16.0 pytest==7.3.2 pytest-rerunfailures==9.1.1 pytest-timeout==1.4.2 -PyYAML==5.4.1 +PyYAML==5.3.1 redis==4.4.4 requests==2.31.0 semver==2.8.1 diff --git a/libbeat/tests/system/requirements_aix.txt b/libbeat/tests/system/requirements_aix.txt index 69789e108c2..adc1a1a2171 100644 --- a/libbeat/tests/system/requirements_aix.txt +++ b/libbeat/tests/system/requirements_aix.txt @@ -35,7 +35,7 @@ pyrsistent==0.16.0 pytest==7.3.2 pytest-rerunfailures==9.1.1 pytest-timeout==1.4.2 -PyYAML==5.4.1 +PyYAML==5.3.1 redis==4.4.4 requests==2.31.0 semver==2.8.1 diff --git a/libbeat/tests/system/test_base.py b/libbeat/tests/system/test_base.py deleted file mode 100644 index fbb8b324f16..00000000000 --- a/libbeat/tests/system/test_base.py +++ /dev/null @@ -1,173 +0,0 @@ -from base import BaseTest -from beat import common_tests - -import json -import os -import shutil -import signal -import subprocess -import sys -import unittest - - -class Test(BaseTest, common_tests.TestExportsMixin): - - def test_base(self): - """ - Basic test with exiting Mockbeat normally - """ - self.render_config_template( - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.check_kill_and_wait() - assert self.log_contains("mockbeat stopped.") - - @unittest.skipIf(sys.platform.startswith("win"), "SIGHUP is not available on Windows") - def test_sighup(self): - """ - Basic test with exiting Mockbeat because of SIGHUP - """ - self.render_config_template( - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.proc.send_signal(signal.SIGHUP) - proc.check_wait() - assert self.log_contains("mockbeat stopped.") - - def test_no_config(self): - """ - Tests starting without a config - """ - exit_code = self.run_beat() - - assert exit_code == 1 - assert self.log_contains("error loading config file") is True - - def test_invalid_config(self): - """ - Checks stop on invalid config - """ - shutil.copy(self.beat_path + "/tests/files/invalid.yml", - os.path.join(self.working_dir, "invalid.yml")) - - exit_code = self.run_beat(config="invalid.yml") - - assert exit_code == 1 - assert self.log_contains("error loading config file") is True - - def test_invalid_config_cli_param(self): - """ - Checks CLI overwrite actually overwrites some config variable by - writing an invalid value. - """ - - self.render_config_template( - console={"pretty": "false"} - ) - - # first run with default config, validating config being - # actually correct. - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.check_kill_and_wait() - - # start beat with invalid config setting on command line - exit_code = self.run_beat( - extra_args=["-d", "config", "-E", "output.console=invalid"]) - - assert exit_code == 1 - assert self.log_contains("error unpacking config data") is True - - # NOTE(ph): I've removed the code to crash with theses settings, but the test is still usefull if - # more settings are added. - # def test_invalid_config_with_removed_settings(self): - # """ - # Checks if libbeat fails to load if removed settings have been used: - # """ - # self.render_config_template(console={"pretty": "false"}) - - # exit_code = self.run_beat(extra_args=[ - # "-E", "queue_size=2048", - # "-E", "bulk_queue_size=1", - # ]) - - # assert exit_code == 1 - # assert self.log_contains("setting 'queue_size' has been removed") - # assert self.log_contains("setting 'bulk_queue_size' has been removed") - - def test_console_output_timed_flush(self): - """ - outputs/console - timed flush - """ - self.render_config_template( - console={"pretty": "false"} - ) - - proc = self.start_beat(logging_args=["-e"]) - self.wait_until(lambda: self.log_contains("Mockbeat is alive"), - max_timeout=2) - proc.check_kill_and_wait() - - def test_console_output_size_flush(self): - """ - outputs/console - size based flush - """ - self.render_config_template( - console={ - "pretty": "false", - "bulk_max_size": 1, - } - ) - - proc = self.start_beat(logging_args=["-e"]) - self.wait_until(lambda: self.log_contains("Mockbeat is alive"), - max_timeout=2) - proc.check_kill_and_wait() - - def test_logging_metrics(self): - self.render_config_template( - metrics_period="0.1s" - ) - proc = self.start_beat(logging_args=["-e"]) - self.wait_until( - lambda: self.log_contains("Non-zero metrics in the last 100ms"), - max_timeout=2) - proc.check_kill_and_wait() - self.wait_until( - lambda: self.log_contains("Total metrics"), - max_timeout=2) - - def test_persistent_uuid(self): - self.render_config_template() - - # run starts and kills the beat, reading the meta file while - # the beat is alive - def run(): - proc = self.start_beat(extra_args=["-path.home", self.working_dir]) - self.wait_until(lambda: self.log_contains("Mockbeat is alive"), - max_timeout=60) - - # open meta file before killing the beat, checking the file being - # available right after startup - metaFile = os.path.join(self.working_dir, "data", "meta.json") - with open(metaFile) as f: - meta = json.loads(f.read()) - - proc.check_kill_and_wait() - return meta - - meta0 = run() - assert self.log_contains("Beat ID: {}".format(meta0["uuid"])) - - # remove log, restart beat and check meta file did not change - # and same UUID is used in log output. - os.remove(os.path.join(self.working_dir, "mockbeat-" + self.today + ".ndjson")) - meta1 = run() - assert self.log_contains("Beat ID: {}".format(meta1["uuid"])) - - # check meta file did not change between restarts - assert meta0 == meta1 diff --git a/libbeat/tests/system/test_ca_pinning.py b/libbeat/tests/system/test_ca_pinning.py deleted file mode 100644 index 5b4e47b117f..00000000000 --- a/libbeat/tests/system/test_ca_pinning.py +++ /dev/null @@ -1,84 +0,0 @@ -import logging -import os -import pytest -import unittest -from base import BaseTest -from elasticsearch import RequestError -from idxmgmt import IdxMgmt - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class TestCAPinning(BaseTest): - """ - Test beat CA pinning for elasticsearch - """ - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_sending_events_with_a_good_sha256(self): - """ - Test Sending events while using ca pinning with a good sha256 - """ - - ca = os.path.join(self.beat_path, - "..", - "testing", - "environments", - "docker", - "elasticsearch", - "pki", - "ca", - "ca.crt") - - self.render_config_template( - elasticsearch={ - "host": self.get_elasticsearch_url_ssl(), - "user": "admin", - "pass": "testing", - # Use certificate verification only to avoid validating localhost as the hostname. - "ssl_verification_mode": "certificate", - "ssl_certificate_authorities": [ca], - "ssl_ca_sha256": "FDFOtqdUyXZw74YgvAJUC+I67ED1WfcI1qK44Qy2WQM=", - }, - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.wait_until(lambda: self.log_contains("PublishEvents: 1 events have been published")) - proc.check_kill_and_wait() - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_sending_events_with_a_bad_sha256(self): - """ - Test Sending events while using ca pinning with a bad sha256 - """ - - ca = os.path.join(self.beat_path, - "..", - "testing", - "environments", - "docker", - "elasticsearch", - "pki", - "ca", - "ca.crt") - - self.render_config_template( - elasticsearch={ - "host": self.get_elasticsearch_url_ssl(), - "user": "beats", - "pass": "testing", - # Use certificate verification only to avoid validating localhost as the hostname. - "ssl_verification_mode": "certificate", - "ssl_certificate_authorities": [ca], - "ssl_ca_sha256": "not-good-sha", - }, - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.wait_until(lambda: self.log_contains( - "provided CA certificate pins doesn't match any of the certificate authorities used to validate the certificate")) - proc.check_kill_and_wait() diff --git a/libbeat/tests/system/test_cmd_completion.py b/libbeat/tests/system/test_cmd_completion.py deleted file mode 100644 index a06259a5046..00000000000 --- a/libbeat/tests/system/test_cmd_completion.py +++ /dev/null @@ -1,25 +0,0 @@ -from base import BaseTest - - -class TestCommandCompletion(BaseTest): - """ - Test beat completion subcommand - """ - - def setUp(self): - super(BaseTest, self).setUp() - - def test_bash_completion(self): - exit_code = self.run_beat(extra_args=["completion", "bash"]) - assert exit_code == 0 - assert self.log_contains("bash completion for mockbeat") - - def test_zsh_completion(self): - exit_code = self.run_beat(extra_args=["completion", "zsh"]) - assert exit_code == 0 - assert self.log_contains("#compdef _mockbeat mockbeat") - - def test_unknown_completion(self): - exit_code = self.run_beat(extra_args=["completion", "awesomeshell"]) - assert exit_code == 1 - assert self.log_contains("Unknown shell awesomeshell") diff --git a/libbeat/tests/system/test_cmd_export_config.py b/libbeat/tests/system/test_cmd_export_config.py deleted file mode 100644 index f5c4de356d2..00000000000 --- a/libbeat/tests/system/test_cmd_export_config.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -from base import BaseTest - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class TestCommandExportConfig(BaseTest): - """ - Test beat command `export config` - """ - - def setUp(self): - super(TestCommandExportConfig, self).setUp() - - self.config = "libbeat.yml" - self.output = os.path.join(self.working_dir, self.config) - - def test_default(self): - """ - Test export config works - """ - self.render_config_template(self.beat_name, self.output, file_name='some-file') - exit_code = self.run_beat(extra_args=["export", "config"], config=self.config) - - assert exit_code == 0 - assert self.log_contains("filename: mockbeat") - assert self.log_contains("name: some-file") - - def test_config_environment_variable(self): - """ - Test export config works but doesn"t expose environment variable. - """ - self.render_config_template(self.beat_name, self.output, - file_name="${FILE_NAME}") - exit_code = self.run_beat(extra_args=["export", "config"], config=self.config, - env={'FILE_NAME': 'some-file'}) - - assert exit_code == 0 - assert self.log_contains("filename: mockbeat") - assert self.log_contains("name: ${FILE_NAME}") diff --git a/libbeat/tests/system/test_cmd_keystore.py b/libbeat/tests/system/test_cmd_keystore.py deleted file mode 100644 index f9f1e4d5611..00000000000 --- a/libbeat/tests/system/test_cmd_keystore.py +++ /dev/null @@ -1,144 +0,0 @@ -from os import path -import os -import hashlib - -from keystore import KeystoreBase - - -class TestCommandKeystore(KeystoreBase): - """ - Test keystore subcommand - - """ - - def setUp(self): - super(TestCommandKeystore, self).setUp() - - self.keystore_path = self.working_dir + "/data/keystore" - - self.render_config_template(keystore_path=self.keystore_path) - - if path.exists(self.keystore_path): - os.Remove(self.keystore_path) - - def test_keystore_create(self): - """ - test keystore create command - """ - exit_code = self.run_beat(extra_args=["keystore", "create"]) - - assert exit_code == 0 - assert path.exists(self.keystore_path) - - def test_keystore_create_force(self): - """ - Allow to override - """ - - self.run_beat(extra_args=["keystore", "create"]) - - assert path.exists(self.keystore_path) - digest_before = hashlib.sha256( - open(self.keystore_path, 'rb').read()).digest() - - exit_code = self.run_beat(extra_args=["keystore", "create", "--force"]) - digest_after = hashlib.sha256( - open(self.keystore_path, 'rb').read()).digest() - - assert exit_code == 0 - assert digest_before != digest_after - - def test_keystore_remove_no_key_no_keystore(self): - """ - Remove a key that doesn't exist when the keystore doesn't exist - """ - exit_code = self.run_beat(extra_args=["keystore", "remove", "mykey"]) - assert exit_code == 1 - assert "The filebeat keystore doesn't exist." - - def test_keystore_remove_non_existing_key(self): - """ - Remove a key that doesn't exist in the keystore - """ - self.run_beat(extra_args=["keystore", "create"]) - - exit_code = self.run_beat(extra_args=["keystore", "remove", "mykey"]) - assert exit_code == 1 - - def test_keystore_remove_existing_key(self): - """ - Remove an key present in the keystore - """ - self.run_beat(extra_args=["keystore", "create"]) - - self.add_secret("mykey") - exit_code = self.run_beat(extra_args=["keystore", "remove", "mykey"]) - - assert exit_code == 0 - - def test_keystore_remove_multiples_existing_keys(self): - """ - Remove an key present in the keystore - """ - - self.run_beat(extra_args=["keystore", "create"]) - - self.add_secret("willnotdelete") - self.add_secret("myawesomekey") - self.add_secret("mysuperkey") - - exit_code = self.run_beat( - extra_args=["keystore", "remove", "mysuperkey", "myawesomekey"]) - - assert exit_code == 0 - - exit_code = self.run_beat(extra_args=["keystore", "list"]) - - assert exit_code == 0 - - def test_keystore_list(self): - """ - list the available keys - """ - - self.run_beat(extra_args=["keystore", "create"]) - - self.add_secret("willnotdelete") - self.add_secret("myawesomekey") - self.add_secret("mysuperkey") - - exit_code = self.run_beat(extra_args=["keystore", "list"]) - - assert exit_code == 0 - - assert self.log_contains("willnotdelete") - assert self.log_contains("myawesomekey") - assert self.log_contains("mysuperkey") - - def test_keystore_list_keys_on_an_empty_keystore(self): - """ - List keys on an empty keystore should not return anything - """ - exit_code = self.run_beat(extra_args=["keystore", "list"]) - assert exit_code == 0 - - def test_keystore_add_secret_from_stdin(self): - """ - Add a secret to the store using stdin - """ - self.run_beat(extra_args=["keystore", "create"]) - exit_code = self.add_secret("willnotdelete") - - assert exit_code == 0 - - def test_keystore_update_force(self): - """ - Update an existing key using the --force flag - """ - self.run_beat(extra_args=["keystore", "create"]) - - self.add_secret("superkey") - - exit_code = self.add_secret("mysuperkey", "hello", True) - - assert exit_code == 0 diff --git a/libbeat/tests/system/test_cmd_test.py b/libbeat/tests/system/test_cmd_test.py deleted file mode 100644 index 944d7791fb6..00000000000 --- a/libbeat/tests/system/test_cmd_test.py +++ /dev/null @@ -1,84 +0,0 @@ -import os -import logging -import unittest -import pytest -from base import BaseTest - - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class TestCommandTest(BaseTest): - """ - Test beat subcommands - """ - - def test_config(self): - """ - Test test config command - """ - self.render_config_template("mockbeat", - os.path.join(self.working_dir, "libbeat.yml")) - - exit_code = self.run_beat( - logging_args=[], - extra_args=["test", "config"], - config="libbeat.yml") - - assert exit_code == 0 - assert self.log_contains("Config OK") - - def test_bad_config(self): - """ - Test test config command with bad config - """ - exit_code = self.run_beat( - logging_args=[], - extra_args=["test", "config"], - config="libbeat-missing.yml") - - assert exit_code == 1 - assert self.log_contains("Config OK") is False - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_output(self): - """ - Test test output works - """ - - self.es_client() - logging.getLogger("elasticsearch").setLevel(logging.ERROR) - - self.render_config_template("mockbeat", - os.path.join(self.working_dir, "mockbeat.yml"), - elasticsearch=self.get_elasticsearch_template_config()) - exit_code = self.run_beat( - extra_args=["test", "output"], - config="mockbeat.yml") - - assert exit_code == 0 - assert self.log_contains('parse url... OK') - assert self.log_contains('TLS... WARN secure connection disabled') - assert self.log_contains('talk to server... OK') - - @unittest.skipIf(not INTEGRATION_TESTS, "integration test") - def test_wrong_output(self): - """ - Test test wrong output works - """ - self.render_config_template("mockbeat", - os.path.join(self.working_dir, - "mockbeat.yml"), - elasticsearch={ - "host": 'badhost:9200', - "user": 'admin', - "pass": 'testing' - }) - exit_code = self.run_beat( - extra_args=["test", "output"], - config="mockbeat.yml") - - assert exit_code == 1 - assert self.log_contains('parse url... OK') - assert self.log_contains('dns lookup... ERROR') diff --git a/libbeat/tests/system/test_cmd_version.py b/libbeat/tests/system/test_cmd_version.py deleted file mode 100644 index ace84b99062..00000000000 --- a/libbeat/tests/system/test_cmd_version.py +++ /dev/null @@ -1,34 +0,0 @@ -from base import BaseTest - -import logging -import os - - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class TestCommandVersion(BaseTest): - """ - Test beat subcommands - """ - - def setUp(self): - super(BaseTest, self).setUp() - - self.elasticsearch_url = self.get_elasticsearch_url() - print("Using elasticsearch: {}".format(self.elasticsearch_url)) - self.es = self.get_elasticsearch_instance(url=self.elasticsearch_url, user='beats') - logging.getLogger("urllib3").setLevel(logging.WARNING) - logging.getLogger("elasticsearch").setLevel(logging.ERROR) - - def test_version(self): - """ - Test version command - """ - exit_code = self.run_beat( - extra_args=["version"], logging_args=["-v", "-d", "*"]) - assert exit_code == 0 - - assert self.log_contains("mockbeat") - assert self.log_contains("version") - assert self.log_contains("9.9.9") diff --git a/libbeat/tests/system/test_dashboard.py b/libbeat/tests/system/test_dashboard.py deleted file mode 100644 index 1341501bd61..00000000000 --- a/libbeat/tests/system/test_dashboard.py +++ /dev/null @@ -1,219 +0,0 @@ -import os -import os.path -import pytest -import json -import re -import requests -import semver -import shutil -import subprocess -import unittest - -from base import BaseTest - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class Test(BaseTest): - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_load_without_dashboard(self): - """ - Test loading without dashboards - """ - self.render_config_template() - beat = self.start_beat( - logging_args=["-e", "-d", "*"], - extra_args=["setup", - "--dashboards", - "-E", "setup.dashboards.file=" + - os.path.join(self.beat_path, "tests", "files", "testbeat-no-dashboards.zip"), - "-E", "setup.dashboards.beat=testbeat", - "-E", "setup.kibana.protocol=http", - "-E", "setup.kibana.host=" + self.get_kibana_host(), - "-E", "setup.kibana.port=" + self.get_kibana_port(), - "-E", "setup.kibana.username=beats", - "-E", "setup.kibana.password=testing", - "-E", "output.elasticsearch.hosts=['" + self.get_host() + "']", - "-E", "output.elasticsearch.username=admin", - "-E", "output.elasticsearch.password=testing", - "-E", "output.file.enabled=false"] - ) - - beat.check_wait(exit_code=0) - - assert self.log_contains("Skipping loading dashboards") - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_load_dashboard(self): - """ - Test loading dashboards - """ - self.render_config_template() - beat = self.start_beat( - logging_args=["-e", "-d", "*"], - extra_args=["setup", - "--dashboards", - "-E", "setup.dashboards.file=" + - os.path.join(self.beat_path, "tests", "files", "testbeat-dashboards.zip"), - "-E", "setup.dashboards.beat=testbeat", - "-E", "setup.kibana.protocol=http", - "-E", "setup.kibana.host=" + self.get_kibana_host(), - "-E", "setup.kibana.port=" + self.get_kibana_port(), - "-E", "setup.kibana.username=beats", - "-E", "setup.kibana.password=testing", - "-E", "output.elasticsearch.hosts=['" + self.get_host() + "']", - "-E", "output.elasticsearch.username=admin", - "-E", "output.elasticsearch.password=testing", - "-E", "output.file.enabled=false"] - ) - beat.check_wait(exit_code=0) - - assert self.log_contains("Kibana dashboards successfully loaded") is True - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_load_only_index_patterns(self): - """ - Test loading dashboards - """ - self.render_config_template() - beat = self.start_beat( - logging_args=["-e", "-d", "*"], - extra_args=["setup", - "--dashboards", - "-E", "setup.dashboards.file=" + - os.path.join(self.beat_path, "tests", "files", "testbeat-dashboards.zip"), - "-E", "setup.dashboards.beat=testbeat", - "-E", "setup.dashboards.only_index=true", - "-E", "setup.kibana.protocol=http", - "-E", "setup.kibana.host=" + self.get_kibana_host(), - "-E", "setup.kibana.port=" + self.get_kibana_port(), - "-E", "setup.kibana.username=beats", - "-E", "setup.kibana.password=testing", - "-E", "output.elasticsearch.hosts=['" + self.get_host() + "']", - "-E", "output.elasticsearch.username=admin", - "-E", "output.elasticsearch.password=testing", - "-E", "output.file.enabled=false"] - ) - - beat.check_wait(exit_code=0) - - assert self.log_contains("Kibana dashboards successfully loaded") is True - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_export_dashboard_cmd_export_dashboard_by_id(self): - """ - Test testbeat export dashboard can export dashboards - """ - self.render_config_template() - self.test_load_dashboard() - beat = self.start_beat( - logging_args=["-e", "-d", "*"], - extra_args=["export", - "dashboard", - "-E", "setup.kibana.protocol=http", - "-E", "setup.kibana.host=" + self.get_kibana_host(), - "-E", "setup.kibana.port=" + self.get_kibana_port(), - "-E", "setup.kibana.username=beats", - "-E", "setup.kibana.password=testing", - "-id", "Metricbeat-system-overview", - "-folder", "system-overview"] - ) - - beat.check_wait(exit_code=0) - self._check_if_dashboard_exported("system-overview") - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_export_dashboard_cmd_export_dashboard_by_id_unknown_id(self): - """ - Test testbeat export dashboard fails gracefully when dashboard with unknown ID is requested - """ - self.render_config_template() - beat = self.start_beat( - logging_args=["-e", "-d", "*"], - extra_args=["export", - "dashboard", - "-E", "setup.kibana.protocol=http", - "-E", "setup.kibana.host=" + self.get_kibana_host(), - "-E", "setup.kibana.port=" + self.get_kibana_port(), - "-E", "setup.kibana.username=beats", - "-E", "setup.kibana.password=testing", - "-id", "No-such-dashboard", - "-folder", "system-overview"] - ) - - beat.check_wait(exit_code=1) - - expected_error = re.compile("error exporting dashboard:.*not found", re.IGNORECASE) - assert self.log_contains(expected_error) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_dev_tool_export_dashboard_by_id(self): - """ - Test dev-tools/cmd/dashboards exports dashboard and removes unsupported characters - """ - - self.test_load_dashboard() - - folder_name = "system-overview" - path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go") - command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port() - command = "go run " + command + " -dashboard Metricbeat-system-overview -folder " + folder_name - - p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - _, stderr = p.communicate() - assert p.returncode == 0, stderr - - self._check_if_dashboard_exported(folder_name) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_dev_tool_export_dashboard_by_id_unknown_id(self): - """ - Test dev-tools/cmd/dashboards fails gracefully when dashboard with unknown ID is requested - """ - - path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go") - command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port() - command = "go run " + command + " -dashboard No-such-dashboard" - - p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - _, stderr = p.communicate() - - assert p.returncode != 0, stderr - - def _check_if_dashboard_exported(self, folder_name): - kibana_semver = semver.VersionInfo.parse(self.get_version()) - dashboard_folder = os.path.join(folder_name, "_meta", "kibana", str(kibana_semver.major), "dashboard") - assert os.path.isdir(dashboard_folder) - - with open(os.path.join(dashboard_folder, "Metricbeat-system-overview.json")) as f: - content = f.read() - assert "Metricbeat-system-overview" in content - - shutil.rmtree(folder_name) - - def get_host(self): - return os.getenv('ES_HOST', 'localhost') + ':' + os.getenv('ES_PORT', '9200') - - def get_kibana_host(self): - return os.getenv('KIBANA_HOST', 'localhost') - - def get_kibana_port(self): - return os.getenv('KIBANA_PORT', '5601') - - def get_version(self): - url = "http://" + self.get_kibana_host() + ":" + self.get_kibana_port() + \ - "/api/status" - - r = requests.get(url, auth=("beats", "testing")) - body = r.json() - version = body["version"]["number"] - - return version diff --git a/libbeat/tests/system/test_http.py b/libbeat/tests/system/test_http.py deleted file mode 100644 index 76e5b40b181..00000000000 --- a/libbeat/tests/system/test_http.py +++ /dev/null @@ -1,56 +0,0 @@ -from base import BaseTest - -import requests -import json - - -class Test(BaseTest): - def setUp(self): - super(BaseTest, self).setUp() - self.render_config_template() - self.proc = self.start_beat(extra_args=["-E", "http.enabled=true"]) - self.wait_until(lambda: self.log_contains("Starting stats endpoint")) - - def tearDown(self): - super(BaseTest, self).tearDown() - # Wait till the beat is completely started so it can handle SIGTERM - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.proc.check_kill_and_wait() - - def test_root(self): - """ - Test / http endpoint - """ - r = requests.get("http://localhost:5066") - assert r.status_code == 200 - - data = json.loads(r.content.decode('utf_8')) - - assert data["beat"] == "mockbeat" - assert data["version"] == "9.9.9" - - def test_stats(self): - """ - Test /stats http endpoint - """ - r = requests.get("http://localhost:5066/stats") - assert r.status_code == 200 - - data = json.loads(r.content.decode('utf_8')) - - # Test one data point - assert data["libbeat"]["config"]["scans"] == 0 - - def test_error(self): - """ - Test not existing http endpoint - """ - r = requests.get("http://localhost:5066/not-exist") - assert r.status_code == 404 - - def test_pprof_disabled(self): - """ - Test /debug/pprof/ http endpoint - """ - r = requests.get("http://localhost:5066/debug/pprof/") - assert r.status_code == 404 diff --git a/libbeat/tests/system/test_logging.py b/libbeat/tests/system/test_logging.py deleted file mode 100644 index 4380e25b55c..00000000000 --- a/libbeat/tests/system/test_logging.py +++ /dev/null @@ -1,49 +0,0 @@ -from base import BaseTest - -import re - -ecs_version_log = "\"ecs.version\":" -ecs_timestamp_log = "\"@timestamp\":" -ecs_message_log = "\"message\":" -ecs_log_level_log = "\"log.level\":" - - -class TestLogging(BaseTest): - - def run_beat_with_args(self, msg, logging_args=[], extra_args=[]): - self.render_config_template( - console={"pretty": "false"} - ) - proc = self.start_beat(logging_args=logging_args, extra_args=extra_args) - self.wait_until(lambda: self.log_contains(msg), - max_timeout=2) - proc.check_kill_and_wait() - - def assert_contains_ecs_log(self, logfile=None): - assert self.log_contains(ecs_version_log, logfile=logfile) - assert self.log_contains(ecs_timestamp_log, logfile=logfile) - assert self.log_contains(ecs_message_log, logfile=logfile) - assert self.log_contains(ecs_log_level_log, logfile=logfile) - - def test_console_ecs(self): - """ - logs to console with ECS format - """ - self.run_beat_with_args("mockbeat start running", - logging_args=["-e"]) - self.assert_contains_ecs_log() - - def test_file_default(self): - """ - logs to file with default format - """ - self.run_beat_with_args("Mockbeat is alive!", - logging_args=[]) - self.assert_contains_ecs_log(logfile="logs/mockbeat-"+self.today+".ndjson") - - def test_file_ecs(self): - """ - logs to file with ECS format - """ - self.run_beat_with_args("Mockbeat is alive!") - self.assert_contains_ecs_log(logfile="logs/mockbeat-"+self.today+".ndjson") diff --git a/libbeat/tests/system/test_meta.py b/libbeat/tests/system/test_meta.py deleted file mode 100644 index f816056a109..00000000000 --- a/libbeat/tests/system/test_meta.py +++ /dev/null @@ -1,37 +0,0 @@ -from base import BaseTest - -import os -import stat -import unittest -from beat.beat import INTEGRATION_TESTS - - -class TestMetaFile(BaseTest): - """ - Test meta file - """ - - def setUp(self): - super(BaseTest, self).setUp() - - self.meta_file_path = os.path.join(self.working_dir, "data", "meta.json") - - self.render_config_template() - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.check_kill_and_wait() - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - def test_is_created(self): - """ - Test that the meta file is created - """ - self.assertTrue(os.path.exists(self.meta_file_path)) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - def test_has_correct_perms(self): - """ - Test that the meta file has correct permissions - """ - perms = stat.S_IMODE(os.lstat(self.meta_file_path).st_mode) - self.assertEqual(perms, 0o600) diff --git a/libbeat/tests/system/test_template.py b/libbeat/tests/system/test_template.py deleted file mode 100644 index 5e1ab7ca909..00000000000 --- a/libbeat/tests/system/test_template.py +++ /dev/null @@ -1,382 +0,0 @@ -import json -import logging -import os -import pytest -import shutil -import unittest - -from base import BaseTest -from idxmgmt import IdxMgmt - -INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) - - -class Test(BaseTest): - - def test_index_modified(self): - """ - Test that beat stops in case elasticsearch index is modified and pattern not - """ - self.render_config_template( - elasticsearch={"index": "test"}, - ) - - exit_code = self.run_beat() - - assert exit_code == 1 - assert self.log_contains( - "setup.template.name and setup.template.pattern have to be set if index name is modified") - - def test_index_not_modified(self): - """ - Test that beat starts running if elasticsearch output is set - """ - self.render_config_template( - elasticsearch=self.get_elasticsearch_template_config(), - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.check_kill_and_wait() - - def test_index_modified_no_pattern(self): - """ - Test that beat stops in case elasticsearch index is modified and pattern not - """ - self.render_config_template( - elasticsearch={"index": "test"}, - es_template_name="test", - ) - - exit_code = self.run_beat() - - assert exit_code == 1 - assert self.log_contains( - "setup.template.name and setup.template.pattern have to be set if index name is modified") - - def test_index_modified_no_name(self): - """ - Test that beat stops in case elasticsearch index is modified and name not - """ - self.render_config_template( - elasticsearch={"index": "test"}, - es_template_pattern="test", - ) - - exit_code = self.run_beat() - - assert exit_code == 1 - assert self.log_contains( - "setup.template.name and setup.template.pattern have to be set if index name is modified") - - def test_index_with_pattern_name(self): - """ - Test that beat starts running if elasticsearch output with modified index and pattern and name are set - """ - self.render_config_template( - elasticsearch=self.get_elasticsearch_template_config(), - es_template_name="test", - es_template_pattern="test-*", - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - proc.check_kill_and_wait() - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_json_template(self): - """ - Test loading of json based template - """ - - template_name = "bla" - es = self.es_client() - self.copy_files(["template.json"]) - path = os.path.join(self.working_dir, "template.json") - print(path) - - self.render_config_template( - elasticsearch=self.get_elasticsearch_template_config(), - template_overwrite="true", - template_json_enabled="true", - template_json_path=path, - template_json_name=template_name, - ) - - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.wait_until(lambda: self.log_contains("Loading json template from file")) - self.wait_until(lambda: self.log_contains('Template with name \\\"bla\\\" loaded.')) - proc.check_kill_and_wait() - - result = es.transport.perform_request('GET', '/_index_template/' + template_name) - assert len(result) == 1 - - def get_host(self): - return os.getenv('ES_HOST', 'localhost') + ':' + os.getenv('ES_PORT', '9200') - - -class TestRunTemplate(BaseTest): - """ - Test run cmd with focus on template setup - """ - - def setUp(self): - super(TestRunTemplate, self).setUp() - # auto-derived default settings, if nothing else is set - self.data_stream = self.beat_name + "-9.9.9" - - self.es = self.es_client() - self.idxmgmt = IdxMgmt(self.es, self.data_stream) - self.idxmgmt.delete(data_streams=[self.data_stream]) - - def tearDown(self): - self.idxmgmt.delete(data_streams=[self.data_stream]) - - def render_config(self, **kwargs): - self.render_config_template( - elasticsearch=self.get_elasticsearch_template_config(), - **kwargs - ) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_template_default(self): - """ - Test run cmd with default settings for template - """ - self.render_config() - proc = self.start_beat() - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.wait_until(lambda: self.log_contains('Template with name \\\"mockbeat-9.9.9\\\" loaded.')) - self.wait_until(lambda: self.log_contains("PublishEvents: 1 events have been published")) - proc.check_kill_and_wait() - - self.idxmgmt.assert_index_template_loaded(self.data_stream) - self.idxmgmt.assert_docs_written_to_data_stream(self.data_stream) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_template_disabled(self): - """ - Test run cmd does not load template when disabled in config - """ - self.render_config() - proc = self.start_beat(extra_args=["-E", "setup.template.enabled=false"]) - self.wait_until(lambda: self.log_contains("mockbeat start running.")) - self.wait_until(lambda: self.log_contains("PublishEvents: 1 events have been published")) - proc.check_kill_and_wait() - - self.idxmgmt.assert_index_template_not_loaded(self.data_stream) - - -class TestCommandSetupTemplate(BaseTest): - """ - Test beat command `setup` with focus on template - """ - - def setUp(self): - super(TestCommandSetupTemplate, self).setUp() - - # auto-derived default settings, if nothing else is set - self.setupCmd = "--index-management" - self.data_stream = self.beat_name + "-9.9.9" - self.policy_name = self.beat_name - - self.es = self.es_client() - self.idxmgmt = IdxMgmt(self.es, self.data_stream) - self.idxmgmt.delete(indices=[self.data_stream], policies=[self.policy_name]) - logging.getLogger("urllib3").setLevel(logging.WARNING) - logging.getLogger("elasticsearch").setLevel(logging.ERROR) - - def tearDown(self): - self.idxmgmt.delete(indices=[self.data_stream], policies=[self.policy_name]) - - def render_config(self, **kwargs): - self.render_config_template( - elasticsearch=self.get_elasticsearch_template_config(), - **kwargs - ) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_setup(self): - """ - Test setup cmd with template and ilm-policy subcommands - """ - self.render_config() - exit_code = self.run_beat(logging_args=["-v", "-d", "*"], - extra_args=["setup", self.setupCmd]) - - assert exit_code == 0 - self.idxmgmt.assert_index_template_loaded(self.data_stream) - self.idxmgmt.assert_policy_created(self.policy_name) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_setup_template_default(self): - """ - Test template setup with default config - """ - self.render_config() - exit_code = self.run_beat(logging_args=["-v", "-d", "*"], - extra_args=["setup", self.setupCmd]) - - assert exit_code == 0 - self.idxmgmt.assert_index_template_loaded(self.data_stream) - self.idxmgmt.assert_index_template_index_pattern(self.data_stream, [self.data_stream]) - - self.idxmgmt.assert_policy_created(self.policy_name) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_setup_template_disabled(self): - """ - Test template setup when ilm disabled - """ - self.render_config() - exit_code = self.run_beat(logging_args=["-v", "-d", "*"], - extra_args=["setup", self.setupCmd, - "-E", "setup.template.enabled=false"]) - - assert exit_code == 0 - self.idxmgmt.assert_index_template_not_loaded(self.data_stream) - - self.idxmgmt.assert_policy_created(self.policy_name) - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_setup_template_with_opts(self): - """ - Test template setup with config options - """ - self.render_config() - exit_code = self.run_beat(logging_args=["-v", "-d", "*"], - extra_args=["setup", self.setupCmd, - "-E", "setup.ilm.enabled=false", - "-E", "setup.template.settings.index.number_of_shards=2"]) - - assert exit_code == 0 - self.idxmgmt.assert_index_template_loaded(self.data_stream) - - # check that settings are overwritten - resp = self.es.transport.perform_request('GET', '/_index_template/' + self.data_stream) - found = False - for index_template in resp["index_templates"]: - if self.data_stream == index_template["name"]: - found = True - index = index_template["index_template"]["template"]["settings"]["index"] - assert index["number_of_shards"] == "2", index["number_of_shards"] - assert found - - @unittest.skipUnless(INTEGRATION_TESTS, "integration test") - @pytest.mark.tag('integration') - def test_template_created_on_ilm_policy_created(self): - """ - Test template setup overwrites template when new ilm policy is created - """ - - self.render_config() - exit_code = self.run_beat(logging_args=["-v", "-d", "*"], - extra_args=["setup", self.setupCmd, - "-E", "setup.ilm.enabled=false"]) - assert exit_code == 0 - self.idxmgmt.assert_index_template_loaded(self.data_stream) - self.idxmgmt.assert_policy_not_created(self.policy_name) - - # ensure ilm policy is created, triggering overwriting existing template - exit_code = self.run_beat(extra_args=["setup", self.setupCmd, - "-E", "setup.template.overwrite=false", - "-E", "setup.template.settings.index.number_of_shards=2"]) - assert exit_code == 0 - self.idxmgmt.assert_policy_created(self.policy_name) - - -class TestCommandExportTemplate(BaseTest): - """ - Test beat command `export template` - """ - - def setUp(self): - super(TestCommandExportTemplate, self).setUp() - - self.config = "libbeat.yml" - self.output = os.path.join(self.working_dir, self.config) - shutil.copy(os.path.join(self.beat_path, "fields.yml"), self.output) - self.template_name = self.beat_name + "-9.9.9" - - def assert_log_contains_template(self, index_pattern): - assert self.log_contains('Loaded index template') - assert self.log_contains(index_pattern) - - def test_default(self): - """ - Test export template works - """ - self.render_config_template(self.beat_name, self.output, - fields=self.output) - exit_code = self.run_beat( - extra_args=["export", "template"], - config=self.config) - - assert exit_code == 0 - self.assert_log_contains_template(self.template_name) - - def test_load_disabled(self): - """ - Test template also exported when disabled in config - """ - self.render_config_template(self.beat_name, self.output, - fields=self.output) - exit_code = self.run_beat( - extra_args=["export", "template", "-E", "setup.template.enabled=false"], - config=self.config) - - assert exit_code == 0 - self.assert_log_contains_template(self.template_name) - - def test_export_to_file_absolute_path(self): - """ - Test export template to file with absolute file path - """ - self.render_config_template(self.beat_name, self.output, - fields=self.output) - - base_path = os.path.abspath(os.path.join(self.beat_path, os.path.dirname(__file__), "export")) - exit_code = self.run_beat( - extra_args=["export", "template", "--dir=" + base_path], - config=self.config) - - assert exit_code == 0 - - file = os.path.join(base_path, "template", self.template_name + '.json') - with open(file) as f: - template = json.load(f) - assert 'index_patterns' in template - assert template['index_patterns'] == [self.template_name], template - - os.remove(file) - - def test_export_to_file_relative_path(self): - """ - Test export template to file with relative file path - """ - self.render_config_template(self.beat_name, self.output, - fields=self.output) - - path = os.path.join(os.path.dirname(__file__), "export") - exit_code = self.run_beat( - extra_args=["export", "template", "--dir=" + path], - config=self.config) - - assert exit_code == 0 - - base_path = os.path.abspath(os.path.join(self.beat_path, os.path.dirname(__file__), "export")) - file = os.path.join(base_path, "template", self.template_name + '.json') - with open(file) as f: - template = json.load(f) - assert 'index_patterns' in template - assert template['index_patterns'] == [self.template_name], template - - os.remove(file) diff --git a/libbeat/version/version.go b/libbeat/version/version.go index cfa3abd3aef..960ed3c72e6 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.10.0" +const defaultBeatVersion = "8.11.0" diff --git a/metricbeat/Dockerfile b/metricbeat/Dockerfile index e7ebcc93371..b3450fb8c24 100644 --- a/metricbeat/Dockerfile +++ b/metricbeat/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 RUN \ apt update \ @@ -13,7 +13,7 @@ RUN \ && rm -rf /var/lib/apt/lists/* # Use a virtualenv to avoid the PEP668 "externally managed environment" error caused by conflicts -# with the system Python installation. golang:1.19.10 uses Debian 12 which now enforces PEP668. +# with the system Python installation. golang:1.20.6 uses Debian 12 which now enforces PEP668. ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" @@ -21,7 +21,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN pip3 install --upgrade pip==20.1.1 RUN pip3 install --upgrade docker-compose==1.23.2 RUN pip3 install --upgrade setuptools==47.3.2 -RUN pip3 install --upgrade PyYAML==6.0.0 +RUN pip3 install --upgrade PyYAML==5.3.1 # Oracle instant client RUN cd /usr/lib \ diff --git a/metricbeat/docker-compose.yml b/metricbeat/docker-compose.yml index ddbab5b80c1..a857636f46b 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.8.1}-1 + image: docker.elastic.co/integrations-ci/beats-elasticsearch:${ELASTICSEARCH_VERSION:-8.9.1}-1 build: context: ./module/elasticsearch/_meta args: - ELASTICSEARCH_VERSION: ${ELASTICSEARCH_VERSION:-8.8.1} + ELASTICSEARCH_VERSION: ${ELASTICSEARCH_VERSION:-8.9.1} 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.8.1}-1 + image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.9.1}-1 build: context: ./module/kibana/_meta args: - KIBANA_VERSION: ${KIBANA_VERSION:-8.8.1} + KIBANA_VERSION: ${KIBANA_VERSION:-8.9.1} 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.8.1}-1 + image: docker.elastic.co/integrations-ci/beats-metricbeat:${BEAT_VERSION:-8.9.1}-1 build: context: ./module/beat/_meta args: - BEAT_VERSION: ${BEAT_VERSION:-8.8.1} + BEAT_VERSION: ${BEAT_VERSION:-8.9.1} command: '-e' ports: - 5066:5066 diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 17f608f713b..6e7e895a56d 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -45789,6 +45789,26 @@ type: boolean -- + +*`kubernetes.deployment.status.available`*:: ++ +-- +Deployment Available Condition status (true, false or unknown) + + +type: keyword + +-- + +*`kubernetes.deployment.status.progressing`*:: ++ +-- +Deployment Progresing Condition status (true, false or unknown) + +type: keyword + +-- + [float] === replicas diff --git a/metricbeat/docs/modules/elasticsearch.asciidoc b/metricbeat/docs/modules/elasticsearch.asciidoc index 54ddd22a762..109f615f073 100644 --- a/metricbeat/docs/modules/elasticsearch.asciidoc +++ b/metricbeat/docs/modules/elasticsearch.asciidoc @@ -71,6 +71,7 @@ metricbeat.modules: hosts: ["http://localhost:9200"] #username: "elastic" #password: "changeme" + #api_key: "foo:bar" #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true diff --git a/metricbeat/docs/modules/kubernetes.asciidoc b/metricbeat/docs/modules/kubernetes.asciidoc index 421f69eb682..1e02b3e9940 100644 --- a/metricbeat/docs/modules/kubernetes.asciidoc +++ b/metricbeat/docs/modules/kubernetes.asciidoc @@ -157,7 +157,7 @@ roleRef: === Compatibility The Kubernetes module is tested with the following versions of Kubernetes: -1.23.x, 1.24.x, 1.25.x, 1.26.x +1.25.x, 1.26.x and 1.27.x. [float] === Dashboard diff --git a/metricbeat/docs/modules/sql.asciidoc b/metricbeat/docs/modules/sql.asciidoc index 879f80ab67f..9c27c0bc4ba 100644 --- a/metricbeat/docs/modules/sql.asciidoc +++ b/metricbeat/docs/modules/sql.asciidoc @@ -11,7 +11,7 @@ This file is generated! See scripts/mage/docs_collector.go == SQL module The SQL module allows you to execute custom queries against an SQL database and -store the results in {es}. It also enables developing various SQL metrics integrations, using sql query as input. +store the results in {es}. It also enables the development of various SQL metrics integrations, using SQL query as input. This module supports the databases that you can monitor with {metricbeat}, including: @@ -35,20 +35,21 @@ fields: `driver`:: The driver can be any driver that has a {metricbeat} module, such as `mssql` or `postgres`. -`raw_data.enabled`:: Expects either true or false. By default false. Marking as true will generate event results in new field format. +`fetch_from_all_databases`:: Expects either `true` or `false` and it is by default set to `false`. Marking as `true` will enable execution `sql_queries` or `sql_query` for all databases in a server. Currently only `mssql` driver supports this feature. For other drivers, if enabled, "fetch from all databases feature is not supported for driver: " error would be logged. -Expects either `sql_queries` or `sql_query`. +`raw_data.enabled`:: Expects either `true` or `false` and it is by default set to `false`. Marking as `true` will generate event results in a new field format. -`sql_queries`:: Receives the list of queries to execute. `query` and `response_format` is repeated to get multiple query inputs. -`query`::: Expects sql query. -`response_format`::: Either `variables` or `table`: -`variables`:::: Expects a two-column table that looks like a key/value result. -The left column is considered a key and the right column the value. This mode -generates a single event on each fetch operation. -`table`:::: Expects any number of columns. This mode generates a single event for -each row. +Use `sql_queries` or `sql_query` depending on the use-case. -`sql_query`:: The single query you want to run. (`Backward Compatibility`). Also provide corresponding `sql_response_format`: either `variables` or `table` +`sql_queries`:: List of queries to execute. `query` and `response_format` fields are repeated to get multiple query inputs. + +`query`::: Single SQL query. + +`response_format`::: Either `variables` or `table`. +`variables`:::: Expects a two-column table that looks like a key-value result. The left column is considered a key and the right column is the value. This mode generates a single event on each fetch operation. +`table`:::: Expects any number of columns. This mode generates a single event for each row. + +`sql_query` (`Backward Compatibility`):: Single query you want to run. Also, provide corresponding `sql_response_format` (value: `variables` or `table`) similar to `sql_queries`'s `response_format`. [float] == Example @@ -56,7 +57,7 @@ each row. Examples of configurations in `sql.yml` to connect with supported databases are mentioned below. [float] -=== Example: capture Innodb-related metrics +=== Example: Capture Innodb-related metrics This `sql.yml` configuration shows how to capture Innodb-related metrics that result from the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL @@ -143,7 +144,7 @@ The example shown earlier generates this event: ---- [float] -=== Example: query PostgreSQL and generate a "table" result +=== Example: Query PostgreSQL and generate a "table" result This `sql.yml` configuration shows how to query PostgreSQL and generate a "table" result. This configuration generates a single event for each row @@ -231,7 +232,7 @@ for each row. For example, this event is created for the first row: ---- [float] -=== Example: get the buffer catch hit ratio in Oracle +=== Example: Get the buffer catch hit ratio in Oracle This `sql.yml` configuration shows how to get the buffer cache hit ratio: @@ -306,7 +307,7 @@ The example generates this event: ---- [float] -=== Example: get the buffer cache hit ratio for MSSQL +=== Example: Get the buffer cache hit ratio for MSSQL This `sql.yml` configuration gets the buffer cache hit ratio: @@ -356,7 +357,7 @@ The example generates this event: ---- [float] -=== Example: launch two or more queries. +=== Example: Launch two or more queries. To launch two or more queries, specify the full configuration for each query. @@ -420,14 +421,14 @@ The example generates this event: The response event is generated in new format "version": "8.0.0" }, "host": { - "name": "Muthu-mps" + "name": "mps" }, "agent": { "type": "metricbeat", "version": "8.3.0", "ephemeral_id": "8decc9eb-5ea5-47d8-8a22-fac507a5521b", "id": "6bbf5058-afed-44c6-aa05-775ee14a2da4", - "name": "Muthu-mps" + "name": "mps" } } ---- @@ -477,26 +478,26 @@ The example generates this event: By disabling the flag `raw_data.enabled`, whic "version": "8.0.0" }, "host": { - "name": "Muthu-mps" + "name": "mps" }, "agent": { "version": "8.3.0", "ephemeral_id": "bc09584b-62db-4b45-bfe9-6b7e8e982361", "id": "6bbf5058-afed-44c6-aa05-775ee14a2da4", - "name": "Muthu-mps", + "name": "mps", "type": "metricbeat" } } ---- [float] -=== Example: Merge multiple queries to single event. +=== Example: Merge multiple queries into a single event. -Multiple queries will create multiple events, one for each query. It may be preferrable to create a single event by combining the metrics together in a single event. +Multiple queries will create multiple events, one for each query. It may be preferable to create a single event by combining the metrics together in a single event. This feature can be enabled using the `merge_results` config. -However, such a merge is possible only if the table queries being merged, each produce a single row. +However, such a merge is possible only if the table queries are merged, each produces a single row. For example: @@ -525,7 +526,7 @@ This creates a combined event as below, where `blks_hit`, `blks_read`, `checkpoi { "@timestamp": "2022-07-21T07:07:06.747Z", "agent": { - "name": "Lalits-MBP-2", + "name": "MBP-2", "type": "metricbeat", "version": "8.4.0", "ephemeral_id": "b0867287-e56a-492f-b421-0ac870c426f9", @@ -556,6 +557,276 @@ This creates a combined event as below, where `blks_hit`, `blks_read`, `checkpoi } ---- +[float] +=== Example: Execute given queries for all database(s) present in a server + +Assuming a user could have 100s of databases on their server and then it becomes cumbersome to add them manually to the query. If `fetch_from_all_databases` is set to `true` then SQL module would fetch the databases names automatically and prefix +the database selector statement to the queries so that the queries can run against +the database provided. + +Currently, this feature only works with `mssql` driver. For example: + +[source,yaml] +---- +- module: sql + metricsets: + - query + period: 50s + hosts: ["sqlserver://:@"] + raw_data.enabled: true + + fetch_from_all_databases: true + + driver: "mssql" + sql_queries: + - query: SELECT DB_NAME() AS 'database_name'; + response_format: table +---- + +For an mssql instance, by default only four databases are present namely — `master`, `model`, `msdb`, `tempdb`. So, if `fetch_from_all_databases` is enabled then query `SELECT DB_NAME() AS 'database_name'` runs for each one of them i.e., there would be in total 4 documents (one each for 4 databases) for every scrape. + + +[source,json] +---- +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "service": { + "type": "sql", + "address": "localhost" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 40346375 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "sql": { + "metrics": { + "database_name": "master" + }, + "driver": "mssql", + "query": "USE [master]; SELECT DB_NAME() AS 'database_name';" + }, + "host": { + "os": { + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "", + "build": "" + }, + "name": "", + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "", + "architecture": "arm64" + }, + "agent": { + "name": "", + "type": "metricbeat", + "version": "8.10.0", + "ephemeral_id": "", + "id": "" + }, + "ecs": { + "version": "8.0.0" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "agent": { + "ephemeral_id": "", + "id": "", + "name": "", + "type": "metricbeat", + "version": "8.10.0" + }, + "event": { + "module": "sql", + "duration": 43147875, + "dataset": "sql.query" + }, + "metricset": { + "period": 50000, + "name": "query" + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "tempdb" + }, + "driver": "mssql", + "query": "USE [tempdb]; SELECT DB_NAME() AS 'database_name';" + }, + "ecs": { + "version": "8.0.0" + }, + "host": { + "name": "", + "architecture": "arm64", + "os": { + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "", + "build": "", + "type": "macos" + }, + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "host": { + "os": { + "build": "", + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "" + }, + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "", + "name": "", + "architecture": "arm64" + }, + "agent": { + "ephemeral_id": "", + "id": "", + "name": "", + "type": "metricbeat", + "version": "8.10.0" + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "model" + }, + "driver": "mssql", + "query": "USE [model]; SELECT DB_NAME() AS 'database_name';" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 46623125 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "ecs": { + "version": "8.0.0" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "host": { + "architecture": "arm64", + "os": { + "kernel": "", + "build": "", + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS" + }, + "name": "", + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "" + }, + "agent": { + "type": "metricbeat", + "version": "8.10.0", + "ephemeral_id": "", + "id": "", + "name": "" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 49649250 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "msdb" + }, + "driver": "mssql", + "query": "USE [msdb]; SELECT DB_NAME() AS 'database_name';" + }, + "ecs": { + "version": "8.0.0" + } +} +---- + + === Host Setup Some drivers require additional configuration to work. Find here instructions for these drivers. @@ -575,9 +846,9 @@ Also, add `ORACLE_HOME/bin` to the `PATH` environment variable. ===== Oracle Instant Client Installation -Oracle Instant Client enables development and deployment of applications that connect to Oracle Database. The Instant Client libraries provide the necessary network connectivity and advanced data features to make full use of Oracle Database. If you have OCI Oracle server which comes with these libraries pre-installed, you don't need a separate client installation. +Oracle Instant Client enables the development and deployment of applications that connect to the Oracle Database. The Instant Client libraries provide the necessary network connectivity and advanced data features to make full use of the Oracle Database. If you have an OCI Oracle server which comes with these libraries pre-installed, you don't need a separate client installation. -The OCI library install few Client Shared Libraries that must be referenced on the machine where Metricbeat is installed. Please follow https://docs.oracle.com/en/database/oracle/oracle-database/21/lacli/install-instant-client-using-zip.html#GUID-D3DCB4FB-D3CA-4C25-BE48-3A1FB5A22E84[this] link for OCI Instant Client set up. The OCI Instant Client is available with the Oracle Universal Installer, RPM file or ZIP file. Download links can be found https://www.oracle.com/database/technologies/instant-client/downloads.html[here]. +The OCI library installs a few Client Shared Libraries that must be referenced on the machine where Metricbeat is installed. Please follow https://docs.oracle.com/en/database/oracle/oracle-database/21/lacli/install-instant-client-using-zip.html#GUID-D3DCB4FB-D3CA-4C25-BE48-3A1FB5A22E84[this] link for OCI Instant Client set up. The OCI Instant Client is available with the Oracle Universal Installer, RPM file or ZIP file. Download links can be found at https://www.oracle.com/database/technologies/instant-client/downloads.html[here]. ===== Enable Oracle Listener @@ -612,7 +883,7 @@ The following two types of host configurations are supported: Note: If the password contains the backslash (`\`) character, it must be escaped with a backslash. For example, if the password is `my\_password`, it should be written as `my\\_password`. -Username and Password to connect to the database can be provided as values to `username` and `password` keys of `sql.yml`. +The username and password to connect to the database can be provided as values to `username` and `password` keys of `sql.yml`. [source,yml] ---- diff --git a/metricbeat/docs/running-on-docker.asciidoc b/metricbeat/docs/running-on-docker.asciidoc index cc7c8c5b650..72cfed9757d 100644 --- a/metricbeat/docs/running-on-docker.asciidoc +++ b/metricbeat/docs/running-on-docker.asciidoc @@ -18,7 +18,9 @@ docker run \ --mount type=bind,source=/proc,target=/hostfs/proc,readonly \ <1> --mount type=bind,source=/sys/fs/cgroup,target=/hostfs/sys/fs/cgroup,readonly \ <2> --mount type=bind,source=/,target=/hostfs,readonly \ <3> - --net=host \ <4> + --mount type=bind,source=/var/run/dbus/system_bus_socket,target=/hostfs/var/run/dbus/system_bus_socket,readonly \ <4> + --env DBUS_SYSTEM_BUS_ADDRESS='unix:path=/hostfs/var/run/dbus/system_bus_socket' \ <4> + --net=host \ <5> {dockerimage} -e -system.hostfs=/hostfs ---- @@ -36,7 +38,9 @@ mounted inside the directory specified by the `hostfs` config value. <3> If you want to be able to monitor filesystems from the host by using the <>, then those filesystems need to be mounted inside of the container. They can be mounted at any location. -<4> The <> uses data from `/proc/net/dev`, or +<4> The <> and <> +both require access to dbus. Mount the dbus socket and set the `DBUS_SYSTEM_BUS_ADDRESS` environment variable to the mounted system socket path. +<5> The <> uses data from `/proc/net/dev`, or `/hostfs/proc/net/dev` when using `hostfs=/hostfs`. The only way to make this file contain the host's network devices is to use the `--net=host` flag. This is due to Linux namespacing; simply bind mounting the host's `/proc` diff --git a/metricbeat/docs/troubleshooting.asciidoc b/metricbeat/docs/troubleshooting.asciidoc index 823ad0d3357..f1876af0f27 100644 --- a/metricbeat/docs/troubleshooting.asciidoc +++ b/metricbeat/docs/troubleshooting.asciidoc @@ -7,6 +7,7 @@ If you have issues installing or running {beatname_uc}, read the following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -24,3 +25,15 @@ include::{libbeat-dir}/getting-help.asciidoc[] == Debug include::{libbeat-dir}/debugging.asciidoc[] + +//sets block macro for metrics-in-logs.asciidoc included in next section + +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] \ No newline at end of file diff --git a/metricbeat/helper/dialer/dialer_posix.go b/metricbeat/helper/dialer/dialer_posix.go index 04651ab1ea4..0e66e82b2b7 100644 --- a/metricbeat/helper/dialer/dialer_posix.go +++ b/metricbeat/helper/dialer/dialer_posix.go @@ -20,11 +20,10 @@ package dialer import ( + "errors" "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/transport" ) diff --git a/metricbeat/helper/elastic/elastic.go b/metricbeat/helper/elastic/elastic.go index e6cdea008f8..25fa5835434 100644 --- a/metricbeat/helper/elastic/elastic.go +++ b/metricbeat/helper/elastic/elastic.go @@ -21,8 +21,6 @@ import ( "fmt" "strings" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/version" @@ -145,7 +143,7 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpa XPackEnabled bool `config:"xpack.enabled"` }{} if err := base.UnpackConfig(&config); err != nil { - return nil, errors.Wrapf(err, "could not unpack configuration for module %v", moduleName) + return nil, fmt.Errorf("could not unpack configuration for module %v: %w", moduleName, err) } // No special configuration is needed if xpack.enabled != true @@ -155,7 +153,7 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpa var raw mapstr.M if err := base.UnpackConfig(&raw); err != nil { - return nil, errors.Wrapf(err, "could not unpack configuration for module %v", moduleName) + return nil, fmt.Errorf("could not unpack configuration for module %v: %w", moduleName, err) } // Ensure all required metricsets are enabled when xpack.enabled == true, and add any additional which are optional @@ -190,12 +188,12 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpa newConfig, err := conf.NewConfigFrom(raw) if err != nil { - return nil, errors.Wrapf(err, "could not create new configuration for module %v", moduleName) + return nil, fmt.Errorf("could not create new configuration for module %v: %w", moduleName, err) } newModule, err := base.WithConfig(*newConfig) if err != nil { - return nil, errors.Wrapf(err, "could not reconfigure module %v", moduleName) + return nil, fmt.Errorf("could not reconfigure module %v: %w", moduleName, err) } logger.Debugf("Configuration for module %v modified because xpack.enabled was set to true", moduleName) diff --git a/metricbeat/helper/kubernetes/ktest/ktest.go b/metricbeat/helper/kubernetes/ktest/ktest.go index f5394ad0b7a..a8de05cbd05 100644 --- a/metricbeat/helper/kubernetes/ktest/ktest.go +++ b/metricbeat/helper/kubernetes/ktest/ktest.go @@ -47,14 +47,14 @@ func GetTestCases(files []string) ptest.TestCases { return cases } -// TestStateMetricsFamily +// TestMetricsFamily // This function reads the metric files and checks if the resource fetched metrics exist in it. // It only checks the family metric, because if the metric doesn't have any data, we don't have a way // to know the labels from the file. // The test fails if the metric does not exist in any of the files. // A warning is printed if the metric is not present in all of them. // Nothing happens, otherwise. -func TestStateMetricsFamily(t *testing.T, files []string, mapping *p.MetricsMapping) { +func TestMetricsFamily(t *testing.T, files []string, mapping *p.MetricsMapping) { metricsFiles := map[string][]string{} for i := 0; i < len(files); i++ { content, err := ioutil.ReadFile(files[i]) diff --git a/metricbeat/helper/socket/netlink.go b/metricbeat/helper/socket/netlink.go index 0037cca64f7..df1230f5421 100644 --- a/metricbeat/helper/socket/netlink.go +++ b/metricbeat/helper/socket/netlink.go @@ -20,11 +20,10 @@ package socket import ( + "fmt" "os" "sync/atomic" - "github.com/pkg/errors" - "github.com/elastic/gosigar/sys/linux" ) @@ -48,7 +47,7 @@ func (session *NetlinkSession) GetSocketList() ([]*linux.InetDiagMsg, error) { req.Header.Seq = atomic.AddUint32(&session.seq, 1) sockets, err := linux.NetlinkInetDiagWithBuf(req, session.readBuffer, nil) if err != nil { - return nil, errors.Wrap(err, "failed requesting socket dump") + return nil, fmt.Errorf("failed requesting socket dump: %w", err) } return sockets, nil } diff --git a/metricbeat/helper/sql/sql.go b/metricbeat/helper/sql/sql.go index 80e59779adc..a0d4ebbd36b 100644 --- a/metricbeat/helper/sql/sql.go +++ b/metricbeat/helper/sql/sql.go @@ -26,8 +26,6 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -46,22 +44,25 @@ type sqlRow interface { // NewDBClient gets a client ready to query the database func NewDBClient(driver, uri string, l *logp.Logger) (*DbClient, error) { - dbx, err := sql.Open(switchDriverName(driver), uri) + dbx, err := sql.Open(SwitchDriverName(driver), uri) if err != nil { - return nil, errors.Wrap(err, "opening connection") + return nil, fmt.Errorf("opening connection: %w", err) } err = dbx.Ping() if err != nil { if closeErr := dbx.Close(); closeErr != nil { - return nil, errors.Wrapf(err, "failed to close with %s, after connection test failed", closeErr) + // NOTE(SS): Support for wrapping multiple errors is there in Go 1.20+. + // TODO(SS): When beats module starts using Go 1.20+, use: https://pkg.go.dev/errors#Join + // and until then, let's use the following workaround. + return nil, fmt.Errorf(fmt.Sprintf("failed to close with: %s", closeErr.Error())+" after connection test failed: %w", err) } - return nil, errors.Wrap(err, "testing connection") + return nil, fmt.Errorf("testing connection: %w", err) } return &DbClient{DB: dbx, logger: l}, nil } -// fetchTableMode scan the rows and publishes the event for querys that return the response in a table format. +// FetchTableMode scan the rows and publishes the event for querys that return the response in a table format. func (d *DbClient) FetchTableMode(ctx context.Context, q string) ([]mapstr.M, error) { rows, err := d.QueryContext(ctx, q) if err != nil { @@ -76,7 +77,7 @@ func (d *DbClient) fetchTableMode(rows sqlRow) ([]mapstr.M, error) { // https://stackoverflow.com/questions/23507531/is-golangs-sql-package-incapable-of-ad-hoc-exploratory-queries/23507765#23507765 cols, err := rows.Columns() if err != nil { - return nil, errors.Wrap(err, "error getting columns") + return nil, fmt.Errorf("error getting columns: %w", err) } for k, v := range cols { @@ -92,7 +93,7 @@ func (d *DbClient) fetchTableMode(rows sqlRow) ([]mapstr.M, error) { for rows.Next() { err = rows.Scan(vals...) if err != nil { - d.logger.Debug(errors.Wrap(err, "error trying to scan rows")) + d.logger.Debug(fmt.Errorf("error trying to scan rows: %w", err)) continue } @@ -107,7 +108,7 @@ func (d *DbClient) fetchTableMode(rows sqlRow) ([]mapstr.M, error) { } if err = rows.Err(); err != nil { - d.logger.Debug(errors.Wrap(err, "error trying to read rows")) + d.logger.Debug(fmt.Errorf("error trying to read rows: %w", err)) } return rr, nil @@ -131,7 +132,7 @@ func (d *DbClient) fetchVariableMode(rows sqlRow) (mapstr.M, error) { var val interface{} err := rows.Scan(&key, &val) if err != nil { - d.logger.Debug(errors.Wrap(err, "error trying to scan rows")) + d.logger.Debug(fmt.Errorf("error trying to scan rows: %w", err)) continue } @@ -140,13 +141,14 @@ func (d *DbClient) fetchVariableMode(rows sqlRow) (mapstr.M, error) { } if err := rows.Err(); err != nil { - d.logger.Debug(errors.Wrap(err, "error trying to read rows")) + d.logger.Debug(fmt.Errorf("error trying to read rows: %w", err)) } r := mapstr.M{} for key, value := range data { - value := getValue(&value) + value := value + value = getValue(&value) r.Put(key, value) } @@ -189,9 +191,9 @@ func getValue(pval *interface{}) interface{} { } } -// switchDriverName switches between driver name and a pretty name for a driver. For example, 'oracle' driver is called +// SwitchDriverName switches between driver name and a pretty name for a driver. For example, 'oracle' driver is called // 'godror' so this detail implementation must be hidden to the user, that should only choose and see 'oracle' as driver -func switchDriverName(d string) string { +func SwitchDriverName(d string) string { switch d { case "oracle": return "godror" diff --git a/metricbeat/helper/windows/pdh/pdh_query_windows.go b/metricbeat/helper/windows/pdh/pdh_query_windows.go index 44e86637346..3706edbf85c 100644 --- a/metricbeat/helper/windows/pdh/pdh_query_windows.go +++ b/metricbeat/helper/windows/pdh/pdh_query_windows.go @@ -20,6 +20,8 @@ package pdh import ( + "errors" + "fmt" "regexp" "runtime" "strings" @@ -27,8 +29,6 @@ import ( "unsafe" "golang.org/x/sys/windows" - - "github.com/pkg/errors" ) var ( @@ -195,10 +195,10 @@ func (q *Query) GetFormattedCounterValues() (map[string][]CounterValue, error) { func (q *Query) GetCountersAndInstances(objectName string) ([]string, []string, error) { counters, instances, err := PdhEnumObjectItems(objectName) if err != nil { - return nil, nil, errors.Wrapf(err, "Unable to retrieve counter and instance list for %s", objectName) + return nil, nil, fmt.Errorf("Unable to retrieve counter and instance list for %s: %w", objectName, err) } if len(counters) == 0 && len(instances) == 0 { - return nil, nil, errors.Errorf("Unable to retrieve counter and instance list for %s", objectName) + return nil, nil, fmt.Errorf("Unable to retrieve counter and instance list for %s", objectName) } return UTF16ToStringArray(counters), UTF16ToStringArray(instances), nil } @@ -333,7 +333,7 @@ func getCounterValue(counter *Counter) CounterValue { counterValue.Measurement = value.Value } default: - counterValue.Err.Error = errors.Errorf("initialization failed: format '%#v' "+ + counterValue.Err.Error = fmt.Errorf("initialization failed: format '%#v' "+ "for instance '%s' is invalid (must be PdhFmtDouble, PdhFmtLarge or PdhFmtLong)", counter.format, counter.instanceName) } diff --git a/metricbeat/internal/sysinit/init.go b/metricbeat/internal/sysinit/init.go index 880063506b9..a14a7709550 100644 --- a/metricbeat/internal/sysinit/init.go +++ b/metricbeat/internal/sysinit/init.go @@ -19,6 +19,7 @@ package sysinit import ( "flag" + "fmt" "sync" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" @@ -39,21 +40,24 @@ type HostFSConfig struct { HostFS string `config:"hostfs"` } -// MetricbeatHostFSConfig +// MetricbeatHostFSConfig carries config information for the hostfs setting type MetricbeatHostFSConfig struct { HostFS string `config:"system.hostfs"` } -// Init either the system or linux module. This will produce different modules depending on if we're running under agent or not. +// InitSystemModule initializes either either the system or linux module. This will produce different modules depending on if we're running under agent or not. func InitSystemModule(base mb.BaseModule) (mb.Module, error) { // common code for the base use case of `hostfs` being set at the module-level logger := logp.L() - hostfs, userSet := findConfigValue(base) + hostfs, userSet, err := findConfigValue(base) + if err != nil { + return nil, fmt.Errorf("error fetching config value: %w", err) + } if fleetmode.Enabled() { logger.Infof("initializing HostFS values under agent: %s", hostfs) return fleetInit(base, hostfs, userSet) } - return metricbeatInit(base, hostfs, userSet) + return metricbeatInit(base, hostfs) } func fleetInit(base mb.BaseModule, modulepath string, moduleSet bool) (mb.Module, error) { @@ -71,12 +75,11 @@ func fleetInit(base mb.BaseModule, modulepath string, moduleSet bool) (mb.Module } // Deal with the legacy configs available to metricbeat -func metricbeatInit(base mb.BaseModule, modulePath string, moduleSet bool) (mb.Module, error) { +func metricbeatInit(base mb.BaseModule, modulePath string) (mb.Module, error) { var hostfs = modulePath var userSet bool // allow the CLI to override other settings if hostfsCLI != nil && *hostfsCLI != "" { - cfgwarn.Deprecate("8.0.0", "The --system.hostfs flag will be removed in the future and replaced by a config value.") hostfs = *hostfsCLI userSet = true } @@ -91,22 +94,29 @@ func metricbeatInit(base mb.BaseModule, modulePath string, moduleSet bool) (mb.M // A user can supply either `system.hostfs` or `hostfs`. // In additon, we will probably want to change Integration Config values to `hostfs` as well. // We need to figure out which one we got, if any. -func findConfigValue(base mb.BaseModule) (string, bool) { +// Returns false if no config value was set +func findConfigValue(base mb.BaseModule) (string, bool, error) { partialConfig := HostFSConfig{} - base.UnpackConfig(&partialConfig) + err := base.UnpackConfig(&partialConfig) + if err != nil { + return "", false, fmt.Errorf("error unpacking hostfs config: %w", err) + } // if the newer value is set, just use that. if partialConfig.HostFS != "" { - return partialConfig.HostFS, true + return partialConfig.HostFS, true, nil } legacyConfig := MetricbeatHostFSConfig{} - base.UnpackConfig(&legacyConfig) + err = base.UnpackConfig(&legacyConfig) + if err != nil { + return "", false, fmt.Errorf("error unpacking legacy config: %w", err) + } if legacyConfig.HostFS != "" { cfgwarn.Deprecate("8.0.0", "The system.hostfs config value will be removed, use `hostfs` from within the module config.") // Only fallback to this if the user didn't set anything else - return legacyConfig.HostFS, true + return legacyConfig.HostFS, true, nil } - return "/", false + return "/", false, nil } diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index 2a184fdb0bf..eabdcc8e918 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -282,6 +282,7 @@ metricbeat.modules: hosts: ["http://localhost:9200"] #username: "elastic" #password: "changeme" + #api_key: "foo:bar" #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true diff --git a/metricbeat/module/apache/status/status.go b/metricbeat/module/apache/status/status.go index 012e08b91ac..472e4fcb3d5 100644 --- a/metricbeat/module/apache/status/status.go +++ b/metricbeat/module/apache/status/status.go @@ -19,7 +19,7 @@ package status import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/fleetmode" "github.com/elastic/beats/v7/metricbeat/helper" @@ -87,7 +87,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { scanner, err := m.http.FetchScanner() if err != nil { - return errors.Wrap(err, "error fetching data") + return fmt.Errorf("error fetching data: %w", err) } data, _ := eventMapping(scanner, m.Host()) diff --git a/metricbeat/module/ceph/cluster_status/cluster_status.go b/metricbeat/module/ceph/cluster_status/cluster_status.go index 69c11a084f3..786bde0c9a5 100644 --- a/metricbeat/module/ceph/cluster_status/cluster_status.go +++ b/metricbeat/module/ceph/cluster_status/cluster_status.go @@ -18,7 +18,7 @@ package cluster_status import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -70,12 +70,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { content, err := m.HTTP.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } events, err := eventsMapping(content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } for _, event := range events { diff --git a/metricbeat/module/ceph/mgr_cluster_disk/data.go b/metricbeat/module/ceph/mgr_cluster_disk/data.go index e2e808cbc08..4f41ba05d79 100644 --- a/metricbeat/module/ceph/mgr_cluster_disk/data.go +++ b/metricbeat/module/ceph/mgr_cluster_disk/data.go @@ -18,7 +18,7 @@ package mgr_cluster_disk import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/module/ceph/mgr" "github.com/elastic/elastic-agent-libs/mapstr" @@ -36,7 +36,7 @@ func eventMapping(content []byte) (mapstr.M, error) { var response DfResponse err := mgr.UnmarshalResponse(content, &response) if err != nil { - return nil, errors.Wrap(err, "could not get response data") + return nil, fmt.Errorf("could not get response data: %w", err) } return mapstr.M{ diff --git a/metricbeat/module/docker/network_summary/helper.go b/metricbeat/module/docker/network_summary/helper.go index 63cb5793d44..694178b6147 100644 --- a/metricbeat/module/docker/network_summary/helper.go +++ b/metricbeat/module/docker/network_summary/helper.go @@ -29,7 +29,6 @@ import ( "time" "github.com/docker/docker/client" - "github.com/pkg/errors" "github.com/elastic/go-sysinfo" @@ -55,19 +54,23 @@ func fetchContainerNetStats(client *client.Client, timeout time.Duration, contai inspect, err := client.ContainerInspect(ctx, container) if err != nil { - return nil, errors.Wrapf(err, "error fetching stats for container %s", container) + return nil, fmt.Errorf("error fetching stats for container %s: %w", container, err) } rootPID := inspect.ContainerJSONBase.State.Pid proc, err := sysinfo.Process(rootPID) + if err != nil { + return nil, fmt.Errorf("cannot fetch process information for PID %d: %w", rootPID, err) + } + procNet, ok := proc.(sysinfotypes.NetworkCounters) if !ok { - return nil, errors.Wrapf(err, "cannot fetch network counters for PID %d", rootPID) + return nil, fmt.Errorf("cannot fetch network counters for PID %d", rootPID) } counters, err := procNet.NetworkCounters() if err != nil { - return &sysinfotypes.NetworkCountersInfo{}, errors.Wrapf(err, "error fetching network counters for PID %d", rootPID) + return &sysinfotypes.NetworkCountersInfo{}, fmt.Errorf("error fetching network counters for PID %d: %w", rootPID, err) } return counters, nil @@ -78,7 +81,7 @@ func fetchContainerNetStats(client *client.Client, timeout time.Duration, contai func fetchNamespace(pid int) (int, error) { nsLink, err := os.Readlink(filepath.Join("/proc/", fmt.Sprintf("%d", pid), "/ns/net")) if err != nil { - return 0, errors.Wrap(err, "error reading network namespace link") + return 0, fmt.Errorf("error reading network namespace link: %w", err) } nsidString := nsRegex.FindString(nsLink) // This is minor metadata, so don't consider it an error @@ -88,7 +91,7 @@ func fetchNamespace(pid int) (int, error) { nsID, err := strconv.Atoi(nsidString) if err != nil { - return 0, errors.Wrapf(err, "error converting %s to int", nsidString) + return 0, fmt.Errorf("error converting %s to int: %w", nsidString, err) } return nsID, nil } diff --git a/metricbeat/module/docker/network_summary/network_summary.go b/metricbeat/module/docker/network_summary/network_summary.go index 090869d1d8d..9753b449add 100644 --- a/metricbeat/module/docker/network_summary/network_summary.go +++ b/metricbeat/module/docker/network_summary/network_summary.go @@ -21,10 +21,10 @@ package network_summary import ( "context" + "fmt" "runtime" "github.com/docker/docker/client" - "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -86,7 +86,7 @@ func (m *MetricSet) Fetch(ctx context.Context, report mb.ReporterV2) error { stats, err := docker.FetchStats(m.dockerClient, m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "failed to get docker stats") + return fmt.Errorf("failed to get docker stats: %w", err) } for _, myStats := range stats { @@ -96,19 +96,19 @@ func (m *MetricSet) Fetch(ctx context.Context, report mb.ReporterV2) error { inspect, err := m.dockerClient.ContainerInspect(ctx, myStats.Container.ID) if err != nil { - return errors.Wrapf(err, "error fetching stats for container %s", myStats.Container.ID) + return fmt.Errorf("error fetching stats for container %s: %w", myStats.Container.ID, err) } rootPID := inspect.ContainerJSONBase.State.Pid netNS, err := fetchNamespace(rootPID) if err != nil { - return errors.Wrapf(err, "error fetching namespace for PID %d", rootPID) + return fmt.Errorf("error fetching namespace for PID %d: %w", rootPID, err) } networkStats, err := fetchContainerNetStats(m.dockerClient, m.Module().Config().Timeout, myStats.Container.ID) if err != nil { - return errors.Wrap(err, "error fetching per-PID stats") + return fmt.Errorf("error fetching per-PID stats") } summary := network.MapProcNetCounters(networkStats) diff --git a/metricbeat/module/elasticsearch/_meta/config-xpack.yml b/metricbeat/module/elasticsearch/_meta/config-xpack.yml index 4406ba7c050..0cdbe68aa79 100644 --- a/metricbeat/module/elasticsearch/_meta/config-xpack.yml +++ b/metricbeat/module/elasticsearch/_meta/config-xpack.yml @@ -4,4 +4,5 @@ hosts: ["http://localhost:9200"] #username: "user" #password: "secret" + #api_key: "foo:bar" diff --git a/metricbeat/module/elasticsearch/_meta/config.reference.yml b/metricbeat/module/elasticsearch/_meta/config.reference.yml index 199d28a0aea..1aa1d583b72 100644 --- a/metricbeat/module/elasticsearch/_meta/config.reference.yml +++ b/metricbeat/module/elasticsearch/_meta/config.reference.yml @@ -12,6 +12,7 @@ hosts: ["http://localhost:9200"] #username: "elastic" #password: "changeme" + #api_key: "foo:bar" #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true diff --git a/metricbeat/module/elasticsearch/_meta/config.yml b/metricbeat/module/elasticsearch/_meta/config.yml index 4a9dde67ad6..2ca3677cbf2 100644 --- a/metricbeat/module/elasticsearch/_meta/config.yml +++ b/metricbeat/module/elasticsearch/_meta/config.yml @@ -6,3 +6,4 @@ hosts: ["http://localhost:9200"] #username: "user" #password: "secret" + #api_key: "foo:bar" diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index 9cd316a41d3..00737472f2c 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -19,6 +19,7 @@ package elasticsearch import ( "encoding/json" + "errors" "fmt" "net/url" "strconv" @@ -26,8 +27,6 @@ import ( "sync" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/helper/elastic" "github.com/elastic/beats/v7/metricbeat/mb" @@ -390,7 +389,7 @@ func GetIndicesSettings(http *helper.HTTP, resetURI string) (map[string]IndexSet content, err := fetchPath(http, resetURI, "*/_settings", "filter_path=*.settings.index.hidden&expand_wildcards=all") if err != nil { - return nil, errors.Wrap(err, "could not fetch indices settings") + return nil, fmt.Errorf("could not fetch indices settings: %w", err) } var resp map[string]struct { @@ -403,7 +402,7 @@ func GetIndicesSettings(http *helper.HTTP, resetURI string) (map[string]IndexSet err = json.Unmarshal(content, &resp) if err != nil { - return nil, errors.Wrap(err, "could not parse indices settings response") + return nil, fmt.Errorf("could not parse indices settings response: %w", err) } ret := make(map[string]IndexSettings, len(resp)) @@ -604,7 +603,7 @@ func (l *License) ToMapStr() mapstr.M { func getSettingGroup(allSettings mapstr.M, groupKey string) (mapstr.M, error) { hasSettingGroup, err := allSettings.HasKey(groupKey) if err != nil { - return nil, errors.Wrap(err, "failure to determine if "+groupKey+" settings exist") + return nil, fmt.Errorf("failure to determine if "+groupKey+" settings exist: %w", err) } if !hasSettingGroup { @@ -613,12 +612,12 @@ func getSettingGroup(allSettings mapstr.M, groupKey string) (mapstr.M, error) { settings, err := allSettings.GetValue(groupKey) if err != nil { - return nil, errors.Wrap(err, "failure to extract "+groupKey+" settings") + return nil, fmt.Errorf("failure to extract "+groupKey+" settings: %w", err) } v, ok := settings.(map[string]interface{}) if !ok { - return nil, errors.Wrap(err, groupKey+" settings are not a map") + return nil, fmt.Errorf(groupKey + " settings are not a map") } return mapstr.M(v), nil diff --git a/metricbeat/module/elasticsearch/metricset.go b/metricbeat/module/elasticsearch/metricset.go index 363a9634f05..508ac68431c 100644 --- a/metricbeat/module/elasticsearch/metricset.go +++ b/metricbeat/module/elasticsearch/metricset.go @@ -18,6 +18,7 @@ package elasticsearch import ( + "encoding/base64" "encoding/json" "errors" "fmt" @@ -90,19 +91,29 @@ func NewMetricSet(base mb.BaseMetricSet, servicePath string) (*MetricSet, error) return nil, err } - http.SetHeaderDefault(productorigin.Header, productorigin.Beats) - config := struct { - Scope Scope `config:"scope"` - XPackEnabled bool `config:"xpack.enabled"` + Scope Scope `config:"scope"` + XPackEnabled bool `config:"xpack.enabled"` + ApiKey string `config:"api_key"` }{ Scope: ScopeNode, XPackEnabled: false, + ApiKey: "", } if err := base.Module().UnpackConfig(&config); err != nil { return nil, err } + http.SetHeaderDefault(productorigin.Header, productorigin.Beats) + + if config.ApiKey != "" { + hostData := base.HostData() + if hostData.User != "" || hostData.Password != "" { + return nil, fmt.Errorf("cannot set both api_key and username/password") + } + http.SetHeader("Authorization", "ApiKey "+base64.StdEncoding.EncodeToString([]byte(config.ApiKey))) + } + ms := &MetricSet{ base, servicePath, diff --git a/metricbeat/module/elasticsearch/node/node_test.go b/metricbeat/module/elasticsearch/node/node_test.go index 4a49072f294..32f91bc8c60 100644 --- a/metricbeat/module/elasticsearch/node/node_test.go +++ b/metricbeat/module/elasticsearch/node/node_test.go @@ -20,6 +20,7 @@ package node import ( + "encoding/base64" "io/ioutil" "net/http" "net/http/httptest" @@ -78,4 +79,48 @@ func TestFetch(t *testing.T) { t.Logf("%s/%s event: %+v", metricSet.Module().Name(), metricSet.Name(), e.Fields.StringToPrint()) }) } + + t.Run("with api key", func(t *testing.T) { + apiKey := "foo:bar" + expectedHeader := "ApiKey " + base64.StdEncoding.EncodeToString([]byte(apiKey)) + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.RequestURI { + case "/_nodes/_local": + apiKey := r.Header.Get("Authorization") + if apiKey != expectedHeader { + t.Errorf("expected api key to be %s but got %s", expectedHeader, apiKey) + } + w.WriteHeader(200) + w.Header().Set("Content-Type", "application/json;") + w.Write([]byte([]byte("{}"))) + + case "/": + apiKey := r.Header.Get("Authorization") + if apiKey != expectedHeader { + t.Errorf("expected api key to be %s but got %s", expectedHeader, apiKey) + } + + w.WriteHeader(200) + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{}")) + + default: + t.FailNow() + } + + })) + defer server.Close() + + config := map[string]interface{}{ + "module": "elasticsearch", + "metricsets": []string{"node"}, + "hosts": []string{server.URL}, + "api_key": "foo:bar", + } + reporter := &mbtest.CapturingReporterV2{} + + metricSet := mbtest.NewReportingMetricSetV2Error(t, config) + metricSet.Fetch(reporter) + }) } diff --git a/metricbeat/module/haproxy/info/data.go b/metricbeat/module/haproxy/info/data.go index b52c3fe9c48..d4cf9700269 100644 --- a/metricbeat/module/haproxy/info/data.go +++ b/metricbeat/module/haproxy/info/data.go @@ -18,7 +18,7 @@ package info import ( - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstrstr" @@ -174,7 +174,7 @@ func eventMapping(info *haproxy.Info, r mb.ReporterV2) (mb.Event, error) { // Convert this value to a float between 0.0 and 1.0 fval, err := strconv.ParseFloat(f.Interface().(string), 64) if err != nil { - return mb.Event{}, errors.Wrap(err, "error getting IdlePct") + return mb.Event{}, fmt.Errorf("error getting IdlePct: %w", err) } source[typeOfT.Field(i).Name] = strconv.FormatFloat(fval/float64(100), 'f', 2, 64) } else if typeOfT.Field(i).Name == "Memmax_MB" { @@ -182,7 +182,7 @@ func eventMapping(info *haproxy.Info, r mb.ReporterV2) (mb.Event, error) { val, err := strconv.Atoi(strings.TrimSpace(f.Interface().(string))) if err != nil { r.Error(err) - return mb.Event{}, errors.Wrap(err, "error getting Memmax_MB") + return mb.Event{}, fmt.Errorf("error getting Memmax_MB: %w", err) } source[typeOfT.Field(i).Name] = strconv.Itoa((val * 1024 * 1024)) } else { @@ -201,7 +201,7 @@ func eventMapping(info *haproxy.Info, r mb.ReporterV2) (mb.Event, error) { fields, err := schema.Apply(source) if err != nil { - return event, errors.Wrap(err, "error applying schema") + return event, fmt.Errorf("error applying schema: %w", err) } if processID, err := fields.GetValue("pid"); err == nil { event.RootFields.Put("process.pid", processID) diff --git a/metricbeat/module/haproxy/info/info.go b/metricbeat/module/haproxy/info/info.go index b875f05e718..027daf8fe73 100644 --- a/metricbeat/module/haproxy/info/info.go +++ b/metricbeat/module/haproxy/info/info.go @@ -18,7 +18,7 @@ package info import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -57,17 +57,17 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { hapc, err := haproxy.NewHaproxyClient(m.HostData().URI, m.BaseMetricSet) if err != nil { - return errors.Wrap(err, "failed creating haproxy client") + return fmt.Errorf("failed creating haproxy client: %w", err) } res, err := hapc.GetInfo() if err != nil { - return errors.Wrap(err, "failed fetching haproxy info") + return fmt.Errorf("failed fetching haproxy info: %w", err) } event, err := eventMapping(res, reporter) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } reporter.Event(event) return nil diff --git a/metricbeat/module/http/_meta/Dockerfile b/metricbeat/module/http/_meta/Dockerfile index 8565b542b1a..4bcd674a247 100644 --- a/metricbeat/module/http/_meta/Dockerfile +++ b/metricbeat/module/http/_meta/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 COPY test/main.go main.go diff --git a/metricbeat/module/jolokia/jmx/config.go b/metricbeat/module/jolokia/jmx/config.go index 23d7b18a5e2..337f0960011 100644 --- a/metricbeat/module/jolokia/jmx/config.go +++ b/metricbeat/module/jolokia/jmx/config.go @@ -19,13 +19,12 @@ package jmx import ( "encoding/json" + "errors" "fmt" "regexp" "sort" "strings" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -395,7 +394,7 @@ func (pc *JolokiaHTTPGetFetcher) EventMapping(content []byte, mapping AttributeM // When we use GET, the response is a single Entry if err := json.Unmarshal(content, &singleEntry); err != nil { - return nil, errors.Wrapf(err, "failed to unmarshal jolokia JSON response '%v'", string(content)) + return nil, fmt.Errorf("failed to unmarshal jolokia JSON response '%v': %w", string(content), err) } return eventMapping([]Entry{singleEntry}, mapping) @@ -517,8 +516,7 @@ func (pc *JolokiaHTTPPostFetcher) EventMapping(content []byte, mapping Attribute // When we use POST, the response is an array of Entry objects if err := json.Unmarshal(content, &entries); err != nil { - - return nil, errors.Wrapf(err, "failed to unmarshal jolokia JSON response '%v'", string(content)) + return nil, fmt.Errorf("failed to unmarshal jolokia JSON response '%v': %w", string(content), err) } return eventMapping(entries, mapping) diff --git a/metricbeat/module/kafka/consumergroup/consumergroup.go b/metricbeat/module/kafka/consumergroup/consumergroup.go index acce0b39d20..5fa41b13f01 100644 --- a/metricbeat/module/kafka/consumergroup/consumergroup.go +++ b/metricbeat/module/kafka/consumergroup/consumergroup.go @@ -20,8 +20,6 @@ package consumergroup import ( "fmt" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/kafka" "github.com/elastic/elastic-agent-libs/logp" @@ -81,7 +79,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { broker, err := m.Connect() if err != nil { - return errors.Wrap(err, "error in connect") + return fmt.Errorf("error in connect: %w", err) } defer broker.Close() @@ -114,7 +112,7 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { } err = fetchGroupInfo(emitEvent, broker, m.groups.pred(), m.topics.pred()) if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } return nil diff --git a/metricbeat/module/kafka/consumergroup/consumergroup_integration_test.go b/metricbeat/module/kafka/consumergroup/consumergroup_integration_test.go index db3423c8c3d..aafb5250499 100644 --- a/metricbeat/module/kafka/consumergroup/consumergroup_integration_test.go +++ b/metricbeat/module/kafka/consumergroup/consumergroup_integration_test.go @@ -20,12 +20,12 @@ package consumergroup import ( + "fmt" "io" "testing" "time" saramacluster "github.com/bsm/sarama-cluster" - "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/tests/compose" "github.com/elastic/beats/v7/metricbeat/mb" @@ -47,7 +47,7 @@ func TestData(t *testing.T) { c, err := startConsumer(t, service.HostForPort(9092), "metricbeat-test") if err != nil { - t.Fatal(errors.Wrap(err, "starting kafka consumer")) + t.Fatal(fmt.Errorf("starting kafka consumer: %w", err)) } defer c.Close() @@ -70,7 +70,7 @@ func TestFetch(t *testing.T) { c, err := startConsumer(t, service.HostForPort(9092), "metricbeat-test") if err != nil { - t.Fatal(errors.Wrap(err, "starting kafka consumer")) + t.Fatal(fmt.Errorf("starting kafka consumer: %w", err)) } defer c.Close() diff --git a/metricbeat/module/kafka/partition/partition.go b/metricbeat/module/kafka/partition/partition.go index c0372b32361..486c9a79e24 100644 --- a/metricbeat/module/kafka/partition/partition.go +++ b/metricbeat/module/kafka/partition/partition.go @@ -18,12 +18,11 @@ package partition import ( + "errors" "fmt" "github.com/Shopify/sarama" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" "github.com/elastic/beats/v7/metricbeat/module/kafka" @@ -78,13 +77,13 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { broker, err := m.Connect() if err != nil { - return errors.Wrap(err, "error in connect") + return fmt.Errorf("error in connect: %w", err) } defer broker.Close() topics, err := broker.GetTopicsMetadata(m.topics...) if err != nil { - return errors.Wrap(err, "error getting topic metadata") + return fmt.Errorf("error getting topic metadata: %w", err) } if len(topics) == 0 { debugf("no topic could be read, check ACLs") @@ -190,12 +189,12 @@ func queryOffsetRange( ) (int64, int64, bool, error) { oldest, err := b.PartitionOffset(replicaID, topic, partition, sarama.OffsetOldest) if err != nil { - return -1, -1, false, errors.Wrap(err, "failed to get oldest offset") + return -1, -1, false, fmt.Errorf("failed to get oldest offset: %w", err) } newest, err := b.PartitionOffset(replicaID, topic, partition, sarama.OffsetNewest) if err != nil { - return -1, -1, false, errors.Wrap(err, "failed to get newest offset") + return -1, -1, false, fmt.Errorf("failed to get newest offset: %w", err) } okOld := oldest != -1 diff --git a/metricbeat/module/kibana/settings/data.go b/metricbeat/module/kibana/settings/data.go index 55c6860e9f6..fc47e8a4839 100644 --- a/metricbeat/module/kibana/settings/data.go +++ b/metricbeat/module/kibana/settings/data.go @@ -19,8 +19,7 @@ package settings import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper/elastic" "github.com/elastic/elastic-agent-libs/mapstr" @@ -34,7 +33,7 @@ func eventMapping(r mb.ReporterV2, content []byte) error { var data map[string]interface{} err := json.Unmarshal(content, &data) if err != nil { - return errors.Wrap(err, "failure parsing Kibana API response") + return fmt.Errorf("failure parsing Kibana API response: %w", err) } schema := s.Schema{ diff --git a/metricbeat/module/kibana/status/data.go b/metricbeat/module/kibana/status/data.go index f02b2812d0b..3f975323a9e 100644 --- a/metricbeat/module/kibana/status/data.go +++ b/metricbeat/module/kibana/status/data.go @@ -19,8 +19,7 @@ package status import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -60,7 +59,7 @@ func eventMapping(r mb.ReporterV2, content []byte, isXpack bool) error { var data map[string]interface{} err := json.Unmarshal(content, &data) if err != nil { - return errors.Wrap(err, "failure parsing Kibana Status API response") + return fmt.Errorf("failure parsing Kibana Status API response: %w", err) } dataFields, _ := schema.Apply(data) diff --git a/metricbeat/module/kubernetes/_meta/docs.asciidoc b/metricbeat/module/kubernetes/_meta/docs.asciidoc index 0f187e37e72..56ea6711020 100644 --- a/metricbeat/module/kubernetes/_meta/docs.asciidoc +++ b/metricbeat/module/kubernetes/_meta/docs.asciidoc @@ -146,7 +146,7 @@ roleRef: === Compatibility The Kubernetes module is tested with the following versions of Kubernetes: -1.23.x, 1.24.x, 1.25.x, 1.26.x +1.25.x, 1.26.x and 1.27.x. [float] === Dashboard diff --git a/metricbeat/module/kubernetes/_meta/terraform/eks/requirements.txt b/metricbeat/module/kubernetes/_meta/terraform/eks/requirements.txt index 2f67d6aad45..57d386ba6a0 100644 --- a/metricbeat/module/kubernetes/_meta/terraform/eks/requirements.txt +++ b/metricbeat/module/kubernetes/_meta/terraform/eks/requirements.txt @@ -5,7 +5,7 @@ docutils==0.15.2 jmespath==0.9.5 pyasn1==0.4.8 python-dateutil==2.8.1 -PyYAML==5.4.1 +PyYAML==5.3.1 rsa==4.7.2 s3transfer==0.3.3 six==1.14.0 diff --git a/metricbeat/module/kubernetes/_meta/test/docs.plain b/metricbeat/module/kubernetes/_meta/test/docs.plain index 933942a37e0..2b6bf3b34af 100644 --- a/metricbeat/module/kubernetes/_meta/test/docs.plain +++ b/metricbeat/module/kubernetes/_meta/test/docs.plain @@ -11,224 +11,213 @@ # HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_configmap_annotations gauge kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 +kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 +kube_configmap_annotations{namespace="default",configmap="example-redis-config"} 1 kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 # HELP kube_configmap_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_configmap_labels gauge -kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="default",configmap="example-redis-config"} 1 # HELP kube_configmap_info [STABLE] Information about configmap. # TYPE kube_configmap_info gauge -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 +kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="default",configmap="example-redis-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 # HELP kube_configmap_created [STABLE] Unix creation timestamp # TYPE kube_configmap_created gauge -kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.673879561e+09 -kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.673879567e+09 -kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1.67402729e+09 -kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.673879562e+09 -kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.673879562e+09 -kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1.67402729e+09 -kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.673879559e+09 +kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.69156634e+09 +kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.691566343e+09 +kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="example-redis-config"} 1.691568526e+09 +kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.691566337e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.69156634e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.69156634e+09 # HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. # TYPE kube_configmap_metadata_resource_version gauge -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-config"} 92047 -kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 321 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 232 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 62236 -kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 325 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 323 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 92048 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 27 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 225 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 197 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 200 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 272 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 324 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 322 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 238 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 341 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 360 +kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 343 +kube_configmap_metadata_resource_version{namespace="default",configmap="example-redis-config"} 3691 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 26 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 231 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 270 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 198 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 202 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 342 +kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 344 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 345 # HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_cronjob_annotations gauge -kube_cronjob_annotations{namespace="kube-system",cronjob="hello-cronjob"} 1 +kube_cronjob_annotations{namespace="default",cronjob="hello"} 1 # HELP kube_cronjob_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_cronjob_labels gauge -kube_cronjob_labels{namespace="kube-system",cronjob="hello-cronjob"} 1 +kube_cronjob_labels{namespace="default",cronjob="hello"} 1 # HELP kube_cronjob_info [STABLE] Info about cronjob. # TYPE kube_cronjob_info gauge -kube_cronjob_info{namespace="kube-system",cronjob="hello-cronjob",schedule="* * * * *",concurrency_policy="Allow"} 1 +kube_cronjob_info{namespace="default",cronjob="hello",schedule="*/1 * * * *",concurrency_policy="Allow"} 1 # HELP kube_cronjob_created [STABLE] Unix creation timestamp # TYPE kube_cronjob_created gauge -kube_cronjob_created{namespace="kube-system",cronjob="hello-cronjob"} 1.673949613e+09 +kube_cronjob_created{namespace="default",cronjob="hello"} 1.691568526e+09 # HELP kube_cronjob_status_active [STABLE] Active holds pointers to currently running jobs. # TYPE kube_cronjob_status_active gauge -kube_cronjob_status_active{namespace="kube-system",cronjob="hello-cronjob"} 0 +kube_cronjob_status_active{namespace="default",cronjob="hello"} 0 # HELP kube_cronjob_status_last_schedule_time [STABLE] LastScheduleTime keeps information of when was the last time the job was successfully scheduled. # TYPE kube_cronjob_status_last_schedule_time gauge -kube_cronjob_status_last_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67403522e+09 +kube_cronjob_status_last_schedule_time{namespace="default",cronjob="hello"} 1.69156854e+09 # HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully. # TYPE kube_cronjob_status_last_successful_time gauge -kube_cronjob_status_last_successful_time{namespace="kube-system",cronjob="hello-cronjob"} 1.674035224e+09 +kube_cronjob_status_last_successful_time{namespace="default",cronjob="hello"} 1.691568544e+09 # HELP kube_cronjob_spec_suspend [STABLE] Suspend flag tells the controller to suspend subsequent executions. # TYPE kube_cronjob_spec_suspend gauge -kube_cronjob_spec_suspend{namespace="kube-system",cronjob="hello-cronjob"} 0 +kube_cronjob_spec_suspend{namespace="default",cronjob="hello"} 0 # HELP kube_cronjob_spec_starting_deadline_seconds [STABLE] Deadline in seconds for starting the job if it misses scheduled time for any reason. # TYPE kube_cronjob_spec_starting_deadline_seconds gauge # HELP kube_cronjob_next_schedule_time [STABLE] Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. # TYPE kube_cronjob_next_schedule_time gauge -kube_cronjob_next_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67403528e+09 +kube_cronjob_next_schedule_time{namespace="default",cronjob="hello"} 1.6915686e+09 # HELP kube_cronjob_metadata_resource_version [STABLE] Resource version representing a specific version of the cronjob. # TYPE kube_cronjob_metadata_resource_version gauge -kube_cronjob_metadata_resource_version{namespace="kube-system",cronjob="hello-cronjob"} 108742 +kube_cronjob_metadata_resource_version{namespace="default",cronjob="hello"} 3811 # HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. # TYPE kube_cronjob_spec_successful_job_history_limit gauge -kube_cronjob_spec_successful_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 3 +kube_cronjob_spec_successful_job_history_limit{namespace="default",cronjob="hello"} 3 # HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. # TYPE kube_cronjob_spec_failed_job_history_limit gauge -kube_cronjob_spec_failed_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 1 +kube_cronjob_spec_failed_job_history_limit{namespace="default",cronjob="hello"} 1 # HELP kube_daemonset_created [STABLE] Unix creation timestamp # TYPE kube_daemonset_created gauge -kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.673879566e+09 -kube_daemonset_created{namespace="kube-system",daemonset="metricbeat"} 1.67402729e+09 -kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.673879562e+09 +kube_daemonset_created{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1.691568526e+09 +kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.69156634e+09 +kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.691566342e+09 # HELP kube_daemonset_status_current_number_scheduled [STABLE] The number of nodes running at least one daemon pod and are supposed to. # TYPE kube_daemonset_status_current_number_scheduled gauge -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_daemonset_status_desired_number_scheduled [STABLE] The number of nodes that should be running the daemon pod. # TYPE kube_daemonset_status_desired_number_scheduled gauge +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 # HELP kube_daemonset_status_number_available [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available # TYPE kube_daemonset_status_number_available gauge -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_daemonset_status_number_misscheduled [STABLE] The number of nodes running a daemon pod but are not supposed to. # TYPE kube_daemonset_status_number_misscheduled gauge -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="metricbeat"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 # HELP kube_daemonset_status_number_ready [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. # TYPE kube_daemonset_status_number_ready gauge -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_daemonset_status_number_unavailable [STABLE] The number of nodes that should be running the daemon pod and have none of the daemon pod running and available # TYPE kube_daemonset_status_number_unavailable gauge -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="metricbeat"} 0 kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 # HELP kube_daemonset_status_observed_generation [STABLE] The most recent generation observed by the daemon set controller. # TYPE kube_daemonset_status_observed_generation gauge +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="metricbeat"} 1 # HELP kube_daemonset_status_updated_number_scheduled [STABLE] The total number of nodes that are running updated daemon pod # TYPE kube_daemonset_status_updated_number_scheduled gauge -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_daemonset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. # TYPE kube_daemonset_metadata_generation gauge +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="metricbeat"} 1 # HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_daemonset_annotations gauge -kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_daemonset_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_daemonset_labels gauge -kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="metricbeat"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 # HELP kube_deployment_created [STABLE] Unix creation timestamp # TYPE kube_deployment_created gauge -kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.673879567e+09 -kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.674035179e+09 -kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.673879562e+09 +kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.69156634e+09 +kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.691566342e+09 +kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.691568526e+09 # HELP kube_deployment_status_replicas [STABLE] The number of replicas per deployment. # TYPE kube_deployment_status_replicas gauge +kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 # HELP kube_deployment_status_replicas_ready [STABLE] The number of ready replicas per deployment. # TYPE kube_deployment_status_replicas_ready gauge +kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 # HELP kube_deployment_status_replicas_available [STABLE] The number of available replicas per deployment. # TYPE kube_deployment_status_replicas_available gauge +kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 # HELP kube_deployment_status_replicas_unavailable [STABLE] The number of unavailable replicas per deployment. # TYPE kube_deployment_status_replicas_unavailable gauge +kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 # HELP kube_deployment_status_replicas_updated [STABLE] The number of updated replicas per deployment. # TYPE kube_deployment_status_replicas_updated gauge +kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 # HELP kube_deployment_status_observed_generation [STABLE] The generation observed by the deployment controller. # TYPE kube_deployment_status_observed_generation gauge +kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 # HELP kube_deployment_status_condition [STABLE] The current status conditions of a deployment. # TYPE kube_deployment_status_condition gauge -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 @@ -241,6 +230,12 @@ kube_deployment_status_condition{namespace="kube-system",deployment="coredns",co kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 # HELP kube_deployment_spec_replicas [STABLE] Number of desired pods for a deployment. # TYPE kube_deployment_spec_replicas gauge kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 @@ -253,24 +248,24 @@ kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metri kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 # HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable [STABLE] Maximum number of unavailable replicas during a rolling update of a deployment. # TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 # HELP kube_deployment_spec_strategy_rollingupdate_max_surge [STABLE] Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. # TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 # HELP kube_deployment_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. # TYPE kube_deployment_metadata_generation gauge +kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 # HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_deployment_annotations gauge +kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 # HELP kube_deployment_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_deployment_labels gauge kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 @@ -281,51 +276,45 @@ kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_info{namespace="default",endpoint="nginx"} 1 # HELP kube_endpoint_created [STABLE] Unix creation timestamp # TYPE kube_endpoint_created gauge -kube_endpoint_created{namespace="default",endpoint="nginx"} 1.673969356e+09 -kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.673879561e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.673879576e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.674035179e+09 +kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.691566338e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.691566354e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.691568526e+09 # HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_endpoint_annotations gauge kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_annotations{namespace="default",endpoint="nginx"} 1 # HELP kube_endpoint_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_endpoint_labels gauge kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_labels{namespace="default",endpoint="nginx"} 1 # HELP kube_endpoint_address_available (Deprecated since v2.6.0) Number of addresses available in endpoint. # TYPE kube_endpoint_address_available gauge kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 -kube_endpoint_address_available{namespace="default",endpoint="nginx"} 0 kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 # HELP kube_endpoint_address_not_ready (Deprecated since v2.6.0) Number of addresses not ready in endpoint # TYPE kube_endpoint_address_not_ready gauge -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="nginx"} 0 kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 +kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 # HELP kube_endpoint_address [STABLE] Information about Endpoint available and non available addresses. # TYPE kube_endpoint_address gauge -kube_endpoint_address{namespace="kube-system",endpoint="kube-state-metrics",ip="10.244.0.124",ready="true"} 1 kube_endpoint_address{namespace="default",endpoint="kubernetes",ip="172.18.0.2",ready="true"} 1 kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.2",ready="true"} 1 -kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.4",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.3",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-state-metrics",ip="10.244.0.18",ready="true"} 1 # HELP kube_endpoint_ports [STABLE] Information about the Endpoint ports. # TYPE kube_endpoint_ports gauge -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 # HELP kube_horizontalpodautoscaler_info Information about this autoscaler. # TYPE kube_horizontalpodautoscaler_info gauge # HELP kube_horizontalpodautoscaler_metadata_generation [STABLE] The generation observed by the HorizontalPodAutoscaler controller. @@ -364,106 +353,76 @@ kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metri # TYPE kube_ingress_tls gauge # HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_job_annotations gauge -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 -kube_job_annotations{namespace="kube-system",job_name="pi"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 +kube_job_annotations{namespace="default",job_name="hello"} 1 +kube_job_annotations{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_job_labels gauge -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 -kube_job_labels{namespace="kube-system",job_name="pi"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 +kube_job_labels{namespace="default",job_name="hello"} 1 +kube_job_labels{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_info [STABLE] Information about job. # TYPE kube_job_info gauge -kube_job_info{namespace="kube-system",job_name="pi"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 +kube_job_info{namespace="default",job_name="hello"} 1 +kube_job_info{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_created [STABLE] Unix creation timestamp # TYPE kube_job_created gauge -kube_job_created{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27900585"} 1.6740351e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27900586"} 1.67403516e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27900587"} 1.67403522e+09 +kube_job_created{namespace="default",job_name="hello-28192809"} 1.69156854e+09 +kube_job_created{namespace="default",job_name="hello"} 1.691568526e+09 # HELP kube_job_spec_parallelism [STABLE] The maximum desired number of pods the job should run at any given time. # TYPE kube_job_spec_parallelism gauge -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="pi"} 1 +kube_job_spec_parallelism{namespace="default",job_name="hello"} 1 +kube_job_spec_parallelism{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_spec_completions [STABLE] The desired number of successfully finished pods the job should be run with. # TYPE kube_job_spec_completions gauge -kube_job_spec_completions{namespace="kube-system",job_name="pi"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 +kube_job_spec_completions{namespace="default",job_name="hello"} 1 +kube_job_spec_completions{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_spec_active_deadline_seconds [STABLE] The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. # TYPE kube_job_spec_active_deadline_seconds gauge # HELP kube_job_status_succeeded [STABLE] The number of pods which reached Phase Succeeded. # TYPE kube_job_status_succeeded gauge -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27900587"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="pi"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27900585"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27900586"} 1 +kube_job_status_succeeded{namespace="default",job_name="hello"} 1 +kube_job_status_succeeded{namespace="default",job_name="hello-28192809"} 1 # HELP kube_job_status_failed [STABLE] The number of pods which reached Phase Failed and the reason for failure. # TYPE kube_job_status_failed gauge -kube_job_status_failed{namespace="kube-system",job_name="pi"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27900585"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27900586"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27900587"} 0 +kube_job_status_failed{namespace="default",job_name="hello"} 0 +kube_job_status_failed{namespace="default",job_name="hello-28192809"} 0 # HELP kube_job_status_active [STABLE] The number of actively running pods. # TYPE kube_job_status_active gauge -kube_job_status_active{namespace="kube-system",job_name="pi"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27900585"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27900586"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27900587"} 0 +kube_job_status_active{namespace="default",job_name="hello"} 0 +kube_job_status_active{namespace="default",job_name="hello-28192809"} 0 # HELP kube_job_complete [STABLE] The job has completed its execution. # TYPE kube_job_complete gauge -kube_job_complete{namespace="kube-system",job_name="pi",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="pi",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="pi",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900585",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900585",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900585",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900586",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900586",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900586",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900587",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900587",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27900587",condition="unknown"} 0 +kube_job_complete{namespace="default",job_name="hello",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello",condition="unknown"} 0 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="unknown"} 0 # HELP kube_job_failed [STABLE] The job has failed its execution. # TYPE kube_job_failed gauge # HELP kube_job_status_start_time [STABLE] StartTime represents time when the job was acknowledged by the Job Manager. # TYPE kube_job_status_start_time gauge -kube_job_status_start_time{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27900585"} 1.6740351e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27900586"} 1.67403516e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27900587"} 1.67403522e+09 +kube_job_status_start_time{namespace="default",job_name="hello"} 1.691568526e+09 +kube_job_status_start_time{namespace="default",job_name="hello-28192809"} 1.69156854e+09 # HELP kube_job_status_completion_time [STABLE] CompletionTime represents time when the job was completed. # TYPE kube_job_status_completion_time gauge -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27900587"} 1.674035224e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="pi"} 1.673969411e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27900585"} 1.674035104e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27900586"} 1.674035164e+09 +kube_job_status_completion_time{namespace="default",job_name="hello"} 1.691568531e+09 +kube_job_status_completion_time{namespace="default",job_name="hello-28192809"} 1.691568544e+09 # HELP kube_job_owner [STABLE] Information about the Job's owner. # TYPE kube_job_owner gauge -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27900587",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="pi",owner_kind="",owner_name="",owner_is_controller=""} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27900585",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27900586",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 +kube_job_owner{namespace="default",job_name="hello",owner_kind="",owner_name="",owner_is_controller=""} 1 +kube_job_owner{namespace="default",job_name="hello-28192809",owner_kind="CronJob",owner_name="hello",owner_is_controller="true"} 1 # HELP kube_lease_owner Information about the Lease's owner. # TYPE kube_lease_owner gauge -kube_lease_owner{lease="metricbeat-cluster-leader",owner_kind="",owner_name="",namespace="kube-system",lease_holder="beats-leader-kind-control-plane"} 1 -kube_lease_owner{lease="kube-controller-manager",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_583b0717-d7d6-4ea7-a917-d6ca938c33b6"} 1 +kube_lease_owner{lease="kube-controller-manager",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_0b4da5ad-3d3f-46e1-a9a7-f3de4500210d"} 1 kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane",namespace="kube-node-lease",lease_holder="kind-control-plane"} 1 -kube_lease_owner{lease="kube-scheduler",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_6726ab49-c4dc-44d5-9021-c3917fb222c6"} 1 +kube_lease_owner{lease="kube-scheduler",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_1ccae8c1-4c4b-4f22-ba9f-4001d58bbbeb"} 1 +kube_lease_owner{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_eb429ff6-d4a0-49b6-ae35-4471a79c6c25"} 1 # HELP kube_lease_renew_time Kube lease renew time. # TYPE kube_lease_renew_time gauge -kube_lease_renew_time{lease="kind-control-plane"} 1.674035264e+09 -kube_lease_renew_time{lease="kube-scheduler"} 1.674035269e+09 -kube_lease_renew_time{lease="metricbeat-cluster-leader"} 1.674035269e+09 -kube_lease_renew_time{lease="kube-controller-manager"} 1.674035269e+09 +kube_lease_renew_time{lease="kind-control-plane",namespace="kube-node-lease"} 1.691568555e+09 +kube_lease_renew_time{lease="kube-scheduler",namespace="kube-system"} 1.691568554e+09 +kube_lease_renew_time{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a",namespace="kube-system"} 1.691568549e+09 +kube_lease_renew_time{lease="kube-controller-manager",namespace="kube-system"} 1.691568553e+09 # HELP kube_limitrange [STABLE] Information about limit range. # TYPE kube_limitrange gauge # HELP kube_limitrange_created [STABLE] Unix creation timestamp @@ -476,29 +435,27 @@ kube_lease_renew_time{lease="kube-controller-manager"} 1.674035269e+09 # TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge # HELP kube_namespace_created [STABLE] Unix creation timestamp # TYPE kube_namespace_created gauge -kube_namespace_created{namespace="kube-node-lease"} 1.673879559e+09 -kube_namespace_created{namespace="default"} 1.673879561e+09 -kube_namespace_created{namespace="local-path-storage"} 1.673879567e+09 -kube_namespace_created{namespace="kube-system"} 1.673879559e+09 -kube_namespace_created{namespace="kube-public"} 1.673879559e+09 +kube_namespace_created{namespace="kube-system"} 1.691566337e+09 +kube_namespace_created{namespace="kube-public"} 1.691566337e+09 +kube_namespace_created{namespace="kube-node-lease"} 1.691566337e+09 +kube_namespace_created{namespace="default"} 1.691566338e+09 +kube_namespace_created{namespace="local-path-storage"} 1.691566342e+09 # HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_namespace_annotations gauge -kube_namespace_annotations{namespace="local-path-storage"} 1 kube_namespace_annotations{namespace="kube-system"} 1 kube_namespace_annotations{namespace="kube-public"} 1 kube_namespace_annotations{namespace="kube-node-lease"} 1 kube_namespace_annotations{namespace="default"} 1 +kube_namespace_annotations{namespace="local-path-storage"} 1 # HELP kube_namespace_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_namespace_labels gauge -kube_namespace_labels{namespace="kube-node-lease"} 1 kube_namespace_labels{namespace="default"} 1 kube_namespace_labels{namespace="local-path-storage"} 1 kube_namespace_labels{namespace="kube-system"} 1 kube_namespace_labels{namespace="kube-public"} 1 +kube_namespace_labels{namespace="kube-node-lease"} 1 # HELP kube_namespace_status_phase [STABLE] kubernetes namespace status phase. # TYPE kube_namespace_status_phase gauge -kube_namespace_status_phase{namespace="default",phase="Active"} 1 -kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 @@ -507,6 +464,8 @@ kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="default",phase="Active"} 1 +kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 # HELP kube_namespace_status_condition The condition of a namespace. # TYPE kube_namespace_status_condition gauge # HELP kube_networkpolicy_created Unix creation timestamp of network policy @@ -524,12 +483,12 @@ kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 kube_node_annotations{node="kind-control-plane"} 1 # HELP kube_node_created [STABLE] Unix creation timestamp # TYPE kube_node_created gauge -kube_node_created{node="kind-control-plane"} 1.673879559e+09 +kube_node_created{node="kind-control-plane"} 1.691566337e+09 # HELP kube_node_deletion_timestamp Unix deletion timestamp # TYPE kube_node_deletion_timestamp gauge # HELP kube_node_info [STABLE] Information about a cluster node. # TYPE kube_node_info gauge -kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit",os_image="Ubuntu 22.04.1 LTS",container_runtime_version="containerd://1.6.9",kubelet_version="v1.25.3",kubeproxy_version="v1.25.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="eee895ed1cd343d68cde3dc3f09e40e6",internal_ip="172.18.0.2"} 1 +kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit-pr",os_image="Ubuntu 22.04.2 LTS",container_runtime_version="containerd://1.6.19-46-g941215f49",kubelet_version="v1.26.3",kubeproxy_version="v1.26.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="da6f977ba55a4ef5a3240dbd88134863",internal_ip="172.18.0.2"} 1 # HELP kube_node_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_node_labels gauge kube_node_labels{node="kind-control-plane"} 1 @@ -543,20 +502,20 @@ kube_node_role{node="kind-control-plane",role="control-plane"} 1 kube_node_spec_unschedulable{node="kind-control-plane"} 0 # HELP kube_node_status_allocatable [STABLE] The allocatable for different resources of a node that are available for scheduling. # TYPE kube_node_status_allocatable gauge +kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 # HELP kube_node_status_capacity [STABLE] The capacity for different resources of a node. # TYPE kube_node_status_capacity gauge +kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 # HELP kube_node_status_condition [STABLE] The condition of a cluster node. # TYPE kube_node_status_condition gauge kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 @@ -573,62 +532,54 @@ kube_node_status_condition{node="kind-control-plane",condition="Ready",status="f kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 # HELP kube_persistentvolumeclaim_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_persistentvolumeclaim_labels gauge -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="www-web-0"} 1 +kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 # HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_persistentvolumeclaim_annotations gauge -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="www-web-0"} 1 +kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 # HELP kube_persistentvolumeclaim_info [STABLE] Information about persistent volume claim. # TYPE kube_persistentvolumeclaim_info gauge -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="myclaim",storageclass="slow",volumename=""} 1 -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="www-web-0",storageclass="my-storage-class",volumename=""} 1 +kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="task-pv-claim",storageclass="generic",volumename="task-pv-volume"} 1 # HELP kube_persistentvolumeclaim_status_phase [STABLE] The phase the persistent volume claim is currently in. # TYPE kube_persistentvolumeclaim_status_phase gauge -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Pending"} 1 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Pending"} 1 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Lost"} 0 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Bound"} 1 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Pending"} 0 # HELP kube_persistentvolumeclaim_resource_requests_storage_bytes [STABLE] The capacity of storage requested by the persistent volume claim. # TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="myclaim"} 8.589934592e+09 -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="www-web-0"} 1.073741824e+09 +kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="task-pv-claim"} 1024 # HELP kube_persistentvolumeclaim_access_mode [STABLE] The access mode(s) specified by the persistent volume claim. # TYPE kube_persistentvolumeclaim_access_mode gauge -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="myclaim",access_mode="ReadWriteOnce"} 1 -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="www-web-0",access_mode="ReadWriteOnce"} 1 +kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="task-pv-claim",access_mode="ReadWriteOnce"} 1 # HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. # TYPE kube_persistentvolumeclaim_status_condition gauge # HELP kube_persistentvolumeclaim_created Unix creation timestamp # TYPE kube_persistentvolumeclaim_created gauge -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="myclaim"} 1.673969355e+09 -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="www-web-0"} 1.673969356e+09 +kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="task-pv-claim"} 1.691568526e+09 # HELP kube_persistentvolume_claim_ref [STABLE] Information about the Persistent Volume Claim Reference. # TYPE kube_persistentvolume_claim_ref gauge +kube_persistentvolume_claim_ref{persistentvolume="task-pv-volume",name="task-pv-claim",claim_namespace="default"} 1 # HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_persistentvolume_annotations gauge -kube_persistentvolume_annotations{persistentvolume="pv0003"} 1 +kube_persistentvolume_annotations{persistentvolume="task-pv-volume"} 1 # HELP kube_persistentvolume_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_persistentvolume_labels gauge -kube_persistentvolume_labels{persistentvolume="pv0003"} 1 +kube_persistentvolume_labels{persistentvolume="task-pv-volume"} 1 # HELP kube_persistentvolume_status_phase [STABLE] The phase indicates if a volume is available, bound to a claim, or released by a claim. # TYPE kube_persistentvolume_status_phase gauge -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Pending"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Available"} 1 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Bound"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Released"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Failed"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Pending"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Available"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Bound"} 1 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Released"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Failed"} 0 # HELP kube_persistentvolume_info [STABLE] Information about persistentvolume. # TYPE kube_persistentvolume_info gauge -kube_persistentvolume_info{persistentvolume="pv0003",storageclass="slow",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="172.17.0.2",nfs_path="/tmp",csi_driver="",csi_volume_handle="",local_path="",local_fs="",host_path="",host_path_type=""} 1 +kube_persistentvolume_info{persistentvolume="task-pv-volume",storageclass="generic",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="",nfs_path="",csi_driver="",csi_volume_handle="",local_path="",local_fs="",host_path="/tmp/data",host_path_type=""} 1 # HELP kube_persistentvolume_capacity_bytes [STABLE] Persistentvolume capacity in bytes. # TYPE kube_persistentvolume_capacity_bytes gauge -kube_persistentvolume_capacity_bytes{persistentvolume="pv0003"} 5.36870912e+09 +kube_persistentvolume_capacity_bytes{persistentvolume="task-pv-volume"} 2048 # HELP kube_persistentvolume_created Unix creation timestamp # TYPE kube_persistentvolume_created gauge -kube_persistentvolume_created{persistentvolume="pv0003"} 1.673969355e+09 +kube_persistentvolume_created{persistentvolume="task-pv-volume"} 1.691568526e+09 # HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_poddisruptionbudget_annotations gauge # HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. @@ -647,218 +598,202 @@ kube_persistentvolume_created{persistentvolume="pv0003"} 1.673969355e+09 # TYPE kube_poddisruptionbudget_status_observed_generation gauge # HELP kube_pod_completion_time [STABLE] Completion time in unix timestamp for a pod. # TYPE kube_pod_completion_time gauge -kube_pod_completion_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969408e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1.67403522e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1.67403516e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1.6740351e+09 +kube_pod_completion_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568527e+09 +kube_pod_completion_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 # HELP kube_pod_container_info [STABLE] Information about a container in a pod. # TYPE kube_pod_container_info gauge -kube_pod_container_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",image_spec="perl:5.34.0",image="docker.io/library/perl:5.34.0",image_id="docker.io/library/perl@sha256:2584f46a92d1042b25320131219e5832c5b3e75086dfaaff33e4fda7a9f47d99",container_id="containerd://b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839"} 1 -kube_pod_container_info{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat",image_spec="docker.elastic.co/beats/metricbeat:8.6.0",image="docker.elastic.co/beats/metricbeat:8.6.0",image_id="docker.elastic.co/beats/metricbeat@sha256:6a327e350e01dfd01d576717f038767ed03fbd513b10033a6f65835668aa82fb",container_id="containerd://bbecc08bbf0158bdc85f4ed006cddbf40f51d7348ce5cbd95e86d367d20e8fbb"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.25.3",image="registry.k8s.io/kube-controller-manager:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4",container_id="containerd://548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb"} 1 -kube_pod_container_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20221004-44d545d1",image="docker.io/kindest/kindnetd:v20221004-44d545d1",image_id="sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f",container_id="containerd://db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://18bddca29930370d9cfa083969de095894f7b77b5c63fd0712128ea7de6c64fd"} 1 -kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.4-0",image="registry.k8s.io/etcd:3.5.4-0",image_id="sha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66",container_id="containerd://e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.25.3",image="registry.k8s.io/kube-proxy:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950",container_id="containerd://9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://77d181df6b24476654d367bdcadc543c65371de07cc71044fc8a0bafc20a2105"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics",image_spec="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0",image="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0",image_id="registry.k8s.io/kube-state-metrics/kube-state-metrics@sha256:a15ca437f2309b769caa36a88240ce0266d67028f02da90f1c817c849b144273",container_id="containerd://d58ac7bcd7b24a58132d3021f13301d2a0995e74f98596956e8f20e19029f2be"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6"} 1 -kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image_id="sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6",container_id="containerd://003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.25.3",image="registry.k8s.io/kube-scheduler:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78d",container_id="containerd://f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.25.3",image="registry.k8s.io/kube-apiserver:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4a",container_id="containerd://01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612"} 1 +kube_pod_container_info{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76"} 1 +kube_pod_container_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",image="sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb",image_id="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",container_id="containerd://c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.26.3",image="registry.k8s.io/kube-proxy:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:44db4d50a5f9c8efbac0d37ea974d1c0419a5928f90748d3d491a041a00c20b5",container_id="containerd://c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics",image_spec="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2",image="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2",image_id="registry.k8s.io/kube-state-metrics/kube-state-metrics@sha256:5ac2e67a862cd3baa0eb4fd7683d54928fd76ea3a61cde50508922c956901d8c",container_id="containerd://d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23"} 1 +kube_pod_container_info{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",image_spec="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image_id="sha256:c896ab1149bb529ca28d76976885e04c0d754b6592f74b5478bfdcf248f84e62",container_id="containerd://d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.26.3",image="registry.k8s.io/kube-scheduler:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:3dd2337f70af979c7362b5e52bbdfcb3a5fd39c78d94d02145150cd2db86ba39",container_id="containerd://abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.26.3",image="registry.k8s.io/kube-apiserver:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:ba097b515c8c40689733c0f19de377e9bf8995964b7d7150c2045f3dfd166657",container_id="containerd://146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427"} 1 +kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",image="sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc",image_id="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",container_id="containerd://0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece"} 1 +kube_pod_container_info{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx",image_spec="docker.io/nginx:1.24.0-alpine-slim",image="docker.io/library/nginx:1.24.0-alpine-slim",image_id="docker.io/library/nginx@sha256:b8132df8c2fc73f4c1e7ce434c1ff19b134818e8173cd5e8f79c55a5f635d7e5",container_id="containerd://861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063"} 1 +kube_pod_container_info{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.26.3",image="registry.k8s.io/kube-controller-manager:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:8dbb345de79d1c44f59a7895da702a5f71997ae72aea056609445c397b0c10dc",container_id="containerd://9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7"} 1 +kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.6-0",image="registry.k8s.io/etcd:3.5.6-0",image_id="sha256:fce326961ae2d51a5f726883fd59d2a8c2ccc3e45d3bb859882db58e422e59e7",container_id="containerd://a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068"} 1 # HELP kube_pod_container_resource_limits The number of requested limit resource by a container. It is recommended to use the kube_pod_resource_limits metric exposed by kube-scheduler instead, as it is more precise. # TYPE kube_pod_container_resource_limits gauge -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 # HELP kube_pod_container_resource_requests The number of requested request resource by a container. It is recommended to use the kube_pod_resource_requests metric exposed by kube-scheduler instead, as it is more precise. # TYPE kube_pod_container_resource_requests gauge -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 # HELP kube_pod_container_state_started [STABLE] Start time in unix timestamp for a pod container. # TYPE kube_pod_container_state_started gauge -kube_pod_container_state_started{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1.673879578e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 1.67403522e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1.673879556e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1.673879577e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 1.67403516e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 1.674035188e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 1.6740351e+09 -kube_pod_container_state_started{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1.673969403e+09 -kube_pod_container_state_started{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 1.674027291e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1.673879554e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1.691566361e+09 +kube_pod_container_state_started{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1.691566334e+09 +kube_pod_container_state_started{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1.691566357e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1.691566355e+09 +kube_pod_container_state_started{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 1.69156854e+09 # HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. # TYPE kube_pod_container_status_last_terminated_reason gauge # HELP kube_pod_container_status_last_terminated_exitcode Describes the exit code for the last container in terminated state. # TYPE kube_pod_container_status_last_terminated_exitcode gauge # HELP kube_pod_container_status_ready [STABLE] Describes whether the containers readiness check succeeded. # TYPE kube_pod_container_status_ready gauge -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 0 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 # HELP kube_pod_container_status_restarts_total [STABLE] The number of container restarts per container. # TYPE kube_pod_container_status_restarts_total counter -kube_pod_container_status_restarts_total{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 # HELP kube_pod_container_status_running [STABLE] Describes whether the container is currently in running state. # TYPE kube_pod_container_status_running gauge -kube_pod_container_status_running{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_running{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 # HELP kube_pod_container_status_terminated [STABLE] Describes whether the container is currently in terminated state. # TYPE kube_pod_container_status_terminated gauge -kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 1 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_terminated{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 1 +kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 1 # HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. # TYPE kube_pod_container_status_terminated_reason gauge -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob",reason="Completed"} 1 +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello",reason="Completed"} 1 +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello",reason="Completed"} 1 # HELP kube_pod_container_status_waiting [STABLE] Describes whether the container is currently in waiting state. # TYPE kube_pod_container_status_waiting gauge -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",container="kube-state-metrics"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",container="metricbeat"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",container="hello-cronjob"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_waiting{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 # HELP kube_pod_container_status_waiting_reason [STABLE] Describes the reason the container is currently in waiting state. # TYPE kube_pod_container_status_waiting_reason gauge # HELP kube_pod_created [STABLE] Unix creation timestamp # TYPE kube_pod_created gauge -kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_created{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1.673969356e+09 -kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879562e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1.6740351e+09 -kube_pod_created{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_created{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9"} 1.67402729e+09 -kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1.67403522e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1.67403516e+09 -kube_pod_created{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297"} 1.674035179e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879576e+09 -kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 +kube_pod_created{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566341e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566354e+09 +kube_pod_created{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.69156634e+09 +kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_created{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_created{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 # HELP kube_pod_deletion_timestamp Unix deletion timestamp # TYPE kube_pod_deletion_timestamp gauge # HELP kube_pod_info [STABLE] Information about pod. # TYPE kube_pod_info gauge -kube_pod_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",host_ip="172.18.0.2",pod_ip="10.244.0.125",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27900587",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",host_ip="172.18.0.2",pod_ip="10.244.0.123",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27900586",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",host_ip="172.18.0.2",pod_ip="10.244.0.124",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-548546fc89",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-684f458cdd",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",host_ip="",pod_ip="",node="",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",host_ip="172.18.0.2",pod_ip="10.244.0.122",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27900585",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",host_ip="172.18.0.2",pod_ip="10.244.0.59",node="kind-control-plane",created_by_kind="Job",created_by_name="pi",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="metricbeat",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",host_ip="172.18.0.2",pod_ip="10.244.0.20",node="kind-control-plane",created_by_kind="Job",created_by_name="hello",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",host_ip="172.18.0.2",pod_ip="10.244.0.22",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-28192809",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",host_ip="172.18.0.2",pod_ip="10.244.0.21",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="fluentd-elasticsearch",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",host_ip="172.18.0.2",pod_ip="10.244.0.18",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-7bc9d484b6",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-75f5b54ffd",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",host_ip="172.18.0.2",pod_ip="10.244.0.19",node="kind-control-plane",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 # HELP kube_pod_ips Pod IP addresses # TYPE kube_pod_ips gauge -kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",ip="10.244.0.123",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",ip="10.244.0.124",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",ip="10.244.0.4",ip_family="4"} 1 -kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",ip="10.244.0.3",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",ip="10.244.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",ip="10.244.0.122",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",ip="10.244.0.59",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",ip="10.244.0.125",ip_family="4"} 1 +kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",ip="10.244.0.4",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",ip="10.244.0.19",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",ip="10.244.0.20",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",ip="10.244.0.22",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",ip="10.244.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",ip="10.244.0.3",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",ip="10.244.0.18",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",ip="10.244.0.21",ip_family="4"} 1 # HELP kube_pod_init_container_info [STABLE] Information about an init container in a pod. # TYPE kube_pod_init_container_info gauge # HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. @@ -883,491 +818,516 @@ kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385 # TYPE kube_pod_init_container_status_waiting_reason gauge # HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_pod_annotations gauge -kube_pod_annotations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_annotations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_annotations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_annotations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1 +kube_pod_annotations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_annotations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_annotations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1 +kube_pod_annotations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +kube_pod_annotations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1 # HELP kube_pod_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_pod_labels gauge -kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_labels{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1 -kube_pod_labels{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_labels{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_labels{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1 +kube_pod_labels{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1 +kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_labels{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_labels{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1 +kube_pod_labels{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +kube_pod_labels{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1 # HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. # TYPE kube_pod_overhead_cpu_cores gauge # HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. # TYPE kube_pod_overhead_memory_bytes gauge # HELP kube_pod_owner [STABLE] Information about the Pod's owner. # TYPE kube_pod_owner gauge -kube_pod_owner{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",owner_kind="Job",owner_name="pi",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",owner_kind="DaemonSet",owner_name="metricbeat",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",owner_kind="Job",owner_name="hello-cronjob-27900587",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",owner_kind="Job",owner_name="hello-cronjob-27900586",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",owner_kind="ReplicaSet",owner_name="kube-state-metrics-548546fc89",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",owner_kind="ReplicaSet",owner_name="local-path-provisioner-684f458cdd",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",owner_kind="Job",owner_name="hello-cronjob-27900585",owner_is_controller="true"} 1 +kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",owner_kind="ReplicaSet",owner_name="local-path-provisioner-75f5b54ffd",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",owner_kind="Job",owner_name="hello",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",owner_kind="Job",owner_name="hello-28192809",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",owner_kind="ReplicaSet",owner_name="kube-state-metrics-7bc9d484b6",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",owner_kind="DaemonSet",owner_name="fluentd-elasticsearch",owner_is_controller="true"} 1 # HELP kube_pod_restart_policy [STABLE] Describes the restart policy in use by this pod. # TYPE kube_pod_restart_policy gauge -kube_pod_restart_policy{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",type="Never"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",type="Always"} 1 -kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",type="Always"} 1 -kube_pod_restart_policy{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",type="Always"} 1 +kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",type="Always"} 1 # HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. # TYPE kube_pod_runtimeclass_name_info gauge # HELP kube_pod_spec_volumes_persistentvolumeclaims_info [STABLE] Information about persistentvolumeclaim volumes in a pod. # TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge -kube_pod_spec_volumes_persistentvolumeclaims_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 1 # HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly [STABLE] Describes whether a persistentvolumeclaim is mounted read only. # TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge -kube_pod_spec_volumes_persistentvolumeclaims_readonly{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 0 # HELP kube_pod_start_time [STABLE] Start time in unix timestamp for a pod. # TYPE kube_pod_start_time gauge -kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297"} 1.674035179e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1.67403516e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1.6740351e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9"} 1.67402729e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1.67403522e+09 -kube_pod_start_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 +kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_start_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_start_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_start_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 # HELP kube_pod_status_phase [STABLE] The pods current phase. # TYPE kube_pod_status_phase gauge -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Running"} 1 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Pending"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Failed"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Unknown"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Running"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Pending"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Failed"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Unknown"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",phase="Running"} 1 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Pending"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Failed"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Unknown"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Running"} 1 +# HELP kube_pod_status_qos_class The pods current qosClass. +# TYPE kube_pod_status_qos_class gauge +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Guaranteed"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="Guaranteed"} 0 # HELP kube_pod_status_ready [STABLE] Describes whether the pod is ready to serve requests. # TYPE kube_pod_status_ready gauge -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="unknown"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="true"} 1 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="false"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="unknown"} 0 +# HELP kube_pod_status_ready_time Readiness achieved time in unix timestamp for a pod. +# TYPE kube_pod_status_ready_time gauge +kube_pod_status_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568537e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568528e+09 +kube_pod_status_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_ready_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568528e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +# HELP kube_pod_status_container_ready_time Readiness achieved time in unix timestamp for a pod containers. +# TYPE kube_pod_status_container_ready_time gauge +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568528e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568537e+09 +kube_pod_status_container_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_container_ready_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568528e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 # HELP kube_pod_status_reason The pod status reasons # TYPE kube_pod_status_reason gauge -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Evicted"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Evicted"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Evicted"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="UnexpectedAdmissionError"} 0 # HELP kube_pod_status_scheduled [STABLE] Describes the status of the scheduling process for the pod. # TYPE kube_pod_status_scheduled gauge -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="true"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="false"} 1 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="unknown"} 0 # HELP kube_pod_status_scheduled_time [STABLE] Unix timestamp when pod moved into scheduled status # TYPE kube_pod_status_scheduled_time gauge -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29"} 1.67403516e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297"} 1.674035179e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385"} 1.6740351e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9"} 1.67402729e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15"} 1.67403522e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 # HELP kube_pod_status_unschedulable [STABLE] Describes the unschedulable status for the pod. # TYPE kube_pod_status_unschedulable gauge -kube_pod_status_unschedulable{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 # HELP kube_pod_tolerations Information about the pod tolerations # TYPE kube_pod_tolerations gauge -kube_pod_tolerations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900585-6zngl",uid="750bad5a-1caa-4211-85e8-857167a7f385",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-6xfvl",uid="fe4cb1f6-fa84-4b3b-a8e0-e165190ecbe9",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900587-r7g6w",uid="385ca116-418f-4b17-bde1-c6ab158ada15",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27900586-psw5h",uid="5053cf69-d59a-4e88-afac-b955da469c29",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-548546fc89-qrkzb",uid="79549712-7702-4d38-bb5c-670ea397b297",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="CriticalAddonsOnly",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node-role.kubernetes.io/master",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node-role.kubernetes.io/control-plane",operator="Equal",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node-role.kubernetes.io/master",operator="Equal",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="CriticalAddonsOnly",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node-role.kubernetes.io/master",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node-role.kubernetes.io/control-plane",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node-role.kubernetes.io/master",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/control-plane",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/master",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",operator="Exists",effect="NoExecute"} 1 # HELP kube_replicaset_created [STABLE] Unix creation timestamp # TYPE kube_replicaset_created gauge -kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="coredns-565d847f94"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1.674035179e+09 +kube_replicaset_created{namespace="kube-system",replicaset="coredns-787d4945fb"} 1.691566354e+09 +kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1.691566354e+09 +kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1.691568526e+09 # HELP kube_replicaset_status_replicas [STABLE] The number of replicas per ReplicaSet. # TYPE kube_replicaset_status_replicas gauge -kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_status_fully_labeled_replicas [STABLE] The number of fully labeled replicas per ReplicaSet. # TYPE kube_replicaset_status_fully_labeled_replicas gauge -kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_status_ready_replicas [STABLE] The number of ready replicas per ReplicaSet. # TYPE kube_replicaset_status_ready_replicas gauge -kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 # HELP kube_replicaset_status_observed_generation [STABLE] The generation observed by the ReplicaSet controller. # TYPE kube_replicaset_status_observed_generation gauge -kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_spec_replicas [STABLE] Number of desired pods for a ReplicaSet. # TYPE kube_replicaset_spec_replicas gauge -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 -kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. # TYPE kube_replicaset_metadata_generation gauge -kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_owner [STABLE] Information about the ReplicaSet's owner. # TYPE kube_replicaset_owner gauge -kube_replicaset_owner{namespace="kube-system",replicaset="coredns-565d847f94",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-548546fc89",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="kube-system",replicaset="coredns-787d4945fb",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 # HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_replicaset_annotations gauge -kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicaset_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_replicaset_labels gauge -kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-548546fc89"} 1 +kube_replicaset_labels{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 # HELP kube_replicationcontroller_created [STABLE] Unix creation timestamp # TYPE kube_replicationcontroller_created gauge # HELP kube_replicationcontroller_status_replicas [STABLE] The number of replicas per ReplicationController. @@ -1388,90 +1348,77 @@ kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-54 # TYPE kube_replicationcontroller_owner gauge # HELP kube_resourcequota_created [STABLE] Unix creation timestamp # TYPE kube_resourcequota_created gauge -kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-medium"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-low"} 1.673969356e+09 +kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.691568526e+09 # HELP kube_resourcequota [STABLE] Information about resource quota. # TYPE kube_resourcequota gauge kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 2.147483648e+11 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 204800 kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="hard"} 2.147483648e+10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="hard"} 5 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="hard"} 1.073741824e+10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="used"} 0 # HELP kube_secret_info [STABLE] Information about secret. # TYPE kube_secret_info gauge +kube_secret_info{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 # HELP kube_secret_type [STABLE] Type about secret. # TYPE kube_secret_type gauge +kube_secret_type{namespace="kube-system",secret="bootstrap-token-abcdef",type="bootstrap.kubernetes.io/token"} 1 # HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_secret_annotations gauge +kube_secret_annotations{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 # HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_secret_labels gauge +kube_secret_labels{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 # HELP kube_secret_created [STABLE] Unix creation timestamp # TYPE kube_secret_created gauge +kube_secret_created{namespace="kube-system",secret="bootstrap-token-abcdef"} 1.69156634e+09 # HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. # TYPE kube_secret_metadata_resource_version gauge +kube_secret_metadata_resource_version{namespace="kube-system",secret="bootstrap-token-abcdef"} 221 # HELP kube_service_info [STABLE] Information about service. # TYPE kube_service_info gauge -kube_service_info{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="af9d889d-579d-4367-ac53-fb10fcb40274",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc",cluster_ip="None",external_name="",load_balancer_ip=""} 1 # HELP kube_service_created [STABLE] Unix creation timestamp # TYPE kube_service_created gauge -kube_service_created{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1.673879562e+09 -kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="af9d889d-579d-4367-ac53-fb10fcb40274"} 1.674035179e+09 -kube_service_created{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1.673969356e+09 -kube_service_created{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1.673879561e+09 +kube_service_created{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1.691566338e+09 +kube_service_created{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1.69156634e+09 +kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1.691568526e+09 # HELP kube_service_spec_type [STABLE] Type about service. # TYPE kube_service_spec_type gauge -kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="af9d889d-579d-4367-ac53-fb10fcb40274",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",type="ClusterIP"} 1 +kube_service_spec_type{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",type="ClusterIP"} 1 +kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",type="ClusterIP"} 1 +kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc",type="ClusterIP"} 1 # HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_service_annotations gauge -kube_service_annotations{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -kube_service_annotations{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_annotations{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="af9d889d-579d-4367-ac53-fb10fcb40274"} 1 +kube_service_annotations{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1 +kube_service_annotations{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 # HELP kube_service_labels [STABLE] Kubernetes labels converted to Prometheus labels. # TYPE kube_service_labels gauge -kube_service_labels{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="af9d889d-579d-4367-ac53-fb10fcb40274"} 1 -kube_service_labels{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -kube_service_labels{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 +kube_service_labels{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 +kube_service_labels{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1 # HELP kube_service_spec_external_ip [STABLE] Service external ips. One series for each ip # TYPE kube_service_spec_external_ip gauge # HELP kube_service_status_load_balancer_ingress [STABLE] Service load balancer ingress status # TYPE kube_service_status_load_balancer_ingress gauge # HELP kube_statefulset_created [STABLE] Unix creation timestamp # TYPE kube_statefulset_created gauge -kube_statefulset_created{namespace="default",statefulset="web"} 1.673969356e+09 +kube_statefulset_created{namespace="default",statefulset="web"} 1.691568526e+09 # HELP kube_statefulset_status_replicas [STABLE] The number of replicas per StatefulSet. # TYPE kube_statefulset_status_replicas gauge kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. # TYPE kube_statefulset_status_replicas_available gauge -kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 0 +kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_status_replicas_current [STABLE] The number of current replicas per StatefulSet. # TYPE kube_statefulset_status_replicas_current gauge kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_status_replicas_ready [STABLE] The number of ready replicas per StatefulSet. # TYPE kube_statefulset_status_replicas_ready gauge -kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 0 +kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_status_replicas_updated [STABLE] The number of updated replicas per StatefulSet. # TYPE kube_statefulset_status_replicas_updated gauge kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 @@ -1480,7 +1427,9 @@ kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet. # TYPE kube_statefulset_replicas gauge -kube_statefulset_replicas{namespace="default",statefulset="web"} 3 +kube_statefulset_replicas{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_ordinals_start Start ordinal of the StatefulSet. +# TYPE kube_statefulset_ordinals_start gauge # HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet. # TYPE kube_statefulset_metadata_generation gauge kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 @@ -1494,16 +1443,16 @@ kube_statefulset_annotations{namespace="default",statefulset="web"} 1 kube_statefulset_labels{namespace="default",statefulset="web"} 1 # HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). # TYPE kube_statefulset_status_current_revision gauge -kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 +kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 # HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) # TYPE kube_statefulset_status_update_revision gauge -kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 +kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 # HELP kube_storageclass_info [STABLE] Information about storageclass. # TYPE kube_storageclass_info gauge kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 # HELP kube_storageclass_created [STABLE] Unix creation timestamp # TYPE kube_storageclass_created gauge -kube_storageclass_created{storageclass="standard"} 1.673879567e+09 +kube_storageclass_created{storageclass="standard"} 1.691566342e+09 # HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. # TYPE kube_storageclass_annotations gauge kube_storageclass_annotations{storageclass="standard"} 1 diff --git a/metricbeat/module/kubernetes/_meta/test/ksm.v2.4.2.plain b/metricbeat/module/kubernetes/_meta/test/ksm.v2.4.2.plain deleted file mode 100644 index 0a8d5cf4094..00000000000 --- a/metricbeat/module/kubernetes/_meta/test/ksm.v2.4.2.plain +++ /dev/null @@ -1,1422 +0,0 @@ -# HELP kube_certificatesigningrequest_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_annotations gauge -# HELP kube_certificatesigningrequest_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_labels gauge -# HELP kube_certificatesigningrequest_created Unix creation timestamp -# TYPE kube_certificatesigningrequest_created gauge -# HELP kube_certificatesigningrequest_condition The number of each certificatesigningrequest condition -# TYPE kube_certificatesigningrequest_condition gauge -# HELP kube_certificatesigningrequest_cert_length Length of the issued cert -# TYPE kube_certificatesigningrequest_cert_length gauge -# HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_configmap_annotations gauge -kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -# HELP kube_configmap_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_configmap_labels gauge -kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 -# HELP kube_configmap_info Information about configmap. -# TYPE kube_configmap_info gauge -kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 -# HELP kube_configmap_created Unix creation timestamp -# TYPE kube_configmap_created gauge -kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.673879567e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1.673879587e+09 -kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.673879559e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1.673879587e+09 -kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.673879562e+09 -# HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. -# TYPE kube_configmap_metadata_resource_version gauge -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 197 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 225 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 200 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 27 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 453 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 62236 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 324 -kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 325 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 232 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 323 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 322 -kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 321 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 272 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-config"} 452 -# HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_cronjob_annotations gauge -kube_cronjob_annotations{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_cronjob_labels gauge -kube_cronjob_labels{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_info Info about cronjob. -# TYPE kube_cronjob_info gauge -kube_cronjob_info{namespace="kube-system",cronjob="hello-cronjob",schedule="* * * * *",concurrency_policy="Allow"} 1 -# HELP kube_cronjob_created Unix creation timestamp -# TYPE kube_cronjob_created gauge -kube_cronjob_created{namespace="kube-system",cronjob="hello-cronjob"} 1.673949613e+09 -# HELP kube_cronjob_status_active Active holds pointers to currently running jobs. -# TYPE kube_cronjob_status_active gauge -kube_cronjob_status_active{namespace="kube-system",cronjob="hello-cronjob"} 0 -# HELP kube_cronjob_status_last_schedule_time LastScheduleTime keeps information of when was the last time the job was successfully scheduled. -# TYPE kube_cronjob_status_last_schedule_time gauge -kube_cronjob_status_last_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67396934e+09 -# HELP kube_cronjob_spec_suspend Suspend flag tells the controller to suspend subsequent executions. -# TYPE kube_cronjob_spec_suspend gauge -kube_cronjob_spec_suspend{namespace="kube-system",cronjob="hello-cronjob"} 0 -# HELP kube_cronjob_spec_starting_deadline_seconds Deadline in seconds for starting the job if it misses scheduled time for any reason. -# TYPE kube_cronjob_spec_starting_deadline_seconds gauge -# HELP kube_cronjob_next_schedule_time Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. -# TYPE kube_cronjob_next_schedule_time gauge -kube_cronjob_next_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.6739694e+09 -# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob. -# TYPE kube_cronjob_metadata_resource_version gauge -kube_cronjob_metadata_resource_version{namespace="kube-system",cronjob="hello-cronjob"} 69335 -# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. -# TYPE kube_cronjob_spec_successful_job_history_limit gauge -kube_cronjob_spec_successful_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 3 -# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. -# TYPE kube_cronjob_spec_failed_job_history_limit gauge -kube_cronjob_spec_failed_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_daemonset_created Unix creation timestamp -# TYPE kube_daemonset_created gauge -kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.673879562e+09 -kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.673879566e+09 -kube_daemonset_created{namespace="kube-system",daemonset="metricbeat"} 1.673879587e+09 -# HELP kube_daemonset_status_current_number_scheduled The number of nodes running at least one daemon pod and are supposed to. -# TYPE kube_daemonset_status_current_number_scheduled gauge -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -# HELP kube_daemonset_status_desired_number_scheduled The number of nodes that should be running the daemon pod. -# TYPE kube_daemonset_status_desired_number_scheduled gauge -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_available The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available -# TYPE kube_daemonset_status_number_available gauge -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_misscheduled The number of nodes running a daemon pod but are not supposed to. -# TYPE kube_daemonset_status_number_misscheduled gauge -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="metricbeat"} 0 -# HELP kube_daemonset_status_number_ready The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. -# TYPE kube_daemonset_status_number_ready gauge -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_unavailable The number of nodes that should be running the daemon pod and have none of the daemon pod running and available -# TYPE kube_daemonset_status_number_unavailable gauge -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="metricbeat"} 0 -# HELP kube_daemonset_status_observed_generation The most recent generation observed by the daemon set controller. -# TYPE kube_daemonset_status_observed_generation gauge -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_updated_number_scheduled The total number of nodes that are running updated daemon pod -# TYPE kube_daemonset_status_updated_number_scheduled gauge -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -# HELP kube_daemonset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_daemonset_metadata_generation gauge -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_daemonset_annotations gauge -kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_daemonset_labels gauge -kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_deployment_created Unix creation timestamp -# TYPE kube_deployment_created gauge -kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.673879562e+09 -kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.673879567e+09 -kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.673969342e+09 -# HELP kube_deployment_status_replicas The number of replicas per deployment. -# TYPE kube_deployment_status_replicas gauge -kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -# HELP kube_deployment_status_replicas_ready The number of ready replicas per deployment. -# TYPE kube_deployment_status_replicas_ready gauge -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_available The number of available replicas per deployment. -# TYPE kube_deployment_status_replicas_available gauge -kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_unavailable The number of unavailable replicas per deployment. -# TYPE kube_deployment_status_replicas_unavailable gauge -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_status_replicas_updated The number of updated replicas per deployment. -# TYPE kube_deployment_status_replicas_updated gauge -kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 -# HELP kube_deployment_status_observed_generation The generation observed by the deployment controller. -# TYPE kube_deployment_status_observed_generation gauge -kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -# HELP kube_deployment_status_condition The current status conditions of a deployment. -# TYPE kube_deployment_status_condition gauge -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="unknown"} 0 -# HELP kube_deployment_spec_replicas Number of desired pods for a deployment. -# TYPE kube_deployment_spec_replicas gauge -kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_spec_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_spec_paused Whether the deployment is paused and will not be processed by the deployment controller. -# TYPE kube_deployment_spec_paused gauge -kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_spec_paused{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable Maximum number of unavailable replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_spec_strategy_rollingupdate_max_surge Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_deployment_metadata_generation gauge -kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 -# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_deployment_annotations gauge -kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_deployment_labels gauge -kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_labels{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_endpoint_info Information about endpoint. -# TYPE kube_endpoint_info gauge -kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_info{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_created Unix creation timestamp -# TYPE kube_endpoint_created gauge -kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.673879576e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.673969341e+09 -kube_endpoint_created{namespace="default",endpoint="nginx"} 1.673969356e+09 -kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.673879561e+09 -# HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_endpoint_annotations gauge -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_annotations{namespace="default",endpoint="nginx"} 1 -kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 -# HELP kube_endpoint_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_endpoint_labels gauge -kube_endpoint_labels{namespace="default",endpoint="nginx"} 1 -kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 -# HELP kube_endpoint_address_available Number of addresses available in endpoint. -# TYPE kube_endpoint_address_available gauge -kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 -kube_endpoint_address_available{namespace="default",endpoint="nginx"} 0 -# HELP kube_endpoint_address_not_ready Number of addresses not ready in endpoint -# TYPE kube_endpoint_address_not_ready gauge -kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="nginx"} 0 -# HELP kube_endpoint_ports Information about the Endpoint ports. -# TYPE kube_endpoint_ports gauge -kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 -# HELP kube_horizontalpodautoscaler_info Information about this autoscaler. -# TYPE kube_horizontalpodautoscaler_info gauge -# HELP kube_horizontalpodautoscaler_metadata_generation The generation observed by the HorizontalPodAutoscaler controller. -# TYPE kube_horizontalpodautoscaler_metadata_generation gauge -# HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. -# TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. -# TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. -# TYPE kube_horizontalpodautoscaler_spec_target_metric gauge -# HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_current_replicas gauge -# HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge -# HELP kube_horizontalpodautoscaler_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_annotations gauge -# HELP kube_horizontalpodautoscaler_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_labels gauge -# HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_condition gauge -# HELP kube_ingress_info Information about ingress. -# TYPE kube_ingress_info gauge -# HELP kube_ingress_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_ingress_annotations gauge -# HELP kube_ingress_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_ingress_labels gauge -# HELP kube_ingress_created Unix creation timestamp -# TYPE kube_ingress_created gauge -# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress. -# TYPE kube_ingress_metadata_resource_version gauge -# HELP kube_ingress_path Ingress host, paths and backend service information. -# TYPE kube_ingress_path gauge -# HELP kube_ingress_tls Ingress TLS host and secret information. -# TYPE kube_ingress_tls gauge -# HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_job_annotations gauge -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -kube_job_annotations{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_job_labels gauge -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -kube_job_labels{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_info Information about job. -# TYPE kube_job_info gauge -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -kube_job_info{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_created Unix creation timestamp -# TYPE kube_job_created gauge -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899489"} 1.67396934e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899487"} 1.67396922e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899488"} 1.67396928e+09 -kube_job_created{namespace="kube-system",job_name="pi"} 1.673969355e+09 -# HELP kube_job_spec_parallelism The maximum desired number of pods the job should run at any given time. -# TYPE kube_job_spec_parallelism gauge -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_spec_completions The desired number of successfully finished pods the job should be run with. -# TYPE kube_job_spec_completions gauge -kube_job_spec_completions{namespace="kube-system",job_name="pi"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -# HELP kube_job_spec_active_deadline_seconds The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. -# TYPE kube_job_spec_active_deadline_seconds gauge -# HELP kube_job_status_succeeded The number of pods which reached Phase Succeeded. -# TYPE kube_job_status_succeeded gauge -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899488"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="pi"} 0 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899489"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899487"} 1 -# HELP kube_job_status_failed The number of pods which reached Phase Failed and the reason for failure. -# TYPE kube_job_status_failed gauge -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899488"} 0 -kube_job_status_failed{namespace="kube-system",job_name="pi"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899489"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899487"} 0 -# HELP kube_job_status_active The number of actively running pods. -# TYPE kube_job_status_active gauge -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899487"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899488"} 0 -kube_job_status_active{namespace="kube-system",job_name="pi"} 1 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899489"} 0 -# HELP kube_job_complete The job has completed its execution. -# TYPE kube_job_complete gauge -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899489",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899489",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899489",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899487",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899487",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899487",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899488",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899488",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899488",condition="unknown"} 0 -# HELP kube_job_failed The job has failed its execution. -# TYPE kube_job_failed gauge -# HELP kube_job_status_start_time StartTime represents time when the job was acknowledged by the Job Manager. -# TYPE kube_job_status_start_time gauge -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899489"} 1.67396934e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899487"} 1.67396922e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899488"} 1.67396928e+09 -kube_job_status_start_time{namespace="kube-system",job_name="pi"} 1.673969355e+09 -# HELP kube_job_status_completion_time CompletionTime represents time when the job was completed. -# TYPE kube_job_status_completion_time gauge -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899489"} 1.673969344e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899487"} 1.673969224e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899488"} 1.673969284e+09 -# HELP kube_job_owner Information about the Job's owner. -# TYPE kube_job_owner gauge -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899489",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899487",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899488",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="pi",owner_kind="",owner_name="",owner_is_controller=""} 1 -# HELP kube_lease_owner Information about the Lease's owner. -# TYPE kube_lease_owner gauge -kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane"} 1 -# HELP kube_lease_renew_time Kube lease renew time. -# TYPE kube_lease_renew_time gauge -kube_lease_renew_time{lease="kind-control-plane"} 1.673969382e+09 -# HELP kube_limitrange Information about limit range. -# TYPE kube_limitrange gauge -# HELP kube_limitrange_created Unix creation timestamp -# TYPE kube_limitrange_created gauge -# HELP kube_mutatingwebhookconfiguration_info Information about the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_info gauge -# HELP kube_mutatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_mutatingwebhookconfiguration_created gauge -# HELP kube_mutatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_namespace_created Unix creation timestamp -# TYPE kube_namespace_created gauge -kube_namespace_created{namespace="local-path-storage"} 1.673879567e+09 -kube_namespace_created{namespace="kube-system"} 1.673879559e+09 -kube_namespace_created{namespace="kube-public"} 1.673879559e+09 -kube_namespace_created{namespace="kube-node-lease"} 1.673879559e+09 -kube_namespace_created{namespace="default"} 1.673879561e+09 -# HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_namespace_annotations gauge -kube_namespace_annotations{namespace="kube-node-lease"} 1 -kube_namespace_annotations{namespace="default"} 1 -kube_namespace_annotations{namespace="local-path-storage"} 1 -kube_namespace_annotations{namespace="kube-system"} 1 -kube_namespace_annotations{namespace="kube-public"} 1 -# HELP kube_namespace_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_namespace_labels gauge -kube_namespace_labels{namespace="kube-node-lease"} 1 -kube_namespace_labels{namespace="default"} 1 -kube_namespace_labels{namespace="local-path-storage"} 1 -kube_namespace_labels{namespace="kube-system"} 1 -kube_namespace_labels{namespace="kube-public"} 1 -# HELP kube_namespace_status_phase kubernetes namespace status phase. -# TYPE kube_namespace_status_phase gauge -kube_namespace_status_phase{namespace="default",phase="Active"} 1 -kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 -kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-system",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 -# HELP kube_namespace_status_condition The condition of a namespace. -# TYPE kube_namespace_status_condition gauge -# HELP kube_networkpolicy_created Unix creation timestamp of network policy -# TYPE kube_networkpolicy_created gauge -# HELP kube_networkpolicy_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_networkpolicy_annotations gauge -# HELP kube_networkpolicy_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_networkpolicy_labels gauge -# HELP kube_networkpolicy_spec_ingress_rules Number of ingress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_ingress_rules gauge -# HELP kube_networkpolicy_spec_egress_rules Number of egress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_egress_rules gauge -# HELP kube_node_created Unix creation timestamp -# TYPE kube_node_created gauge -kube_node_created{node="kind-control-plane"} 1.673879559e+09 -# HELP kube_node_info Information about a cluster node. -# TYPE kube_node_info gauge -kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit",os_image="Ubuntu 22.04.1 LTS",container_runtime_version="containerd://1.6.9",kubelet_version="v1.25.3",kubeproxy_version="v1.25.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="eee895ed1cd343d68cde3dc3f09e40e6",internal_ip="172.18.0.2"} 1 -# HELP kube_node_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_node_annotations gauge -kube_node_annotations{node="kind-control-plane"} 1 -# HELP kube_node_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_node_labels gauge -kube_node_labels{node="kind-control-plane"} 1 -# HELP kube_node_role The role of a cluster node. -# TYPE kube_node_role gauge -kube_node_role{node="kind-control-plane",role="control-plane"} 1 -# HELP kube_node_spec_taint The taint of a cluster node. -# TYPE kube_node_spec_taint gauge -# HELP kube_node_spec_unschedulable Whether a node can schedule new pods. -# TYPE kube_node_spec_unschedulable gauge -kube_node_spec_unschedulable{node="kind-control-plane"} 0 -# HELP kube_node_status_allocatable The allocatable for different resources of a node that are available for scheduling. -# TYPE kube_node_status_allocatable gauge -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -# HELP kube_node_status_capacity The capacity for different resources of a node. -# TYPE kube_node_status_capacity gauge -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -# HELP kube_node_status_condition The condition of a cluster node. -# TYPE kube_node_status_condition gauge -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="true"} 1 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="false"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 -# HELP kube_persistentvolumeclaim_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_labels gauge -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_annotations gauge -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_info Information about persistent volume claim. -# TYPE kube_persistentvolumeclaim_info gauge -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="myclaim",storageclass="slow",volumename=""} 1 -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="www-web-0",storageclass="my-storage-class",volumename=""} 1 -# HELP kube_persistentvolumeclaim_status_phase The phase the persistent volume claim is currently in. -# TYPE kube_persistentvolumeclaim_status_phase gauge -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Pending"} 1 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Pending"} 1 -# HELP kube_persistentvolumeclaim_resource_requests_storage_bytes The capacity of storage requested by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="myclaim"} 8.589934592e+09 -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="www-web-0"} 1.073741824e+09 -# HELP kube_persistentvolumeclaim_access_mode The access mode(s) specified by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_access_mode gauge -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="myclaim",access_mode="ReadWriteOnce"} 1 -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="www-web-0",access_mode="ReadWriteOnce"} 1 -# HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. -# TYPE kube_persistentvolumeclaim_status_condition gauge -# HELP kube_persistentvolume_claim_ref Information about the Persistent Volume Claim Reference. -# TYPE kube_persistentvolume_claim_ref gauge -# HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolume_annotations gauge -kube_persistentvolume_annotations{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolume_labels gauge -kube_persistentvolume_labels{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_status_phase The phase indicates if a volume is available, bound to a claim, or released by a claim. -# TYPE kube_persistentvolume_status_phase gauge -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Pending"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Available"} 1 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Bound"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Released"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Failed"} 0 -# HELP kube_persistentvolume_info Information about persistentvolume. -# TYPE kube_persistentvolume_info gauge -kube_persistentvolume_info{persistentvolume="pv0003",storageclass="slow",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="172.17.0.2",nfs_path="/tmp"} 1 -# HELP kube_persistentvolume_capacity_bytes Persistentvolume capacity in bytes. -# TYPE kube_persistentvolume_capacity_bytes gauge -kube_persistentvolume_capacity_bytes{persistentvolume="pv0003"} 5.36870912e+09 -# HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_annotations gauge -# HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_labels gauge -# HELP kube_poddisruptionbudget_created Unix creation timestamp -# TYPE kube_poddisruptionbudget_created gauge -# HELP kube_poddisruptionbudget_status_current_healthy Current number of healthy pods -# TYPE kube_poddisruptionbudget_status_current_healthy gauge -# HELP kube_poddisruptionbudget_status_desired_healthy Minimum desired number of healthy pods -# TYPE kube_poddisruptionbudget_status_desired_healthy gauge -# HELP kube_poddisruptionbudget_status_pod_disruptions_allowed Number of pod disruptions that are currently allowed -# TYPE kube_poddisruptionbudget_status_pod_disruptions_allowed gauge -# HELP kube_poddisruptionbudget_status_expected_pods Total number of pods counted by this disruption budget -# TYPE kube_poddisruptionbudget_status_expected_pods gauge -# HELP kube_poddisruptionbudget_status_observed_generation Most recent generation observed when updating this PDB status -# TYPE kube_poddisruptionbudget_status_observed_generation gauge -# HELP kube_pod_completion_time Completion time in unix timestamp for a pod. -# TYPE kube_pod_completion_time gauge -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1.67396934e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1.67396928e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1.67396922e+09 -# HELP kube_pod_container_info Information about a container in a pod. -# TYPE kube_pod_container_info gauge -kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.25.3",image="registry.k8s.io/kube-controller-manager:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4",container_id="containerd://548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.25.3",image="registry.k8s.io/kube-proxy:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950",container_id="containerd://9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics",image_spec="k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.4.2",image="k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.4.2",image_id="k8s.gcr.io/kube-state-metrics/kube-state-metrics@sha256:b48f10941c463f0cb1d8fa7f0748d8791332ad09db73585b8d4928bc1f6ac6ca",container_id="containerd://26d7459f5f6e7dfce46638648c6bfec8771152583c743ae6a65adf6a3a3419a9"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.25.3",image="registry.k8s.io/kube-apiserver:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4a",container_id="containerd://01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://69a6e1720df542c8a662873e8ad0694c3d120259fa625bf527269c4d4f1bff34"} 1 -kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image_id="sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6",container_id="containerd://003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://cbc3ddaeb5fda1bbd6063297b75340fc69063f9247d6cc3de20a92438b961e1f"} 1 -kube_pod_container_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20221004-44d545d1",image="docker.io/kindest/kindnetd:v20221004-44d545d1",image_id="sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f",container_id="containerd://db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://30514fd6f76760a37d429af91f1d84301b9d1bae00a4b6c2845f07ab8b86eb30"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.25.3",image="registry.k8s.io/kube-scheduler:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78d",container_id="containerd://f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2"} 1 -kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.4-0",image="registry.k8s.io/etcd:3.5.4-0",image_id="sha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66",container_id="containerd://e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b"} 1 -kube_pod_container_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",image_spec="perl:5.34.0",image="perl:5.34.0",image_id="",container_id=""} 1 -kube_pod_container_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",image_spec="docker.elastic.co/beats/metricbeat:8.6.0",image="docker.elastic.co/beats/metricbeat:8.6.0",image_id="docker.elastic.co/beats/metricbeat@sha256:6a327e350e01dfd01d576717f038767ed03fbd513b10033a6f65835668aa82fb",container_id="containerd://94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8"} 1 -# HELP kube_pod_container_resource_limits The number of requested limit resource by a container. -# TYPE kube_pod_container_resource_limits gauge -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -# HELP kube_pod_container_resource_requests The number of requested request resource by a container. -# TYPE kube_pod_container_resource_requests gauge -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -# HELP kube_pod_container_state_started Start time in unix timestamp for a pod container. -# TYPE kube_pod_container_state_started gauge -kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1.673879577e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 1.673969345e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 1.67396922e+09 -kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 1.67396928e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1.673879578e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 1.67396934e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1.673879556e+09 -kube_pod_container_state_started{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1.673879609e+09 -# HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. -# TYPE kube_pod_container_status_last_terminated_reason gauge -# HELP kube_pod_container_status_ready Describes whether the containers readiness check succeeded. -# TYPE kube_pod_container_status_ready gauge -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -# HELP kube_pod_container_status_restarts_total The number of container restarts per container. -# TYPE kube_pod_container_status_restarts_total counter -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -# HELP kube_pod_container_status_running Describes whether the container is currently in running state. -# TYPE kube_pod_container_status_running gauge -kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -# HELP kube_pod_container_status_terminated Describes whether the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated gauge -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 0 -# HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated_reason gauge -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob",reason="Completed"} 1 -# HELP kube_pod_container_status_waiting Describes whether the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting gauge -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",container="kube-state-metrics"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1 -kube_pod_container_status_waiting{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -# HELP kube_pod_container_status_waiting_reason Describes the reason the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting_reason gauge -kube_pod_container_status_waiting_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",reason="ContainerCreating"} 1 -# HELP kube_pod_created Unix creation timestamp -# TYPE kube_pod_created gauge -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1.67396934e+09 -kube_pod_created{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_created{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879562e+09 -kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432"} 1.673969342e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1.67396928e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1.67396922e+09 -kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879576e+09 -kube_pod_created{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1.673969356e+09 -# HELP kube_pod_deletion_timestamp Unix deletion timestamp -# TYPE kube_pod_deletion_timestamp gauge -# HELP kube_pod_info Information about pod. -# TYPE kube_pod_info gauge -kube_pod_info{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",host_ip="172.18.0.2",pod_ip="10.244.0.58",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-77bcd445dd",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",host_ip="",pod_ip="",node="",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",host_ip="172.18.0.2",pod_ip="10.244.0.56",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899488",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",host_ip="172.18.0.2",pod_ip="10.244.0.55",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899487",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-684f458cdd",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",host_ip="172.18.0.2",pod_ip="10.244.0.57",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899489",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",host_ip="172.18.0.2",pod_ip="",node="kind-control-plane",created_by_kind="Job",created_by_name="pi",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="metricbeat",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -# HELP kube_pod_init_container_info Information about an init container in a pod. -# TYPE kube_pod_init_container_info gauge -# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. -# TYPE kube_pod_init_container_resource_limits gauge -# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container. -# TYPE kube_pod_init_container_resource_requests gauge -# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state. -# TYPE kube_pod_init_container_status_last_terminated_reason gauge -# HELP kube_pod_init_container_status_ready Describes whether the init containers readiness check succeeded. -# TYPE kube_pod_init_container_status_ready gauge -# HELP kube_pod_init_container_status_restarts_total The number of restarts for the init container. -# TYPE kube_pod_init_container_status_restarts_total counter -# HELP kube_pod_init_container_status_running Describes whether the init container is currently in running state. -# TYPE kube_pod_init_container_status_running gauge -# HELP kube_pod_init_container_status_terminated Describes whether the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated gauge -# HELP kube_pod_init_container_status_terminated_reason Describes the reason the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated_reason gauge -# HELP kube_pod_init_container_status_waiting Describes whether the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting gauge -# HELP kube_pod_init_container_status_waiting_reason Describes the reason the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting_reason gauge -# HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_pod_annotations gauge -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1 -kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_annotations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1 -kube_pod_annotations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_annotations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_annotations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -# HELP kube_pod_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_pod_labels gauge -kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_labels{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1 -kube_pod_labels{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_labels{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_labels{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -# HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. -# TYPE kube_pod_overhead_cpu_cores gauge -# HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. -# TYPE kube_pod_overhead_memory_bytes gauge -# HELP kube_pod_owner Information about the Pod's owner. -# TYPE kube_pod_owner gauge -kube_pod_owner{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",owner_kind="DaemonSet",owner_name="metricbeat",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",owner_kind="Job",owner_name="pi",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",owner_kind="ReplicaSet",owner_name="kube-state-metrics-77bcd445dd",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",owner_kind="Job",owner_name="hello-cronjob-27899488",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",owner_kind="Job",owner_name="hello-cronjob-27899487",owner_is_controller="true"} 1 -kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",owner_kind="ReplicaSet",owner_name="local-path-provisioner-684f458cdd",owner_is_controller="true"} 1 -kube_pod_owner{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",owner_kind="Job",owner_name="hello-cronjob-27899489",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -# HELP kube_pod_restart_policy Describes the restart policy in use by this pod. -# TYPE kube_pod_restart_policy gauge -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",type="Always"} 1 -kube_pod_restart_policy{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",type="Never"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",type="Always"} 1 -# HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. -# TYPE kube_pod_runtimeclass_name_info gauge -# HELP kube_pod_spec_volumes_persistentvolumeclaims_info Information about persistentvolumeclaim volumes in a pod. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge -kube_pod_spec_volumes_persistentvolumeclaims_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly Describes whether a persistentvolumeclaim is mounted read only. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge -kube_pod_spec_volumes_persistentvolumeclaims_readonly{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 0 -# HELP kube_pod_start_time Start time in unix timestamp for a pod. -# TYPE kube_pod_start_time gauge -kube_pod_start_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432"} 1.673969342e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1.67396928e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1.67396922e+09 -kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1.67396934e+09 -kube_pod_start_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -# HELP kube_pod_status_phase The pods current phase. -# TYPE kube_pod_status_phase gauge -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Pending"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",phase="Running"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Pending"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Failed"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Unknown"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Running"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Pending"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Failed"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Unknown"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Running"} 1 -# HELP kube_pod_status_ready Describes whether the pod is ready to serve requests. -# TYPE kube_pod_status_ready gauge -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="unknown"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -# HELP kube_pod_status_reason The pod status reasons -# TYPE kube_pod_status_reason gauge -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Evicted"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Evicted"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="UnexpectedAdmissionError"} 0 -# HELP kube_pod_status_scheduled Describes the status of the scheduling process for the pod. -# TYPE kube_pod_status_scheduled gauge -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="true"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="false"} 1 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="unknown"} 0 -# HELP kube_pod_status_scheduled_time Unix timestamp when pod moved into scheduled status -# TYPE kube_pod_status_scheduled_time gauge -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-77bcd445dd-tnbvx",uid="ba55ba7c-0932-4c2f-8ae1-6eed3b383432"} 1.673969342e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899488-mctvl",uid="310e2db7-5e8a-4779-8943-d340cecf7d8e"} 1.67396928e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899487-6vx8l",uid="a84fbfeb-9444-41ef-abdc-864d56fda3d8"} 1.67396922e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899489-sl9hn",uid="59d60d06-18fe-4014-98ac-e23e11b272e0"} 1.67396934e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -# HELP kube_pod_status_unschedulable Describes the unschedulable status for the pod. -# TYPE kube_pod_status_unschedulable gauge -kube_pod_status_unschedulable{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -# HELP kube_replicaset_created Unix creation timestamp -# TYPE kube_replicaset_created gauge -kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1.673969342e+09 -kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="coredns-565d847f94"} 1.673879576e+09 -# HELP kube_replicaset_status_replicas The number of replicas per ReplicaSet. -# TYPE kube_replicaset_status_replicas gauge -kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_status_fully_labeled_replicas The number of fully labeled replicas per ReplicaSet. -# TYPE kube_replicaset_status_fully_labeled_replicas gauge -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_status_ready_replicas The number of ready replicas per ReplicaSet. -# TYPE kube_replicaset_status_ready_replicas gauge -kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -# HELP kube_replicaset_status_observed_generation The generation observed by the ReplicaSet controller. -# TYPE kube_replicaset_status_observed_generation gauge -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -# HELP kube_replicaset_spec_replicas Number of desired pods for a ReplicaSet. -# TYPE kube_replicaset_spec_replicas gauge -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicaset_metadata_generation gauge -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -# HELP kube_replicaset_owner Information about the ReplicaSet's owner. -# TYPE kube_replicaset_owner gauge -kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="coredns-565d847f94",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 -# HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_replicaset_annotations gauge -kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -# HELP kube_replicaset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_replicaset_labels gauge -kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-77bcd445dd"} 1 -kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -# HELP kube_replicationcontroller_created Unix creation timestamp -# TYPE kube_replicationcontroller_created gauge -# HELP kube_replicationcontroller_status_replicas The number of replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_replicas gauge -# HELP kube_replicationcontroller_status_fully_labeled_replicas The number of fully labeled replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_fully_labeled_replicas gauge -# HELP kube_replicationcontroller_status_ready_replicas The number of ready replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_ready_replicas gauge -# HELP kube_replicationcontroller_status_available_replicas The number of available replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_available_replicas gauge -# HELP kube_replicationcontroller_status_observed_generation The generation observed by the ReplicationController controller. -# TYPE kube_replicationcontroller_status_observed_generation gauge -# HELP kube_replicationcontroller_spec_replicas Number of desired pods for a ReplicationController. -# TYPE kube_replicationcontroller_spec_replicas gauge -# HELP kube_replicationcontroller_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicationcontroller_metadata_generation gauge -# HELP kube_replicationcontroller_owner Information about the ReplicationController's owner. -# TYPE kube_replicationcontroller_owner gauge -# HELP kube_resourcequota_created Unix creation timestamp -# TYPE kube_resourcequota_created gauge -kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-medium"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-low"} 1.673969356e+09 -# HELP kube_resourcequota Information about resource quota. -# TYPE kube_resourcequota gauge -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="hard"} 5 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="hard"} 1.073741824e+10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 2.147483648e+11 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="hard"} 2.147483648e+10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="used"} 0 -# HELP kube_secret_info Information about secret. -# TYPE kube_secret_info gauge -# HELP kube_secret_type Type about secret. -# TYPE kube_secret_type gauge -# HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_secret_annotations gauge -# HELP kube_secret_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_secret_labels gauge -# HELP kube_secret_created Unix creation timestamp -# TYPE kube_secret_created gauge -# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. -# TYPE kube_secret_metadata_resource_version gauge -# HELP kube_service_info Information about service. -# TYPE kube_service_info gauge -kube_service_info{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="435df169-ec4f-4a7c-9d06-04d12a89c9d0",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -# HELP kube_service_created Unix creation timestamp -# TYPE kube_service_created gauge -kube_service_created{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1.673879561e+09 -kube_service_created{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1.673879562e+09 -kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="435df169-ec4f-4a7c-9d06-04d12a89c9d0"} 1.673969341e+09 -kube_service_created{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1.673969356e+09 -# HELP kube_service_spec_type Type about service. -# TYPE kube_service_spec_type gauge -kube_service_spec_type{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="435df169-ec4f-4a7c-9d06-04d12a89c9d0",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",type="ClusterIP"} 1 -# HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_service_annotations gauge -kube_service_annotations{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_annotations{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="435df169-ec4f-4a7c-9d06-04d12a89c9d0"} 1 -kube_service_annotations{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -# HELP kube_service_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_service_labels gauge -kube_service_labels{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -kube_service_labels{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_labels{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="435df169-ec4f-4a7c-9d06-04d12a89c9d0"} 1 -# HELP kube_service_spec_external_ip Service external ips. One series for each ip -# TYPE kube_service_spec_external_ip gauge -# HELP kube_service_status_load_balancer_ingress Service load balancer ingress status -# TYPE kube_service_status_load_balancer_ingress gauge -# HELP kube_statefulset_created Unix creation timestamp -# TYPE kube_statefulset_created gauge -kube_statefulset_created{namespace="default",statefulset="web"} 1.673969356e+09 -# HELP kube_statefulset_status_replicas The number of replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas gauge -kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_available gauge -kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_current The number of current replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_current gauge -kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_ready The number of ready replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_ready gauge -kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_updated The number of updated replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_updated gauge -kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_observed_generation The generation observed by the StatefulSet controller. -# TYPE kube_statefulset_status_observed_generation gauge -kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_replicas Number of desired pods for a StatefulSet. -# TYPE kube_statefulset_replicas gauge -kube_statefulset_replicas{namespace="default",statefulset="web"} 3 -# HELP kube_statefulset_metadata_generation Sequence number representing a specific generation of the desired state for the StatefulSet. -# TYPE kube_statefulset_metadata_generation gauge -kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_statefulset_annotations gauge -kube_statefulset_annotations{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_statefulset_labels gauge -kube_statefulset_labels{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_current_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). -# TYPE kube_statefulset_status_current_revision gauge -kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_statefulset_status_update_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) -# TYPE kube_statefulset_status_update_revision gauge -kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_storageclass_info Information about storageclass. -# TYPE kube_storageclass_info gauge -kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 -# HELP kube_storageclass_created Unix creation timestamp -# TYPE kube_storageclass_created gauge -kube_storageclass_created{storageclass="standard"} 1.673879567e+09 -# HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_storageclass_annotations gauge -kube_storageclass_annotations{storageclass="standard"} 1 -# HELP kube_storageclass_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_storageclass_labels gauge -kube_storageclass_labels{storageclass="standard"} 1 -# HELP kube_validatingwebhookconfiguration_info Information about the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_info gauge -# HELP kube_validatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_validatingwebhookconfiguration_created gauge -# HELP kube_validatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_volumeattachment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_volumeattachment_labels gauge -# HELP kube_volumeattachment_info Information about volumeattachment. -# TYPE kube_volumeattachment_info gauge -# HELP kube_volumeattachment_created Unix creation timestamp -# TYPE kube_volumeattachment_created gauge -# HELP kube_volumeattachment_spec_source_persistentvolume PersistentVolume source reference. -# TYPE kube_volumeattachment_spec_source_persistentvolume gauge -# HELP kube_volumeattachment_status_attached Information about volumeattachment. -# TYPE kube_volumeattachment_status_attached gauge -# HELP kube_volumeattachment_status_attachment_metadata volumeattachment metadata. -# TYPE kube_volumeattachment_status_attachment_metadata gauge diff --git a/metricbeat/module/kubernetes/_meta/test/ksm.v2.5.0.plain b/metricbeat/module/kubernetes/_meta/test/ksm.v2.5.0.plain deleted file mode 100644 index 33bac8059ed..00000000000 --- a/metricbeat/module/kubernetes/_meta/test/ksm.v2.5.0.plain +++ /dev/null @@ -1,1455 +0,0 @@ -# HELP kube_certificatesigningrequest_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_annotations gauge -# HELP kube_certificatesigningrequest_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_labels gauge -# HELP kube_certificatesigningrequest_created Unix creation timestamp -# TYPE kube_certificatesigningrequest_created gauge -# HELP kube_certificatesigningrequest_condition The number of each certificatesigningrequest condition -# TYPE kube_certificatesigningrequest_condition gauge -# HELP kube_certificatesigningrequest_cert_length Length of the issued cert -# TYPE kube_certificatesigningrequest_cert_length gauge -# HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_configmap_annotations gauge -kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -# HELP kube_configmap_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_configmap_labels gauge -kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 -# HELP kube_configmap_info Information about configmap. -# TYPE kube_configmap_info gauge -kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 -# HELP kube_configmap_created Unix creation timestamp -# TYPE kube_configmap_created gauge -kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.673879562e+09 -kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.673879567e+09 -kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.673879562e+09 -kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1.673879587e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1.673879587e+09 -kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.673879561e+09 -kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.673879559e+09 -# HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. -# TYPE kube_configmap_metadata_resource_version gauge -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 322 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 453 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 232 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 324 -kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 325 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 197 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-config"} 452 -kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 321 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 323 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 27 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 200 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 272 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 225 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 62236 -# HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_cronjob_annotations gauge -kube_cronjob_annotations{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_cronjob_labels gauge -kube_cronjob_labels{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_info Info about cronjob. -# TYPE kube_cronjob_info gauge -kube_cronjob_info{namespace="kube-system",cronjob="hello-cronjob",schedule="* * * * *",concurrency_policy="Allow"} 1 -# HELP kube_cronjob_created Unix creation timestamp -# TYPE kube_cronjob_created gauge -kube_cronjob_created{namespace="kube-system",cronjob="hello-cronjob"} 1.673949613e+09 -# HELP kube_cronjob_status_active Active holds pointers to currently running jobs. -# TYPE kube_cronjob_status_active gauge -kube_cronjob_status_active{namespace="kube-system",cronjob="hello-cronjob"} 0 -# HELP kube_cronjob_status_last_schedule_time LastScheduleTime keeps information of when was the last time the job was successfully scheduled. -# TYPE kube_cronjob_status_last_schedule_time gauge -kube_cronjob_status_last_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67396994e+09 -# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully. -# TYPE kube_cronjob_status_last_successful_time gauge -kube_cronjob_status_last_successful_time{namespace="kube-system",cronjob="hello-cronjob"} 1.673969944e+09 -# HELP kube_cronjob_spec_suspend Suspend flag tells the controller to suspend subsequent executions. -# TYPE kube_cronjob_spec_suspend gauge -kube_cronjob_spec_suspend{namespace="kube-system",cronjob="hello-cronjob"} 0 -# HELP kube_cronjob_spec_starting_deadline_seconds Deadline in seconds for starting the job if it misses scheduled time for any reason. -# TYPE kube_cronjob_spec_starting_deadline_seconds gauge -# HELP kube_cronjob_next_schedule_time Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. -# TYPE kube_cronjob_next_schedule_time gauge -kube_cronjob_next_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67397e+09 -# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob. -# TYPE kube_cronjob_metadata_resource_version gauge -kube_cronjob_metadata_resource_version{namespace="kube-system",cronjob="hello-cronjob"} 70739 -# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. -# TYPE kube_cronjob_spec_successful_job_history_limit gauge -kube_cronjob_spec_successful_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 3 -# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. -# TYPE kube_cronjob_spec_failed_job_history_limit gauge -kube_cronjob_spec_failed_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_daemonset_created Unix creation timestamp -# TYPE kube_daemonset_created gauge -kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.673879562e+09 -kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.673879566e+09 -kube_daemonset_created{namespace="kube-system",daemonset="metricbeat"} 1.673879587e+09 -# HELP kube_daemonset_status_current_number_scheduled The number of nodes running at least one daemon pod and are supposed to. -# TYPE kube_daemonset_status_current_number_scheduled gauge -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_desired_number_scheduled The number of nodes that should be running the daemon pod. -# TYPE kube_daemonset_status_desired_number_scheduled gauge -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_available The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available -# TYPE kube_daemonset_status_number_available gauge -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_misscheduled The number of nodes running a daemon pod but are not supposed to. -# TYPE kube_daemonset_status_number_misscheduled gauge -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="metricbeat"} 0 -# HELP kube_daemonset_status_number_ready The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. -# TYPE kube_daemonset_status_number_ready gauge -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_unavailable The number of nodes that should be running the daemon pod and have none of the daemon pod running and available -# TYPE kube_daemonset_status_number_unavailable gauge -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="metricbeat"} 0 -# HELP kube_daemonset_status_observed_generation The most recent generation observed by the daemon set controller. -# TYPE kube_daemonset_status_observed_generation gauge -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_updated_number_scheduled The total number of nodes that are running updated daemon pod -# TYPE kube_daemonset_status_updated_number_scheduled gauge -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_daemonset_metadata_generation gauge -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_daemonset_annotations gauge -kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_daemonset_labels gauge -kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 -# HELP kube_deployment_created Unix creation timestamp -# TYPE kube_deployment_created gauge -kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.673879562e+09 -kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.673879567e+09 -kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.673969921e+09 -# HELP kube_deployment_status_replicas The number of replicas per deployment. -# TYPE kube_deployment_status_replicas gauge -kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_ready The number of ready replicas per deployment. -# TYPE kube_deployment_status_replicas_ready gauge -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_available The number of available replicas per deployment. -# TYPE kube_deployment_status_replicas_available gauge -kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_unavailable The number of unavailable replicas per deployment. -# TYPE kube_deployment_status_replicas_unavailable gauge -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_status_replicas_updated The number of updated replicas per deployment. -# TYPE kube_deployment_status_replicas_updated gauge -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_observed_generation The generation observed by the deployment controller. -# TYPE kube_deployment_status_observed_generation gauge -kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 -# HELP kube_deployment_status_condition The current status conditions of a deployment. -# TYPE kube_deployment_status_condition gauge -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="unknown"} 0 -# HELP kube_deployment_spec_replicas Number of desired pods for a deployment. -# TYPE kube_deployment_spec_replicas gauge -kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_spec_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_spec_paused Whether the deployment is paused and will not be processed by the deployment controller. -# TYPE kube_deployment_spec_paused gauge -kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metrics"} 0 -kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_spec_paused{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -# HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable Maximum number of unavailable replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 -# HELP kube_deployment_spec_strategy_rollingupdate_max_surge Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_deployment_metadata_generation gauge -kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_deployment_annotations gauge -kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_deployment_labels gauge -kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_labels{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_endpoint_info Information about endpoint. -# TYPE kube_endpoint_info gauge -kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_info{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_created Unix creation timestamp -# TYPE kube_endpoint_created gauge -kube_endpoint_created{namespace="default",endpoint="nginx"} 1.673969356e+09 -kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.673879561e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.673879576e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.673969921e+09 -# HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_endpoint_annotations gauge -kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_annotations{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_endpoint_labels gauge -kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_labels{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_address_available Number of addresses available in endpoint. -# TYPE kube_endpoint_address_available gauge -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 -kube_endpoint_address_available{namespace="default",endpoint="nginx"} 0 -kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 -# HELP kube_endpoint_address_not_ready Number of addresses not ready in endpoint -# TYPE kube_endpoint_address_not_ready gauge -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="nginx"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 -# HELP kube_endpoint_ports Information about the Endpoint ports. -# TYPE kube_endpoint_ports gauge -kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 -# HELP kube_horizontalpodautoscaler_info Information about this autoscaler. -# TYPE kube_horizontalpodautoscaler_info gauge -# HELP kube_horizontalpodautoscaler_metadata_generation The generation observed by the HorizontalPodAutoscaler controller. -# TYPE kube_horizontalpodautoscaler_metadata_generation gauge -# HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. -# TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. -# TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. -# TYPE kube_horizontalpodautoscaler_spec_target_metric gauge -# HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_current_replicas gauge -# HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge -# HELP kube_horizontalpodautoscaler_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_annotations gauge -# HELP kube_horizontalpodautoscaler_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_labels gauge -# HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_condition gauge -# HELP kube_ingress_info Information about ingress. -# TYPE kube_ingress_info gauge -# HELP kube_ingress_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_ingress_annotations gauge -# HELP kube_ingress_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_ingress_labels gauge -# HELP kube_ingress_created Unix creation timestamp -# TYPE kube_ingress_created gauge -# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress. -# TYPE kube_ingress_metadata_resource_version gauge -# HELP kube_ingress_path Ingress host, paths and backend service information. -# TYPE kube_ingress_path gauge -# HELP kube_ingress_tls Ingress TLS host and secret information. -# TYPE kube_ingress_tls gauge -# HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_job_annotations gauge -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_annotations{namespace="kube-system",job_name="pi"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -# HELP kube_job_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_job_labels gauge -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_labels{namespace="kube-system",job_name="pi"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -# HELP kube_job_info Information about job. -# TYPE kube_job_info gauge -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_info{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_created Unix creation timestamp -# TYPE kube_job_created gauge -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899497"} 1.67396982e+09 -kube_job_created{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.67396988e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.67396994e+09 -# HELP kube_job_spec_parallelism The maximum desired number of pods the job should run at any given time. -# TYPE kube_job_spec_parallelism gauge -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="pi"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -# HELP kube_job_spec_completions The desired number of successfully finished pods the job should be run with. -# TYPE kube_job_spec_completions gauge -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_spec_active_deadline_seconds The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. -# TYPE kube_job_spec_active_deadline_seconds gauge -# HELP kube_job_status_succeeded The number of pods which reached Phase Succeeded. -# TYPE kube_job_status_succeeded gauge -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899497"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="pi"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -# HELP kube_job_status_failed The number of pods which reached Phase Failed and the reason for failure. -# TYPE kube_job_status_failed gauge -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899497"} 0 -kube_job_status_failed{namespace="kube-system",job_name="pi"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899498"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899499"} 0 -# HELP kube_job_status_active The number of actively running pods. -# TYPE kube_job_status_active gauge -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899498"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899499"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899497"} 0 -kube_job_status_active{namespace="kube-system",job_name="pi"} 0 -# HELP kube_job_complete The job has completed its execution. -# TYPE kube_job_complete gauge -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899497",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899497",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899497",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="pi",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="pi",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="pi",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="unknown"} 0 -# HELP kube_job_failed The job has failed its execution. -# TYPE kube_job_failed gauge -# HELP kube_job_status_start_time StartTime represents time when the job was acknowledged by the Job Manager. -# TYPE kube_job_status_start_time gauge -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899497"} 1.67396982e+09 -kube_job_status_start_time{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.67396988e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.67396994e+09 -# HELP kube_job_status_completion_time CompletionTime represents time when the job was completed. -# TYPE kube_job_status_completion_time gauge -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899497"} 1.673969824e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="pi"} 1.673969411e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.673969884e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.673969944e+09 -# HELP kube_job_owner Information about the Job's owner. -# TYPE kube_job_owner gauge -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899497",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="pi",owner_kind="",owner_name="",owner_is_controller=""} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899498",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899499",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -# HELP kube_lease_owner Information about the Lease's owner. -# TYPE kube_lease_owner gauge -kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane"} 1 -# HELP kube_lease_renew_time Kube lease renew time. -# TYPE kube_lease_renew_time gauge -kube_lease_renew_time{lease="kind-control-plane"} 1.673969974e+09 -# HELP kube_limitrange Information about limit range. -# TYPE kube_limitrange gauge -# HELP kube_limitrange_created Unix creation timestamp -# TYPE kube_limitrange_created gauge -# HELP kube_mutatingwebhookconfiguration_info Information about the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_info gauge -# HELP kube_mutatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_mutatingwebhookconfiguration_created gauge -# HELP kube_mutatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_namespace_created Unix creation timestamp -# TYPE kube_namespace_created gauge -kube_namespace_created{namespace="kube-public"} 1.673879559e+09 -kube_namespace_created{namespace="kube-node-lease"} 1.673879559e+09 -kube_namespace_created{namespace="default"} 1.673879561e+09 -kube_namespace_created{namespace="local-path-storage"} 1.673879567e+09 -kube_namespace_created{namespace="kube-system"} 1.673879559e+09 -# HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_namespace_annotations gauge -kube_namespace_annotations{namespace="default"} 1 -kube_namespace_annotations{namespace="local-path-storage"} 1 -kube_namespace_annotations{namespace="kube-system"} 1 -kube_namespace_annotations{namespace="kube-public"} 1 -kube_namespace_annotations{namespace="kube-node-lease"} 1 -# HELP kube_namespace_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_namespace_labels gauge -kube_namespace_labels{namespace="kube-public"} 1 -kube_namespace_labels{namespace="kube-node-lease"} 1 -kube_namespace_labels{namespace="default"} 1 -kube_namespace_labels{namespace="local-path-storage"} 1 -kube_namespace_labels{namespace="kube-system"} 1 -# HELP kube_namespace_status_phase kubernetes namespace status phase. -# TYPE kube_namespace_status_phase gauge -kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="default",phase="Active"} 1 -kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 -kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-system",phase="Terminating"} 0 -# HELP kube_namespace_status_condition The condition of a namespace. -# TYPE kube_namespace_status_condition gauge -# HELP kube_networkpolicy_created Unix creation timestamp of network policy -# TYPE kube_networkpolicy_created gauge -# HELP kube_networkpolicy_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_networkpolicy_annotations gauge -# HELP kube_networkpolicy_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_networkpolicy_labels gauge -# HELP kube_networkpolicy_spec_ingress_rules Number of ingress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_ingress_rules gauge -# HELP kube_networkpolicy_spec_egress_rules Number of egress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_egress_rules gauge -# HELP kube_node_created Unix creation timestamp -# TYPE kube_node_created gauge -kube_node_created{node="kind-control-plane"} 1.673879559e+09 -# HELP kube_node_info Information about a cluster node. -# TYPE kube_node_info gauge -kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit",os_image="Ubuntu 22.04.1 LTS",container_runtime_version="containerd://1.6.9",kubelet_version="v1.25.3",kubeproxy_version="v1.25.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="eee895ed1cd343d68cde3dc3f09e40e6",internal_ip="172.18.0.2"} 1 -# HELP kube_node_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_node_annotations gauge -kube_node_annotations{node="kind-control-plane"} 1 -# HELP kube_node_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_node_labels gauge -kube_node_labels{node="kind-control-plane"} 1 -# HELP kube_node_role The role of a cluster node. -# TYPE kube_node_role gauge -kube_node_role{node="kind-control-plane",role="control-plane"} 1 -# HELP kube_node_spec_taint The taint of a cluster node. -# TYPE kube_node_spec_taint gauge -# HELP kube_node_spec_unschedulable Whether a node can schedule new pods. -# TYPE kube_node_spec_unschedulable gauge -kube_node_spec_unschedulable{node="kind-control-plane"} 0 -# HELP kube_node_status_allocatable The allocatable for different resources of a node that are available for scheduling. -# TYPE kube_node_status_allocatable gauge -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -# HELP kube_node_status_capacity The capacity for different resources of a node. -# TYPE kube_node_status_capacity gauge -kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -# HELP kube_node_status_condition The condition of a cluster node. -# TYPE kube_node_status_condition gauge -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="true"} 1 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="false"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 -# HELP kube_persistentvolumeclaim_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_labels gauge -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_annotations gauge -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_info Information about persistent volume claim. -# TYPE kube_persistentvolumeclaim_info gauge -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="myclaim",storageclass="slow",volumename=""} 1 -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="www-web-0",storageclass="my-storage-class",volumename=""} 1 -# HELP kube_persistentvolumeclaim_status_phase The phase the persistent volume claim is currently in. -# TYPE kube_persistentvolumeclaim_status_phase gauge -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Pending"} 1 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Pending"} 1 -# HELP kube_persistentvolumeclaim_resource_requests_storage_bytes The capacity of storage requested by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="myclaim"} 8.589934592e+09 -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="www-web-0"} 1.073741824e+09 -# HELP kube_persistentvolumeclaim_access_mode The access mode(s) specified by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_access_mode gauge -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="www-web-0",access_mode="ReadWriteOnce"} 1 -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="myclaim",access_mode="ReadWriteOnce"} 1 -# HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. -# TYPE kube_persistentvolumeclaim_status_condition gauge -# HELP kube_persistentvolumeclaim_created Unix creation timestamp -# TYPE kube_persistentvolumeclaim_created gauge -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="www-web-0"} 1.673969356e+09 -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="myclaim"} 1.673969355e+09 -# HELP kube_persistentvolume_claim_ref Information about the Persistent Volume Claim Reference. -# TYPE kube_persistentvolume_claim_ref gauge -# HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolume_annotations gauge -kube_persistentvolume_annotations{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolume_labels gauge -kube_persistentvolume_labels{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_status_phase The phase indicates if a volume is available, bound to a claim, or released by a claim. -# TYPE kube_persistentvolume_status_phase gauge -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Pending"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Available"} 1 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Bound"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Released"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Failed"} 0 -# HELP kube_persistentvolume_info Information about persistentvolume. -# TYPE kube_persistentvolume_info gauge -kube_persistentvolume_info{persistentvolume="pv0003",storageclass="slow",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="172.17.0.2",nfs_path="/tmp",csi_driver="",csi_volume_handle=""} 1 -# HELP kube_persistentvolume_capacity_bytes Persistentvolume capacity in bytes. -# TYPE kube_persistentvolume_capacity_bytes gauge -kube_persistentvolume_capacity_bytes{persistentvolume="pv0003"} 5.36870912e+09 -# HELP kube_persistentvolume_created Unix creation timestamp -# TYPE kube_persistentvolume_created gauge -kube_persistentvolume_created{persistentvolume="pv0003"} 1.673969355e+09 -# HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_annotations gauge -# HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_labels gauge -# HELP kube_poddisruptionbudget_created Unix creation timestamp -# TYPE kube_poddisruptionbudget_created gauge -# HELP kube_poddisruptionbudget_status_current_healthy Current number of healthy pods -# TYPE kube_poddisruptionbudget_status_current_healthy gauge -# HELP kube_poddisruptionbudget_status_desired_healthy Minimum desired number of healthy pods -# TYPE kube_poddisruptionbudget_status_desired_healthy gauge -# HELP kube_poddisruptionbudget_status_pod_disruptions_allowed Number of pod disruptions that are currently allowed -# TYPE kube_poddisruptionbudget_status_pod_disruptions_allowed gauge -# HELP kube_poddisruptionbudget_status_expected_pods Total number of pods counted by this disruption budget -# TYPE kube_poddisruptionbudget_status_expected_pods gauge -# HELP kube_poddisruptionbudget_status_observed_generation Most recent generation observed when updating this PDB status -# TYPE kube_poddisruptionbudget_status_observed_generation gauge -# HELP kube_pod_completion_time Completion time in unix timestamp for a pod. -# TYPE kube_pod_completion_time gauge -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_completion_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969408e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1.67396982e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -# HELP kube_pod_container_info Information about a container in a pod. -# TYPE kube_pod_container_info gauge -kube_pod_container_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",image_spec="docker.elastic.co/beats/metricbeat:8.6.0",image="docker.elastic.co/beats/metricbeat:8.6.0",image_id="docker.elastic.co/beats/metricbeat@sha256:6a327e350e01dfd01d576717f038767ed03fbd513b10033a6f65835668aa82fb",container_id="containerd://94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8"} 1 -kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image_id="sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6",container_id="containerd://003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.25.3",image="registry.k8s.io/kube-scheduler:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78d",container_id="containerd://f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2"} 1 -kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.4-0",image="registry.k8s.io/etcd:3.5.4-0",image_id="sha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66",container_id="containerd://e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.25.3",image="registry.k8s.io/kube-controller-manager:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4",container_id="containerd://548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.25.3",image="registry.k8s.io/kube-proxy:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950",container_id="containerd://9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05"} 1 -kube_pod_container_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",image_spec="perl:5.34.0",image="docker.io/library/perl:5.34.0",image_id="docker.io/library/perl@sha256:2584f46a92d1042b25320131219e5832c5b3e75086dfaaff33e4fda7a9f47d99",container_id="containerd://b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics",image_spec="k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0",image="k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0",image_id="k8s.gcr.io/kube-state-metrics/kube-state-metrics@sha256:09a36e2be1dbda6009641235d90be8627c9616d42a0b887b770fc92c1753b74a",container_id="containerd://4c58768671aab3b73013a030c4125c8f9d39d51772a3c75df19c84bc055094ed"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.25.3",image="registry.k8s.io/kube-apiserver:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4a",container_id="containerd://01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8"} 1 -kube_pod_container_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20221004-44d545d1",image="docker.io/kindest/kindnetd:v20221004-44d545d1",image_id="sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f",container_id="containerd://db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://3ba2b0ddb34668d521831c06e4c0553e3f93458738356e97647837a13eda1063"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6"} 1 -# HELP kube_pod_container_resource_limits The number of requested limit resource by a container. -# TYPE kube_pod_container_resource_limits gauge -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 -# HELP kube_pod_container_resource_requests The number of requested request resource by a container. -# TYPE kube_pod_container_resource_requests gauge -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 -# HELP kube_pod_container_state_started Start time in unix timestamp for a pod container. -# TYPE kube_pod_container_state_started gauge -kube_pod_container_state_started{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1.673879578e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 1.67396982e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1.673879554e+09 -kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 1.67396994e+09 -kube_pod_container_state_started{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1.673879609e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1.673879556e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1.673879577e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 1.67396988e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 1.673969924e+09 -kube_pod_container_state_started{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1.673969403e+09 -# HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. -# TYPE kube_pod_container_status_last_terminated_reason gauge -# HELP kube_pod_container_status_ready Describes whether the containers readiness check succeeded. -# TYPE kube_pod_container_status_ready gauge -kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 1 -# HELP kube_pod_container_status_restarts_total The number of container restarts per container. -# TYPE kube_pod_container_status_restarts_total counter -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -# HELP kube_pod_container_status_running Describes whether the container is currently in running state. -# TYPE kube_pod_container_status_running gauge -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -# HELP kube_pod_container_status_terminated Describes whether the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated gauge -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 0 -# HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated_reason gauge -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob",reason="Completed"} 1 -# HELP kube_pod_container_status_waiting Describes whether the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting gauge -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",container="kube-state-metrics"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -# HELP kube_pod_container_status_waiting_reason Describes the reason the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting_reason gauge -# HELP kube_pod_created Unix creation timestamp -# TYPE kube_pod_created gauge -kube_pod_created{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3"} 1.673969921e+09 -kube_pod_created{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_created{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1.67396982e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879562e+09 -kube_pod_created{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1.673969356e+09 -kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_created{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -# HELP kube_pod_deletion_timestamp Unix deletion timestamp -# TYPE kube_pod_deletion_timestamp gauge -# HELP kube_pod_info Information about pod. -# TYPE kube_pod_info gauge -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",host_ip="172.18.0.2",pod_ip="10.244.0.67",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899497",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",host_ip="172.18.0.2",pod_ip="10.244.0.70",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899499",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="metricbeat",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",host_ip="",pod_ip="",node="",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-684f458cdd",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",host_ip="172.18.0.2",pod_ip="10.244.0.68",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899498",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",host_ip="172.18.0.2",pod_ip="10.244.0.59",node="kind-control-plane",created_by_kind="Job",created_by_name="pi",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",host_ip="172.18.0.2",pod_ip="10.244.0.69",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-8595684f78",priority_class="",host_network="false"} 1 -# HELP kube_pod_ips Pod IP addresses -# TYPE kube_pod_ips gauge -kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",ip="10.244.0.67",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",ip="10.244.0.4",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",ip="10.244.0.70",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",ip="10.244.0.3",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",ip="10.244.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",ip="10.244.0.68",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",ip="10.244.0.59",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",ip="10.244.0.69",ip_family="4"} 1 -# HELP kube_pod_init_container_info Information about an init container in a pod. -# TYPE kube_pod_init_container_info gauge -# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. -# TYPE kube_pod_init_container_resource_limits gauge -# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container. -# TYPE kube_pod_init_container_resource_requests gauge -# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state. -# TYPE kube_pod_init_container_status_last_terminated_reason gauge -# HELP kube_pod_init_container_status_ready Describes whether the init containers readiness check succeeded. -# TYPE kube_pod_init_container_status_ready gauge -# HELP kube_pod_init_container_status_restarts_total The number of restarts for the init container. -# TYPE kube_pod_init_container_status_restarts_total counter -# HELP kube_pod_init_container_status_running Describes whether the init container is currently in running state. -# TYPE kube_pod_init_container_status_running gauge -# HELP kube_pod_init_container_status_terminated Describes whether the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated gauge -# HELP kube_pod_init_container_status_terminated_reason Describes the reason the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated_reason gauge -# HELP kube_pod_init_container_status_waiting Describes whether the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting gauge -# HELP kube_pod_init_container_status_waiting_reason Describes the reason the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting_reason gauge -# HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_pod_annotations gauge -kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_annotations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_annotations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1 -kube_pod_annotations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_annotations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -# HELP kube_pod_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_pod_labels gauge -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_labels{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_labels{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1 -kube_pod_labels{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_labels{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -# HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. -# TYPE kube_pod_overhead_cpu_cores gauge -# HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. -# TYPE kube_pod_overhead_memory_bytes gauge -# HELP kube_pod_owner Information about the Pod's owner. -# TYPE kube_pod_owner gauge -kube_pod_owner{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",owner_kind="Job",owner_name="pi",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",owner_kind="ReplicaSet",owner_name="kube-state-metrics-8595684f78",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",owner_kind="Job",owner_name="hello-cronjob-27899497",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",owner_kind="DaemonSet",owner_name="metricbeat",owner_is_controller="true"} 1 -kube_pod_owner{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 -kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",owner_kind="ReplicaSet",owner_name="local-path-provisioner-684f458cdd",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",owner_kind="Job",owner_name="hello-cronjob-27899499",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",owner_kind="Job",owner_name="hello-cronjob-27899498",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 -# HELP kube_pod_restart_policy Describes the restart policy in use by this pod. -# TYPE kube_pod_restart_policy gauge -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",type="Never"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",type="Always"} 1 -kube_pod_restart_policy{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",type="Always"} 1 -kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",type="OnFailure"} 1 -# HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. -# TYPE kube_pod_runtimeclass_name_info gauge -# HELP kube_pod_spec_volumes_persistentvolumeclaims_info Information about persistentvolumeclaim volumes in a pod. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge -kube_pod_spec_volumes_persistentvolumeclaims_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly Describes whether a persistentvolumeclaim is mounted read only. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge -kube_pod_spec_volumes_persistentvolumeclaims_readonly{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 0 -# HELP kube_pod_start_time Start time in unix timestamp for a pod. -# TYPE kube_pod_start_time gauge -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3"} 1.673969921e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1.67396982e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -# HELP kube_pod_status_phase The pods current phase. -# TYPE kube_pod_status_phase gauge -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Running"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Pending"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Failed"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Unknown"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Running"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Pending"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Failed"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Unknown"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Running"} 1 -# HELP kube_pod_status_ready Describes whether the pod is ready to serve requests. -# TYPE kube_pod_status_ready gauge -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="unknown"} 0 -# HELP kube_pod_status_reason The pod status reasons -# TYPE kube_pod_status_reason gauge -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Evicted"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Evicted"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",reason="UnexpectedAdmissionError"} 0 -# HELP kube_pod_status_scheduled Describes the status of the scheduling process for the pod. -# TYPE kube_pod_status_scheduled gauge -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="true"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="false"} 1 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -# HELP kube_pod_status_scheduled_time Unix timestamp when pod moved into scheduled status -# TYPE kube_pod_status_scheduled_time gauge -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899497-ffm4g",uid="ef14331c-a104-496a-9031-66130c4c9bdb"} 1.67396982e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-8595684f78-ppcnj",uid="e8185649-8c7e-49e1-9f28-e7c2a7ea6ae3"} 1.673969921e+09 -# HELP kube_pod_status_unschedulable Describes the unschedulable status for the pod. -# TYPE kube_pod_status_unschedulable gauge -kube_pod_status_unschedulable{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -# HELP kube_replicaset_created Unix creation timestamp -# TYPE kube_replicaset_created gauge -kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="coredns-565d847f94"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1.673969921e+09 -# HELP kube_replicaset_status_replicas The number of replicas per ReplicaSet. -# TYPE kube_replicaset_status_replicas gauge -kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_status_fully_labeled_replicas The number of fully labeled replicas per ReplicaSet. -# TYPE kube_replicaset_status_fully_labeled_replicas gauge -kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -# HELP kube_replicaset_status_ready_replicas The number of ready replicas per ReplicaSet. -# TYPE kube_replicaset_status_ready_replicas gauge -kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -# HELP kube_replicaset_status_observed_generation The generation observed by the ReplicaSet controller. -# TYPE kube_replicaset_status_observed_generation gauge -kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -# HELP kube_replicaset_spec_replicas Number of desired pods for a ReplicaSet. -# TYPE kube_replicaset_spec_replicas gauge -kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -# HELP kube_replicaset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicaset_metadata_generation gauge -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -# HELP kube_replicaset_owner Information about the ReplicaSet's owner. -# TYPE kube_replicaset_owner gauge -kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-8595684f78",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="coredns-565d847f94",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 -# HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_replicaset_annotations gauge -kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -# HELP kube_replicaset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_replicaset_labels gauge -kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-8595684f78"} 1 -# HELP kube_replicationcontroller_created Unix creation timestamp -# TYPE kube_replicationcontroller_created gauge -# HELP kube_replicationcontroller_status_replicas The number of replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_replicas gauge -# HELP kube_replicationcontroller_status_fully_labeled_replicas The number of fully labeled replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_fully_labeled_replicas gauge -# HELP kube_replicationcontroller_status_ready_replicas The number of ready replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_ready_replicas gauge -# HELP kube_replicationcontroller_status_available_replicas The number of available replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_available_replicas gauge -# HELP kube_replicationcontroller_status_observed_generation The generation observed by the ReplicationController controller. -# TYPE kube_replicationcontroller_status_observed_generation gauge -# HELP kube_replicationcontroller_spec_replicas Number of desired pods for a ReplicationController. -# TYPE kube_replicationcontroller_spec_replicas gauge -# HELP kube_replicationcontroller_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicationcontroller_metadata_generation gauge -# HELP kube_replicationcontroller_owner Information about the ReplicationController's owner. -# TYPE kube_replicationcontroller_owner gauge -# HELP kube_resourcequota_created Unix creation timestamp -# TYPE kube_resourcequota_created gauge -kube_resourcequota_created{namespace="default",resourcequota="pods-low"} 1.673969356e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-medium"} 1.673969355e+09 -# HELP kube_resourcequota Information about resource quota. -# TYPE kube_resourcequota gauge -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="hard"} 5 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="hard"} 1.073741824e+10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 2.147483648e+11 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="hard"} 2.147483648e+10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="used"} 0 -# HELP kube_secret_info Information about secret. -# TYPE kube_secret_info gauge -# HELP kube_secret_type Type about secret. -# TYPE kube_secret_type gauge -# HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_secret_annotations gauge -# HELP kube_secret_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_secret_labels gauge -# HELP kube_secret_created Unix creation timestamp -# TYPE kube_secret_created gauge -# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. -# TYPE kube_secret_metadata_resource_version gauge -# HELP kube_service_info Information about service. -# TYPE kube_service_info gauge -kube_service_info{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="dab0635c-ed37-441e-bb0c-57f0c6f6c939",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -# HELP kube_service_created Unix creation timestamp -# TYPE kube_service_created gauge -kube_service_created{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1.673879561e+09 -kube_service_created{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1.673879562e+09 -kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="dab0635c-ed37-441e-bb0c-57f0c6f6c939"} 1.673969921e+09 -kube_service_created{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1.673969356e+09 -# HELP kube_service_spec_type Type about service. -# TYPE kube_service_spec_type gauge -kube_service_spec_type{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="dab0635c-ed37-441e-bb0c-57f0c6f6c939",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",type="ClusterIP"} 1 -# HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_service_annotations gauge -kube_service_annotations{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_annotations{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="dab0635c-ed37-441e-bb0c-57f0c6f6c939"} 1 -kube_service_annotations{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -# HELP kube_service_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_service_labels gauge -kube_service_labels{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="dab0635c-ed37-441e-bb0c-57f0c6f6c939"} 1 -kube_service_labels{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -kube_service_labels{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -# HELP kube_service_spec_external_ip Service external ips. One series for each ip -# TYPE kube_service_spec_external_ip gauge -# HELP kube_service_status_load_balancer_ingress Service load balancer ingress status -# TYPE kube_service_status_load_balancer_ingress gauge -# HELP kube_statefulset_created Unix creation timestamp -# TYPE kube_statefulset_created gauge -kube_statefulset_created{namespace="default",statefulset="web"} 1.673969356e+09 -# HELP kube_statefulset_status_replicas The number of replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas gauge -kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_available gauge -kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_current The number of current replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_current gauge -kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_ready The number of ready replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_ready gauge -kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_updated The number of updated replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_updated gauge -kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_observed_generation The generation observed by the StatefulSet controller. -# TYPE kube_statefulset_status_observed_generation gauge -kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_replicas Number of desired pods for a StatefulSet. -# TYPE kube_statefulset_replicas gauge -kube_statefulset_replicas{namespace="default",statefulset="web"} 3 -# HELP kube_statefulset_metadata_generation Sequence number representing a specific generation of the desired state for the StatefulSet. -# TYPE kube_statefulset_metadata_generation gauge -kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_statefulset_annotations gauge -kube_statefulset_annotations{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_statefulset_labels gauge -kube_statefulset_labels{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_current_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). -# TYPE kube_statefulset_status_current_revision gauge -kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_statefulset_status_update_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) -# TYPE kube_statefulset_status_update_revision gauge -kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_storageclass_info Information about storageclass. -# TYPE kube_storageclass_info gauge -kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 -# HELP kube_storageclass_created Unix creation timestamp -# TYPE kube_storageclass_created gauge -kube_storageclass_created{storageclass="standard"} 1.673879567e+09 -# HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_storageclass_annotations gauge -kube_storageclass_annotations{storageclass="standard"} 1 -# HELP kube_storageclass_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_storageclass_labels gauge -kube_storageclass_labels{storageclass="standard"} 1 -# HELP kube_validatingwebhookconfiguration_info Information about the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_info gauge -# HELP kube_validatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_validatingwebhookconfiguration_created gauge -# HELP kube_validatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_volumeattachment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_volumeattachment_labels gauge -# HELP kube_volumeattachment_info Information about volumeattachment. -# TYPE kube_volumeattachment_info gauge -# HELP kube_volumeattachment_created Unix creation timestamp -# TYPE kube_volumeattachment_created gauge -# HELP kube_volumeattachment_spec_source_persistentvolume PersistentVolume source reference. -# TYPE kube_volumeattachment_spec_source_persistentvolume gauge -# HELP kube_volumeattachment_status_attached Information about volumeattachment. -# TYPE kube_volumeattachment_status_attached gauge -# HELP kube_volumeattachment_status_attachment_metadata volumeattachment metadata. -# TYPE kube_volumeattachment_status_attachment_metadata gauge diff --git a/metricbeat/module/kubernetes/_meta/test/ksm.v2.6.0.plain b/metricbeat/module/kubernetes/_meta/test/ksm.v2.6.0.plain deleted file mode 100644 index 6b28b858488..00000000000 --- a/metricbeat/module/kubernetes/_meta/test/ksm.v2.6.0.plain +++ /dev/null @@ -1,1563 +0,0 @@ -# HELP kube_certificatesigningrequest_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_annotations gauge -# HELP kube_certificatesigningrequest_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_certificatesigningrequest_labels gauge -# HELP kube_certificatesigningrequest_created Unix creation timestamp -# TYPE kube_certificatesigningrequest_created gauge -# HELP kube_certificatesigningrequest_condition The number of each certificatesigningrequest condition -# TYPE kube_certificatesigningrequest_condition gauge -# HELP kube_certificatesigningrequest_cert_length Length of the issued cert -# TYPE kube_certificatesigningrequest_cert_length gauge -# HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_configmap_annotations gauge -kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_annotations{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -# HELP kube_configmap_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_configmap_labels gauge -kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_labels{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -# HELP kube_configmap_info Information about configmap. -# TYPE kube_configmap_info gauge -kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 -kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 -kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 -kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 -kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 -kube_configmap_info{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1 -kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 -# HELP kube_configmap_created Unix creation timestamp -# TYPE kube_configmap_created gauge -kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.673879562e+09 -kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.673879562e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-config"} 1.673879587e+09 -kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.673879559e+09 -kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.673879575e+09 -kube_configmap_created{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 1.673879587e+09 -kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.673879567e+09 -kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.673879561e+09 -kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.673879575e+09 -# HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. -# TYPE kube_configmap_metadata_resource_version gauge -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 322 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 27 -kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 321 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 62236 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-config"} 452 -kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 324 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="metricbeat-daemonset-modules"} 453 -kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 272 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 197 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 323 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 200 -kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 325 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 225 -kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 232 -# HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_cronjob_annotations gauge -kube_cronjob_annotations{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_cronjob_labels gauge -kube_cronjob_labels{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_info Info about cronjob. -# TYPE kube_cronjob_info gauge -kube_cronjob_info{namespace="kube-system",cronjob="hello-cronjob",schedule="* * * * *",concurrency_policy="Allow"} 1 -# HELP kube_cronjob_created Unix creation timestamp -# TYPE kube_cronjob_created gauge -kube_cronjob_created{namespace="kube-system",cronjob="hello-cronjob"} 1.673949613e+09 -# HELP kube_cronjob_status_active Active holds pointers to currently running jobs. -# TYPE kube_cronjob_status_active gauge -kube_cronjob_status_active{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_cronjob_status_last_schedule_time LastScheduleTime keeps information of when was the last time the job was successfully scheduled. -# TYPE kube_cronjob_status_last_schedule_time gauge -kube_cronjob_status_last_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67397006e+09 -# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully. -# TYPE kube_cronjob_status_last_successful_time gauge -kube_cronjob_status_last_successful_time{namespace="kube-system",cronjob="hello-cronjob"} 1.673970004e+09 -# HELP kube_cronjob_spec_suspend Suspend flag tells the controller to suspend subsequent executions. -# TYPE kube_cronjob_spec_suspend gauge -kube_cronjob_spec_suspend{namespace="kube-system",cronjob="hello-cronjob"} 0 -# HELP kube_cronjob_spec_starting_deadline_seconds Deadline in seconds for starting the job if it misses scheduled time for any reason. -# TYPE kube_cronjob_spec_starting_deadline_seconds gauge -# HELP kube_cronjob_next_schedule_time Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. -# TYPE kube_cronjob_next_schedule_time gauge -kube_cronjob_next_schedule_time{namespace="kube-system",cronjob="hello-cronjob"} 1.67397012e+09 -# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob. -# TYPE kube_cronjob_metadata_resource_version gauge -kube_cronjob_metadata_resource_version{namespace="kube-system",cronjob="hello-cronjob"} 71011 -# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. -# TYPE kube_cronjob_spec_successful_job_history_limit gauge -kube_cronjob_spec_successful_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 3 -# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. -# TYPE kube_cronjob_spec_failed_job_history_limit gauge -kube_cronjob_spec_failed_job_history_limit{namespace="kube-system",cronjob="hello-cronjob"} 1 -# HELP kube_daemonset_created Unix creation timestamp -# TYPE kube_daemonset_created gauge -kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.673879562e+09 -kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.673879566e+09 -kube_daemonset_created{namespace="kube-system",daemonset="metricbeat"} 1.673879587e+09 -# HELP kube_daemonset_status_current_number_scheduled The number of nodes running at least one daemon pod and are supposed to. -# TYPE kube_daemonset_status_current_number_scheduled gauge -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_desired_number_scheduled The number of nodes that should be running the daemon pod. -# TYPE kube_daemonset_status_desired_number_scheduled gauge -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_available The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available -# TYPE kube_daemonset_status_number_available gauge -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_available{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_number_misscheduled The number of nodes running a daemon pod but are not supposed to. -# TYPE kube_daemonset_status_number_misscheduled gauge -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="metricbeat"} 0 -kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 -# HELP kube_daemonset_status_number_ready The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. -# TYPE kube_daemonset_status_number_ready gauge -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 -# HELP kube_daemonset_status_number_unavailable The number of nodes that should be running the daemon pod and have none of the daemon pod running and available -# TYPE kube_daemonset_status_number_unavailable gauge -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 -kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="metricbeat"} 0 -# HELP kube_daemonset_status_observed_generation The most recent generation observed by the daemon set controller. -# TYPE kube_daemonset_status_observed_generation gauge -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_status_updated_number_scheduled The total number of nodes that are running updated daemon pod -# TYPE kube_daemonset_status_updated_number_scheduled gauge -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 -# HELP kube_daemonset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_daemonset_metadata_generation gauge -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_metadata_generation{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_daemonset_annotations gauge -kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 -kube_daemonset_annotations{namespace="kube-system",daemonset="metricbeat"} 1 -# HELP kube_daemonset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_daemonset_labels gauge -kube_daemonset_labels{namespace="kube-system",daemonset="metricbeat"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 -kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 -# HELP kube_deployment_created Unix creation timestamp -# TYPE kube_deployment_created gauge -kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.673879562e+09 -kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.673879567e+09 -kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.67397003e+09 -# HELP kube_deployment_status_replicas The number of replicas per deployment. -# TYPE kube_deployment_status_replicas gauge -kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 -# HELP kube_deployment_status_replicas_ready The number of ready replicas per deployment. -# TYPE kube_deployment_status_replicas_ready gauge -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_available The number of available replicas per deployment. -# TYPE kube_deployment_status_replicas_available gauge -kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_replicas_unavailable The number of unavailable replicas per deployment. -# TYPE kube_deployment_status_replicas_unavailable gauge -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_status_replicas_updated The number of updated replicas per deployment. -# TYPE kube_deployment_status_replicas_updated gauge -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_observed_generation The generation observed by the deployment controller. -# TYPE kube_deployment_status_observed_generation gauge -kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_status_condition The current status conditions of a deployment. -# TYPE kube_deployment_status_condition gauge -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="unknown"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 -kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 -# HELP kube_deployment_spec_replicas Number of desired pods for a deployment. -# TYPE kube_deployment_spec_replicas gauge -kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 -kube_deployment_spec_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_spec_paused Whether the deployment is paused and will not be processed by the deployment controller. -# TYPE kube_deployment_spec_paused gauge -kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 -kube_deployment_spec_paused{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable Maximum number of unavailable replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 -kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 -# HELP kube_deployment_spec_strategy_rollingupdate_max_surge Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. -# TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_deployment_metadata_generation gauge -kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_deployment_annotations gauge -kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_deployment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_deployment_labels gauge -kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 -kube_deployment_labels{namespace="local-path-storage",deployment="local-path-provisioner"} 1 -kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} 1 -# HELP kube_endpoint_info Information about endpoint. -# TYPE kube_endpoint_info gauge -kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_info{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_created Unix creation timestamp -# TYPE kube_endpoint_created gauge -kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.673970029e+09 -kube_endpoint_created{namespace="default",endpoint="nginx"} 1.673969356e+09 -kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.673879561e+09 -kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.673879576e+09 -# HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_endpoint_annotations gauge -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_annotations{namespace="default",endpoint="nginx"} 1 -kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 -# HELP kube_endpoint_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_endpoint_labels gauge -kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 -kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 -kube_endpoint_labels{namespace="default",endpoint="nginx"} 1 -# HELP kube_endpoint_address_available (Deprecated since v2.6.0) Number of addresses available in endpoint. -# TYPE kube_endpoint_address_available gauge -kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 -kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 -kube_endpoint_address_available{namespace="default",endpoint="nginx"} 0 -# HELP kube_endpoint_address_not_ready (Deprecated since v2.6.0) Number of addresses not ready in endpoint -# TYPE kube_endpoint_address_not_ready gauge -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 -kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="nginx"} 0 -kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 -# HELP kube_endpoint_address Information about Endpoint available and non available addresses. -# TYPE kube_endpoint_address gauge -kube_endpoint_address{namespace="default",endpoint="kubernetes",ip="172.18.0.2",ready="true"} 1 -kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.2",ready="true"} 1 -kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.4",ready="true"} 1 -kube_endpoint_address{namespace="kube-system",endpoint="kube-state-metrics",ip="10.244.0.72",ready="true"} 1 -# HELP kube_endpoint_ports Information about the Endpoint ports. -# TYPE kube_endpoint_ports gauge -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 -kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 -kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 -# HELP kube_horizontalpodautoscaler_info Information about this autoscaler. -# TYPE kube_horizontalpodautoscaler_info gauge -# HELP kube_horizontalpodautoscaler_metadata_generation The generation observed by the HorizontalPodAutoscaler controller. -# TYPE kube_horizontalpodautoscaler_metadata_generation gauge -# HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. -# TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. -# TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge -# HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. -# TYPE kube_horizontalpodautoscaler_spec_target_metric gauge -# HELP kube_horizontalpodautoscaler_status_target_metric The current metric status used by this autoscaler when calculating the desired replica count. -# TYPE kube_horizontalpodautoscaler_status_target_metric gauge -# HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_current_replicas gauge -# HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge -# HELP kube_horizontalpodautoscaler_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_annotations gauge -# HELP kube_horizontalpodautoscaler_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_horizontalpodautoscaler_labels gauge -# HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. -# TYPE kube_horizontalpodautoscaler_status_condition gauge -# HELP kube_ingress_info Information about ingress. -# TYPE kube_ingress_info gauge -# HELP kube_ingress_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_ingress_annotations gauge -# HELP kube_ingress_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_ingress_labels gauge -# HELP kube_ingress_created Unix creation timestamp -# TYPE kube_ingress_created gauge -# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress. -# TYPE kube_ingress_metadata_resource_version gauge -# HELP kube_ingress_path Ingress host, paths and backend service information. -# TYPE kube_ingress_path gauge -# HELP kube_ingress_tls Ingress TLS host and secret information. -# TYPE kube_ingress_tls gauge -# HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_job_annotations gauge -kube_job_annotations{namespace="kube-system",job_name="pi"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_annotations{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -# HELP kube_job_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_job_labels gauge -kube_job_labels{namespace="kube-system",job_name="pi"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_labels{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -# HELP kube_job_info Information about job. -# TYPE kube_job_info gauge -kube_job_info{namespace="kube-system",job_name="pi"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_info{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -# HELP kube_job_created Unix creation timestamp -# TYPE kube_job_created gauge -kube_job_created{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.67396994e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899500"} 1.67397e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.67396988e+09 -kube_job_created{namespace="kube-system",job_name="hello-cronjob-27899501"} 1.67397006e+09 -# HELP kube_job_spec_parallelism The maximum desired number of pods the job should run at any given time. -# TYPE kube_job_spec_parallelism gauge -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -kube_job_spec_parallelism{namespace="kube-system",job_name="pi"} 1 -# HELP kube_job_spec_completions The desired number of successfully finished pods the job should be run with. -# TYPE kube_job_spec_completions gauge -kube_job_spec_completions{namespace="kube-system",job_name="pi"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -kube_job_spec_completions{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -# HELP kube_job_spec_active_deadline_seconds The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. -# TYPE kube_job_spec_active_deadline_seconds gauge -# HELP kube_job_status_succeeded The number of pods which reached Phase Succeeded. -# TYPE kube_job_status_succeeded gauge -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899501"} 0 -kube_job_status_succeeded{namespace="kube-system",job_name="pi"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899499"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899500"} 1 -kube_job_status_succeeded{namespace="kube-system",job_name="hello-cronjob-27899498"} 1 -# HELP kube_job_status_failed The number of pods which reached Phase Failed and the reason for failure. -# TYPE kube_job_status_failed gauge -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899498"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899501"} 0 -kube_job_status_failed{namespace="kube-system",job_name="pi"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899499"} 0 -kube_job_status_failed{namespace="kube-system",job_name="hello-cronjob-27899500"} 0 -# HELP kube_job_status_active The number of actively running pods. -# TYPE kube_job_status_active gauge -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899498"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899501"} 1 -kube_job_status_active{namespace="kube-system",job_name="pi"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899499"} 0 -kube_job_status_active{namespace="kube-system",job_name="hello-cronjob-27899500"} 0 -# HELP kube_job_complete The job has completed its execution. -# TYPE kube_job_complete gauge -kube_job_complete{namespace="kube-system",job_name="pi",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="pi",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="pi",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899499",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899500",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899500",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899500",condition="unknown"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="true"} 1 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="false"} 0 -kube_job_complete{namespace="kube-system",job_name="hello-cronjob-27899498",condition="unknown"} 0 -# HELP kube_job_failed The job has failed its execution. -# TYPE kube_job_failed gauge -# HELP kube_job_status_start_time StartTime represents time when the job was acknowledged by the Job Manager. -# TYPE kube_job_status_start_time gauge -kube_job_status_start_time{namespace="kube-system",job_name="pi"} 1.673969355e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.67396994e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899500"} 1.67397e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.67396988e+09 -kube_job_status_start_time{namespace="kube-system",job_name="hello-cronjob-27899501"} 1.67397006e+09 -# HELP kube_job_status_completion_time CompletionTime represents time when the job was completed. -# TYPE kube_job_status_completion_time gauge -kube_job_status_completion_time{namespace="kube-system",job_name="pi"} 1.673969411e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899499"} 1.673969944e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899500"} 1.673970004e+09 -kube_job_status_completion_time{namespace="kube-system",job_name="hello-cronjob-27899498"} 1.673969884e+09 -# HELP kube_job_owner Information about the Job's owner. -# TYPE kube_job_owner gauge -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899501",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="pi",owner_kind="",owner_name="",owner_is_controller=""} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899499",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899500",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -kube_job_owner{namespace="kube-system",job_name="hello-cronjob-27899498",owner_kind="CronJob",owner_name="hello-cronjob",owner_is_controller="true"} 1 -# HELP kube_lease_owner Information about the Lease's owner. -# TYPE kube_lease_owner gauge -kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane"} 1 -# HELP kube_lease_renew_time Kube lease renew time. -# TYPE kube_lease_renew_time gauge -kube_lease_renew_time{lease="kind-control-plane"} 1.673970056e+09 -# HELP kube_limitrange Information about limit range. -# TYPE kube_limitrange gauge -# HELP kube_limitrange_created Unix creation timestamp -# TYPE kube_limitrange_created gauge -# HELP kube_mutatingwebhookconfiguration_info Information about the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_info gauge -# HELP kube_mutatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_mutatingwebhookconfiguration_created gauge -# HELP kube_mutatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the MutatingWebhookConfiguration. -# TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_namespace_created Unix creation timestamp -# TYPE kube_namespace_created gauge -kube_namespace_created{namespace="kube-system"} 1.673879559e+09 -kube_namespace_created{namespace="kube-public"} 1.673879559e+09 -kube_namespace_created{namespace="kube-node-lease"} 1.673879559e+09 -kube_namespace_created{namespace="default"} 1.673879561e+09 -kube_namespace_created{namespace="local-path-storage"} 1.673879567e+09 -# HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_namespace_annotations gauge -kube_namespace_annotations{namespace="local-path-storage"} 1 -kube_namespace_annotations{namespace="kube-system"} 1 -kube_namespace_annotations{namespace="kube-public"} 1 -kube_namespace_annotations{namespace="kube-node-lease"} 1 -kube_namespace_annotations{namespace="default"} 1 -# HELP kube_namespace_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_namespace_labels gauge -kube_namespace_labels{namespace="kube-system"} 1 -kube_namespace_labels{namespace="kube-public"} 1 -kube_namespace_labels{namespace="kube-node-lease"} 1 -kube_namespace_labels{namespace="default"} 1 -kube_namespace_labels{namespace="local-path-storage"} 1 -# HELP kube_namespace_status_phase kubernetes namespace status phase. -# TYPE kube_namespace_status_phase gauge -kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-system",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 -kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="default",phase="Active"} 1 -kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 -kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 -kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 -# HELP kube_namespace_status_condition The condition of a namespace. -# TYPE kube_namespace_status_condition gauge -# HELP kube_networkpolicy_created Unix creation timestamp of network policy -# TYPE kube_networkpolicy_created gauge -# HELP kube_networkpolicy_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_networkpolicy_annotations gauge -# HELP kube_networkpolicy_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_networkpolicy_labels gauge -# HELP kube_networkpolicy_spec_ingress_rules Number of ingress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_ingress_rules gauge -# HELP kube_networkpolicy_spec_egress_rules Number of egress rules on the networkpolicy -# TYPE kube_networkpolicy_spec_egress_rules gauge -# HELP kube_node_created Unix creation timestamp -# TYPE kube_node_created gauge -kube_node_created{node="kind-control-plane"} 1.673879559e+09 -# HELP kube_node_info Information about a cluster node. -# TYPE kube_node_info gauge -kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit",os_image="Ubuntu 22.04.1 LTS",container_runtime_version="containerd://1.6.9",kubelet_version="v1.25.3",kubeproxy_version="v1.25.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="eee895ed1cd343d68cde3dc3f09e40e6",internal_ip="172.18.0.2"} 1 -# HELP kube_node_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_node_annotations gauge -kube_node_annotations{node="kind-control-plane"} 1 -# HELP kube_node_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_node_labels gauge -kube_node_labels{node="kind-control-plane"} 1 -# HELP kube_node_role The role of a cluster node. -# TYPE kube_node_role gauge -kube_node_role{node="kind-control-plane",role="control-plane"} 1 -# HELP kube_node_spec_taint The taint of a cluster node. -# TYPE kube_node_spec_taint gauge -# HELP kube_node_spec_unschedulable Whether a node can schedule new pods. -# TYPE kube_node_spec_unschedulable gauge -kube_node_spec_unschedulable{node="kind-control-plane"} 0 -# HELP kube_node_status_allocatable The allocatable for different resources of a node that are available for scheduling. -# TYPE kube_node_status_allocatable gauge -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 -kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -# HELP kube_node_status_capacity The capacity for different resources of a node. -# TYPE kube_node_status_capacity gauge -kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 -kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 -kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 -kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 -kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 -# HELP kube_node_status_condition The condition of a cluster node. -# TYPE kube_node_status_condition gauge -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="true"} 0 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="false"} 1 -kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="unknown"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="true"} 1 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="false"} 0 -kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 -# HELP kube_persistentvolumeclaim_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_labels gauge -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolumeclaim_annotations gauge -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="myclaim"} 1 -kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_persistentvolumeclaim_info Information about persistent volume claim. -# TYPE kube_persistentvolumeclaim_info gauge -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="myclaim",storageclass="slow",volumename=""} 1 -kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="www-web-0",storageclass="my-storage-class",volumename=""} 1 -# HELP kube_persistentvolumeclaim_status_phase The phase the persistent volume claim is currently in. -# TYPE kube_persistentvolumeclaim_status_phase gauge -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="myclaim",phase="Pending"} 1 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Lost"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Bound"} 0 -kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="www-web-0",phase="Pending"} 1 -# HELP kube_persistentvolumeclaim_resource_requests_storage_bytes The capacity of storage requested by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="www-web-0"} 1.073741824e+09 -kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="myclaim"} 8.589934592e+09 -# HELP kube_persistentvolumeclaim_access_mode The access mode(s) specified by the persistent volume claim. -# TYPE kube_persistentvolumeclaim_access_mode gauge -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="myclaim",access_mode="ReadWriteOnce"} 1 -kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="www-web-0",access_mode="ReadWriteOnce"} 1 -# HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. -# TYPE kube_persistentvolumeclaim_status_condition gauge -# HELP kube_persistentvolumeclaim_created Unix creation timestamp -# TYPE kube_persistentvolumeclaim_created gauge -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="myclaim"} 1.673969355e+09 -kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="www-web-0"} 1.673969356e+09 -# HELP kube_persistentvolume_claim_ref Information about the Persistent Volume Claim Reference. -# TYPE kube_persistentvolume_claim_ref gauge -# HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_persistentvolume_annotations gauge -kube_persistentvolume_annotations{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_persistentvolume_labels gauge -kube_persistentvolume_labels{persistentvolume="pv0003"} 1 -# HELP kube_persistentvolume_status_phase The phase indicates if a volume is available, bound to a claim, or released by a claim. -# TYPE kube_persistentvolume_status_phase gauge -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Pending"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Available"} 1 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Bound"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Released"} 0 -kube_persistentvolume_status_phase{persistentvolume="pv0003",phase="Failed"} 0 -# HELP kube_persistentvolume_info Information about persistentvolume. -# TYPE kube_persistentvolume_info gauge -kube_persistentvolume_info{persistentvolume="pv0003",storageclass="slow",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="172.17.0.2",nfs_path="/tmp",csi_driver="",csi_volume_handle="",local_path="",local_fs="",host_path="",host_path_type=""} 1 -# HELP kube_persistentvolume_capacity_bytes Persistentvolume capacity in bytes. -# TYPE kube_persistentvolume_capacity_bytes gauge -kube_persistentvolume_capacity_bytes{persistentvolume="pv0003"} 5.36870912e+09 -# HELP kube_persistentvolume_created Unix creation timestamp -# TYPE kube_persistentvolume_created gauge -kube_persistentvolume_created{persistentvolume="pv0003"} 1.673969355e+09 -# HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_annotations gauge -# HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_poddisruptionbudget_labels gauge -# HELP kube_poddisruptionbudget_created Unix creation timestamp -# TYPE kube_poddisruptionbudget_created gauge -# HELP kube_poddisruptionbudget_status_current_healthy Current number of healthy pods -# TYPE kube_poddisruptionbudget_status_current_healthy gauge -# HELP kube_poddisruptionbudget_status_desired_healthy Minimum desired number of healthy pods -# TYPE kube_poddisruptionbudget_status_desired_healthy gauge -# HELP kube_poddisruptionbudget_status_pod_disruptions_allowed Number of pod disruptions that are currently allowed -# TYPE kube_poddisruptionbudget_status_pod_disruptions_allowed gauge -# HELP kube_poddisruptionbudget_status_expected_pods Total number of pods counted by this disruption budget -# TYPE kube_poddisruptionbudget_status_expected_pods gauge -# HELP kube_poddisruptionbudget_status_observed_generation Most recent generation observed when updating this PDB status -# TYPE kube_poddisruptionbudget_status_observed_generation gauge -# HELP kube_pod_completion_time Completion time in unix timestamp for a pod. -# TYPE kube_pod_completion_time gauge -kube_pod_completion_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969408e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_completion_time{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1.67397e+09 -# HELP kube_pod_container_info Information about a container in a pod. -# TYPE kube_pod_container_info gauge -kube_pod_container_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.25.3",image="registry.k8s.io/kube-proxy:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950",container_id="containerd://9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics",image_spec="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.6.0",image="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.6.0",image_id="registry.k8s.io/kube-state-metrics/kube-state-metrics@sha256:bdab4e49d71d272cf944c8612dff5ab1250f0fafdae45c22980286ac0c016032",container_id="containerd://cfcec5447b0a83749e71ac33db2b97db3271f576281f51daf50b3cd3220353af"} 1 -kube_pod_container_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",image_spec="perl:5.34.0",image="docker.io/library/perl:5.34.0",image_id="docker.io/library/perl@sha256:2584f46a92d1042b25320131219e5832c5b3e75086dfaaff33e4fda7a9f47d99",container_id="containerd://b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://89392d8ac34feb009401e4d3b1e8f19293b952355f8c8a6b54a0e19ad74c5892"} 1 -kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.4-0",image="registry.k8s.io/etcd:3.5.4-0",image_id="sha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66",container_id="containerd://e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.25.3",image="registry.k8s.io/kube-controller-manager:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4",container_id="containerd://548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb"} 1 -kube_pod_container_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.25.3",image="registry.k8s.io/kube-scheduler:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78d",container_id="containerd://f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2"} 1 -kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.25.3",image="registry.k8s.io/kube-apiserver:v1.25.3",image_id="docker.io/library/import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4a",container_id="containerd://01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8"} 1 -kube_pod_container_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",image_spec="docker.elastic.co/beats/metricbeat:8.6.0",image="docker.elastic.co/beats/metricbeat:8.6.0",image_id="docker.elastic.co/beats/metricbeat@sha256:6a327e350e01dfd01d576717f038767ed03fbd513b10033a6f65835668aa82fb",container_id="containerd://94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8"} 1 -kube_pod_container_info{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob",image_spec="busybox:1.28",image="docker.io/library/busybox:1.28",image_id="docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",container_id="containerd://d1149ce4c5c9fed787e0858c53f2e78c6f739dd48db2845f315287efd1c7f54e"} 1 -kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image="docker.io/kindest/local-path-provisioner:v0.0.22-kind.0",image_id="sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6",container_id="containerd://003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997"} 1 -kube_pod_container_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20221004-44d545d1",image="docker.io/kindest/kindnetd:v20221004-44d545d1",image_id="sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f",container_id="containerd://db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc"} 1 -# HELP kube_pod_container_resource_limits The number of requested limit resource by a container. -# TYPE kube_pod_container_resource_limits gauge -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -# HELP kube_pod_container_resource_requests The number of requested request resource by a container. -# TYPE kube_pod_container_resource_requests gauge -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 -kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 -# HELP kube_pod_container_state_started Start time in unix timestamp for a pod container. -# TYPE kube_pod_container_state_started gauge -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 1.67396994e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1.673879577e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 1.67396988e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 1.67397003e+09 -kube_pod_container_state_started{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1.673969403e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 1.67397e+09 -kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1.673879556e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1.673879554e+09 -kube_pod_container_state_started{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1.673879609e+09 -kube_pod_container_state_started{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 1.67397006e+09 -kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1.673879584e+09 -kube_pod_container_state_started{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1.673879578e+09 -# HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. -# TYPE kube_pod_container_status_last_terminated_reason gauge -# HELP kube_pod_container_status_ready Describes whether the containers readiness check succeeded. -# TYPE kube_pod_container_status_ready gauge -kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 0 -kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -kube_pod_container_status_ready{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 1 -# HELP kube_pod_container_status_restarts_total The number of container restarts per container. -# TYPE kube_pod_container_status_restarts_total counter -kube_pod_container_status_restarts_total{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 0 -kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -# HELP kube_pod_container_status_running Describes whether the container is currently in running state. -# TYPE kube_pod_container_status_running gauge -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 1 -kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 1 -kube_pod_container_status_running{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_running{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -# HELP kube_pod_container_status_terminated Describes whether the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated gauge -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 0 -kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_terminated{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 1 -kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 0 -# HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. -# TYPE kube_pod_container_status_terminated_reason gauge -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob",reason="Completed"} 1 -kube_pod_container_status_terminated_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob",reason="Completed"} 1 -# HELP kube_pod_container_status_waiting Describes whether the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting gauge -kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",container="local-path-provisioner"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",container="kindnet-cni"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",container="kube-proxy"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",container="kube-state-metrics"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",container="pi"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",container="hello-cronjob"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",container="etcd"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",container="kube-controller-manager"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",container="coredns"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",container="kube-scheduler"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",container="kube-apiserver"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",container="metricbeat"} 0 -kube_pod_container_status_waiting{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",container="hello-cronjob"} 0 -# HELP kube_pod_container_status_waiting_reason Describes the reason the container is currently in waiting state. -# TYPE kube_pod_container_status_waiting_reason gauge -# HELP kube_pod_created Unix creation timestamp -# TYPE kube_pod_created gauge -kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_created{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b"} 1.67397003e+09 -kube_pod_created{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1.673969356e+09 -kube_pod_created{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_created{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879576e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1.67397e+09 -kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879563e+09 -kube_pod_created{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_created{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2"} 1.67397006e+09 -kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879562e+09 -# HELP kube_pod_deletion_timestamp Unix deletion timestamp -# TYPE kube_pod_deletion_timestamp gauge -# HELP kube_pod_info Information about pod. -# TYPE kube_pod_info gauge -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",host_ip="172.18.0.2",pod_ip="10.244.0.68",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899498",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",host_ip="172.18.0.2",pod_ip="10.244.0.72",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-5897f6cf77",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",host_ip="",pod_ip="",node="",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",host_ip="172.18.0.2",pod_ip="10.244.0.59",node="kind-control-plane",created_by_kind="Job",created_by_name="pi",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",host_ip="172.18.0.2",pod_ip="10.244.0.70",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899499",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-565d847f94",priority_class="system-cluster-critical",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",host_ip="172.18.0.2",pod_ip="10.244.0.71",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899500",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="metricbeat",priority_class="",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",host_ip="172.18.0.2",pod_ip="10.244.0.73",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-cronjob-27899501",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 -kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-684f458cdd",priority_class="",host_network="false"} 1 -kube_pod_info{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 -# HELP kube_pod_ips Pod IP addresses -# TYPE kube_pod_ips gauge -kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",ip="10.244.0.3",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",ip="10.244.0.59",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",ip="10.244.0.70",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",ip="10.244.0.4",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",ip="10.244.0.68",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",ip="10.244.0.72",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",ip="10.244.0.71",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",ip="10.244.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",ip="172.18.0.2",ip_family="4"} 1 -kube_pod_ips{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",ip="10.244.0.73",ip_family="4"} 1 -# HELP kube_pod_init_container_info Information about an init container in a pod. -# TYPE kube_pod_init_container_info gauge -# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. -# TYPE kube_pod_init_container_resource_limits gauge -# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container. -# TYPE kube_pod_init_container_resource_requests gauge -# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state. -# TYPE kube_pod_init_container_status_last_terminated_reason gauge -# HELP kube_pod_init_container_status_ready Describes whether the init containers readiness check succeeded. -# TYPE kube_pod_init_container_status_ready gauge -# HELP kube_pod_init_container_status_restarts_total The number of restarts for the init container. -# TYPE kube_pod_init_container_status_restarts_total counter -# HELP kube_pod_init_container_status_running Describes whether the init container is currently in running state. -# TYPE kube_pod_init_container_status_running gauge -# HELP kube_pod_init_container_status_terminated Describes whether the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated gauge -# HELP kube_pod_init_container_status_terminated_reason Describes the reason the init container is currently in terminated state. -# TYPE kube_pod_init_container_status_terminated_reason gauge -# HELP kube_pod_init_container_status_waiting Describes whether the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting gauge -# HELP kube_pod_init_container_status_waiting_reason Describes the reason the init container is currently in waiting state. -# TYPE kube_pod_init_container_status_waiting_reason gauge -# HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_pod_annotations gauge -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1 -kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_annotations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2"} 1 -kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_annotations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_annotations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1 -kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b"} 1 -kube_pod_annotations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_annotations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_annotations{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1 -# HELP kube_pod_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_pod_labels gauge -kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1 -kube_pod_labels{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2"} 1 -kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1 -kube_pod_labels{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b"} 1 -kube_pod_labels{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -kube_pod_labels{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1 -kube_pod_labels{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1 -kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1 -kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1 -kube_pod_labels{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1 -# HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. -# TYPE kube_pod_overhead_cpu_cores gauge -# HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. -# TYPE kube_pod_overhead_memory_bytes gauge -# HELP kube_pod_owner Information about the Pod's owner. -# TYPE kube_pod_owner gauge -kube_pod_owner{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 -kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",owner_kind="ReplicaSet",owner_name="local-path-provisioner-684f458cdd",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",owner_kind="Job",owner_name="hello-cronjob-27899498",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",owner_kind="ReplicaSet",owner_name="kube-state-metrics-5897f6cf77",owner_is_controller="true"} 1 -kube_pod_owner{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",owner_kind="Job",owner_name="pi",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",owner_kind="Job",owner_name="hello-cronjob-27899499",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",owner_kind="ReplicaSet",owner_name="coredns-565d847f94",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",owner_kind="Job",owner_name="hello-cronjob-27899500",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",owner_kind="DaemonSet",owner_name="metricbeat",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",owner_kind="Job",owner_name="hello-cronjob-27899501",owner_is_controller="true"} 1 -kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 -# HELP kube_pod_restart_policy Describes the restart policy in use by this pod. -# TYPE kube_pod_restart_policy gauge -kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",type="Always"} 1 -kube_pod_restart_policy{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",type="Never"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",type="OnFailure"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",type="Always"} 1 -kube_pod_restart_policy{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",type="OnFailure"} 1 -# HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. -# TYPE kube_pod_runtimeclass_name_info gauge -# HELP kube_pod_spec_volumes_persistentvolumeclaims_info Information about persistentvolumeclaim volumes in a pod. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge -kube_pod_spec_volumes_persistentvolumeclaims_info{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 1 -# HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly Describes whether a persistentvolumeclaim is mounted read only. -# TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge -kube_pod_spec_volumes_persistentvolumeclaims_readonly{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",volume="www",persistentvolumeclaim="www-web-0"} 0 -# HELP kube_pod_start_time Start time in unix timestamp for a pod. -# TYPE kube_pod_start_time gauge -kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2"} 1.67397006e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b"} 1.67397003e+09 -kube_pod_start_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_start_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_start_time{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1.67397e+09 -# HELP kube_pod_status_phase The pods current phase. -# TYPE kube_pod_status_phase gauge -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Pending"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Failed"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Unknown"} 0 -kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",phase="Running"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Pending"} 1 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Failed"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Unknown"} 0 -kube_pod_status_phase{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",phase="Succeeded"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",phase="Running"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",phase="Running"} 1 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",phase="Pending"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",phase="Succeeded"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",phase="Failed"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",phase="Unknown"} 0 -kube_pod_status_phase{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",phase="Running"} 1 -# HELP kube_pod_status_ready Describes whether the pod is ready to serve requests. -# TYPE kube_pod_status_ready gauge -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="true"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="false"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -# HELP kube_pod_status_reason The pod status reasons -# TYPE kube_pod_status_reason gauge -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Evicted"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Evicted"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",reason="UnexpectedAdmissionError"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Evicted"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeAffinity"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="NodeLost"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="Shutdown"} 0 -kube_pod_status_reason{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",reason="UnexpectedAdmissionError"} 0 -# HELP kube_pod_status_scheduled Describes the status of the scheduling process for the pod. -# TYPE kube_pod_status_scheduled gauge -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="true"} 1 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="false"} 0 -kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="true"} 0 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="false"} 1 -kube_pod_status_scheduled{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",condition="unknown"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="true"} 1 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="false"} 0 -kube_pod_status_scheduled{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",condition="unknown"} 0 -# HELP kube_pod_status_scheduled_time Unix timestamp when pod moved into scheduled status -# TYPE kube_pod_status_scheduled_time gauge -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029"} 1.673879576e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68"} 1.67396988e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b"} 1.67397003e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415"} 1.673969355e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93"} 1.67396994e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf"} 1.67397e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727"} 1.673879562e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934"} 1.673879563e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f"} 1.673879587e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2"} 1.67397006e+09 -kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5"} 1.673879583e+09 -kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697"} 1.673879576e+09 -# HELP kube_pod_status_unschedulable Describes the unschedulable status for the pod. -# TYPE kube_pod_status_unschedulable gauge -kube_pod_status_unschedulable{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809"} 1 -# HELP kube_pod_tolerations Information about the pod tolerations -# TYPE kube_pod_tolerations gauge -kube_pod_tolerations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="54b244fd-f9f6-4258-97d3-a9641f2bd727",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="5e88bff0-0d9c-40bf-a08b-92198db6e934",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="metricbeat-h24sg",uid="976f7318-110b-4e17-b2de-ceb2d995d42f",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899501-t2lnn",uid="c284f2f9-4eb3-4157-812d-f11f03ef50d2",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node-role.kubernetes.io/control-plane",operator="Equal",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node-role.kubernetes.io/master",operator="Equal",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-684f458cdd-wvdbd",uid="aabddc73-a86f-4f97-8af3-24f08d2da9c5",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kindnet-4tnzw",uid="6825015c-b38f-4280-b5b0-40859a9e0697",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-flrd6",uid="1df9a30d-26fb-468f-a461-db46d8d1d029",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="CriticalAddonsOnly",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node-role.kubernetes.io/master",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-q2mmv",uid="1a4ec304-a66c-4fbc-b155-85bb28138b54",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899498-q8cl7",uid="2c087e4c-cf42-4081-ae0c-1800654e6b68",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-5897f6cf77-jq242",uid="af090e04-884f-4e7a-869b-e05c2ee5f34b",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="default",pod="web-0",uid="6ed575bf-f5e3-4139-8419-5cf2d939d809",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="pi-m88dn",uid="4f37fbae-0316-44d0-95c5-31d49ce88415",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899499-k5d56",uid="8dda7f57-24b1-440e-a312-20c0a355dd93",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="hello-cronjob-27899500-skmng",uid="86149383-13d6-4af2-9b7b-94736ba3afbf",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="etcd-kind-control-plane",uid="383d57f4-53b6-4405-9ab5-336a511966b8",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="95f1d124-9e72-488f-bb33-cd8975ec1bfd",operator="Exists",effect="NoExecute"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="CriticalAddonsOnly",operator="Exists"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node-role.kubernetes.io/master",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -kube_pod_tolerations{namespace="kube-system",pod="coredns-565d847f94-dgwk8",uid="e80184a6-404d-484d-ace4-084b5c377bc8",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 -# HELP kube_replicaset_created Unix creation timestamp -# TYPE kube_replicaset_created gauge -kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="coredns-565d847f94"} 1.673879576e+09 -kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1.67397003e+09 -# HELP kube_replicaset_status_replicas The number of replicas per ReplicaSet. -# TYPE kube_replicaset_status_replicas gauge -kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -# HELP kube_replicaset_status_fully_labeled_replicas The number of fully labeled replicas per ReplicaSet. -# TYPE kube_replicaset_status_fully_labeled_replicas gauge -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -# HELP kube_replicaset_status_ready_replicas The number of ready replicas per ReplicaSet. -# TYPE kube_replicaset_status_ready_replicas gauge -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_status_observed_generation The generation observed by the ReplicaSet controller. -# TYPE kube_replicaset_status_observed_generation gauge -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -# HELP kube_replicaset_spec_replicas Number of desired pods for a ReplicaSet. -# TYPE kube_replicaset_spec_replicas gauge -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-565d847f94"} 2 -# HELP kube_replicaset_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicaset_metadata_generation gauge -kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -# HELP kube_replicaset_owner Information about the ReplicaSet's owner. -# TYPE kube_replicaset_owner gauge -kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="coredns-565d847f94",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 -kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 -# HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_replicaset_annotations gauge -kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -# HELP kube_replicaset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_replicaset_labels gauge -kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-684f458cdd"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="coredns-565d847f94"} 1 -kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-5897f6cf77"} 1 -# HELP kube_replicationcontroller_created Unix creation timestamp -# TYPE kube_replicationcontroller_created gauge -# HELP kube_replicationcontroller_status_replicas The number of replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_replicas gauge -# HELP kube_replicationcontroller_status_fully_labeled_replicas The number of fully labeled replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_fully_labeled_replicas gauge -# HELP kube_replicationcontroller_status_ready_replicas The number of ready replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_ready_replicas gauge -# HELP kube_replicationcontroller_status_available_replicas The number of available replicas per ReplicationController. -# TYPE kube_replicationcontroller_status_available_replicas gauge -# HELP kube_replicationcontroller_status_observed_generation The generation observed by the ReplicationController controller. -# TYPE kube_replicationcontroller_status_observed_generation gauge -# HELP kube_replicationcontroller_spec_replicas Number of desired pods for a ReplicationController. -# TYPE kube_replicationcontroller_spec_replicas gauge -# HELP kube_replicationcontroller_metadata_generation Sequence number representing a specific generation of the desired state. -# TYPE kube_replicationcontroller_metadata_generation gauge -# HELP kube_replicationcontroller_owner Information about the ReplicationController's owner. -# TYPE kube_replicationcontroller_owner gauge -# HELP kube_resourcequota_created Unix creation timestamp -# TYPE kube_resourcequota_created gauge -kube_resourcequota_created{namespace="default",resourcequota="pods-medium"} 1.673969355e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-low"} 1.673969356e+09 -kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.673969355e+09 -# HELP kube_resourcequota Information about resource quota. -# TYPE kube_resourcequota gauge -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 2.147483648e+11 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="hard"} 2.147483648e+10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-medium",resource="pods",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="hard"} 5 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="hard"} 1.073741824e+10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="hard"} 10 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="cpu",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="memory",type="used"} 0 -kube_resourcequota{namespace="default",resourcequota="pods-low",resource="pods",type="used"} 0 -# HELP kube_secret_info Information about secret. -# TYPE kube_secret_info gauge -# HELP kube_secret_type Type about secret. -# TYPE kube_secret_type gauge -# HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_secret_annotations gauge -# HELP kube_secret_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_secret_labels gauge -# HELP kube_secret_created Unix creation timestamp -# TYPE kube_secret_created gauge -# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. -# TYPE kube_secret_metadata_resource_version gauge -# HELP kube_service_info Information about service. -# TYPE kube_service_info gauge -kube_service_info{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 -kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="8a71b06b-befb-4f38-bb65-d71ec45bf6d2",cluster_ip="None",external_name="",load_balancer_ip=""} 1 -# HELP kube_service_created Unix creation timestamp -# TYPE kube_service_created gauge -kube_service_created{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1.673879561e+09 -kube_service_created{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1.673879562e+09 -kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="8a71b06b-befb-4f38-bb65-d71ec45bf6d2"} 1.673970029e+09 -kube_service_created{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1.673969356e+09 -# HELP kube_service_spec_type Type about service. -# TYPE kube_service_spec_type gauge -kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="8a71b06b-befb-4f38-bb65-d71ec45bf6d2",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4",type="ClusterIP"} 1 -kube_service_spec_type{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28",type="ClusterIP"} 1 -kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8",type="ClusterIP"} 1 -# HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_service_annotations gauge -kube_service_annotations{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_annotations{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="8a71b06b-befb-4f38-bb65-d71ec45bf6d2"} 1 -kube_service_annotations{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -# HELP kube_service_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_service_labels gauge -kube_service_labels{namespace="default",service="kubernetes",uid="907c42ab-acde-4ff5-83d5-04be77203b28"} 1 -kube_service_labels{namespace="kube-system",service="kube-dns",uid="e9b08fcb-fb13-463f-8a59-6a1236a666a8"} 1 -kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="8a71b06b-befb-4f38-bb65-d71ec45bf6d2"} 1 -kube_service_labels{namespace="default",service="nginx",uid="8380ed3c-d057-4a95-8870-2dae63be27c4"} 1 -# HELP kube_service_spec_external_ip Service external ips. One series for each ip -# TYPE kube_service_spec_external_ip gauge -# HELP kube_service_status_load_balancer_ingress Service load balancer ingress status -# TYPE kube_service_status_load_balancer_ingress gauge -# HELP kube_statefulset_created Unix creation timestamp -# TYPE kube_statefulset_created gauge -kube_statefulset_created{namespace="default",statefulset="web"} 1.673969356e+09 -# HELP kube_statefulset_status_replicas The number of replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas gauge -kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_available gauge -kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_current The number of current replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_current gauge -kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_replicas_ready The number of ready replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_ready gauge -kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 0 -# HELP kube_statefulset_status_replicas_updated The number of updated replicas per StatefulSet. -# TYPE kube_statefulset_status_replicas_updated gauge -kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_observed_generation The generation observed by the StatefulSet controller. -# TYPE kube_statefulset_status_observed_generation gauge -kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_replicas Number of desired pods for a StatefulSet. -# TYPE kube_statefulset_replicas gauge -kube_statefulset_replicas{namespace="default",statefulset="web"} 3 -# HELP kube_statefulset_metadata_generation Sequence number representing a specific generation of the desired state for the StatefulSet. -# TYPE kube_statefulset_metadata_generation gauge -kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_statefulset_annotations gauge -kube_statefulset_annotations{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_statefulset_labels gauge -kube_statefulset_labels{namespace="default",statefulset="web"} 1 -# HELP kube_statefulset_status_current_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). -# TYPE kube_statefulset_status_current_revision gauge -kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_statefulset_status_update_revision Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) -# TYPE kube_statefulset_status_update_revision gauge -kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-79dc58f667"} 1 -# HELP kube_storageclass_info Information about storageclass. -# TYPE kube_storageclass_info gauge -kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 -# HELP kube_storageclass_created Unix creation timestamp -# TYPE kube_storageclass_created gauge -kube_storageclass_created{storageclass="standard"} 1.673879567e+09 -# HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. -# TYPE kube_storageclass_annotations gauge -kube_storageclass_annotations{storageclass="standard"} 1 -# HELP kube_storageclass_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_storageclass_labels gauge -kube_storageclass_labels{storageclass="standard"} 1 -# HELP kube_validatingwebhookconfiguration_info Information about the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_info gauge -# HELP kube_validatingwebhookconfiguration_created Unix creation timestamp. -# TYPE kube_validatingwebhookconfiguration_created gauge -# HELP kube_validatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the ValidatingWebhookConfiguration. -# TYPE kube_validatingwebhookconfiguration_metadata_resource_version gauge -# HELP kube_volumeattachment_labels Kubernetes labels converted to Prometheus labels. -# TYPE kube_volumeattachment_labels gauge -# HELP kube_volumeattachment_info Information about volumeattachment. -# TYPE kube_volumeattachment_info gauge -# HELP kube_volumeattachment_created Unix creation timestamp -# TYPE kube_volumeattachment_created gauge -# HELP kube_volumeattachment_spec_source_persistentvolume PersistentVolume source reference. -# TYPE kube_volumeattachment_spec_source_persistentvolume gauge -# HELP kube_volumeattachment_status_attached Information about volumeattachment. -# TYPE kube_volumeattachment_status_attached gauge -# HELP kube_volumeattachment_status_attachment_metadata volumeattachment metadata. -# TYPE kube_volumeattachment_status_attachment_metadata gauge diff --git a/metricbeat/module/kubernetes/_meta/test/ksm.v2.8.2.plain b/metricbeat/module/kubernetes/_meta/test/ksm.v2.8.2.plain new file mode 100644 index 00000000000..5f23ea0fbad --- /dev/null +++ b/metricbeat/module/kubernetes/_meta/test/ksm.v2.8.2.plain @@ -0,0 +1,1477 @@ +# HELP kube_certificatesigningrequest_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_certificatesigningrequest_annotations gauge +# HELP kube_certificatesigningrequest_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_certificatesigningrequest_labels gauge +# HELP kube_certificatesigningrequest_created [STABLE] Unix creation timestamp +# TYPE kube_certificatesigningrequest_created gauge +# HELP kube_certificatesigningrequest_condition [STABLE] The number of each certificatesigningrequest condition +# TYPE kube_certificatesigningrequest_condition gauge +# HELP kube_certificatesigningrequest_cert_length [STABLE] Length of the issued cert +# TYPE kube_certificatesigningrequest_cert_length gauge +# HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_configmap_annotations gauge +kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="default",configmap="example-redis-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 +# HELP kube_configmap_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_configmap_labels gauge +kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 +kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="default",configmap="example-redis-config"} 1 +# HELP kube_configmap_info [STABLE] Information about configmap. +# TYPE kube_configmap_info gauge +kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="default",configmap="example-redis-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 +kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +# HELP kube_configmap_created [STABLE] Unix creation timestamp +# TYPE kube_configmap_created gauge +kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.691566337e+09 +kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.691566343e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.69156634e+09 +kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="example-redis-config"} 1.691568402e+09 +kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.69156634e+09 +kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.69156634e+09 +# HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. +# TYPE kube_configmap_metadata_resource_version gauge +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 238 +kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 343 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 26 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 270 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 341 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 198 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 360 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 231 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 342 +kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 344 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 345 +kube_configmap_metadata_resource_version{namespace="default",configmap="example-redis-config"} 3360 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 202 +# HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_cronjob_annotations gauge +kube_cronjob_annotations{namespace="default",cronjob="hello"} 1 +# HELP kube_cronjob_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_cronjob_labels gauge +kube_cronjob_labels{namespace="default",cronjob="hello"} 1 +# HELP kube_cronjob_info [STABLE] Info about cronjob. +# TYPE kube_cronjob_info gauge +kube_cronjob_info{namespace="default",cronjob="hello",schedule="*/1 * * * *",concurrency_policy="Allow"} 1 +# HELP kube_cronjob_created [STABLE] Unix creation timestamp +# TYPE kube_cronjob_created gauge +kube_cronjob_created{namespace="default",cronjob="hello"} 1.691568402e+09 +# HELP kube_cronjob_status_active [STABLE] Active holds pointers to currently running jobs. +# TYPE kube_cronjob_status_active gauge +kube_cronjob_status_active{namespace="default",cronjob="hello"} 0 +# HELP kube_cronjob_status_last_schedule_time [STABLE] LastScheduleTime keeps information of when was the last time the job was successfully scheduled. +# TYPE kube_cronjob_status_last_schedule_time gauge +kube_cronjob_status_last_schedule_time{namespace="default",cronjob="hello"} 1.69156842e+09 +# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully. +# TYPE kube_cronjob_status_last_successful_time gauge +kube_cronjob_status_last_successful_time{namespace="default",cronjob="hello"} 1.691568424e+09 +# HELP kube_cronjob_spec_suspend [STABLE] Suspend flag tells the controller to suspend subsequent executions. +# TYPE kube_cronjob_spec_suspend gauge +kube_cronjob_spec_suspend{namespace="default",cronjob="hello"} 0 +# HELP kube_cronjob_spec_starting_deadline_seconds [STABLE] Deadline in seconds for starting the job if it misses scheduled time for any reason. +# TYPE kube_cronjob_spec_starting_deadline_seconds gauge +# HELP kube_cronjob_next_schedule_time [STABLE] Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. +# TYPE kube_cronjob_next_schedule_time gauge +kube_cronjob_next_schedule_time{namespace="default",cronjob="hello"} 1.69156848e+09 +# HELP kube_cronjob_metadata_resource_version [STABLE] Resource version representing a specific version of the cronjob. +# TYPE kube_cronjob_metadata_resource_version gauge +kube_cronjob_metadata_resource_version{namespace="default",cronjob="hello"} 3487 +# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. +# TYPE kube_cronjob_spec_successful_job_history_limit gauge +kube_cronjob_spec_successful_job_history_limit{namespace="default",cronjob="hello"} 3 +# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. +# TYPE kube_cronjob_spec_failed_job_history_limit gauge +kube_cronjob_spec_failed_job_history_limit{namespace="default",cronjob="hello"} 1 +# HELP kube_daemonset_created [STABLE] Unix creation timestamp +# TYPE kube_daemonset_created gauge +kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.691566342e+09 +kube_daemonset_created{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1.691568402e+09 +kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.69156634e+09 +# HELP kube_daemonset_status_current_number_scheduled [STABLE] The number of nodes running at least one daemon pod and are supposed to. +# TYPE kube_daemonset_status_current_number_scheduled gauge +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_status_desired_number_scheduled [STABLE] The number of nodes that should be running the daemon pod. +# TYPE kube_daemonset_status_desired_number_scheduled gauge +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_status_number_available [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available +# TYPE kube_daemonset_status_number_available gauge +kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_status_number_misscheduled [STABLE] The number of nodes running a daemon pod but are not supposed to. +# TYPE kube_daemonset_status_number_misscheduled gauge +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 +# HELP kube_daemonset_status_number_ready [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. +# TYPE kube_daemonset_status_number_ready gauge +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_status_number_unavailable [STABLE] The number of nodes that should be running the daemon pod and have none of the daemon pod running and available +# TYPE kube_daemonset_status_number_unavailable gauge +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 +# HELP kube_daemonset_status_observed_generation [STABLE] The most recent generation observed by the daemon set controller. +# TYPE kube_daemonset_status_observed_generation gauge +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_status_updated_number_scheduled [STABLE] The total number of nodes that are running updated daemon pod +# TYPE kube_daemonset_status_updated_number_scheduled gauge +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_daemonset_metadata_generation gauge +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_daemonset_annotations gauge +kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 +# HELP kube_daemonset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_daemonset_labels gauge +kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +# HELP kube_deployment_created [STABLE] Unix creation timestamp +# TYPE kube_deployment_created gauge +kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.69156634e+09 +kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.691566342e+09 +kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.691568402e+09 +# HELP kube_deployment_status_replicas [STABLE] The number of replicas per deployment. +# TYPE kube_deployment_status_replicas gauge +kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 +kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 +# HELP kube_deployment_status_replicas_ready [STABLE] The number of ready replicas per deployment. +# TYPE kube_deployment_status_replicas_ready gauge +kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_replicas_available [STABLE] The number of available replicas per deployment. +# TYPE kube_deployment_status_replicas_available gauge +kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 +kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +# HELP kube_deployment_status_replicas_unavailable [STABLE] The number of unavailable replicas per deployment. +# TYPE kube_deployment_status_replicas_unavailable gauge +kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 +kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 +# HELP kube_deployment_status_replicas_updated [STABLE] The number of updated replicas per deployment. +# TYPE kube_deployment_status_replicas_updated gauge +kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_observed_generation [STABLE] The generation observed by the deployment controller. +# TYPE kube_deployment_status_observed_generation gauge +kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_condition [STABLE] The current status conditions of a deployment. +# TYPE kube_deployment_status_condition gauge +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="unknown"} 0 +# HELP kube_deployment_spec_replicas [STABLE] Number of desired pods for a deployment. +# TYPE kube_deployment_spec_replicas gauge +kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_spec_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_spec_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_spec_paused [STABLE] Whether the deployment is paused and will not be processed by the deployment controller. +# TYPE kube_deployment_spec_paused gauge +kube_deployment_spec_paused{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metrics"} 0 +kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 +# HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable [STABLE] Maximum number of unavailable replicas during a rolling update of a deployment. +# TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 +# HELP kube_deployment_spec_strategy_rollingupdate_max_surge [STABLE] Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. +# TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_deployment_metadata_generation gauge +kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 +kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 +# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_deployment_annotations gauge +kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 +kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +# HELP kube_deployment_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_deployment_labels gauge +kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} 1 +kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_labels{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +# HELP kube_endpoint_info [STABLE] Information about endpoint. +# TYPE kube_endpoint_info gauge +kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_created [STABLE] Unix creation timestamp +# TYPE kube_endpoint_created gauge +kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.691566338e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.691566354e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.691568402e+09 +# HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_endpoint_annotations gauge +kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_endpoint_labels gauge +kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_address_available (Deprecated since v2.6.0) Number of addresses available in endpoint. +# TYPE kube_endpoint_address_available gauge +kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 +kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 +# HELP kube_endpoint_address_not_ready (Deprecated since v2.6.0) Number of addresses not ready in endpoint +# TYPE kube_endpoint_address_not_ready gauge +kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 +kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 +kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 +# HELP kube_endpoint_address [STABLE] Information about Endpoint available and non available addresses. +# TYPE kube_endpoint_address gauge +kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.2",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.3",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-state-metrics",ip="10.244.0.14",ready="true"} 1 +kube_endpoint_address{namespace="default",endpoint="kubernetes",ip="172.18.0.2",ready="true"} 1 +# HELP kube_endpoint_ports [STABLE] Information about the Endpoint ports. +# TYPE kube_endpoint_ports gauge +kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 +# HELP kube_horizontalpodautoscaler_info Information about this autoscaler. +# TYPE kube_horizontalpodautoscaler_info gauge +# HELP kube_horizontalpodautoscaler_metadata_generation [STABLE] The generation observed by the HorizontalPodAutoscaler controller. +# TYPE kube_horizontalpodautoscaler_metadata_generation gauge +# HELP kube_horizontalpodautoscaler_spec_max_replicas [STABLE] Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. +# TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge +# HELP kube_horizontalpodautoscaler_spec_min_replicas [STABLE] Lower limit for the number of pods that can be set by the autoscaler, default 1. +# TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge +# HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. +# TYPE kube_horizontalpodautoscaler_spec_target_metric gauge +# HELP kube_horizontalpodautoscaler_status_target_metric The current metric status used by this autoscaler when calculating the desired replica count. +# TYPE kube_horizontalpodautoscaler_status_target_metric gauge +# HELP kube_horizontalpodautoscaler_status_current_replicas [STABLE] Current number of replicas of pods managed by this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_current_replicas gauge +# HELP kube_horizontalpodautoscaler_status_desired_replicas [STABLE] Desired number of replicas of pods managed by this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge +# HELP kube_horizontalpodautoscaler_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_horizontalpodautoscaler_annotations gauge +# HELP kube_horizontalpodautoscaler_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_horizontalpodautoscaler_labels gauge +# HELP kube_horizontalpodautoscaler_status_condition [STABLE] The condition of this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_condition gauge +# HELP kube_ingress_info [STABLE] Information about ingress. +# TYPE kube_ingress_info gauge +# HELP kube_ingress_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_ingress_annotations gauge +# HELP kube_ingress_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_ingress_labels gauge +# HELP kube_ingress_created [STABLE] Unix creation timestamp +# TYPE kube_ingress_created gauge +# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress. +# TYPE kube_ingress_metadata_resource_version gauge +# HELP kube_ingress_path [STABLE] Ingress host, paths and backend service information. +# TYPE kube_ingress_path gauge +# HELP kube_ingress_tls [STABLE] Ingress TLS host and secret information. +# TYPE kube_ingress_tls gauge +# HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_job_annotations gauge +kube_job_annotations{namespace="default",job_name="hello"} 1 +kube_job_annotations{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_job_labels gauge +kube_job_labels{namespace="default",job_name="hello"} 1 +kube_job_labels{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_info [STABLE] Information about job. +# TYPE kube_job_info gauge +kube_job_info{namespace="default",job_name="hello"} 1 +kube_job_info{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_created [STABLE] Unix creation timestamp +# TYPE kube_job_created gauge +kube_job_created{namespace="default",job_name="hello-28192807"} 1.69156842e+09 +kube_job_created{namespace="default",job_name="hello"} 1.691568402e+09 +# HELP kube_job_spec_parallelism [STABLE] The maximum desired number of pods the job should run at any given time. +# TYPE kube_job_spec_parallelism gauge +kube_job_spec_parallelism{namespace="default",job_name="hello"} 1 +kube_job_spec_parallelism{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_spec_completions [STABLE] The desired number of successfully finished pods the job should be run with. +# TYPE kube_job_spec_completions gauge +kube_job_spec_completions{namespace="default",job_name="hello"} 1 +kube_job_spec_completions{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_spec_active_deadline_seconds [STABLE] The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. +# TYPE kube_job_spec_active_deadline_seconds gauge +# HELP kube_job_status_succeeded [STABLE] The number of pods which reached Phase Succeeded. +# TYPE kube_job_status_succeeded gauge +kube_job_status_succeeded{namespace="default",job_name="hello"} 1 +kube_job_status_succeeded{namespace="default",job_name="hello-28192807"} 1 +# HELP kube_job_status_failed [STABLE] The number of pods which reached Phase Failed and the reason for failure. +# TYPE kube_job_status_failed gauge +kube_job_status_failed{namespace="default",job_name="hello"} 0 +kube_job_status_failed{namespace="default",job_name="hello-28192807"} 0 +# HELP kube_job_status_active [STABLE] The number of actively running pods. +# TYPE kube_job_status_active gauge +kube_job_status_active{namespace="default",job_name="hello"} 0 +kube_job_status_active{namespace="default",job_name="hello-28192807"} 0 +# HELP kube_job_complete [STABLE] The job has completed its execution. +# TYPE kube_job_complete gauge +kube_job_complete{namespace="default",job_name="hello-28192807",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello-28192807",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello-28192807",condition="unknown"} 0 +kube_job_complete{namespace="default",job_name="hello",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello",condition="unknown"} 0 +# HELP kube_job_failed [STABLE] The job has failed its execution. +# TYPE kube_job_failed gauge +# HELP kube_job_status_start_time [STABLE] StartTime represents time when the job was acknowledged by the Job Manager. +# TYPE kube_job_status_start_time gauge +kube_job_status_start_time{namespace="default",job_name="hello"} 1.691568402e+09 +kube_job_status_start_time{namespace="default",job_name="hello-28192807"} 1.69156842e+09 +# HELP kube_job_status_completion_time [STABLE] CompletionTime represents time when the job was completed. +# TYPE kube_job_status_completion_time gauge +kube_job_status_completion_time{namespace="default",job_name="hello"} 1.691568406e+09 +kube_job_status_completion_time{namespace="default",job_name="hello-28192807"} 1.691568424e+09 +# HELP kube_job_owner [STABLE] Information about the Job's owner. +# TYPE kube_job_owner gauge +kube_job_owner{namespace="default",job_name="hello",owner_kind="",owner_name="",owner_is_controller=""} 1 +kube_job_owner{namespace="default",job_name="hello-28192807",owner_kind="CronJob",owner_name="hello",owner_is_controller="true"} 1 +# HELP kube_lease_owner Information about the Lease's owner. +# TYPE kube_lease_owner gauge +kube_lease_owner{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_eb429ff6-d4a0-49b6-ae35-4471a79c6c25"} 1 +kube_lease_owner{lease="kube-controller-manager",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_0b4da5ad-3d3f-46e1-a9a7-f3de4500210d"} 1 +kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane",namespace="kube-node-lease",lease_holder="kind-control-plane"} 1 +kube_lease_owner{lease="kube-scheduler",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_1ccae8c1-4c4b-4f22-ba9f-4001d58bbbeb"} 1 +# HELP kube_lease_renew_time Kube lease renew time. +# TYPE kube_lease_renew_time gauge +kube_lease_renew_time{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a"} 1.691568417e+09 +kube_lease_renew_time{lease="kube-controller-manager"} 1.691568424e+09 +kube_lease_renew_time{lease="kind-control-plane"} 1.691568422e+09 +kube_lease_renew_time{lease="kube-scheduler"} 1.691568426e+09 +# HELP kube_limitrange [STABLE] Information about limit range. +# TYPE kube_limitrange gauge +# HELP kube_limitrange_created [STABLE] Unix creation timestamp +# TYPE kube_limitrange_created gauge +# HELP kube_mutatingwebhookconfiguration_info Information about the MutatingWebhookConfiguration. +# TYPE kube_mutatingwebhookconfiguration_info gauge +# HELP kube_mutatingwebhookconfiguration_created Unix creation timestamp. +# TYPE kube_mutatingwebhookconfiguration_created gauge +# HELP kube_mutatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the MutatingWebhookConfiguration. +# TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge +# HELP kube_namespace_created [STABLE] Unix creation timestamp +# TYPE kube_namespace_created gauge +kube_namespace_created{namespace="kube-system"} 1.691566337e+09 +kube_namespace_created{namespace="kube-public"} 1.691566337e+09 +kube_namespace_created{namespace="kube-node-lease"} 1.691566337e+09 +kube_namespace_created{namespace="default"} 1.691566338e+09 +kube_namespace_created{namespace="local-path-storage"} 1.691566342e+09 +# HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_namespace_annotations gauge +kube_namespace_annotations{namespace="kube-public"} 1 +kube_namespace_annotations{namespace="kube-node-lease"} 1 +kube_namespace_annotations{namespace="default"} 1 +kube_namespace_annotations{namespace="local-path-storage"} 1 +kube_namespace_annotations{namespace="kube-system"} 1 +# HELP kube_namespace_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_namespace_labels gauge +kube_namespace_labels{namespace="local-path-storage"} 1 +kube_namespace_labels{namespace="kube-system"} 1 +kube_namespace_labels{namespace="kube-public"} 1 +kube_namespace_labels{namespace="kube-node-lease"} 1 +kube_namespace_labels{namespace="default"} 1 +# HELP kube_namespace_status_phase [STABLE] kubernetes namespace status phase. +# TYPE kube_namespace_status_phase gauge +kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-system",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="default",phase="Active"} 1 +kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 +kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 +# HELP kube_namespace_status_condition The condition of a namespace. +# TYPE kube_namespace_status_condition gauge +# HELP kube_networkpolicy_created Unix creation timestamp of network policy +# TYPE kube_networkpolicy_created gauge +# HELP kube_networkpolicy_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_networkpolicy_annotations gauge +# HELP kube_networkpolicy_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_networkpolicy_labels gauge +# HELP kube_networkpolicy_spec_ingress_rules Number of ingress rules on the networkpolicy +# TYPE kube_networkpolicy_spec_ingress_rules gauge +# HELP kube_networkpolicy_spec_egress_rules Number of egress rules on the networkpolicy +# TYPE kube_networkpolicy_spec_egress_rules gauge +# HELP kube_node_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_node_annotations gauge +kube_node_annotations{node="kind-control-plane"} 1 +# HELP kube_node_created [STABLE] Unix creation timestamp +# TYPE kube_node_created gauge +kube_node_created{node="kind-control-plane"} 1.691566337e+09 +# HELP kube_node_deletion_timestamp Unix deletion timestamp +# TYPE kube_node_deletion_timestamp gauge +# HELP kube_node_info [STABLE] Information about a cluster node. +# TYPE kube_node_info gauge +kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit-pr",os_image="Ubuntu 22.04.2 LTS",container_runtime_version="containerd://1.6.19-46-g941215f49",kubelet_version="v1.26.3",kubeproxy_version="v1.26.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="da6f977ba55a4ef5a3240dbd88134863",internal_ip="172.18.0.2"} 1 +# HELP kube_node_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_node_labels gauge +kube_node_labels{node="kind-control-plane"} 1 +# HELP kube_node_role The role of a cluster node. +# TYPE kube_node_role gauge +kube_node_role{node="kind-control-plane",role="control-plane"} 1 +# HELP kube_node_spec_taint [STABLE] The taint of a cluster node. +# TYPE kube_node_spec_taint gauge +# HELP kube_node_spec_unschedulable [STABLE] Whether a node can schedule new pods. +# TYPE kube_node_spec_unschedulable gauge +kube_node_spec_unschedulable{node="kind-control-plane"} 0 +# HELP kube_node_status_allocatable [STABLE] The allocatable for different resources of a node that are available for scheduling. +# TYPE kube_node_status_allocatable gauge +kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 +kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 +kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 +kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 +kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 +kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 +# HELP kube_node_status_capacity [STABLE] The capacity for different resources of a node. +# TYPE kube_node_status_capacity gauge +kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 +kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 +kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 +kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 +kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 +kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 +# HELP kube_node_status_condition [STABLE] The condition of a cluster node. +# TYPE kube_node_status_condition gauge +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="true"} 1 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="false"} 0 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 +# HELP kube_persistentvolumeclaim_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_persistentvolumeclaim_labels gauge +kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 +# HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_persistentvolumeclaim_annotations gauge +kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 +# HELP kube_persistentvolumeclaim_info [STABLE] Information about persistent volume claim. +# TYPE kube_persistentvolumeclaim_info gauge +kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="task-pv-claim",storageclass="generic",volumename="task-pv-volume"} 1 +# HELP kube_persistentvolumeclaim_status_phase [STABLE] The phase the persistent volume claim is currently in. +# TYPE kube_persistentvolumeclaim_status_phase gauge +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Lost"} 0 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Bound"} 1 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Pending"} 0 +# HELP kube_persistentvolumeclaim_resource_requests_storage_bytes [STABLE] The capacity of storage requested by the persistent volume claim. +# TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge +kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="task-pv-claim"} 1024 +# HELP kube_persistentvolumeclaim_access_mode [STABLE] The access mode(s) specified by the persistent volume claim. +# TYPE kube_persistentvolumeclaim_access_mode gauge +kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="task-pv-claim",access_mode="ReadWriteOnce"} 1 +# HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. +# TYPE kube_persistentvolumeclaim_status_condition gauge +# HELP kube_persistentvolumeclaim_created Unix creation timestamp +# TYPE kube_persistentvolumeclaim_created gauge +kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="task-pv-claim"} 1.691568402e+09 +# HELP kube_persistentvolume_claim_ref [STABLE] Information about the Persistent Volume Claim Reference. +# TYPE kube_persistentvolume_claim_ref gauge +kube_persistentvolume_claim_ref{persistentvolume="task-pv-volume",name="task-pv-claim",claim_namespace="default"} 1 +# HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_persistentvolume_annotations gauge +kube_persistentvolume_annotations{persistentvolume="task-pv-volume"} 1 +# HELP kube_persistentvolume_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_persistentvolume_labels gauge +kube_persistentvolume_labels{persistentvolume="task-pv-volume"} 1 +# HELP kube_persistentvolume_status_phase [STABLE] The phase indicates if a volume is available, bound to a claim, or released by a claim. +# TYPE kube_persistentvolume_status_phase gauge +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Pending"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Available"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Bound"} 1 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Released"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Failed"} 0 +# HELP kube_persistentvolume_info [STABLE] Information about persistentvolume. +# TYPE kube_persistentvolume_info gauge +kube_persistentvolume_info{persistentvolume="task-pv-volume",storageclass="generic",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="",nfs_path="",csi_driver="",csi_volume_handle="",local_path="",local_fs="",host_path="/tmp/data",host_path_type=""} 1 +# HELP kube_persistentvolume_capacity_bytes [STABLE] Persistentvolume capacity in bytes. +# TYPE kube_persistentvolume_capacity_bytes gauge +kube_persistentvolume_capacity_bytes{persistentvolume="task-pv-volume"} 2048 +# HELP kube_persistentvolume_created Unix creation timestamp +# TYPE kube_persistentvolume_created gauge +kube_persistentvolume_created{persistentvolume="task-pv-volume"} 1.691568402e+09 +# HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_poddisruptionbudget_annotations gauge +# HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_poddisruptionbudget_labels gauge +# HELP kube_poddisruptionbudget_created [STABLE] Unix creation timestamp +# TYPE kube_poddisruptionbudget_created gauge +# HELP kube_poddisruptionbudget_status_current_healthy [STABLE] Current number of healthy pods +# TYPE kube_poddisruptionbudget_status_current_healthy gauge +# HELP kube_poddisruptionbudget_status_desired_healthy [STABLE] Minimum desired number of healthy pods +# TYPE kube_poddisruptionbudget_status_desired_healthy gauge +# HELP kube_poddisruptionbudget_status_pod_disruptions_allowed [STABLE] Number of pod disruptions that are currently allowed +# TYPE kube_poddisruptionbudget_status_pod_disruptions_allowed gauge +# HELP kube_poddisruptionbudget_status_expected_pods [STABLE] Total number of pods counted by this disruption budget +# TYPE kube_poddisruptionbudget_status_expected_pods gauge +# HELP kube_poddisruptionbudget_status_observed_generation [STABLE] Most recent generation observed when updating this PDB status +# TYPE kube_poddisruptionbudget_status_observed_generation gauge +# HELP kube_pod_completion_time [STABLE] Completion time in unix timestamp for a pod. +# TYPE kube_pod_completion_time gauge +kube_pod_completion_time{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1.69156842e+09 +kube_pod_completion_time{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1.691568402e+09 +# HELP kube_pod_container_info [STABLE] Information about a container in a pod. +# TYPE kube_pod_container_info gauge +kube_pod_container_info{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://792a785041217bf9d4784f80510bd60bb21fc179088f5b72286af6d350166a91"} 1 +kube_pod_container_info{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch",image_spec="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image_id="sha256:c896ab1149bb529ca28d76976885e04c0d754b6592f74b5478bfdcf248f84e62",container_id="containerd://a4f1799a2236665489587b54ff78e36c9eebd8a4134d75b768149551f5a564b3"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.26.3",image="registry.k8s.io/kube-scheduler:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:3dd2337f70af979c7362b5e52bbdfcb3a5fd39c78d94d02145150cd2db86ba39",container_id="containerd://abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36"} 1 +kube_pod_container_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",image="sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb",image_id="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",container_id="containerd://c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072"} 1 +kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",image="sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc",image_id="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",container_id="containerd://0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.26.3",image="registry.k8s.io/kube-apiserver:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:ba097b515c8c40689733c0f19de377e9bf8995964b7d7150c2045f3dfd166657",container_id="containerd://146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427"} 1 +kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.6-0",image="registry.k8s.io/etcd:3.5.6-0",image_id="sha256:fce326961ae2d51a5f726883fd59d2a8c2ccc3e45d3bb859882db58e422e59e7",container_id="containerd://a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068"} 1 +kube_pod_container_info{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://9db55f876bbf229af92f6825e4ffb58ac7b98c7519f1471fa90c1342fd6a9abc"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics",image_spec="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2",image="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2",image_id="registry.k8s.io/kube-state-metrics/kube-state-metrics@sha256:ec5732e28f151de3847df60f48c5a570aacdb692ff1ce949d97105ae5e5a6722",container_id="containerd://2385de25be8a2c1ec1c1490d5aab898d0d1202c981840b41de1d2cc67d891a8d"} 1 +kube_pod_container_info{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx",image_spec="docker.io/nginx:1.24.0-alpine-slim",image="docker.io/library/nginx:1.24.0-alpine-slim",image_id="docker.io/library/nginx@sha256:b8132df8c2fc73f4c1e7ce434c1ff19b134818e8173cd5e8f79c55a5f635d7e5",container_id="containerd://d7ccd676642697b9c11ccd6789aa8ab9048ee18ee0f9627227db5e12006e0342"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.26.3",image="registry.k8s.io/kube-controller-manager:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:8dbb345de79d1c44f59a7895da702a5f71997ae72aea056609445c397b0c10dc",container_id="containerd://9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.26.3",image="registry.k8s.io/kube-proxy:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:44db4d50a5f9c8efbac0d37ea974d1c0419a5928f90748d3d491a041a00c20b5",container_id="containerd://c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f"} 1 +# HELP kube_pod_container_resource_limits The number of requested limit resource by a container. It is recommended to use the kube_pod_resource_limits metric exposed by kube-scheduler instead, as it is more precise. +# TYPE kube_pod_container_resource_limits gauge +kube_pod_container_resource_limits{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +# HELP kube_pod_container_resource_requests The number of requested request resource by a container. It is recommended to use the kube_pod_resource_requests metric exposed by kube-scheduler instead, as it is more precise. +# TYPE kube_pod_container_resource_requests gauge +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 +# HELP kube_pod_container_state_started [STABLE] Start time in unix timestamp for a pod container. +# TYPE kube_pod_container_state_started gauge +kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1.691566355e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1.691566357e+09 +kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1.691566361e+09 +kube_pod_container_state_started{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 1.69156842e+09 +kube_pod_container_state_started{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 1.691568402e+09 +kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1.691566334e+09 +kube_pod_container_state_started{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 1.691568402e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 1.691568403e+09 +kube_pod_container_state_started{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 1.691568403e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1.691566332e+09 +# HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. +# TYPE kube_pod_container_status_last_terminated_reason gauge +# HELP kube_pod_container_status_last_terminated_exitcode Describes the exit code for the last container in terminated state. +# TYPE kube_pod_container_status_last_terminated_exitcode gauge +# HELP kube_pod_container_status_ready [STABLE] Describes whether the containers readiness check succeeded. +# TYPE kube_pod_container_status_ready gauge +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 0 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 0 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 1 +kube_pod_container_status_ready{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 1 +# HELP kube_pod_container_status_restarts_total [STABLE] The number of container restarts per container. +# TYPE kube_pod_container_status_restarts_total counter +kube_pod_container_status_restarts_total{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +# HELP kube_pod_container_status_running [STABLE] Describes whether the container is currently in running state. +# TYPE kube_pod_container_status_running gauge +kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 0 +kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 0 +kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 1 +kube_pod_container_status_running{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +# HELP kube_pod_container_status_terminated [STABLE] Describes whether the container is currently in terminated state. +# TYPE kube_pod_container_status_terminated gauge +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 1 +kube_pod_container_status_terminated{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 0 +kube_pod_container_status_terminated{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 1 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +# HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. +# TYPE kube_pod_container_status_terminated_reason gauge +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello",reason="Completed"} 1 +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello",reason="Completed"} 1 +# HELP kube_pod_container_status_waiting [STABLE] Describes whether the container is currently in waiting state. +# TYPE kube_pod_container_status_waiting gauge +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",container="kube-state-metrics"} 0 +kube_pod_container_status_waiting{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",container="nginx"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +# HELP kube_pod_container_status_waiting_reason [STABLE] Describes the reason the container is currently in waiting state. +# TYPE kube_pod_container_status_waiting_reason gauge +# HELP kube_pod_created [STABLE] Unix creation timestamp +# TYPE kube_pod_created gauge +kube_pod_created{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566354e+09 +kube_pod_created{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1.69156842e+09 +kube_pod_created{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1.691568402e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566341e+09 +kube_pod_created{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1.691568402e+09 +kube_pod_created{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1.691568402e+09 +kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.69156634e+09 +kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_created{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1.691568402e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +# HELP kube_pod_deletion_timestamp Unix deletion timestamp +# TYPE kube_pod_deletion_timestamp gauge +# HELP kube_pod_info [STABLE] Information about pod. +# TYPE kube_pod_info gauge +kube_pod_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 +kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-75f5b54ffd",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",host_ip="172.18.0.2",pod_ip="10.244.0.16",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-28192807",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",host_ip="172.18.0.2",pod_ip="10.244.0.12",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="fluentd-elasticsearch",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",host_ip="172.18.0.2",pod_ip="10.244.0.13",node="kind-control-plane",created_by_kind="Job",created_by_name="hello",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",host_ip="172.18.0.2",pod_ip="10.244.0.14",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-fb945547c",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",host_ip="172.18.0.2",pod_ip="10.244.0.15",node="kind-control-plane",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +# HELP kube_pod_ips Pod IP addresses +# TYPE kube_pod_ips gauge +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",ip="10.244.0.3",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",ip="10.244.0.4",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",ip="10.244.0.16",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",ip="10.244.0.12",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",ip="10.244.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",ip="10.244.0.15",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",ip="10.244.0.13",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",ip="10.244.0.14",ip_family="4"} 1 +# HELP kube_pod_init_container_info [STABLE] Information about an init container in a pod. +# TYPE kube_pod_init_container_info gauge +# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. +# TYPE kube_pod_init_container_resource_limits gauge +# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container. +# TYPE kube_pod_init_container_resource_requests gauge +# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state. +# TYPE kube_pod_init_container_status_last_terminated_reason gauge +# HELP kube_pod_init_container_status_ready [STABLE] Describes whether the init containers readiness check succeeded. +# TYPE kube_pod_init_container_status_ready gauge +# HELP kube_pod_init_container_status_restarts_total [STABLE] The number of restarts for the init container. +# TYPE kube_pod_init_container_status_restarts_total counter +# HELP kube_pod_init_container_status_running [STABLE] Describes whether the init container is currently in running state. +# TYPE kube_pod_init_container_status_running gauge +# HELP kube_pod_init_container_status_terminated [STABLE] Describes whether the init container is currently in terminated state. +# TYPE kube_pod_init_container_status_terminated gauge +# HELP kube_pod_init_container_status_terminated_reason Describes the reason the init container is currently in terminated state. +# TYPE kube_pod_init_container_status_terminated_reason gauge +# HELP kube_pod_init_container_status_waiting [STABLE] Describes whether the init container is currently in waiting state. +# TYPE kube_pod_init_container_status_waiting gauge +# HELP kube_pod_init_container_status_waiting_reason Describes the reason the init container is currently in waiting state. +# TYPE kube_pod_init_container_status_waiting_reason gauge +# HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_pod_annotations gauge +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +kube_pod_annotations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1 +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_annotations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_annotations{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_annotations{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1 +kube_pod_annotations{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1 +# HELP kube_pod_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_pod_labels gauge +kube_pod_labels{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1 +kube_pod_labels{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_labels{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_labels{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1 +kube_pod_labels{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +# HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. +# TYPE kube_pod_overhead_cpu_cores gauge +# HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. +# TYPE kube_pod_overhead_memory_bytes gauge +# HELP kube_pod_owner [STABLE] Information about the Pod's owner. +# TYPE kube_pod_owner gauge +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",owner_kind="DaemonSet",owner_name="fluentd-elasticsearch",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 +kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",owner_kind="ReplicaSet",owner_name="local-path-provisioner-75f5b54ffd",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",owner_kind="Job",owner_name="hello-28192807",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",owner_kind="Job",owner_name="hello",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",owner_kind="ReplicaSet",owner_name="kube-state-metrics-fb945547c",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 +# HELP kube_pod_restart_policy [STABLE] Describes the restart policy in use by this pod. +# TYPE kube_pod_restart_policy gauge +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",type="Always"} 1 +kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",type="Always"} 1 +# HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. +# TYPE kube_pod_runtimeclass_name_info gauge +# HELP kube_pod_spec_volumes_persistentvolumeclaims_info [STABLE] Information about persistentvolumeclaim volumes in a pod. +# TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge +# HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly [STABLE] Describes whether a persistentvolumeclaim is mounted read only. +# TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge +# HELP kube_pod_start_time [STABLE] Start time in unix timestamp for a pod. +# TYPE kube_pod_start_time gauge +kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_start_time{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1.691568402e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1.691568402e+09 +kube_pod_start_time{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1.691568402e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_start_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_start_time{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1.69156842e+09 +kube_pod_start_time{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1.691568402e+09 +# HELP kube_pod_status_phase [STABLE] The pods current phase. +# TYPE kube_pod_status_phase gauge +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Running"} 1 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Pending"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Failed"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Unknown"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Running"} 1 +# HELP kube_pod_status_qos_class The pods current qosClass. +# TYPE kube_pod_status_qos_class gauge +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Guaranteed"} 1 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",qos_class="Guaranteed"} 0 +# HELP kube_pod_status_ready [STABLE] Describes whether the pod is ready to serve requests. +# TYPE kube_pod_status_ready gauge +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="true"} 1 +kube_pod_status_ready{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="false"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +# HELP kube_pod_status_ready_time Readiness achieved time in unix timestamp for a pod. +# TYPE kube_pod_status_ready_time gauge +kube_pod_status_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1.691568403e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1.691568412e+09 +kube_pod_status_ready_time{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1.691568404e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +# HELP kube_pod_status_container_ready_time Readiness achieved time in unix timestamp for a pod containers. +# TYPE kube_pod_status_container_ready_time gauge +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1.691568412e+09 +kube_pod_status_container_ready_time{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1.691568404e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_container_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1.691568403e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +# HELP kube_pod_status_reason The pod status reasons +# TYPE kube_pod_status_reason gauge +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Evicted"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="UnexpectedAdmissionError"} 0 +# HELP kube_pod_status_scheduled [STABLE] Describes the status of the scheduling process for the pod. +# TYPE kube_pod_status_scheduled gauge +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +# HELP kube_pod_status_scheduled_time [STABLE] Unix timestamp when pod moved into scheduled status +# TYPE kube_pod_status_scheduled_time gauge +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724"} 1.69156842e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17"} 1.691568402e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b"} 1.691568402e+09 +kube_pod_status_scheduled_time{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c"} 1.691568402e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7"} 1.691568402e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +# HELP kube_pod_status_unschedulable [STABLE] Describes the unschedulable status for the pod. +# TYPE kube_pod_status_unschedulable gauge +# HELP kube_pod_tolerations Information about the pod tolerations +# TYPE kube_pod_tolerations gauge +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192807-p6f5s",uid="9cf6e32b-0cae-42ae-bdf0-1cc1e1307724",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node-role.kubernetes.io/control-plane",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node-role.kubernetes.io/master",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-qrlkt",uid="a69e9036-f859-4836-8a3e-01dd8f95ac17",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/control-plane",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/master",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-7dfgp",uid="db49dd04-84c8-4360-ae91-676138fb6db7",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-fb945547c-zdncb",uid="b0df55cf-7b68-4347-8b28-5824cc8c1e0b",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="c9fab27d-228a-4850-ba37-fe2ac77fda6c",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",operator="Exists",effect="NoExecute"} 1 +# HELP kube_replicaset_created [STABLE] Unix creation timestamp +# TYPE kube_replicaset_created gauge +kube_replicaset_created{namespace="kube-system",replicaset="coredns-787d4945fb"} 1.691566354e+09 +kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1.691566354e+09 +kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1.691568402e+09 +# HELP kube_replicaset_status_replicas [STABLE] The number of replicas per ReplicaSet. +# TYPE kube_replicaset_status_replicas gauge +kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +# HELP kube_replicaset_status_fully_labeled_replicas [STABLE] The number of fully labeled replicas per ReplicaSet. +# TYPE kube_replicaset_status_fully_labeled_replicas gauge +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +# HELP kube_replicaset_status_ready_replicas [STABLE] The number of ready replicas per ReplicaSet. +# TYPE kube_replicaset_status_ready_replicas gauge +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +# HELP kube_replicaset_status_observed_generation [STABLE] The generation observed by the ReplicaSet controller. +# TYPE kube_replicaset_status_observed_generation gauge +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +# HELP kube_replicaset_spec_replicas [STABLE] Number of desired pods for a ReplicaSet. +# TYPE kube_replicaset_spec_replicas gauge +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +# HELP kube_replicaset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_replicaset_metadata_generation gauge +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +# HELP kube_replicaset_owner [STABLE] Information about the ReplicaSet's owner. +# TYPE kube_replicaset_owner gauge +kube_replicaset_owner{namespace="kube-system",replicaset="coredns-787d4945fb",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-fb945547c",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 +# HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_replicaset_annotations gauge +kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +# HELP kube_replicaset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_replicaset_labels gauge +kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-fb945547c"} 1 +kube_replicaset_labels{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +# HELP kube_replicationcontroller_created [STABLE] Unix creation timestamp +# TYPE kube_replicationcontroller_created gauge +# HELP kube_replicationcontroller_status_replicas [STABLE] The number of replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_replicas gauge +# HELP kube_replicationcontroller_status_fully_labeled_replicas [STABLE] The number of fully labeled replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_fully_labeled_replicas gauge +# HELP kube_replicationcontroller_status_ready_replicas [STABLE] The number of ready replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_ready_replicas gauge +# HELP kube_replicationcontroller_status_available_replicas [STABLE] The number of available replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_available_replicas gauge +# HELP kube_replicationcontroller_status_observed_generation [STABLE] The generation observed by the ReplicationController controller. +# TYPE kube_replicationcontroller_status_observed_generation gauge +# HELP kube_replicationcontroller_spec_replicas [STABLE] Number of desired pods for a ReplicationController. +# TYPE kube_replicationcontroller_spec_replicas gauge +# HELP kube_replicationcontroller_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_replicationcontroller_metadata_generation gauge +# HELP kube_replicationcontroller_owner Information about the ReplicationController's owner. +# TYPE kube_replicationcontroller_owner gauge +# HELP kube_resourcequota_created [STABLE] Unix creation timestamp +# TYPE kube_resourcequota_created gauge +kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.691568402e+09 +# HELP kube_resourcequota [STABLE] Information about resource quota. +# TYPE kube_resourcequota gauge +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 204800 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 +# HELP kube_secret_info [STABLE] Information about secret. +# TYPE kube_secret_info gauge +kube_secret_info{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_type [STABLE] Type about secret. +# TYPE kube_secret_type gauge +kube_secret_type{namespace="kube-system",secret="bootstrap-token-abcdef",type="bootstrap.kubernetes.io/token"} 1 +# HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_secret_annotations gauge +kube_secret_annotations{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_secret_labels gauge +kube_secret_labels{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_created [STABLE] Unix creation timestamp +# TYPE kube_secret_created gauge +kube_secret_created{namespace="kube-system",secret="bootstrap-token-abcdef"} 1.69156634e+09 +# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. +# TYPE kube_secret_metadata_resource_version gauge +kube_secret_metadata_resource_version{namespace="kube-system",secret="bootstrap-token-abcdef"} 221 +# HELP kube_service_info [STABLE] Information about service. +# TYPE kube_service_info gauge +kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="47c4b57d-96b5-482c-9da0-c543cd1589fb",cluster_ip="None",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 +# HELP kube_service_created [STABLE] Unix creation timestamp +# TYPE kube_service_created gauge +kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="47c4b57d-96b5-482c-9da0-c543cd1589fb"} 1.691568402e+09 +kube_service_created{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1.691566338e+09 +kube_service_created{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1.69156634e+09 +# HELP kube_service_spec_type [STABLE] Type about service. +# TYPE kube_service_spec_type gauge +kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="47c4b57d-96b5-482c-9da0-c543cd1589fb",type="ClusterIP"} 1 +kube_service_spec_type{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",type="ClusterIP"} 1 +kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",type="ClusterIP"} 1 +# HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_service_annotations gauge +kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="47c4b57d-96b5-482c-9da0-c543cd1589fb"} 1 +kube_service_annotations{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 +kube_service_annotations{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +# HELP kube_service_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_service_labels gauge +kube_service_labels{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="47c4b57d-96b5-482c-9da0-c543cd1589fb"} 1 +kube_service_labels{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 +# HELP kube_service_spec_external_ip [STABLE] Service external ips. One series for each ip +# TYPE kube_service_spec_external_ip gauge +# HELP kube_service_status_load_balancer_ingress [STABLE] Service load balancer ingress status +# TYPE kube_service_status_load_balancer_ingress gauge +# HELP kube_statefulset_created [STABLE] Unix creation timestamp +# TYPE kube_statefulset_created gauge +kube_statefulset_created{namespace="default",statefulset="web"} 1.691568402e+09 +# HELP kube_statefulset_status_replicas [STABLE] The number of replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas gauge +kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_available gauge +kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_current [STABLE] The number of current replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_current gauge +kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_ready [STABLE] The number of ready replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_ready gauge +kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_updated [STABLE] The number of updated replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_updated gauge +kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_observed_generation [STABLE] The generation observed by the StatefulSet controller. +# TYPE kube_statefulset_status_observed_generation gauge +kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet. +# TYPE kube_statefulset_replicas gauge +kube_statefulset_replicas{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet. +# TYPE kube_statefulset_metadata_generation gauge +kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs +# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge +# HELP kube_statefulset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_statefulset_annotations gauge +kube_statefulset_annotations{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_statefulset_labels gauge +kube_statefulset_labels{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). +# TYPE kube_statefulset_status_current_revision gauge +kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 +# HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) +# TYPE kube_statefulset_status_update_revision gauge +kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 +# HELP kube_storageclass_info [STABLE] Information about storageclass. +# TYPE kube_storageclass_info gauge +kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 +# HELP kube_storageclass_created [STABLE] Unix creation timestamp +# TYPE kube_storageclass_created gauge +kube_storageclass_created{storageclass="standard"} 1.691566342e+09 +# HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_storageclass_annotations gauge +kube_storageclass_annotations{storageclass="standard"} 1 +# HELP kube_storageclass_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_storageclass_labels gauge +kube_storageclass_labels{storageclass="standard"} 1 +# HELP kube_validatingwebhookconfiguration_info Information about the ValidatingWebhookConfiguration. +# TYPE kube_validatingwebhookconfiguration_info gauge +# HELP kube_validatingwebhookconfiguration_created Unix creation timestamp. +# TYPE kube_validatingwebhookconfiguration_created gauge +# HELP kube_validatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the ValidatingWebhookConfiguration. +# TYPE kube_validatingwebhookconfiguration_metadata_resource_version gauge +# HELP kube_volumeattachment_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_volumeattachment_labels gauge +# HELP kube_volumeattachment_info Information about volumeattachment. +# TYPE kube_volumeattachment_info gauge +# HELP kube_volumeattachment_created Unix creation timestamp +# TYPE kube_volumeattachment_created gauge +# HELP kube_volumeattachment_spec_source_persistentvolume PersistentVolume source reference. +# TYPE kube_volumeattachment_spec_source_persistentvolume gauge +# HELP kube_volumeattachment_status_attached Information about volumeattachment. +# TYPE kube_volumeattachment_status_attached gauge +# HELP kube_volumeattachment_status_attachment_metadata volumeattachment metadata. +# TYPE kube_volumeattachment_status_attachment_metadata gauge diff --git a/metricbeat/module/kubernetes/_meta/test/ksm.v2.9.2.plain b/metricbeat/module/kubernetes/_meta/test/ksm.v2.9.2.plain new file mode 100644 index 00000000000..2b6bf3b34af --- /dev/null +++ b/metricbeat/module/kubernetes/_meta/test/ksm.v2.9.2.plain @@ -0,0 +1,1479 @@ +# HELP kube_certificatesigningrequest_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_certificatesigningrequest_annotations gauge +# HELP kube_certificatesigningrequest_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_certificatesigningrequest_labels gauge +# HELP kube_certificatesigningrequest_created [STABLE] Unix creation timestamp +# TYPE kube_certificatesigningrequest_created gauge +# HELP kube_certificatesigningrequest_condition [STABLE] The number of each certificatesigningrequest condition +# TYPE kube_certificatesigningrequest_condition gauge +# HELP kube_certificatesigningrequest_cert_length [STABLE] Length of the issued cert +# TYPE kube_certificatesigningrequest_cert_length gauge +# HELP kube_configmap_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_configmap_annotations gauge +kube_configmap_annotations{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_annotations{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_annotations{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_annotations{namespace="default",configmap="example-redis-config"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_annotations{namespace="kube-system",configmap="kube-proxy"} 1 +# HELP kube_configmap_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_configmap_labels gauge +kube_configmap_labels{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_labels{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_labels{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kube-proxy"} 1 +kube_configmap_labels{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_labels{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_labels{namespace="default",configmap="example-redis-config"} 1 +# HELP kube_configmap_info [STABLE] Information about configmap. +# TYPE kube_configmap_info gauge +kube_configmap_info{namespace="local-path-storage",configmap="local-path-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="kubeadm-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="kubelet-config"} 1 +kube_configmap_info{namespace="kube-public",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="default",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-system",configmap="coredns"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1 +kube_configmap_info{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1 +kube_configmap_info{namespace="default",configmap="example-redis-config"} 1 +kube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1 +kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1 +# HELP kube_configmap_created [STABLE] Unix creation timestamp +# TYPE kube_configmap_created gauge +kube_configmap_created{namespace="kube-public",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="local-path-storage",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.69156634e+09 +kube_configmap_created{namespace="local-path-storage",configmap="local-path-config"} 1.691566343e+09 +kube_configmap_created{namespace="kube-system",configmap="kubeadm-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-system",configmap="kubelet-config"} 1.691566339e+09 +kube_configmap_created{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="default",configmap="example-redis-config"} 1.691568526e+09 +kube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.691566337e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-proxy"} 1.69156634e+09 +kube_configmap_created{namespace="kube-system",configmap="kube-root-ca.crt"} 1.691566353e+09 +kube_configmap_created{namespace="kube-public",configmap="cluster-info"} 1.69156634e+09 +# HELP kube_configmap_metadata_resource_version Resource version representing a specific version of the configmap. +# TYPE kube_configmap_metadata_resource_version gauge +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 238 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-root-ca.crt"} 341 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 360 +kube_configmap_metadata_resource_version{namespace="kube-node-lease",configmap="kube-root-ca.crt"} 343 +kube_configmap_metadata_resource_version{namespace="default",configmap="example-redis-config"} 3691 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="extension-apiserver-authentication"} 26 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="coredns"} 231 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="local-path-config"} 270 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubeadm-config"} 198 +kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kubelet-config"} 202 +kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 342 +kube_configmap_metadata_resource_version{namespace="default",configmap="kube-root-ca.crt"} 344 +kube_configmap_metadata_resource_version{namespace="local-path-storage",configmap="kube-root-ca.crt"} 345 +# HELP kube_cronjob_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_cronjob_annotations gauge +kube_cronjob_annotations{namespace="default",cronjob="hello"} 1 +# HELP kube_cronjob_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_cronjob_labels gauge +kube_cronjob_labels{namespace="default",cronjob="hello"} 1 +# HELP kube_cronjob_info [STABLE] Info about cronjob. +# TYPE kube_cronjob_info gauge +kube_cronjob_info{namespace="default",cronjob="hello",schedule="*/1 * * * *",concurrency_policy="Allow"} 1 +# HELP kube_cronjob_created [STABLE] Unix creation timestamp +# TYPE kube_cronjob_created gauge +kube_cronjob_created{namespace="default",cronjob="hello"} 1.691568526e+09 +# HELP kube_cronjob_status_active [STABLE] Active holds pointers to currently running jobs. +# TYPE kube_cronjob_status_active gauge +kube_cronjob_status_active{namespace="default",cronjob="hello"} 0 +# HELP kube_cronjob_status_last_schedule_time [STABLE] LastScheduleTime keeps information of when was the last time the job was successfully scheduled. +# TYPE kube_cronjob_status_last_schedule_time gauge +kube_cronjob_status_last_schedule_time{namespace="default",cronjob="hello"} 1.69156854e+09 +# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully. +# TYPE kube_cronjob_status_last_successful_time gauge +kube_cronjob_status_last_successful_time{namespace="default",cronjob="hello"} 1.691568544e+09 +# HELP kube_cronjob_spec_suspend [STABLE] Suspend flag tells the controller to suspend subsequent executions. +# TYPE kube_cronjob_spec_suspend gauge +kube_cronjob_spec_suspend{namespace="default",cronjob="hello"} 0 +# HELP kube_cronjob_spec_starting_deadline_seconds [STABLE] Deadline in seconds for starting the job if it misses scheduled time for any reason. +# TYPE kube_cronjob_spec_starting_deadline_seconds gauge +# HELP kube_cronjob_next_schedule_time [STABLE] Next time the cronjob should be scheduled. The time after lastScheduleTime, or after the cron job's creation time if it's never been scheduled. Use this to determine if the job is delayed. +# TYPE kube_cronjob_next_schedule_time gauge +kube_cronjob_next_schedule_time{namespace="default",cronjob="hello"} 1.6915686e+09 +# HELP kube_cronjob_metadata_resource_version [STABLE] Resource version representing a specific version of the cronjob. +# TYPE kube_cronjob_metadata_resource_version gauge +kube_cronjob_metadata_resource_version{namespace="default",cronjob="hello"} 3811 +# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved. +# TYPE kube_cronjob_spec_successful_job_history_limit gauge +kube_cronjob_spec_successful_job_history_limit{namespace="default",cronjob="hello"} 3 +# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved. +# TYPE kube_cronjob_spec_failed_job_history_limit gauge +kube_cronjob_spec_failed_job_history_limit{namespace="default",cronjob="hello"} 1 +# HELP kube_daemonset_created [STABLE] Unix creation timestamp +# TYPE kube_daemonset_created gauge +kube_daemonset_created{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1.691568526e+09 +kube_daemonset_created{namespace="kube-system",daemonset="kube-proxy"} 1.69156634e+09 +kube_daemonset_created{namespace="kube-system",daemonset="kindnet"} 1.691566342e+09 +# HELP kube_daemonset_status_current_number_scheduled [STABLE] The number of nodes running at least one daemon pod and are supposed to. +# TYPE kube_daemonset_status_current_number_scheduled gauge +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_current_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_status_desired_number_scheduled [STABLE] The number of nodes that should be running the daemon pod. +# TYPE kube_daemonset_status_desired_number_scheduled gauge +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_desired_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_status_number_available [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available +# TYPE kube_daemonset_status_number_available gauge +kube_daemonset_status_number_available{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_available{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_status_number_misscheduled [STABLE] The number of nodes running a daemon pod but are not supposed to. +# TYPE kube_daemonset_status_number_misscheduled gauge +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kube-proxy"} 0 +kube_daemonset_status_number_misscheduled{namespace="kube-system",daemonset="kindnet"} 0 +# HELP kube_daemonset_status_number_ready [STABLE] The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready. +# TYPE kube_daemonset_status_number_ready gauge +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_number_ready{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_status_number_unavailable [STABLE] The number of nodes that should be running the daemon pod and have none of the daemon pod running and available +# TYPE kube_daemonset_status_number_unavailable gauge +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kube-proxy"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="kindnet"} 0 +kube_daemonset_status_number_unavailable{namespace="kube-system",daemonset="fluentd-elasticsearch"} 0 +# HELP kube_daemonset_status_observed_generation [STABLE] The most recent generation observed by the daemon set controller. +# TYPE kube_daemonset_status_observed_generation gauge +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_observed_generation{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_status_updated_number_scheduled [STABLE] The total number of nodes that are running updated daemon pod +# TYPE kube_daemonset_status_updated_number_scheduled gauge +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_status_updated_number_scheduled{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_daemonset_metadata_generation gauge +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_metadata_generation{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_daemonset_annotations gauge +kube_daemonset_annotations{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_annotations{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_daemonset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_daemonset_labels gauge +kube_daemonset_labels{namespace="kube-system",daemonset="fluentd-elasticsearch"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="kube-proxy"} 1 +kube_daemonset_labels{namespace="kube-system",daemonset="kindnet"} 1 +# HELP kube_deployment_created [STABLE] Unix creation timestamp +# TYPE kube_deployment_created gauge +kube_deployment_created{namespace="kube-system",deployment="coredns"} 1.69156634e+09 +kube_deployment_created{namespace="local-path-storage",deployment="local-path-provisioner"} 1.691566342e+09 +kube_deployment_created{namespace="kube-system",deployment="kube-state-metrics"} 1.691568526e+09 +# HELP kube_deployment_status_replicas [STABLE] The number of replicas per deployment. +# TYPE kube_deployment_status_replicas gauge +kube_deployment_status_replicas{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_replicas_ready [STABLE] The number of ready replicas per deployment. +# TYPE kube_deployment_status_replicas_ready gauge +kube_deployment_status_replicas_ready{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_ready{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas_ready{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_replicas_available [STABLE] The number of available replicas per deployment. +# TYPE kube_deployment_status_replicas_available gauge +kube_deployment_status_replicas_available{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_available{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas_available{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_replicas_unavailable [STABLE] The number of unavailable replicas per deployment. +# TYPE kube_deployment_status_replicas_unavailable gauge +kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="coredns"} 0 +kube_deployment_status_replicas_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_status_replicas_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 +# HELP kube_deployment_status_replicas_updated [STABLE] The number of updated replicas per deployment. +# TYPE kube_deployment_status_replicas_updated gauge +kube_deployment_status_replicas_updated{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_status_replicas_updated{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_replicas_updated{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_observed_generation [STABLE] The generation observed by the deployment controller. +# TYPE kube_deployment_status_observed_generation gauge +kube_deployment_status_observed_generation{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_status_observed_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_status_observed_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_status_condition [STABLE] The current status conditions of a deployment. +# TYPE kube_deployment_status_condition gauge +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="kube-state-metrics",condition="Progressing",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="kube-system",deployment="coredns",condition="Progressing",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Available",status="unknown"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="true"} 1 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="false"} 0 +kube_deployment_status_condition{namespace="local-path-storage",deployment="local-path-provisioner",condition="Progressing",status="unknown"} 0 +# HELP kube_deployment_spec_replicas [STABLE] Number of desired pods for a deployment. +# TYPE kube_deployment_spec_replicas gauge +kube_deployment_spec_replicas{namespace="kube-system",deployment="coredns"} 2 +kube_deployment_spec_replicas{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_spec_replicas{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_spec_paused [STABLE] Whether the deployment is paused and will not be processed by the deployment controller. +# TYPE kube_deployment_spec_paused gauge +kube_deployment_spec_paused{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_spec_paused{namespace="kube-system",deployment="kube-state-metrics"} 0 +kube_deployment_spec_paused{namespace="kube-system",deployment="coredns"} 0 +# HELP kube_deployment_spec_strategy_rollingupdate_max_unavailable [STABLE] Maximum number of unavailable replicas during a rolling update of a deployment. +# TYPE kube_deployment_spec_strategy_rollingupdate_max_unavailable gauge +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="local-path-storage",deployment="local-path-provisioner"} 0 +kube_deployment_spec_strategy_rollingupdate_max_unavailable{namespace="kube-system",deployment="kube-state-metrics"} 0 +# HELP kube_deployment_spec_strategy_rollingupdate_max_surge [STABLE] Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. +# TYPE kube_deployment_spec_strategy_rollingupdate_max_surge gauge +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_spec_strategy_rollingupdate_max_surge{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_deployment_metadata_generation gauge +kube_deployment_metadata_generation{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_metadata_generation{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_metadata_generation{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_deployment_annotations gauge +kube_deployment_annotations{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_annotations{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_deployment_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_deployment_labels gauge +kube_deployment_labels{namespace="kube-system",deployment="coredns"} 1 +kube_deployment_labels{namespace="local-path-storage",deployment="local-path-provisioner"} 1 +kube_deployment_labels{namespace="kube-system",deployment="kube-state-metrics"} 1 +# HELP kube_endpoint_info [STABLE] Information about endpoint. +# TYPE kube_endpoint_info gauge +kube_endpoint_info{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_info{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_info{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_created [STABLE] Unix creation timestamp +# TYPE kube_endpoint_created gauge +kube_endpoint_created{namespace="default",endpoint="kubernetes"} 1.691566338e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-dns"} 1.691566354e+09 +kube_endpoint_created{namespace="kube-system",endpoint="kube-state-metrics"} 1.691568526e+09 +# HELP kube_endpoint_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_endpoint_annotations gauge +kube_endpoint_annotations{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_annotations{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_annotations{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_endpoint_labels gauge +kube_endpoint_labels{namespace="default",endpoint="kubernetes"} 1 +kube_endpoint_labels{namespace="kube-system",endpoint="kube-dns"} 1 +kube_endpoint_labels{namespace="kube-system",endpoint="kube-state-metrics"} 1 +# HELP kube_endpoint_address_available (Deprecated since v2.6.0) Number of addresses available in endpoint. +# TYPE kube_endpoint_address_available gauge +kube_endpoint_address_available{namespace="kube-system",endpoint="kube-dns"} 6 +kube_endpoint_address_available{namespace="kube-system",endpoint="kube-state-metrics"} 2 +kube_endpoint_address_available{namespace="default",endpoint="kubernetes"} 1 +# HELP kube_endpoint_address_not_ready (Deprecated since v2.6.0) Number of addresses not ready in endpoint +# TYPE kube_endpoint_address_not_ready gauge +kube_endpoint_address_not_ready{namespace="default",endpoint="kubernetes"} 0 +kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-dns"} 0 +kube_endpoint_address_not_ready{namespace="kube-system",endpoint="kube-state-metrics"} 0 +# HELP kube_endpoint_address [STABLE] Information about Endpoint available and non available addresses. +# TYPE kube_endpoint_address gauge +kube_endpoint_address{namespace="default",endpoint="kubernetes",ip="172.18.0.2",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.2",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-dns",ip="10.244.0.3",ready="true"} 1 +kube_endpoint_address{namespace="kube-system",endpoint="kube-state-metrics",ip="10.244.0.18",ready="true"} 1 +# HELP kube_endpoint_ports [STABLE] Information about the Endpoint ports. +# TYPE kube_endpoint_ports gauge +kube_endpoint_ports{namespace="default",endpoint="kubernetes",port_name="https",port_protocol="TCP",port_number="6443"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns-tcp",port_protocol="TCP",port_number="53"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="dns",port_protocol="UDP",port_number="53"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-dns",port_name="metrics",port_protocol="TCP",port_number="9153"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="telemetry",port_protocol="TCP",port_number="8081"} 1 +kube_endpoint_ports{namespace="kube-system",endpoint="kube-state-metrics",port_name="http-metrics",port_protocol="TCP",port_number="8080"} 1 +# HELP kube_horizontalpodautoscaler_info Information about this autoscaler. +# TYPE kube_horizontalpodautoscaler_info gauge +# HELP kube_horizontalpodautoscaler_metadata_generation [STABLE] The generation observed by the HorizontalPodAutoscaler controller. +# TYPE kube_horizontalpodautoscaler_metadata_generation gauge +# HELP kube_horizontalpodautoscaler_spec_max_replicas [STABLE] Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. +# TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge +# HELP kube_horizontalpodautoscaler_spec_min_replicas [STABLE] Lower limit for the number of pods that can be set by the autoscaler, default 1. +# TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge +# HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. +# TYPE kube_horizontalpodautoscaler_spec_target_metric gauge +# HELP kube_horizontalpodautoscaler_status_target_metric The current metric status used by this autoscaler when calculating the desired replica count. +# TYPE kube_horizontalpodautoscaler_status_target_metric gauge +# HELP kube_horizontalpodautoscaler_status_current_replicas [STABLE] Current number of replicas of pods managed by this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_current_replicas gauge +# HELP kube_horizontalpodautoscaler_status_desired_replicas [STABLE] Desired number of replicas of pods managed by this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge +# HELP kube_horizontalpodautoscaler_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_horizontalpodautoscaler_annotations gauge +# HELP kube_horizontalpodautoscaler_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_horizontalpodautoscaler_labels gauge +# HELP kube_horizontalpodautoscaler_status_condition [STABLE] The condition of this autoscaler. +# TYPE kube_horizontalpodautoscaler_status_condition gauge +# HELP kube_ingress_info [STABLE] Information about ingress. +# TYPE kube_ingress_info gauge +# HELP kube_ingress_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_ingress_annotations gauge +# HELP kube_ingress_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_ingress_labels gauge +# HELP kube_ingress_created [STABLE] Unix creation timestamp +# TYPE kube_ingress_created gauge +# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress. +# TYPE kube_ingress_metadata_resource_version gauge +# HELP kube_ingress_path [STABLE] Ingress host, paths and backend service information. +# TYPE kube_ingress_path gauge +# HELP kube_ingress_tls [STABLE] Ingress TLS host and secret information. +# TYPE kube_ingress_tls gauge +# HELP kube_job_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_job_annotations gauge +kube_job_annotations{namespace="default",job_name="hello"} 1 +kube_job_annotations{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_job_labels gauge +kube_job_labels{namespace="default",job_name="hello"} 1 +kube_job_labels{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_info [STABLE] Information about job. +# TYPE kube_job_info gauge +kube_job_info{namespace="default",job_name="hello"} 1 +kube_job_info{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_created [STABLE] Unix creation timestamp +# TYPE kube_job_created gauge +kube_job_created{namespace="default",job_name="hello-28192809"} 1.69156854e+09 +kube_job_created{namespace="default",job_name="hello"} 1.691568526e+09 +# HELP kube_job_spec_parallelism [STABLE] The maximum desired number of pods the job should run at any given time. +# TYPE kube_job_spec_parallelism gauge +kube_job_spec_parallelism{namespace="default",job_name="hello"} 1 +kube_job_spec_parallelism{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_spec_completions [STABLE] The desired number of successfully finished pods the job should be run with. +# TYPE kube_job_spec_completions gauge +kube_job_spec_completions{namespace="default",job_name="hello"} 1 +kube_job_spec_completions{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_spec_active_deadline_seconds [STABLE] The duration in seconds relative to the startTime that the job may be active before the system tries to terminate it. +# TYPE kube_job_spec_active_deadline_seconds gauge +# HELP kube_job_status_succeeded [STABLE] The number of pods which reached Phase Succeeded. +# TYPE kube_job_status_succeeded gauge +kube_job_status_succeeded{namespace="default",job_name="hello"} 1 +kube_job_status_succeeded{namespace="default",job_name="hello-28192809"} 1 +# HELP kube_job_status_failed [STABLE] The number of pods which reached Phase Failed and the reason for failure. +# TYPE kube_job_status_failed gauge +kube_job_status_failed{namespace="default",job_name="hello"} 0 +kube_job_status_failed{namespace="default",job_name="hello-28192809"} 0 +# HELP kube_job_status_active [STABLE] The number of actively running pods. +# TYPE kube_job_status_active gauge +kube_job_status_active{namespace="default",job_name="hello"} 0 +kube_job_status_active{namespace="default",job_name="hello-28192809"} 0 +# HELP kube_job_complete [STABLE] The job has completed its execution. +# TYPE kube_job_complete gauge +kube_job_complete{namespace="default",job_name="hello",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello",condition="unknown"} 0 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="true"} 1 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="false"} 0 +kube_job_complete{namespace="default",job_name="hello-28192809",condition="unknown"} 0 +# HELP kube_job_failed [STABLE] The job has failed its execution. +# TYPE kube_job_failed gauge +# HELP kube_job_status_start_time [STABLE] StartTime represents time when the job was acknowledged by the Job Manager. +# TYPE kube_job_status_start_time gauge +kube_job_status_start_time{namespace="default",job_name="hello"} 1.691568526e+09 +kube_job_status_start_time{namespace="default",job_name="hello-28192809"} 1.69156854e+09 +# HELP kube_job_status_completion_time [STABLE] CompletionTime represents time when the job was completed. +# TYPE kube_job_status_completion_time gauge +kube_job_status_completion_time{namespace="default",job_name="hello"} 1.691568531e+09 +kube_job_status_completion_time{namespace="default",job_name="hello-28192809"} 1.691568544e+09 +# HELP kube_job_owner [STABLE] Information about the Job's owner. +# TYPE kube_job_owner gauge +kube_job_owner{namespace="default",job_name="hello",owner_kind="",owner_name="",owner_is_controller=""} 1 +kube_job_owner{namespace="default",job_name="hello-28192809",owner_kind="CronJob",owner_name="hello",owner_is_controller="true"} 1 +# HELP kube_lease_owner Information about the Lease's owner. +# TYPE kube_lease_owner gauge +kube_lease_owner{lease="kube-controller-manager",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_0b4da5ad-3d3f-46e1-a9a7-f3de4500210d"} 1 +kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane",namespace="kube-node-lease",lease_holder="kind-control-plane"} 1 +kube_lease_owner{lease="kube-scheduler",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kind-control-plane_1ccae8c1-4c4b-4f22-ba9f-4001d58bbbeb"} 1 +kube_lease_owner{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a",owner_kind="",owner_name="",namespace="kube-system",lease_holder="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_eb429ff6-d4a0-49b6-ae35-4471a79c6c25"} 1 +# HELP kube_lease_renew_time Kube lease renew time. +# TYPE kube_lease_renew_time gauge +kube_lease_renew_time{lease="kind-control-plane",namespace="kube-node-lease"} 1.691568555e+09 +kube_lease_renew_time{lease="kube-scheduler",namespace="kube-system"} 1.691568554e+09 +kube_lease_renew_time{lease="kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a",namespace="kube-system"} 1.691568549e+09 +kube_lease_renew_time{lease="kube-controller-manager",namespace="kube-system"} 1.691568553e+09 +# HELP kube_limitrange [STABLE] Information about limit range. +# TYPE kube_limitrange gauge +# HELP kube_limitrange_created [STABLE] Unix creation timestamp +# TYPE kube_limitrange_created gauge +# HELP kube_mutatingwebhookconfiguration_info Information about the MutatingWebhookConfiguration. +# TYPE kube_mutatingwebhookconfiguration_info gauge +# HELP kube_mutatingwebhookconfiguration_created Unix creation timestamp. +# TYPE kube_mutatingwebhookconfiguration_created gauge +# HELP kube_mutatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the MutatingWebhookConfiguration. +# TYPE kube_mutatingwebhookconfiguration_metadata_resource_version gauge +# HELP kube_namespace_created [STABLE] Unix creation timestamp +# TYPE kube_namespace_created gauge +kube_namespace_created{namespace="kube-system"} 1.691566337e+09 +kube_namespace_created{namespace="kube-public"} 1.691566337e+09 +kube_namespace_created{namespace="kube-node-lease"} 1.691566337e+09 +kube_namespace_created{namespace="default"} 1.691566338e+09 +kube_namespace_created{namespace="local-path-storage"} 1.691566342e+09 +# HELP kube_namespace_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_namespace_annotations gauge +kube_namespace_annotations{namespace="kube-system"} 1 +kube_namespace_annotations{namespace="kube-public"} 1 +kube_namespace_annotations{namespace="kube-node-lease"} 1 +kube_namespace_annotations{namespace="default"} 1 +kube_namespace_annotations{namespace="local-path-storage"} 1 +# HELP kube_namespace_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_namespace_labels gauge +kube_namespace_labels{namespace="default"} 1 +kube_namespace_labels{namespace="local-path-storage"} 1 +kube_namespace_labels{namespace="kube-system"} 1 +kube_namespace_labels{namespace="kube-public"} 1 +kube_namespace_labels{namespace="kube-node-lease"} 1 +# HELP kube_namespace_status_phase [STABLE] kubernetes namespace status phase. +# TYPE kube_namespace_status_phase gauge +kube_namespace_status_phase{namespace="local-path-storage",phase="Active"} 1 +kube_namespace_status_phase{namespace="local-path-storage",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="kube-system",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-system",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="kube-public",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-public",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="kube-node-lease",phase="Active"} 1 +kube_namespace_status_phase{namespace="kube-node-lease",phase="Terminating"} 0 +kube_namespace_status_phase{namespace="default",phase="Active"} 1 +kube_namespace_status_phase{namespace="default",phase="Terminating"} 0 +# HELP kube_namespace_status_condition The condition of a namespace. +# TYPE kube_namespace_status_condition gauge +# HELP kube_networkpolicy_created Unix creation timestamp of network policy +# TYPE kube_networkpolicy_created gauge +# HELP kube_networkpolicy_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_networkpolicy_annotations gauge +# HELP kube_networkpolicy_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_networkpolicy_labels gauge +# HELP kube_networkpolicy_spec_ingress_rules Number of ingress rules on the networkpolicy +# TYPE kube_networkpolicy_spec_ingress_rules gauge +# HELP kube_networkpolicy_spec_egress_rules Number of egress rules on the networkpolicy +# TYPE kube_networkpolicy_spec_egress_rules gauge +# HELP kube_node_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_node_annotations gauge +kube_node_annotations{node="kind-control-plane"} 1 +# HELP kube_node_created [STABLE] Unix creation timestamp +# TYPE kube_node_created gauge +kube_node_created{node="kind-control-plane"} 1.691566337e+09 +# HELP kube_node_deletion_timestamp Unix deletion timestamp +# TYPE kube_node_deletion_timestamp gauge +# HELP kube_node_info [STABLE] Information about a cluster node. +# TYPE kube_node_info gauge +kube_node_info{node="kind-control-plane",kernel_version="5.15.49-linuxkit-pr",os_image="Ubuntu 22.04.2 LTS",container_runtime_version="containerd://1.6.19-46-g941215f49",kubelet_version="v1.26.3",kubeproxy_version="v1.26.3",provider_id="kind://docker/kind/kind-control-plane",pod_cidr="10.244.0.0/24",system_uuid="da6f977ba55a4ef5a3240dbd88134863",internal_ip="172.18.0.2"} 1 +# HELP kube_node_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_node_labels gauge +kube_node_labels{node="kind-control-plane"} 1 +# HELP kube_node_role The role of a cluster node. +# TYPE kube_node_role gauge +kube_node_role{node="kind-control-plane",role="control-plane"} 1 +# HELP kube_node_spec_taint [STABLE] The taint of a cluster node. +# TYPE kube_node_spec_taint gauge +# HELP kube_node_spec_unschedulable [STABLE] Whether a node can schedule new pods. +# TYPE kube_node_spec_unschedulable gauge +kube_node_spec_unschedulable{node="kind-control-plane"} 0 +# HELP kube_node_status_allocatable [STABLE] The allocatable for different resources of a node that are available for scheduling. +# TYPE kube_node_status_allocatable gauge +kube_node_status_allocatable{node="kind-control-plane",resource="cpu",unit="core"} 8 +kube_node_status_allocatable{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 +kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 +kube_node_status_allocatable{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 +kube_node_status_allocatable{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 +kube_node_status_allocatable{node="kind-control-plane",resource="pods",unit="integer"} 110 +# HELP kube_node_status_capacity [STABLE] The capacity for different resources of a node. +# TYPE kube_node_status_capacity gauge +kube_node_status_capacity{node="kind-control-plane",resource="ephemeral_storage",unit="byte"} 6.7317051392e+10 +kube_node_status_capacity{node="kind-control-plane",resource="hugepages_1Gi",unit="byte"} 0 +kube_node_status_capacity{node="kind-control-plane",resource="hugepages_2Mi",unit="byte"} 0 +kube_node_status_capacity{node="kind-control-plane",resource="memory",unit="byte"} 1.6259682304e+10 +kube_node_status_capacity{node="kind-control-plane",resource="pods",unit="integer"} 110 +kube_node_status_capacity{node="kind-control-plane",resource="cpu",unit="core"} 8 +# HELP kube_node_status_condition [STABLE] The condition of a cluster node. +# TYPE kube_node_status_condition gauge +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="MemoryPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="DiskPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="true"} 0 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="false"} 1 +kube_node_status_condition{node="kind-control-plane",condition="PIDPressure",status="unknown"} 0 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="true"} 1 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="false"} 0 +kube_node_status_condition{node="kind-control-plane",condition="Ready",status="unknown"} 0 +# HELP kube_persistentvolumeclaim_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_persistentvolumeclaim_labels gauge +kube_persistentvolumeclaim_labels{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 +# HELP kube_persistentvolumeclaim_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_persistentvolumeclaim_annotations gauge +kube_persistentvolumeclaim_annotations{namespace="default",persistentvolumeclaim="task-pv-claim"} 1 +# HELP kube_persistentvolumeclaim_info [STABLE] Information about persistent volume claim. +# TYPE kube_persistentvolumeclaim_info gauge +kube_persistentvolumeclaim_info{namespace="default",persistentvolumeclaim="task-pv-claim",storageclass="generic",volumename="task-pv-volume"} 1 +# HELP kube_persistentvolumeclaim_status_phase [STABLE] The phase the persistent volume claim is currently in. +# TYPE kube_persistentvolumeclaim_status_phase gauge +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Lost"} 0 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Bound"} 1 +kube_persistentvolumeclaim_status_phase{namespace="default",persistentvolumeclaim="task-pv-claim",phase="Pending"} 0 +# HELP kube_persistentvolumeclaim_resource_requests_storage_bytes [STABLE] The capacity of storage requested by the persistent volume claim. +# TYPE kube_persistentvolumeclaim_resource_requests_storage_bytes gauge +kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="default",persistentvolumeclaim="task-pv-claim"} 1024 +# HELP kube_persistentvolumeclaim_access_mode [STABLE] The access mode(s) specified by the persistent volume claim. +# TYPE kube_persistentvolumeclaim_access_mode gauge +kube_persistentvolumeclaim_access_mode{namespace="default",persistentvolumeclaim="task-pv-claim",access_mode="ReadWriteOnce"} 1 +# HELP kube_persistentvolumeclaim_status_condition Information about status of different conditions of persistent volume claim. +# TYPE kube_persistentvolumeclaim_status_condition gauge +# HELP kube_persistentvolumeclaim_created Unix creation timestamp +# TYPE kube_persistentvolumeclaim_created gauge +kube_persistentvolumeclaim_created{namespace="default",persistentvolumeclaim="task-pv-claim"} 1.691568526e+09 +# HELP kube_persistentvolume_claim_ref [STABLE] Information about the Persistent Volume Claim Reference. +# TYPE kube_persistentvolume_claim_ref gauge +kube_persistentvolume_claim_ref{persistentvolume="task-pv-volume",name="task-pv-claim",claim_namespace="default"} 1 +# HELP kube_persistentvolume_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_persistentvolume_annotations gauge +kube_persistentvolume_annotations{persistentvolume="task-pv-volume"} 1 +# HELP kube_persistentvolume_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_persistentvolume_labels gauge +kube_persistentvolume_labels{persistentvolume="task-pv-volume"} 1 +# HELP kube_persistentvolume_status_phase [STABLE] The phase indicates if a volume is available, bound to a claim, or released by a claim. +# TYPE kube_persistentvolume_status_phase gauge +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Pending"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Available"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Bound"} 1 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Released"} 0 +kube_persistentvolume_status_phase{persistentvolume="task-pv-volume",phase="Failed"} 0 +# HELP kube_persistentvolume_info [STABLE] Information about persistentvolume. +# TYPE kube_persistentvolume_info gauge +kube_persistentvolume_info{persistentvolume="task-pv-volume",storageclass="generic",gce_persistent_disk_name="",ebs_volume_id="",azure_disk_name="",fc_wwids="",fc_lun="",fc_target_wwns="",iscsi_target_portal="",iscsi_iqn="",iscsi_lun="",iscsi_initiator_name="",nfs_server="",nfs_path="",csi_driver="",csi_volume_handle="",local_path="",local_fs="",host_path="/tmp/data",host_path_type=""} 1 +# HELP kube_persistentvolume_capacity_bytes [STABLE] Persistentvolume capacity in bytes. +# TYPE kube_persistentvolume_capacity_bytes gauge +kube_persistentvolume_capacity_bytes{persistentvolume="task-pv-volume"} 2048 +# HELP kube_persistentvolume_created Unix creation timestamp +# TYPE kube_persistentvolume_created gauge +kube_persistentvolume_created{persistentvolume="task-pv-volume"} 1.691568526e+09 +# HELP kube_poddisruptionbudget_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_poddisruptionbudget_annotations gauge +# HELP kube_poddisruptionbudget_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_poddisruptionbudget_labels gauge +# HELP kube_poddisruptionbudget_created [STABLE] Unix creation timestamp +# TYPE kube_poddisruptionbudget_created gauge +# HELP kube_poddisruptionbudget_status_current_healthy [STABLE] Current number of healthy pods +# TYPE kube_poddisruptionbudget_status_current_healthy gauge +# HELP kube_poddisruptionbudget_status_desired_healthy [STABLE] Minimum desired number of healthy pods +# TYPE kube_poddisruptionbudget_status_desired_healthy gauge +# HELP kube_poddisruptionbudget_status_pod_disruptions_allowed [STABLE] Number of pod disruptions that are currently allowed +# TYPE kube_poddisruptionbudget_status_pod_disruptions_allowed gauge +# HELP kube_poddisruptionbudget_status_expected_pods [STABLE] Total number of pods counted by this disruption budget +# TYPE kube_poddisruptionbudget_status_expected_pods gauge +# HELP kube_poddisruptionbudget_status_observed_generation [STABLE] Most recent generation observed when updating this PDB status +# TYPE kube_poddisruptionbudget_status_observed_generation gauge +# HELP kube_pod_completion_time [STABLE] Completion time in unix timestamp for a pod. +# TYPE kube_pod_completion_time gauge +kube_pod_completion_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568527e+09 +kube_pod_completion_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +# HELP kube_pod_container_info [STABLE] Information about a container in a pod. +# TYPE kube_pod_container_info gauge +kube_pod_container_info{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76"} 1 +kube_pod_container_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",image_spec="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",image="sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb",image_id="docker.io/kindest/kindnetd:v20230330-48f316cd@sha256:c19d6362a6a928139820761475a38c24c0cf84d507b9ddf414a078cf627497af",container_id="containerd://c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy",image_spec="registry.k8s.io/kube-proxy:v1.26.3",image="registry.k8s.io/kube-proxy:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:44db4d50a5f9c8efbac0d37ea974d1c0419a5928f90748d3d491a041a00c20b5",container_id="containerd://c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics",image_spec="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2",image="registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2",image_id="registry.k8s.io/kube-state-metrics/kube-state-metrics@sha256:5ac2e67a862cd3baa0eb4fd7683d54928fd76ea3a61cde50508922c956901d8c",container_id="containerd://d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23"} 1 +kube_pod_container_info{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",image_spec="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image="quay.io/fluentd_elasticsearch/fluentd:v2.5.2",image_id="sha256:c896ab1149bb529ca28d76976885e04c0d754b6592f74b5478bfdcf248f84e62",container_id="containerd://d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",image_spec="registry.k8s.io/kube-scheduler:v1.26.3",image="registry.k8s.io/kube-scheduler:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:3dd2337f70af979c7362b5e52bbdfcb3a5fd39c78d94d02145150cd2db86ba39",container_id="containerd://abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36"} 1 +kube_pod_container_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",image_spec="registry.k8s.io/coredns/coredns:v1.9.3",image="registry.k8s.io/coredns/coredns:v1.9.3",image_id="sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a",container_id="containerd://acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",image_spec="registry.k8s.io/kube-apiserver:v1.26.3",image="registry.k8s.io/kube-apiserver:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:ba097b515c8c40689733c0f19de377e9bf8995964b7d7150c2045f3dfd166657",container_id="containerd://146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427"} 1 +kube_pod_container_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner",image_spec="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",image="sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc",image_id="docker.io/kindest/local-path-provisioner:v0.0.23-kind.0@sha256:f2d0a02831ff3a03cf51343226670d5060623b43a4cfc4808bd0875b2c4b9501",container_id="containerd://0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece"} 1 +kube_pod_container_info{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx",image_spec="docker.io/nginx:1.24.0-alpine-slim",image="docker.io/library/nginx:1.24.0-alpine-slim",image_id="docker.io/library/nginx@sha256:b8132df8c2fc73f4c1e7ce434c1ff19b134818e8173cd5e8f79c55a5f635d7e5",container_id="containerd://861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063"} 1 +kube_pod_container_info{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello",image_spec="busybox",image="docker.io/library/busybox:latest",image_id="docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79",container_id="containerd://332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910"} 1 +kube_pod_container_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",image_spec="registry.k8s.io/kube-controller-manager:v1.26.3",image="registry.k8s.io/kube-controller-manager:v1.26.3",image_id="docker.io/library/import-2023-03-30@sha256:8dbb345de79d1c44f59a7895da702a5f71997ae72aea056609445c397b0c10dc",container_id="containerd://9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7"} 1 +kube_pod_container_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",image_spec="registry.k8s.io/etcd:3.5.6-0",image="registry.k8s.io/etcd:3.5.6-0",image_id="sha256:fce326961ae2d51a5f726883fd59d2a8c2ccc3e45d3bb859882db58e422e59e7",container_id="containerd://a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068"} 1 +# HELP kube_pod_container_resource_limits The number of requested limit resource by a container. It is recommended to use the kube_pod_resource_limits metric exposed by kube-scheduler instead, as it is more precise. +# TYPE kube_pod_container_resource_limits gauge +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_limits{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 1.7825792e+08 +kube_pod_container_resource_limits{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +# HELP kube_pod_container_resource_requests The number of requested request resource by a container. It is recommended to use the kube_pod_resource_requests metric exposed by kube-scheduler instead, as it is more precise. +# TYPE kube_pod_container_resource_requests gauge +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver",node="kind-control-plane",resource="cpu",unit="core"} 0.25 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd",node="kind-control-plane",resource="memory",unit="byte"} 1.048576e+08 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager",node="kind-control-plane",resource="cpu",unit="core"} 0.2 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni",node="kind-control-plane",resource="memory",unit="byte"} 5.24288e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns",node="kind-control-plane",resource="memory",unit="byte"} 7.340032e+07 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +kube_pod_container_resource_requests{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch",node="kind-control-plane",resource="memory",unit="byte"} 2.097152e+08 +kube_pod_container_resource_requests{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler",node="kind-control-plane",resource="cpu",unit="core"} 0.1 +# HELP kube_pod_container_state_started [STABLE] Start time in unix timestamp for a pod container. +# TYPE kube_pod_container_state_started gauge +kube_pod_container_state_started{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1.69156636e+09 +kube_pod_container_state_started{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1.691566361e+09 +kube_pod_container_state_started{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1.691566332e+09 +kube_pod_container_state_started{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1.691566334e+09 +kube_pod_container_state_started{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 1.691568527e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1.691566357e+09 +kube_pod_container_state_started{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1.691566355e+09 +kube_pod_container_state_started{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 1.69156854e+09 +# HELP kube_pod_container_status_last_terminated_reason Describes the last reason the container was in terminated state. +# TYPE kube_pod_container_status_last_terminated_reason gauge +# HELP kube_pod_container_status_last_terminated_exitcode Describes the exit code for the last container in terminated state. +# TYPE kube_pod_container_status_last_terminated_exitcode gauge +# HELP kube_pod_container_status_ready [STABLE] Describes whether the containers readiness check succeeded. +# TYPE kube_pod_container_status_ready gauge +kube_pod_container_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +# HELP kube_pod_container_status_restarts_total [STABLE] The number of container restarts per container. +# TYPE kube_pod_container_status_restarts_total counter +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_restarts_total{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_restarts_total{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_restarts_total{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +# HELP kube_pod_container_status_running [STABLE] Describes whether the container is currently in running state. +# TYPE kube_pod_container_status_running gauge +kube_pod_container_status_running{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_running{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 1 +kube_pod_container_status_running{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 1 +kube_pod_container_status_running{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 1 +kube_pod_container_status_running{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 1 +kube_pod_container_status_running{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +# HELP kube_pod_container_status_terminated [STABLE] Describes whether the container is currently in terminated state. +# TYPE kube_pod_container_status_terminated gauge +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_terminated{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_terminated{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 1 +kube_pod_container_status_terminated{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_terminated{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_terminated{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 1 +# HELP kube_pod_container_status_terminated_reason Describes the reason the container is currently in terminated state. +# TYPE kube_pod_container_status_terminated_reason gauge +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello",reason="Completed"} 1 +kube_pod_container_status_terminated_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello",reason="Completed"} 1 +# HELP kube_pod_container_status_waiting [STABLE] Describes whether the container is currently in waiting state. +# TYPE kube_pod_container_status_waiting gauge +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",container="kube-proxy"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",container="kindnet-cni"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",container="coredns"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",container="coredns"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",container="kube-state-metrics"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",container="fluentd-elasticsearch"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",container="kube-scheduler"} 0 +kube_pod_container_status_waiting{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",container="nginx"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",container="kube-apiserver"} 0 +kube_pod_container_status_waiting{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",container="local-path-provisioner"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",container="etcd"} 0 +kube_pod_container_status_waiting{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",container="hello"} 0 +kube_pod_container_status_waiting{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",container="kube-controller-manager"} 0 +# HELP kube_pod_container_status_waiting_reason [STABLE] Describes the reason the container is currently in waiting state. +# TYPE kube_pod_container_status_waiting_reason gauge +# HELP kube_pod_created [STABLE] Unix creation timestamp +# TYPE kube_pod_created gauge +kube_pod_created{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566341e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_created{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566354e+09 +kube_pod_created{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.69156634e+09 +kube_pod_created{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_created{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_created{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_created{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_created{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_created{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +# HELP kube_pod_deletion_timestamp Unix deletion timestamp +# TYPE kube_pod_deletion_timestamp gauge +# HELP kube_pod_info [STABLE] Information about pod. +# TYPE kube_pod_info gauge +kube_pod_info{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",host_ip="172.18.0.2",pod_ip="10.244.0.20",node="kind-control-plane",created_by_kind="Job",created_by_name="hello",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kindnet",priority_class="",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="kube-proxy",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",host_ip="172.18.0.2",pod_ip="10.244.0.22",node="kind-control-plane",created_by_kind="Job",created_by_name="hello-28192809",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",host_ip="172.18.0.2",pod_ip="10.244.0.21",node="kind-control-plane",created_by_kind="DaemonSet",created_by_name="fluentd-elasticsearch",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",host_ip="172.18.0.2",pod_ip="10.244.0.2",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",host_ip="172.18.0.2",pod_ip="10.244.0.3",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="coredns-787d4945fb",priority_class="system-cluster-critical",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",host_ip="172.18.0.2",pod_ip="10.244.0.18",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="kube-state-metrics-7bc9d484b6",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",host_ip="172.18.0.2",pod_ip="10.244.0.4",node="kind-control-plane",created_by_kind="ReplicaSet",created_by_name="local-path-provisioner-75f5b54ffd",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",host_ip="172.18.0.2",pod_ip="10.244.0.19",node="kind-control-plane",created_by_kind="StatefulSet",created_by_name="web",priority_class="",host_network="false"} 1 +kube_pod_info{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",host_ip="172.18.0.2",pod_ip="172.18.0.2",node="kind-control-plane",created_by_kind="Node",created_by_name="kind-control-plane",priority_class="system-node-critical",host_network="true"} 1 +# HELP kube_pod_ips Pod IP addresses +# TYPE kube_pod_ips gauge +kube_pod_ips{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",ip="10.244.0.4",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",ip="10.244.0.19",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",ip="10.244.0.20",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",ip="10.244.0.22",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",ip="172.18.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",ip="10.244.0.2",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",ip="10.244.0.3",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",ip="10.244.0.18",ip_family="4"} 1 +kube_pod_ips{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",ip="10.244.0.21",ip_family="4"} 1 +# HELP kube_pod_init_container_info [STABLE] Information about an init container in a pod. +# TYPE kube_pod_init_container_info gauge +# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container. +# TYPE kube_pod_init_container_resource_limits gauge +# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container. +# TYPE kube_pod_init_container_resource_requests gauge +# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state. +# TYPE kube_pod_init_container_status_last_terminated_reason gauge +# HELP kube_pod_init_container_status_ready [STABLE] Describes whether the init containers readiness check succeeded. +# TYPE kube_pod_init_container_status_ready gauge +# HELP kube_pod_init_container_status_restarts_total [STABLE] The number of restarts for the init container. +# TYPE kube_pod_init_container_status_restarts_total counter +# HELP kube_pod_init_container_status_running [STABLE] Describes whether the init container is currently in running state. +# TYPE kube_pod_init_container_status_running gauge +# HELP kube_pod_init_container_status_terminated [STABLE] Describes whether the init container is currently in terminated state. +# TYPE kube_pod_init_container_status_terminated gauge +# HELP kube_pod_init_container_status_terminated_reason Describes the reason the init container is currently in terminated state. +# TYPE kube_pod_init_container_status_terminated_reason gauge +# HELP kube_pod_init_container_status_waiting [STABLE] Describes whether the init container is currently in waiting state. +# TYPE kube_pod_init_container_status_waiting gauge +# HELP kube_pod_init_container_status_waiting_reason Describes the reason the init container is currently in waiting state. +# TYPE kube_pod_init_container_status_waiting_reason gauge +# HELP kube_pod_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_pod_annotations gauge +kube_pod_annotations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1 +kube_pod_annotations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_annotations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_annotations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_annotations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_annotations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_annotations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1 +kube_pod_annotations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_annotations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +kube_pod_annotations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1 +# HELP kube_pod_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_pod_labels gauge +kube_pod_labels{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1 +kube_pod_labels{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1 +kube_pod_labels{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1 +kube_pod_labels{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1 +kube_pod_labels{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1 +kube_pod_labels{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1 +kube_pod_labels{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1 +kube_pod_labels{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1 +kube_pod_labels{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1 +kube_pod_labels{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1 +# HELP kube_pod_overhead_cpu_cores The pod overhead in regards to cpu cores associated with running a pod. +# TYPE kube_pod_overhead_cpu_cores gauge +# HELP kube_pod_overhead_memory_bytes The pod overhead in regards to memory associated with running a pod. +# TYPE kube_pod_overhead_memory_bytes gauge +# HELP kube_pod_owner [STABLE] Information about the Pod's owner. +# TYPE kube_pod_owner gauge +kube_pod_owner{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",owner_kind="ReplicaSet",owner_name="local-path-provisioner-75f5b54ffd",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",owner_kind="StatefulSet",owner_name="web",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",owner_kind="Job",owner_name="hello",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",owner_kind="DaemonSet",owner_name="kindnet",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",owner_kind="DaemonSet",owner_name="kube-proxy",owner_is_controller="true"} 1 +kube_pod_owner{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",owner_kind="Job",owner_name="hello-28192809",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",owner_kind="Node",owner_name="kind-control-plane",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",owner_kind="ReplicaSet",owner_name="coredns-787d4945fb",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",owner_kind="ReplicaSet",owner_name="kube-state-metrics-7bc9d484b6",owner_is_controller="true"} 1 +kube_pod_owner{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",owner_kind="DaemonSet",owner_name="fluentd-elasticsearch",owner_is_controller="true"} 1 +# HELP kube_pod_restart_policy [STABLE] Describes the restart policy in use by this pod. +# TYPE kube_pod_restart_policy gauge +kube_pod_restart_policy{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",type="OnFailure"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",type="Always"} 1 +kube_pod_restart_policy{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",type="Always"} 1 +kube_pod_restart_policy{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",type="Always"} 1 +kube_pod_restart_policy{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",type="Always"} 1 +# HELP kube_pod_runtimeclass_name_info The runtimeclass associated with the pod. +# TYPE kube_pod_runtimeclass_name_info gauge +# HELP kube_pod_spec_volumes_persistentvolumeclaims_info [STABLE] Information about persistentvolumeclaim volumes in a pod. +# TYPE kube_pod_spec_volumes_persistentvolumeclaims_info gauge +# HELP kube_pod_spec_volumes_persistentvolumeclaims_readonly [STABLE] Describes whether a persistentvolumeclaim is mounted read only. +# TYPE kube_pod_spec_volumes_persistentvolumeclaims_readonly gauge +# HELP kube_pod_start_time [STABLE] Start time in unix timestamp for a pod. +# TYPE kube_pod_start_time gauge +kube_pod_start_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_start_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_start_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_start_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_start_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_start_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_start_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 +# HELP kube_pod_status_phase [STABLE] The pods current phase. +# TYPE kube_pod_status_phase gauge +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Pending"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Failed"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Unknown"} 0 +kube_pod_status_phase{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",phase="Running"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Pending"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Succeeded"} 1 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Failed"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Unknown"} 0 +kube_pod_status_phase{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",phase="Running"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",phase="Running"} 1 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Pending"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Succeeded"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Failed"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Unknown"} 0 +kube_pod_status_phase{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",phase="Running"} 1 +# HELP kube_pod_status_qos_class The pods current qosClass. +# TYPE kube_pod_status_qos_class gauge +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",qos_class="Guaranteed"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="BestEffort"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="Burstable"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",qos_class="Guaranteed"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="BestEffort"} 0 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="Burstable"} 1 +kube_pod_status_qos_class{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",qos_class="Guaranteed"} 0 +# HELP kube_pod_status_ready [STABLE] Describes whether the pod is ready to serve requests. +# TYPE kube_pod_status_ready gauge +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="true"} 0 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="false"} 1 +kube_pod_status_ready{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_ready{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_ready{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="true"} 1 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="false"} 0 +kube_pod_status_ready{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="unknown"} 0 +# HELP kube_pod_status_ready_time Readiness achieved time in unix timestamp for a pod. +# TYPE kube_pod_status_ready_time gauge +kube_pod_status_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568537e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568528e+09 +kube_pod_status_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_ready_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568528e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +# HELP kube_pod_status_container_ready_time Readiness achieved time in unix timestamp for a pod containers. +# TYPE kube_pod_status_container_ready_time gauge +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566345e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.691566344e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566357e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566355e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568528e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.691566351e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.69156636e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568537e+09 +kube_pod_status_container_ready_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566362e+09 +kube_pod_status_container_ready_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568528e+09 +kube_pod_status_container_ready_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566343e+09 +# HELP kube_pod_status_reason The pod status reasons +# TYPE kube_pod_status_reason gauge +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Evicted"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="Evicted"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",reason="UnexpectedAdmissionError"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Evicted"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeAffinity"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="NodeLost"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="Shutdown"} 0 +kube_pod_status_reason{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",reason="UnexpectedAdmissionError"} 0 +# HELP kube_pod_status_scheduled [STABLE] Describes the status of the scheduling process for the pod. +# TYPE kube_pod_status_scheduled gauge +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="true"} 1 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="false"} 0 +kube_pod_status_scheduled{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="true"} 1 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="false"} 0 +kube_pod_status_scheduled{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",condition="unknown"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="true"} 1 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="false"} 0 +kube_pod_status_scheduled{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",condition="unknown"} 0 +# HELP kube_pod_status_scheduled_time [STABLE] Unix timestamp when pod moved into scheduled status +# TYPE kube_pod_status_scheduled_time gauge +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3"} 1.691566341e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2"} 1.691566354e+09 +kube_pod_status_scheduled_time{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a"} 1.69156854e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124"} 1.69156634e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231"} 1.691566358e+09 +kube_pod_status_scheduled_time{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36"} 1.691568526e+09 +kube_pod_status_scheduled_time{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317"} 1.691566341e+09 +# HELP kube_pod_status_unschedulable [STABLE] Describes the unschedulable status for the pod. +# TYPE kube_pod_status_unschedulable gauge +# HELP kube_pod_tolerations Information about the pod tolerations +# TYPE kube_pod_tolerations gauge +kube_pod_tolerations{namespace="kube-system",pod="kube-controller-manager-kind-control-plane",uid="e446c040-10c1-43fc-9281-7491d4c643e3",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="etcd-kind-control-plane",uid="498e519b-b2d6-4edd-b3ed-92f66f79e0e8",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-fddcc",uid="c5539c47-756c-4874-8d2e-58497290c63b",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kindnet-7l48v",uid="e8bb82ab-5c1f-4a4b-aef1-0178745c5d95",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-proxy-nw7gg",uid="b62b2437-3d0c-470d-a228-83c7911e3da2",key="node.kubernetes.io/network-unavailable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="hello-28192809-jbn5z",uid="04bce8e7-a3e0-4eaa-8da5-8548a0e6069a",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-scheduler-kind-control-plane",uid="5315d550-3b87-45bc-b6ff-96498561f124",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-rb564",uid="cb0cb62a-7f36-459b-a907-c41af8d89b63",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="CriticalAddonsOnly",operator="Exists"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node-role.kubernetes.io/control-plane",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="coredns-787d4945fb-kx4f4",uid="61a9a53a-1158-4006-9b10-613dcbe59680",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-state-metrics-7bc9d484b6-79ph2",uid="07cbaeae-2198-4866-85a1-a21f9b6ad2a9",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node-role.kubernetes.io/control-plane",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node-role.kubernetes.io/master",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/disk-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/memory-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/pid-pressure",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="kube-system",pod="fluentd-elasticsearch-fwg46",uid="d38731d0-e647-42c7-9253-f30e3b2f6783",key="node.kubernetes.io/unschedulable",operator="Exists",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/control-plane",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node-role.kubernetes.io/master",operator="Equal",effect="NoSchedule"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="local-path-storage",pod="local-path-provisioner-75f5b54ffd-bm5sx",uid="19b4ea67-7be8-43c6-b1b0-df36a21e0231",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",key="node.kubernetes.io/not-ready",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="default",pod="web-0",uid="bb907162-2d8f-4eef-89d6-ee3254bd3f36",key="node.kubernetes.io/unreachable",operator="Exists",effect="NoExecute",toleration_seconds="300"} 1 +kube_pod_tolerations{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="8659fa6b-a666-43cf-a59c-9e7c78686317",operator="Exists",effect="NoExecute"} 1 +# HELP kube_replicaset_created [STABLE] Unix creation timestamp +# TYPE kube_replicaset_created gauge +kube_replicaset_created{namespace="kube-system",replicaset="coredns-787d4945fb"} 1.691566354e+09 +kube_replicaset_created{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1.691566354e+09 +kube_replicaset_created{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1.691568526e+09 +# HELP kube_replicaset_status_replicas [STABLE] The number of replicas per ReplicaSet. +# TYPE kube_replicaset_status_replicas gauge +kube_replicaset_status_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_status_fully_labeled_replicas [STABLE] The number of fully labeled replicas per ReplicaSet. +# TYPE kube_replicaset_status_fully_labeled_replicas gauge +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_status_fully_labeled_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_fully_labeled_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_status_ready_replicas [STABLE] The number of ready replicas per ReplicaSet. +# TYPE kube_replicaset_status_ready_replicas gauge +kube_replicaset_status_ready_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +kube_replicaset_status_ready_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +# HELP kube_replicaset_status_observed_generation [STABLE] The generation observed by the ReplicaSet controller. +# TYPE kube_replicaset_status_observed_generation gauge +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_status_observed_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_status_observed_generation{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_spec_replicas [STABLE] Number of desired pods for a ReplicaSet. +# TYPE kube_replicaset_spec_replicas gauge +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="coredns-787d4945fb"} 2 +kube_replicaset_spec_replicas{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_spec_replicas{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_replicaset_metadata_generation gauge +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_metadata_generation{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_metadata_generation{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_owner [STABLE] Information about the ReplicaSet's owner. +# TYPE kube_replicaset_owner gauge +kube_replicaset_owner{namespace="kube-system",replicaset="coredns-787d4945fb",owner_kind="Deployment",owner_name="coredns",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd",owner_kind="Deployment",owner_name="local-path-provisioner",owner_is_controller="true"} 1 +kube_replicaset_owner{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6",owner_kind="Deployment",owner_name="kube-state-metrics",owner_is_controller="true"} 1 +# HELP kube_replicaset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_replicaset_annotations gauge +kube_replicaset_annotations{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_annotations{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_annotations{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicaset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_replicaset_labels gauge +kube_replicaset_labels{namespace="kube-system",replicaset="coredns-787d4945fb"} 1 +kube_replicaset_labels{namespace="local-path-storage",replicaset="local-path-provisioner-75f5b54ffd"} 1 +kube_replicaset_labels{namespace="kube-system",replicaset="kube-state-metrics-7bc9d484b6"} 1 +# HELP kube_replicationcontroller_created [STABLE] Unix creation timestamp +# TYPE kube_replicationcontroller_created gauge +# HELP kube_replicationcontroller_status_replicas [STABLE] The number of replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_replicas gauge +# HELP kube_replicationcontroller_status_fully_labeled_replicas [STABLE] The number of fully labeled replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_fully_labeled_replicas gauge +# HELP kube_replicationcontroller_status_ready_replicas [STABLE] The number of ready replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_ready_replicas gauge +# HELP kube_replicationcontroller_status_available_replicas [STABLE] The number of available replicas per ReplicationController. +# TYPE kube_replicationcontroller_status_available_replicas gauge +# HELP kube_replicationcontroller_status_observed_generation [STABLE] The generation observed by the ReplicationController controller. +# TYPE kube_replicationcontroller_status_observed_generation gauge +# HELP kube_replicationcontroller_spec_replicas [STABLE] Number of desired pods for a ReplicationController. +# TYPE kube_replicationcontroller_spec_replicas gauge +# HELP kube_replicationcontroller_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state. +# TYPE kube_replicationcontroller_metadata_generation gauge +# HELP kube_replicationcontroller_owner Information about the ReplicationController's owner. +# TYPE kube_replicationcontroller_owner gauge +# HELP kube_resourcequota_created [STABLE] Unix creation timestamp +# TYPE kube_resourcequota_created gauge +kube_resourcequota_created{namespace="default",resourcequota="pods-high"} 1.691568526e+09 +# HELP kube_resourcequota [STABLE] Information about resource quota. +# TYPE kube_resourcequota gauge +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="hard"} 1000 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="hard"} 204800 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="hard"} 10 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="cpu",type="used"} 0 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="memory",type="used"} 0 +kube_resourcequota{namespace="default",resourcequota="pods-high",resource="pods",type="used"} 0 +# HELP kube_secret_info [STABLE] Information about secret. +# TYPE kube_secret_info gauge +kube_secret_info{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_type [STABLE] Type about secret. +# TYPE kube_secret_type gauge +kube_secret_type{namespace="kube-system",secret="bootstrap-token-abcdef",type="bootstrap.kubernetes.io/token"} 1 +# HELP kube_secret_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_secret_annotations gauge +kube_secret_annotations{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_secret_labels gauge +kube_secret_labels{namespace="kube-system",secret="bootstrap-token-abcdef"} 1 +# HELP kube_secret_created [STABLE] Unix creation timestamp +# TYPE kube_secret_created gauge +kube_secret_created{namespace="kube-system",secret="bootstrap-token-abcdef"} 1.69156634e+09 +# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret. +# TYPE kube_secret_metadata_resource_version gauge +kube_secret_metadata_resource_version{namespace="kube-system",secret="bootstrap-token-abcdef"} 221 +# HELP kube_service_info [STABLE] Information about service. +# TYPE kube_service_info gauge +kube_service_info{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1 +kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc",cluster_ip="None",external_name="",load_balancer_ip=""} 1 +# HELP kube_service_created [STABLE] Unix creation timestamp +# TYPE kube_service_created gauge +kube_service_created{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1.691566338e+09 +kube_service_created{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1.69156634e+09 +kube_service_created{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1.691568526e+09 +# HELP kube_service_spec_type [STABLE] Type about service. +# TYPE kube_service_spec_type gauge +kube_service_spec_type{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c",type="ClusterIP"} 1 +kube_service_spec_type{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354",type="ClusterIP"} 1 +kube_service_spec_type{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc",type="ClusterIP"} 1 +# HELP kube_service_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_service_annotations gauge +kube_service_annotations{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1 +kube_service_annotations{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 +# HELP kube_service_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_service_labels gauge +kube_service_labels{namespace="default",service="kubernetes",uid="d402e60c-e633-4ef1-919e-08bfd4fe1c5c"} 1 +kube_service_labels{namespace="kube-system",service="kube-dns",uid="057e71cd-9a20-4382-85d1-04e087a20354"} 1 +kube_service_labels{namespace="kube-system",service="kube-state-metrics",uid="15b6cf52-6e65-4081-ab05-e2dba135ecfc"} 1 +# HELP kube_service_spec_external_ip [STABLE] Service external ips. One series for each ip +# TYPE kube_service_spec_external_ip gauge +# HELP kube_service_status_load_balancer_ingress [STABLE] Service load balancer ingress status +# TYPE kube_service_status_load_balancer_ingress gauge +# HELP kube_statefulset_created [STABLE] Unix creation timestamp +# TYPE kube_statefulset_created gauge +kube_statefulset_created{namespace="default",statefulset="web"} 1.691568526e+09 +# HELP kube_statefulset_status_replicas [STABLE] The number of replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas gauge +kube_statefulset_status_replicas{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_available gauge +kube_statefulset_status_replicas_available{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_current [STABLE] The number of current replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_current gauge +kube_statefulset_status_replicas_current{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_ready [STABLE] The number of ready replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_ready gauge +kube_statefulset_status_replicas_ready{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_replicas_updated [STABLE] The number of updated replicas per StatefulSet. +# TYPE kube_statefulset_status_replicas_updated gauge +kube_statefulset_status_replicas_updated{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_observed_generation [STABLE] The generation observed by the StatefulSet controller. +# TYPE kube_statefulset_status_observed_generation gauge +kube_statefulset_status_observed_generation{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet. +# TYPE kube_statefulset_replicas gauge +kube_statefulset_replicas{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_ordinals_start Start ordinal of the StatefulSet. +# TYPE kube_statefulset_ordinals_start gauge +# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet. +# TYPE kube_statefulset_metadata_generation gauge +kube_statefulset_metadata_generation{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs +# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge +# HELP kube_statefulset_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_statefulset_annotations gauge +kube_statefulset_annotations{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_statefulset_labels gauge +kube_statefulset_labels{namespace="default",statefulset="web"} 1 +# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas). +# TYPE kube_statefulset_status_current_revision gauge +kube_statefulset_status_current_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 +# HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas) +# TYPE kube_statefulset_status_update_revision gauge +kube_statefulset_status_update_revision{namespace="default",statefulset="web",revision="web-5945dbc797"} 1 +# HELP kube_storageclass_info [STABLE] Information about storageclass. +# TYPE kube_storageclass_info gauge +kube_storageclass_info{storageclass="standard",provisioner="rancher.io/local-path",reclaim_policy="Delete",volume_binding_mode="WaitForFirstConsumer"} 1 +# HELP kube_storageclass_created [STABLE] Unix creation timestamp +# TYPE kube_storageclass_created gauge +kube_storageclass_created{storageclass="standard"} 1.691566342e+09 +# HELP kube_storageclass_annotations Kubernetes annotations converted to Prometheus labels. +# TYPE kube_storageclass_annotations gauge +kube_storageclass_annotations{storageclass="standard"} 1 +# HELP kube_storageclass_labels [STABLE] Kubernetes labels converted to Prometheus labels. +# TYPE kube_storageclass_labels gauge +kube_storageclass_labels{storageclass="standard"} 1 +# HELP kube_validatingwebhookconfiguration_info Information about the ValidatingWebhookConfiguration. +# TYPE kube_validatingwebhookconfiguration_info gauge +# HELP kube_validatingwebhookconfiguration_created Unix creation timestamp. +# TYPE kube_validatingwebhookconfiguration_created gauge +# HELP kube_validatingwebhookconfiguration_metadata_resource_version Resource version representing a specific version of the ValidatingWebhookConfiguration. +# TYPE kube_validatingwebhookconfiguration_metadata_resource_version gauge +# HELP kube_volumeattachment_labels Kubernetes labels converted to Prometheus labels. +# TYPE kube_volumeattachment_labels gauge +# HELP kube_volumeattachment_info Information about volumeattachment. +# TYPE kube_volumeattachment_info gauge +# HELP kube_volumeattachment_created Unix creation timestamp +# TYPE kube_volumeattachment_created gauge +# HELP kube_volumeattachment_spec_source_persistentvolume PersistentVolume source reference. +# TYPE kube_volumeattachment_spec_source_persistentvolume gauge +# HELP kube_volumeattachment_status_attached Information about volumeattachment. +# TYPE kube_volumeattachment_status_attached gauge +# HELP kube_volumeattachment_status_attachment_metadata volumeattachment metadata. +# TYPE kube_volumeattachment_status_attachment_metadata gauge diff --git a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.25.expected b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.25.expected index 1ce77136eac..9cd560896d1 100644 --- a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.25.expected +++ b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.25.expected @@ -1,38 +1,4 @@ [ - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "name": "endpoint_slice_mirroring", - "workqueue": { - "adds": { - "count": 6 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -61,10 +27,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "job", + "name": "endpoint_slice_mirroring", "workqueue": { "adds": { - "count": 0 + "count": 6 }, "depth": { "count": 0 @@ -129,10 +95,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "ClusterRoleAggregator", + "name": "job", "workqueue": { "adds": { - "count": 19 + "count": 0 }, "depth": { "count": 0 @@ -187,10 +153,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "replicationmanager", + "name": "ClusterRoleAggregator", "workqueue": { "adds": { - "count": 0 + "count": 19 }, "depth": { "count": 0 @@ -221,10 +187,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "serviceaccount_tokens_service", + "name": "replicationmanager", "workqueue": { "adds": { - "count": 42 + "count": 0 }, "depth": { "count": 0 @@ -309,10 +275,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_graph_changes", + "name": "serviceaccount_tokens_service", "workqueue": { "adds": { - "count": 4892 + "count": 42 }, "depth": { "count": 0 @@ -343,10 +309,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "claims", + "name": "bootstrap_signer_queue", "workqueue": { "adds": { - "count": 0 + "count": 2 }, "depth": { "count": 0 @@ -354,6 +320,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 0 + }, "unfinished": { "sec": 0 } @@ -374,10 +343,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "bootstrap_signer_queue", + "name": "claims", "workqueue": { "adds": { - "count": 2 + "count": 0 }, "depth": { "count": 0 @@ -385,9 +354,6 @@ "longestrunning": { "sec": 0 }, - "retries": { - "count": 0 - }, "unfinished": { "sec": 0 } @@ -408,10 +374,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "node_lifecycle_controller_pods", + "name": "garbage_collector_graph_changes", "workqueue": { "adds": { - "count": 10 + "count": 4892 }, "depth": { "count": 0 @@ -442,10 +408,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "cronjob", + "name": "node_lifecycle_controller_pods", "workqueue": { "adds": { - "count": 0 + "count": 10 }, "depth": { "count": 0 @@ -476,10 +442,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "noexec_taint_pod", + "name": "cronjob", "workqueue": { "adds": { - "count": 16 + "count": 0 }, "depth": { "count": 0 @@ -487,6 +453,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 0 + }, "unfinished": { "sec": 0 } @@ -507,10 +476,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "disruption_recheck", + "name": "noexec_taint_pod", "workqueue": { "adds": { - "count": 0 + "count": 16 }, "depth": { "count": 0 @@ -518,9 +487,6 @@ "longestrunning": { "sec": 0 }, - "retries": { - "count": 0 - }, "unfinished": { "sec": 0 } @@ -541,7 +507,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "disruption", + "name": "disruption_recheck", "workqueue": { "adds": { "count": 0 @@ -575,7 +541,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "pvcs", + "name": "disruption", "workqueue": { "adds": { "count": 0 @@ -609,7 +575,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "certificate", + "name": "pvcs", "workqueue": { "adds": { "count": 0 @@ -643,10 +609,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "ttlcontroller", + "name": "DynamicCABundle-request-header", "workqueue": { "adds": { - "count": 19 + "count": 2 }, "depth": { "count": 0 @@ -762,10 +728,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-request-header", + "name": "ttlcontroller", "workqueue": { "adds": { - "count": 2 + "count": 19 }, "depth": { "count": 0 @@ -796,10 +762,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "leader": { - "is_master": true - }, - "name": "kube-controller-manager" + "name": "certificate", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } }, "Index": "", "ID": "", @@ -850,14 +830,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 465 - } + "leader": { + "is_master": true }, - "code": "201", - "host": "172.18.0.2:6443", - "method": "POST" + "name": "kube-controller-manager" }, "Index": "", "ID": "", @@ -908,24 +884,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "ttl_jobs_to_delete", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 465 } - } + }, + "code": "201", + "host": "172.18.0.2:6443", + "method": "POST" }, "Index": "", "ID": "", @@ -942,7 +908,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "volume_expand", + "name": "ttl_jobs_to_delete", "workqueue": { "adds": { "count": 0 @@ -976,7 +942,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "job_orphan_pod", + "name": "serviceaccount_tokens_secret", "workqueue": { "adds": { "count": 0 @@ -1010,7 +976,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "serviceaccount_tokens_secret", + "name": "job_orphan_pod", "workqueue": { "adds": { "count": 0 @@ -1044,31 +1010,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 19 - } - }, - "code": "200", - "host": "172.18.0.2: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": { - "name": "ephemeral_volume", + "name": "volume_expand", "workqueue": { "adds": { "count": 0 @@ -1183,6 +1125,64 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "ephemeral_volume", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 19 + } + }, + "code": "200", + "host": "172.18.0.2: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, @@ -1272,10 +1272,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "token_cleaner", + "name": "garbage_collector_attempt_to_orphan", "workqueue": { "adds": { - "count": 1 + "count": 0 }, "depth": { "count": 0 @@ -1284,7 +1284,7 @@ "sec": 0 }, "retries": { - "count": 1 + "count": 0 }, "unfinished": { "sec": 0 @@ -1306,10 +1306,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_attempt_to_orphan", + "name": "token_cleaner", "workqueue": { "adds": { - "count": 0 + "count": 1 }, "depth": { "count": 0 @@ -1318,7 +1318,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 1 }, "unfinished": { "sec": 0 @@ -1340,7 +1340,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "horizontalpodautoscaler", + "name": "stale_pod_disruption", "workqueue": { "adds": { "count": 0 @@ -1374,7 +1374,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "namespace", + "name": "resource_quota_controller_resource_changes", "workqueue": { "adds": { "count": 0 @@ -1442,7 +1442,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "resource_quota_controller_resource_changes", + "name": "namespace", "workqueue": { "adds": { "count": 0 @@ -1476,7 +1476,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "stale_pod_disruption", + "name": "horizontalpodautoscaler", "workqueue": { "adds": { "count": 0 @@ -1510,10 +1510,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-client-ca-bundle", + "name": "endpoint", "workqueue": { "adds": { - "count": 1 + "count": 9 }, "depth": { "count": 0 @@ -1522,7 +1522,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 6 }, "unfinished": { "sec": 0 @@ -1544,10 +1544,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "endpoint", + "name": "DynamicCABundle-client-ca-bundle", "workqueue": { "adds": { - "count": 9 + "count": 1 }, "depth": { "count": 0 @@ -1556,7 +1556,7 @@ "sec": 0 }, "retries": { - "count": 6 + "count": 0 }, "unfinished": { "sec": 0 @@ -1636,10 +1636,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "noexec_taint_node", + "name": "volumes", "workqueue": { "adds": { - "count": 1 + "count": 0 }, "depth": { "count": 0 @@ -1667,10 +1667,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "volumes", + "name": "noexec_taint_node", "workqueue": { "adds": { - "count": 0 + "count": 1 }, "depth": { "count": 0 @@ -1698,14 +1698,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 2100 + "name": "daemonset", + "workqueue": { + "adds": { + "count": 26 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 8 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PUT" + } }, "Index": "", "ID": "", @@ -1753,24 +1763,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "daemonset", - "workqueue": { - "adds": { - "count": 26 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 8 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 2100 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" }, "Index": "", "ID": "", @@ -1787,14 +1787,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 1 + "name": "pvcprotection", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "403", - "host": "172.18.0.2:6443", - "method": "GET" + } }, "Index": "", "ID": "", @@ -1811,10 +1821,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_attempt_to_delete", + "name": "deployment", "workqueue": { "adds": { - "count": 1 + "count": 21 }, "depth": { "count": 0 @@ -1823,7 +1833,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 10 }, "unfinished": { "sec": 0 @@ -1879,10 +1889,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "pvcprotection", + "name": "garbage_collector_attempt_to_delete", "workqueue": { "adds": { - "count": 0 + "count": 1 }, "depth": { "count": 0 @@ -1913,10 +1923,34 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "deployment", + "client": { + "request": { + "count": 1 + } + }, + "code": "403", + "host": "172.18.0.2: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": { + "name": "resourcequota_priority", "workqueue": { "adds": { - "count": 21 + "count": 0 }, "depth": { "count": 0 @@ -1925,7 +1959,7 @@ "sec": 0 }, "retries": { - "count": 10 + "count": 0 }, "unfinished": { "sec": 0 @@ -2032,7 +2066,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "resourcequota_priority", + "name": "orphaned_pods_nodes", "workqueue": { "adds": { "count": 0 @@ -2066,10 +2100,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicServingCertificateController", + "name": "DynamicCABundle-csr-controller", "workqueue": { "adds": { - "count": 70 + "count": 8 }, "depth": { "count": 0 @@ -2100,10 +2134,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-csr-controller", + "name": "DynamicServingCertificateController", "workqueue": { "adds": { - "count": 8 + "count": 70 }, "depth": { "count": 0 @@ -2134,7 +2168,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "orphaned_pods_nodes", + "name": "service", "workqueue": { "adds": { "count": 0 @@ -2164,30 +2198,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 9893 - } - }, - "code": "200", - "host": "172.18.0.2: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, @@ -2226,24 +2236,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "service", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 9893 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "GET" }, "Index": "", "ID": "", diff --git a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.26.expected b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.26.expected index 7757eee2abb..e7cdac4cd20 100644 --- a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.26.expected +++ b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.26.expected @@ -1,4 +1,28 @@ [ + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 33 + } + }, + "code": "404", + "host": "172.18.0.2: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, @@ -37,14 +61,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 33 + "name": "endpoint", + "workqueue": { + "adds": { + "count": 8 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 6 + }, + "unfinished": { + "sec": 0 } - }, - "code": "404", - "host": "172.18.0.2:6443", - "method": "GET" + } }, "Index": "", "ID": "", @@ -176,98 +210,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "name": "endpoint", - "workqueue": { - "adds": { - "count": 8 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 6 - }, - "unfinished": { - "sec": 0 - } - } - }, - "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": 3 - } - }, - "code": "409", - "host": "172.18.0.2:6443", - "method": "PUT" - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "name": "replicationmanager", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -357,10 +299,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "endpoint_slice", + "name": "replicationmanager", "workqueue": { "adds": { - "count": 11 + "count": 0 }, "depth": { "count": 0 @@ -369,7 +311,7 @@ "sec": 0 }, "retries": { - "count": 11 + "count": 0 }, "unfinished": { "sec": 0 @@ -387,6 +329,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 3 + } + }, + "code": "409", + "host": "172.18.0.2:6443", + "method": "PUT" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -425,10 +391,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "claims", + "name": "endpoint_slice", "workqueue": { "adds": { - "count": 0 + "count": 11 }, "depth": { "count": 0 @@ -436,6 +402,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 11 + }, "unfinished": { "sec": 0 } @@ -490,14 +459,21 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 10 + "name": "claims", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PATCH" + } }, "Index": "", "ID": "", @@ -514,14 +490,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 463 + "name": "garbage_collector_graph_changes", + "workqueue": { + "adds": { + "count": 464 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "GET" + } }, "Index": "", "ID": "", @@ -606,24 +592,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_graph_changes", - "workqueue": { - "adds": { - "count": 464 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 463 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "GET" }, "Index": "", "ID": "", @@ -640,21 +616,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "noexec_taint_pod", - "workqueue": { - "adds": { - "count": 16 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 10 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PATCH" }, "Index": "", "ID": "", @@ -675,10 +644,41 @@ "request": { "count": 80 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PUT" + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "noexec_taint_pod", + "workqueue": { + "adds": { + "count": 16 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } }, "Index": "", "ID": "", @@ -797,10 +797,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "certificate", + "name": "DynamicCABundle-request-header", "workqueue": { "adds": { - "count": 0 + "count": 2 }, "depth": { "count": 0 @@ -831,10 +831,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-request-header", + "name": "certificate", "workqueue": { "adds": { - "count": 2 + "count": 0 }, "depth": { "count": 0 @@ -896,42 +896,22 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "node": { - "collector": { - "count": 1, - "eviction": { - "count": 0 - }, - "health": { - "pct": 100 - }, - "unhealthy": { - "count": 0 - } - } - }, - "process": { - "cpu": { - "sec": 4 + "name": "statefulset", + "workqueue": { + "adds": { + "count": 0 }, - "fds": { - "max": { - "count": 1048576 - }, - "open": { - "count": 42 - } + "depth": { + "count": 0 }, - "memory": { - "resident": { - "bytes": 87318528 - }, - "virtual": { - "bytes": 791781376 - } + "longestrunning": { + "sec": 0 }, - "started": { - "sec": 1673879554.06 + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } } }, @@ -970,22 +950,42 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "statefulset", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 + "node": { + "collector": { + "count": 1, + "eviction": { + "count": 0 + }, + "health": { + "pct": 100 + }, + "unhealthy": { + "count": 0 + } + } + }, + "process": { + "cpu": { + "sec": 4 }, - "longestrunning": { - "sec": 0 + "fds": { + "max": { + "count": 1048576 + }, + "open": { + "count": 42 + } }, - "retries": { - "count": 0 + "memory": { + "resident": { + "bytes": 87318528 + }, + "virtual": { + "bytes": 791781376 + } }, - "unfinished": { - "sec": 0 + "started": { + "sec": 1673879554.06 } } }, @@ -1072,7 +1072,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "volume_expand", + "name": "serviceaccount_tokens_secret", "workqueue": { "adds": { "count": 0 @@ -1140,7 +1140,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "serviceaccount_tokens_secret", + "name": "volume_expand", "workqueue": { "adds": { "count": 0 @@ -1208,10 +1208,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "deployment", + "name": "garbage_collector_attempt_to_delete", "workqueue": { "adds": { - "count": 19 + "count": 2 }, "depth": { "count": 0 @@ -1220,7 +1220,7 @@ "sec": 0 }, "retries": { - "count": 10 + "count": 0 }, "unfinished": { "sec": 0 @@ -1242,10 +1242,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_attempt_to_delete", + "name": "deployment", "workqueue": { "adds": { - "count": 2 + "count": 19 }, "depth": { "count": 0 @@ -1254,7 +1254,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 10 }, "unfinished": { "sec": 0 @@ -1276,10 +1276,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "token_cleaner", + "name": "garbage_collector_attempt_to_orphan", "workqueue": { "adds": { - "count": 1 + "count": 0 }, "depth": { "count": 0 @@ -1288,7 +1288,7 @@ "sec": 0 }, "retries": { - "count": 1 + "count": 0 }, "unfinished": { "sec": 0 @@ -1310,10 +1310,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "garbage_collector_attempt_to_orphan", + "name": "token_cleaner", "workqueue": { "adds": { - "count": 0 + "count": 1 }, "depth": { "count": 0 @@ -1322,7 +1322,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 1 }, "unfinished": { "sec": 0 @@ -1344,7 +1344,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "horizontalpodautoscaler", + "name": "stale_pod_disruption", "workqueue": { "adds": { "count": 0 @@ -1378,7 +1378,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "namespace", + "name": "resource_quota_controller_resource_changes", "workqueue": { "adds": { "count": 0 @@ -1446,7 +1446,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "resource_quota_controller_resource_changes", + "name": "namespace", "workqueue": { "adds": { "count": 0 @@ -1480,7 +1480,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "stale_pod_disruption", + "name": "horizontalpodautoscaler", "workqueue": { "adds": { "count": 0 @@ -1514,10 +1514,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "daemonset", + "name": "pvprotection", "workqueue": { "adds": { - "count": 16 + "count": 0 }, "depth": { "count": 0 @@ -1548,10 +1548,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "pvprotection", + "name": "daemonset", "workqueue": { "adds": { - "count": 0 + "count": 16 }, "depth": { "count": 0 @@ -1667,10 +1667,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "noexec_taint_node", + "name": "ttlcontroller", "workqueue": { "adds": { - "count": 1 + "count": 6 }, "depth": { "count": 0 @@ -1678,6 +1678,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 0 + }, "unfinished": { "sec": 0 } @@ -1698,10 +1701,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "volumes", + "name": "ClusterRoleAggregator", "workqueue": { "adds": { - "count": 0 + "count": 18 }, "depth": { "count": 0 @@ -1709,6 +1712,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 0 + }, "unfinished": { "sec": 0 } @@ -1753,10 +1759,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "ClusterRoleAggregator", + "name": "volumes", "workqueue": { "adds": { - "count": 18 + "count": 0 }, "depth": { "count": 0 @@ -1764,9 +1770,6 @@ "longestrunning": { "sec": 0 }, - "retries": { - "count": 0 - }, "unfinished": { "sec": 0 } @@ -1787,10 +1790,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "ttlcontroller", + "name": "noexec_taint_node", "workqueue": { "adds": { - "count": 6 + "count": 1 }, "depth": { "count": 0 @@ -1798,9 +1801,6 @@ "longestrunning": { "sec": 0 }, - "retries": { - "count": 0 - }, "unfinished": { "sec": 0 } @@ -1821,10 +1821,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicServingCertificateController", + "name": "replicaset", "workqueue": { "adds": { - "count": 2 + "count": 21 }, "depth": { "count": 0 @@ -1855,10 +1855,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "replicaset", + "name": "DynamicServingCertificateController", "workqueue": { "adds": { - "count": 21 + "count": 2 }, "depth": { "count": 0 @@ -1889,14 +1889,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 1 + "name": "pvcprotection", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "403", - "host": "172.18.0.2:6443", - "method": "GET" + } }, "Index": "", "ID": "", @@ -1947,24 +1957,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "pvcprotection", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 1 } - } + }, + "code": "403", + "host": "172.18.0.2:6443", + "method": "GET" }, "Index": "", "ID": "", @@ -2100,10 +2100,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-csr-controller", + "name": "orphaned_pods_nodes", "workqueue": { "adds": { - "count": 8 + "count": 0 }, "depth": { "count": 0 @@ -2134,10 +2134,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "orphaned_pods_nodes", + "name": "DynamicCABundle-csr-controller", "workqueue": { "adds": { - "count": 0 + "count": 8 }, "depth": { "count": 0 @@ -2168,10 +2168,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicCABundle-client-ca-bundle", + "name": "service", "workqueue": { "adds": { - "count": 2 + "count": 0 }, "depth": { "count": 0 @@ -2202,10 +2202,10 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "service", + "name": "DynamicCABundle-client-ca-bundle", "workqueue": { "adds": { - "count": 0 + "count": 2 }, "depth": { "count": 0 diff --git a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27 b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27 new file mode 100644 index 00000000000..7a63ccdf7be --- /dev/null +++ b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27 @@ -0,0 +1,2725 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 +# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. +# TYPE apiserver_audit_event_total counter +apiserver_audit_event_total 0 +# HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend. +# TYPE apiserver_audit_requests_rejected_total counter +apiserver_audit_requests_rejected_total 0 +# HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request. +# TYPE apiserver_client_certificate_expiration_seconds histogram +apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="21600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="43200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="86400"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="172800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="345600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="604800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="2.592e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7.776e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1.5552e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3.1104e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="+Inf"} 0 +apiserver_client_certificate_expiration_seconds_sum 0 +apiserver_client_certificate_expiration_seconds_count 0 +# HELP apiserver_delegated_authn_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. +# TYPE apiserver_delegated_authn_request_duration_seconds histogram +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.014738774999999999 +apiserver_delegated_authn_request_duration_seconds_count{code="201"} 2 +# HELP apiserver_delegated_authn_request_total [ALPHA] Number of HTTP requests partitioned by status code. +# TYPE apiserver_delegated_authn_request_total counter +apiserver_delegated_authn_request_total{code="201"} 2 +# HELP apiserver_delegated_authz_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. +# TYPE apiserver_delegated_authz_request_duration_seconds histogram +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.005855873 +apiserver_delegated_authz_request_duration_seconds_count{code="201"} 2 +# HELP apiserver_delegated_authz_request_total [ALPHA] Number of HTTP requests partitioned by status code. +# TYPE apiserver_delegated_authz_request_total counter +apiserver_delegated_authz_request_total{code="201"} 2 +# HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. +# TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge +apiserver_envelope_encryption_dek_cache_fill_percent 0 +# HELP apiserver_storage_data_key_generation_duration_seconds [ALPHA] Latencies in seconds of data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_duration_seconds histogram +apiserver_storage_data_key_generation_duration_seconds_bucket{le="5e-06"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="1e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="2e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="4e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="8e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00016"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00032"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00064"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00128"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00256"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00512"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.01024"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.02048"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.04096"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="+Inf"} 0 +apiserver_storage_data_key_generation_duration_seconds_sum 0 +apiserver_storage_data_key_generation_duration_seconds_count 0 +# HELP apiserver_storage_data_key_generation_failures_total [ALPHA] Total number of failed data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_failures_total counter +apiserver_storage_data_key_generation_failures_total 0 +# HELP apiserver_storage_envelope_transformation_cache_misses_total [ALPHA] Total number of cache misses while accessing key decryption key(KEK). +# TYPE apiserver_storage_envelope_transformation_cache_misses_total counter +apiserver_storage_envelope_transformation_cache_misses_total 0 +# HELP apiserver_webhooks_x509_insecure_sha1_total [ALPHA] Counts the number of requests to servers with insecure SHA1 signatures in their serving certificate OR the number of connection failures due to the insecure SHA1 signatures (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_insecure_sha1_total counter +apiserver_webhooks_x509_insecure_sha1_total 0 +# HELP apiserver_webhooks_x509_missing_san_total [ALPHA] Counts the number of requests to servers missing SAN extension in their serving certificate OR the number of connection failures due to the lack of x509 certificate SAN extension missing (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_missing_san_total counter +apiserver_webhooks_x509_missing_san_total 0 +# HELP attachdetach_controller_forced_detaches [ALPHA] Number of times the A/D Controller performed a forced detach +# TYPE attachdetach_controller_forced_detaches counter +attachdetach_controller_forced_detaches 0 +# HELP authenticated_user_requests [ALPHA] Counter of authenticated requests broken out by username. +# TYPE authenticated_user_requests counter +authenticated_user_requests{username="other"} 66 +# HELP authentication_attempts [ALPHA] Counter of authenticated attempts. +# TYPE authentication_attempts counter +authentication_attempts{result="success"} 66 +# HELP authentication_duration_seconds [ALPHA] Authentication duration in seconds broken out by result. +# TYPE authentication_duration_seconds histogram +authentication_duration_seconds_bucket{result="success",le="0.001"} 65 +authentication_duration_seconds_bucket{result="success",le="0.002"} 65 +authentication_duration_seconds_bucket{result="success",le="0.004"} 65 +authentication_duration_seconds_bucket{result="success",le="0.008"} 65 +authentication_duration_seconds_bucket{result="success",le="0.016"} 66 +authentication_duration_seconds_bucket{result="success",le="0.032"} 66 +authentication_duration_seconds_bucket{result="success",le="0.064"} 66 +authentication_duration_seconds_bucket{result="success",le="0.128"} 66 +authentication_duration_seconds_bucket{result="success",le="0.256"} 66 +authentication_duration_seconds_bucket{result="success",le="0.512"} 66 +authentication_duration_seconds_bucket{result="success",le="1.024"} 66 +authentication_duration_seconds_bucket{result="success",le="2.048"} 66 +authentication_duration_seconds_bucket{result="success",le="4.096"} 66 +authentication_duration_seconds_bucket{result="success",le="8.192"} 66 +authentication_duration_seconds_bucket{result="success",le="16.384"} 66 +authentication_duration_seconds_bucket{result="success",le="+Inf"} 66 +authentication_duration_seconds_sum{result="success"} 0.014726734000000002 +authentication_duration_seconds_count{result="success"} 66 +# HELP authentication_token_cache_active_fetch_count [ALPHA] +# TYPE authentication_token_cache_active_fetch_count gauge +authentication_token_cache_active_fetch_count{status="blocked"} 0 +authentication_token_cache_active_fetch_count{status="in_flight"} 0 +# HELP authentication_token_cache_fetch_total [ALPHA] +# TYPE authentication_token_cache_fetch_total counter +authentication_token_cache_fetch_total{status="ok"} 2 +# HELP authentication_token_cache_request_duration_seconds [ALPHA] +# TYPE authentication_token_cache_request_duration_seconds histogram +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 1 +authentication_token_cache_request_duration_seconds_sum{status="hit"} 0 +authentication_token_cache_request_duration_seconds_count{status="hit"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 2 +authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.015 +authentication_token_cache_request_duration_seconds_count{status="miss"} 2 +# HELP authentication_token_cache_request_total [ALPHA] +# TYPE authentication_token_cache_request_total counter +authentication_token_cache_request_total{status="hit"} 1 +authentication_token_cache_request_total{status="miss"} 2 +# HELP cronjob_controller_job_creation_skew_duration_seconds [STABLE] Time between when a cronjob is scheduled to be run, and when the corresponding job is created +# TYPE cronjob_controller_job_creation_skew_duration_seconds histogram +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="1"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="2"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="4"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="8"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="16"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="32"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="64"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="128"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="256"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="512"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="+Inf"} 0 +cronjob_controller_job_creation_skew_duration_seconds_sum 0 +cronjob_controller_job_creation_skew_duration_seconds_count 0 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 +# HELP endpoint_slice_controller_changes [ALPHA] Number of EndpointSlice changes +# TYPE endpoint_slice_controller_changes counter +endpoint_slice_controller_changes{operation="create"} 1 +endpoint_slice_controller_changes{operation="update"} 3 +# HELP endpoint_slice_controller_desired_endpoint_slices [ALPHA] Number of EndpointSlices that would exist with perfect endpoint allocation +# TYPE endpoint_slice_controller_desired_endpoint_slices gauge +endpoint_slice_controller_desired_endpoint_slices 1 +# HELP endpoint_slice_controller_endpoints_added_per_sync [ALPHA] Number of endpoints added on each Service sync +# TYPE endpoint_slice_controller_endpoints_added_per_sync histogram +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="64"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="128"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="256"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="512"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="1024"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2048"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4096"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8192"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16384"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32768"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="+Inf"} 8 +endpoint_slice_controller_endpoints_added_per_sync_sum 2 +endpoint_slice_controller_endpoints_added_per_sync_count 8 +# HELP endpoint_slice_controller_endpoints_desired [ALPHA] Number of endpoints desired +# TYPE endpoint_slice_controller_endpoints_desired gauge +endpoint_slice_controller_endpoints_desired 2 +# HELP endpoint_slice_controller_endpoints_removed_per_sync [ALPHA] Number of endpoints removed on each Service sync +# TYPE endpoint_slice_controller_endpoints_removed_per_sync histogram +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="64"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="128"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="256"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="512"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="1024"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2048"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4096"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8192"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16384"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32768"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="+Inf"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_sum 0 +endpoint_slice_controller_endpoints_removed_per_sync_count 8 +# HELP endpoint_slice_controller_endpointslices_changed_per_sync [ALPHA] Number of EndpointSlices changed on each Service sync +# TYPE endpoint_slice_controller_endpointslices_changed_per_sync histogram +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.005"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.01"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.025"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.05"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.1"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.25"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.5"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="1"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="2.5"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="5"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="10"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="+Inf"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_sum{topology="Disabled"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_count{topology="Disabled"} 8 +# HELP endpoint_slice_controller_num_endpoint_slices [ALPHA] Number of EndpointSlices +# TYPE endpoint_slice_controller_num_endpoint_slices gauge +endpoint_slice_controller_num_endpoint_slices 1 +# HELP endpoint_slice_controller_syncs [ALPHA] Number of EndpointSlice syncs +# TYPE endpoint_slice_controller_syncs counter +endpoint_slice_controller_syncs{result="success"} 9 +# HELP endpoint_slice_mirroring_controller_endpoints_sync_duration [ALPHA] Duration of syncEndpoints() in seconds +# TYPE endpoint_slice_mirroring_controller_endpoints_sync_duration histogram +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.001"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.002"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.004"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.008"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.016"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.032"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.064"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.128"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.256"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.512"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="1.024"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="2.048"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="4.096"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="8.192"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="16.384"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="+Inf"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_sum 0 +endpoint_slice_mirroring_controller_endpoints_sync_duration_count 5 +# HELP ephemeral_volume_controller_create_failures_total [ALPHA] Number of PersistenVolumeClaims creation requests +# TYPE ephemeral_volume_controller_create_failures_total counter +ephemeral_volume_controller_create_failures_total 0 +# HELP ephemeral_volume_controller_create_total [ALPHA] Number of PersistenVolumeClaims creation requests +# TYPE ephemeral_volume_controller_create_total counter +ephemeral_volume_controller_create_total 0 +# HELP garbagecollector_controller_resources_sync_error_total [ALPHA] Number of garbage collector resources sync errors +# TYPE garbagecollector_controller_resources_sync_error_total counter +garbagecollector_controller_resources_sync_error_total 0 +# HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. +# TYPE go_cgo_go_to_c_calls_calls_total counter +go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.009350777 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.149717618 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.034730859 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.022017536 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.21581679 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 4385.415002366 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 4.99e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.00170814 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001708639 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 5015.342976168 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 629.710448373 +# HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. +# TYPE go_gc_cycles_automatic_gc_cycles_total counter +go_gc_cycles_automatic_gc_cycles_total 16 +# HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. +# TYPE go_gc_cycles_forced_gc_cycles_total counter +go_gc_cycles_forced_gc_cycles_total 0 +# HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. +# TYPE go_gc_cycles_total_gc_cycles_total counter +go_gc_cycles_total_gc_cycles_total 16 +# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 3.4792e-05 +go_gc_duration_seconds{quantile="0.25"} 8.5844e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000176279 +go_gc_duration_seconds{quantile="0.75"} 0.000245191 +go_gc_duration_seconds{quantile="1"} 0.000475774 +go_gc_duration_seconds_sum 0.002752192 +go_gc_duration_seconds_count 16 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 13986 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 337373 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 568393 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 712395 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 771930 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 798600 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 804899 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 807409 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 809058 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 809746 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 810071 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 810232 +go_gc_heap_allocs_by_size_bytes_sum 9.9479784e+07 +go_gc_heap_allocs_by_size_bytes_count 810232 +# HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. +# TYPE go_gc_heap_allocs_bytes_total counter +go_gc_heap_allocs_bytes_total 9.9479784e+07 +# HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_objects_total counter +go_gc_heap_allocs_objects_total 810232 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 9984 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 307650 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 511409 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 642707 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 695655 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 719614 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 725361 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 727523 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 729049 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 729619 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 729761 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 729826 +go_gc_heap_frees_by_size_bytes_sum 8.2895544e+07 +go_gc_heap_frees_by_size_bytes_count 729826 +# HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. +# TYPE go_gc_heap_frees_bytes_total counter +go_gc_heap_frees_bytes_total 8.2895544e+07 +# HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_objects_total counter +go_gc_heap_frees_objects_total 729826 +# HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. +# TYPE go_gc_heap_goal_bytes gauge +go_gc_heap_goal_bytes 3.4482008e+07 +# HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. +# TYPE go_gc_heap_objects_objects gauge +go_gc_heap_objects_objects 80406 +# HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. +# TYPE go_gc_heap_tiny_allocs_objects_total counter +go_gc_heap_tiny_allocs_objects_total 93134 +# HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. +# TYPE go_gc_limiter_last_enabled_gc_cycle gauge +go_gc_limiter_last_enabled_gc_cycle 0 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 6 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 21 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 32 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 32 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 32 +go_gc_pauses_seconds_bucket{le="+Inf"} 32 +go_gc_pauses_seconds_sum 0.00101248 +go_gc_pauses_seconds_count 32 +# HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. +# TYPE go_gc_stack_starting_size_bytes gauge +go_gc_stack_starting_size_bytes 4096 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 1123 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version="go1.20.3"} 1 +# HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. +# TYPE go_memory_classes_heap_free_bytes gauge +go_memory_classes_heap_free_bytes 5.562368e+06 +# HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. +# TYPE go_memory_classes_heap_objects_bytes gauge +go_memory_classes_heap_objects_bytes 1.658424e+07 +# HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. +# TYPE go_memory_classes_heap_released_bytes gauge +go_memory_classes_heap_released_bytes 4.907008e+06 +# HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. +# TYPE go_memory_classes_heap_stacks_bytes gauge +go_memory_classes_heap_stacks_bytes 5.963776e+06 +# HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. +# TYPE go_memory_classes_heap_unused_bytes gauge +go_memory_classes_heap_unused_bytes 8.925648e+06 +# HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. +# TYPE go_memory_classes_metadata_mcache_free_bytes gauge +go_memory_classes_metadata_mcache_free_bytes 6000 +# HELP go_memory_classes_metadata_mcache_inuse_bytes Memory that is occupied by runtime mcache structures that are currently being used. +# TYPE go_memory_classes_metadata_mcache_inuse_bytes gauge +go_memory_classes_metadata_mcache_inuse_bytes 9600 +# HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. +# TYPE go_memory_classes_metadata_mspan_free_bytes gauge +go_memory_classes_metadata_mspan_free_bytes 68320 +# HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. +# TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge +go_memory_classes_metadata_mspan_inuse_bytes 453920 +# HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. +# TYPE go_memory_classes_metadata_other_bytes gauge +go_memory_classes_metadata_other_bytes 9.368496e+06 +# HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. +# TYPE go_memory_classes_os_stacks_bytes gauge +go_memory_classes_os_stacks_bytes 0 +# HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. +# TYPE go_memory_classes_other_bytes gauge +go_memory_classes_other_bytes 1.823877e+06 +# HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. +# TYPE go_memory_classes_profiling_buckets_bytes gauge +go_memory_classes_profiling_buckets_bytes 1.505251e+06 +# HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. +# TYPE go_memory_classes_total_bytes gauge +go_memory_classes_total_bytes 5.5178504e+07 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 1.658424e+07 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 9.9479784e+07 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.505251e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 822960 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 9.368496e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 1.658424e+07 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 1.0469376e+07 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 2.5509888e+07 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 80406 +# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes gauge +go_memstats_heap_released_bytes 4.907008e+06 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 3.5979264e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.6915727966346712e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 903366 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 9600 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 15600 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 453920 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 522240 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 3.4482008e+07 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 1.823877e+06 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 5.963776e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 5.963776e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained from system. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 5.5178504e+07 +# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. +# TYPE go_sched_gomaxprocs_threads gauge +go_sched_gomaxprocs_threads 8 +# HELP go_sched_goroutines_goroutines Count of live goroutines. +# TYPE go_sched_goroutines_goroutines gauge +go_sched_goroutines_goroutines 1123 +# HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. +# TYPE go_sched_latencies_seconds histogram +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 1851 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 2551 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 5081 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 16961 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 17342 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 17353 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 17353 +go_sched_latencies_seconds_bucket{le="+Inf"} 17353 +go_sched_latencies_seconds_sum 0.128123904 +go_sched_latencies_seconds_count 17353 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0.272595736 +# HELP go_threads Number of OS threads created. +# TYPE go_threads gauge +go_threads 10 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 0 +# HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. +# TYPE kubernetes_build_info gauge +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 +# HELP leader_election_master_status [ALPHA] Gauge of if the reporting system is master of the relevant lease, 0 indicates backup, 1 indicates master. 'name' is the string used to identify the lease. Please make sure to group by name. +# TYPE leader_election_master_status gauge +leader_election_master_status{name="kube-controller-manager"} 1 +# HELP node_collector_evictions_total [STABLE] Number of Node evictions that happened since current instance of NodeController started. +# TYPE node_collector_evictions_total counter +node_collector_evictions_total{zone=""} 0 +# HELP node_collector_unhealthy_nodes_in_zone [ALPHA] Gauge measuring number of not Ready Nodes per zones. +# TYPE node_collector_unhealthy_nodes_in_zone gauge +node_collector_unhealthy_nodes_in_zone{zone=""} 0 +# HELP node_collector_update_all_nodes_health_duration_seconds [ALPHA] Duration in seconds for NodeController to update the health of all nodes. +# TYPE node_collector_update_all_nodes_health_duration_seconds histogram +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.01"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.04"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.16"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.64"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="2.56"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="10.24"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="40.96"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="163.84"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="+Inf"} 125 +node_collector_update_all_nodes_health_duration_seconds_sum 0.030889747000000002 +node_collector_update_all_nodes_health_duration_seconds_count 125 +# HELP node_collector_update_node_health_duration_seconds [ALPHA] Duration in seconds for NodeController to update the health of a single node. +# TYPE node_collector_update_node_health_duration_seconds histogram +node_collector_update_node_health_duration_seconds_bucket{le="0.001"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.004"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.016"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.064"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.256"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="1.024"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="4.096"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="16.384"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="+Inf"} 125 +node_collector_update_node_health_duration_seconds_sum 0.018322937 +node_collector_update_node_health_duration_seconds_count 125 +# HELP node_collector_zone_health [ALPHA] Gauge measuring percentage of healthy nodes per zone. +# TYPE node_collector_zone_health gauge +node_collector_zone_health{zone=""} 100 +# HELP node_collector_zone_size [ALPHA] Gauge measuring number of registered Nodes per zones. +# TYPE node_collector_zone_size gauge +node_collector_zone_size{zone=""} 1 +# HELP node_ipam_controller_cidrset_allocation_tries_per_request [ALPHA] Number of endpoints added on each Service sync +# TYPE node_ipam_controller_cidrset_allocation_tries_per_request histogram +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="1"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="5"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="25"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="125"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="625"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_bucket{clusterCIDR="10.244.0.0/16",le="+Inf"} 1 +node_ipam_controller_cidrset_allocation_tries_per_request_sum{clusterCIDR="10.244.0.0/16"} 0 +node_ipam_controller_cidrset_allocation_tries_per_request_count{clusterCIDR="10.244.0.0/16"} 1 +# HELP node_ipam_controller_cidrset_cidrs_allocations_total [ALPHA] Counter measuring total number of CIDR allocations. +# TYPE node_ipam_controller_cidrset_cidrs_allocations_total counter +node_ipam_controller_cidrset_cidrs_allocations_total{clusterCIDR="10.244.0.0/16"} 1 +# HELP node_ipam_controller_cidrset_usage_cidrs [ALPHA] Gauge measuring percentage of allocated CIDRs. +# TYPE node_ipam_controller_cidrset_usage_cidrs gauge +node_ipam_controller_cidrset_usage_cidrs{clusterCIDR="10.244.0.0/16"} 0.00390625 +# HELP node_ipam_controller_cirdset_max_cidrs [ALPHA] Maximum number of CIDRs that can be allocated. +# TYPE node_ipam_controller_cirdset_max_cidrs gauge +node_ipam_controller_cirdset_max_cidrs{clusterCIDR="10.244.0.0/16"} 256 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 18.91 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 19 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 9.4121984e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.69157216924e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 8.00964608e+08 +# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. +# TYPE process_virtual_memory_max_bytes gauge +process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 121 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 9 +# HELP replicaset_controller_sorting_deletion_age_ratio [ALPHA] The ratio of chosen deleted pod's ages to the current youngest pod's age (at the time). Should be <2.The intent of this metric is to measure the rough efficacy of the LogarithmicScaleDown feature gate's effect onthe sorting (and deletion) of pods when a replicaset scales down. This only considers Ready pods when calculating and reporting. +# TYPE replicaset_controller_sorting_deletion_age_ratio histogram +replicaset_controller_sorting_deletion_age_ratio_bucket{le="0.25"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="0.5"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="1"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="2"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="4"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="8"} 0 +replicaset_controller_sorting_deletion_age_ratio_bucket{le="+Inf"} 0 +replicaset_controller_sorting_deletion_age_ratio_sum 0 +replicaset_controller_sorting_deletion_age_ratio_count 0 +# HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. +# TYPE rest_client_exec_plugin_certificate_rotation_age histogram +rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="14400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="86400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="604800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="2.592e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="7.776e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.5552e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3.1104e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.24416e+08"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="+Inf"} 0 +rest_client_exec_plugin_certificate_rotation_age_sum 0 +rest_client_exec_plugin_certificate_rotation_age_count 0 +# HELP rest_client_exec_plugin_ttl_seconds [ALPHA] Gauge of the shortest TTL (time-to-live) of the client certificate(s) managed by the auth exec plugin. The value is in seconds until certificate expiry (negative if already expired). If auth exec plugins are unused or manage no TLS certificates, the value will be +INF. +# TYPE rest_client_exec_plugin_ttl_seconds gauge +rest_client_exec_plugin_ttl_seconds +Inf +# HELP rest_client_rate_limiter_duration_seconds [ALPHA] Client side rate limiter latency in seconds. Broken down by verb, and host. +# TYPE rest_client_rate_limiter_duration_seconds histogram +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 503 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 503 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 547 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 554 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 559 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 6.241064445999998 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 2.6931999999999996e-05 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 66 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 66 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 84 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 2.0618520720000015 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.0009427589999999995 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 353 +# HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. +# TYPE rest_client_request_duration_seconds histogram +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 447 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 501 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 544 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 553 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 558 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 560 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 560 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 11.537652950999988 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 0 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 0.164656374 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 20 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 57 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 76 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 77 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 5.392320426000001 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 29 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 351 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 352 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 352 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 3.877152228000004 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 353 +# HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. +# TYPE rest_client_request_size_bytes histogram +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 0 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 1 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 6 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 7 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 7 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 15373 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 1 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 53 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 65 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 69 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 88 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 47067 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 317 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 321 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 346 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 264367 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 353 +# HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. +# TYPE rest_client_requests_total counter +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 619 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PATCH"} 12 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 348 +rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 85 +rest_client_requests_total{code="403",host="172.18.0.2:6443",method="GET"} 1 +rest_client_requests_total{code="403",host="172.18.0.2:6443",method="POST"} 4 +rest_client_requests_total{code="404",host="172.18.0.2:6443",method="GET"} 33 +rest_client_requests_total{code="409",host="172.18.0.2:6443",method="PUT"} 5 +# HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. +# TYPE rest_client_response_size_bytes histogram +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 20 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 84 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 437 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 441 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 458 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 558 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 1.424272e+06 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 4 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 11 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 28374 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 41 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 42 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 55 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 87 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 84305 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 2 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 322 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 325 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 346 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 249739 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 353 +# HELP retroactive_storageclass_errors_total [ALPHA] Total number of failed retroactive StorageClass assignments to persistent volume claim +# TYPE retroactive_storageclass_errors_total counter +retroactive_storageclass_errors_total 0 +# HELP retroactive_storageclass_total [ALPHA] Total number of retroactive StorageClass assignments to persistent volume claim +# TYPE retroactive_storageclass_total counter +retroactive_storageclass_total 0 +# HELP root_ca_cert_publisher_sync_duration_seconds [ALPHA] Number of namespace syncs happened in root ca cert publisher. +# TYPE root_ca_cert_publisher_sync_duration_seconds histogram +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.001"} 0 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.002"} 0 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.004"} 0 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.008"} 4 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.016"} 4 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.032"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.064"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.128"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.256"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.512"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="1.024"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="2.048"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="4.096"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="8.192"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="16.384"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="+Inf"} 5 +root_ca_cert_publisher_sync_duration_seconds_sum{code="200"} 0.04534516 +root_ca_cert_publisher_sync_duration_seconds_count{code="200"} 5 +# HELP root_ca_cert_publisher_sync_total [ALPHA] Number of namespace syncs happened in root ca cert publisher. +# TYPE root_ca_cert_publisher_sync_total counter +root_ca_cert_publisher_sync_total{code="200"} 5 +# HELP running_managed_controllers [ALPHA] Indicates where instances of a controller are currently running +# TYPE running_managed_controllers gauge +running_managed_controllers{manager="kube-controller-manager",name="nodeipam"} 1 +# HELP service_controller_loadbalancer_sync_total [ALPHA] A metric counting the amount of times any load balancer has been configured, as an effect of service/node changes on the cluster +# TYPE service_controller_loadbalancer_sync_total counter +service_controller_loadbalancer_sync_total 0 +# HELP service_controller_nodesync_error_total [ALPHA] A metric counting the amount of times any load balancer has been configured and errored, as an effect of node changes on the cluster +# TYPE service_controller_nodesync_error_total counter +service_controller_nodesync_error_total 0 +# HELP service_controller_nodesync_latency_seconds [ALPHA] A metric measuring the latency for nodesync which updates loadbalancer hosts on cluster node updates. +# TYPE service_controller_nodesync_latency_seconds histogram +service_controller_nodesync_latency_seconds_bucket{le="1"} 0 +service_controller_nodesync_latency_seconds_bucket{le="2"} 0 +service_controller_nodesync_latency_seconds_bucket{le="4"} 0 +service_controller_nodesync_latency_seconds_bucket{le="8"} 0 +service_controller_nodesync_latency_seconds_bucket{le="16"} 0 +service_controller_nodesync_latency_seconds_bucket{le="32"} 0 +service_controller_nodesync_latency_seconds_bucket{le="64"} 0 +service_controller_nodesync_latency_seconds_bucket{le="128"} 0 +service_controller_nodesync_latency_seconds_bucket{le="256"} 0 +service_controller_nodesync_latency_seconds_bucket{le="512"} 0 +service_controller_nodesync_latency_seconds_bucket{le="1024"} 0 +service_controller_nodesync_latency_seconds_bucket{le="2048"} 0 +service_controller_nodesync_latency_seconds_bucket{le="4096"} 0 +service_controller_nodesync_latency_seconds_bucket{le="8192"} 0 +service_controller_nodesync_latency_seconds_bucket{le="16384"} 0 +service_controller_nodesync_latency_seconds_bucket{le="+Inf"} 0 +service_controller_nodesync_latency_seconds_sum 0 +service_controller_nodesync_latency_seconds_count 0 +# HELP service_controller_update_loadbalancer_host_latency_seconds [ALPHA] A metric measuring the latency for updating each load balancer hosts. +# TYPE service_controller_update_loadbalancer_host_latency_seconds histogram +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="1"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="2"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="4"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="8"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="16"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="32"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="64"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="128"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="256"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="512"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="1024"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="2048"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="4096"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="8192"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="16384"} 0 +service_controller_update_loadbalancer_host_latency_seconds_bucket{le="+Inf"} 0 +service_controller_update_loadbalancer_host_latency_seconds_sum 0 +service_controller_update_loadbalancer_host_latency_seconds_count 0 +# HELP ttl_after_finished_controller_job_deletion_duration_seconds [ALPHA] The time it took to delete the job since it became eligible for deletion +# TYPE ttl_after_finished_controller_job_deletion_duration_seconds histogram +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="0.1"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="0.2"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="0.4"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="0.8"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="1.6"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="3.2"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="6.4"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="12.8"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="25.6"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="51.2"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="102.4"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="204.8"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="409.6"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="819.2"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="+Inf"} 0 +ttl_after_finished_controller_job_deletion_duration_seconds_sum 0 +ttl_after_finished_controller_job_deletion_duration_seconds_count 0 +# HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue +# TYPE workqueue_adds_total counter +workqueue_adds_total{name="ClusterRoleAggregator"} 18 +workqueue_adds_total{name="DynamicCABundle-client-ca-bundle"} 1 +workqueue_adds_total{name="DynamicCABundle-csr-controller"} 8 +workqueue_adds_total{name="DynamicCABundle-request-header"} 2 +workqueue_adds_total{name="DynamicServingCertificateController"} 11 +workqueue_adds_total{name="bootstrap_signer_queue"} 2 +workqueue_adds_total{name="certificate"} 0 +workqueue_adds_total{name="claims"} 0 +workqueue_adds_total{name="cronjob"} 0 +workqueue_adds_total{name="daemonset"} 20 +workqueue_adds_total{name="deployment"} 24 +workqueue_adds_total{name="disruption"} 0 +workqueue_adds_total{name="disruption_recheck"} 0 +workqueue_adds_total{name="endpoint"} 7 +workqueue_adds_total{name="endpoint_slice"} 9 +workqueue_adds_total{name="endpoint_slice_mirroring"} 5 +workqueue_adds_total{name="ephemeral_volume"} 0 +workqueue_adds_total{name="garbage_collector_attempt_to_delete"} 6 +workqueue_adds_total{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_adds_total{name="garbage_collector_graph_changes"} 1333 +workqueue_adds_total{name="horizontalpodautoscaler"} 0 +workqueue_adds_total{name="job"} 0 +workqueue_adds_total{name="job_orphan_pod"} 0 +workqueue_adds_total{name="namespace"} 0 +workqueue_adds_total{name="node"} 1 +workqueue_adds_total{name="node_lifecycle_controller"} 6 +workqueue_adds_total{name="node_lifecycle_controller_pods"} 10 +workqueue_adds_total{name="noexec_taint_node"} 1 +workqueue_adds_total{name="noexec_taint_pod"} 16 +workqueue_adds_total{name="orphaned_pods_nodes"} 0 +workqueue_adds_total{name="pvcprotection"} 0 +workqueue_adds_total{name="pvcs"} 0 +workqueue_adds_total{name="pvprotection"} 0 +workqueue_adds_total{name="replicaset"} 21 +workqueue_adds_total{name="replicationmanager"} 0 +workqueue_adds_total{name="resource_quota_controller_resource_changes"} 0 +workqueue_adds_total{name="resourcequota_primary"} 0 +workqueue_adds_total{name="resourcequota_priority"} 0 +workqueue_adds_total{name="root_ca_cert_publisher"} 5 +workqueue_adds_total{name="service"} 0 +workqueue_adds_total{name="serviceaccount"} 5 +workqueue_adds_total{name="serviceaccount_tokens_secret"} 0 +workqueue_adds_total{name="serviceaccount_tokens_service"} 42 +workqueue_adds_total{name="stale_pod_disruption"} 0 +workqueue_adds_total{name="statefulset"} 0 +workqueue_adds_total{name="token_cleaner"} 1 +workqueue_adds_total{name="ttl_jobs_to_delete"} 0 +workqueue_adds_total{name="ttlcontroller"} 8 +workqueue_adds_total{name="volume_expand"} 0 +workqueue_adds_total{name="volumes"} 0 +# HELP workqueue_depth [ALPHA] Current depth of workqueue +# TYPE workqueue_depth gauge +workqueue_depth{name="ClusterRoleAggregator"} 0 +workqueue_depth{name="DynamicCABundle-client-ca-bundle"} 0 +workqueue_depth{name="DynamicCABundle-csr-controller"} 0 +workqueue_depth{name="DynamicCABundle-request-header"} 0 +workqueue_depth{name="DynamicServingCertificateController"} 0 +workqueue_depth{name="bootstrap_signer_queue"} 0 +workqueue_depth{name="certificate"} 0 +workqueue_depth{name="claims"} 0 +workqueue_depth{name="cronjob"} 0 +workqueue_depth{name="daemonset"} 0 +workqueue_depth{name="deployment"} 0 +workqueue_depth{name="disruption"} 0 +workqueue_depth{name="disruption_recheck"} 0 +workqueue_depth{name="endpoint"} 0 +workqueue_depth{name="endpoint_slice"} 0 +workqueue_depth{name="endpoint_slice_mirroring"} 0 +workqueue_depth{name="ephemeral_volume"} 0 +workqueue_depth{name="garbage_collector_attempt_to_delete"} 0 +workqueue_depth{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_depth{name="garbage_collector_graph_changes"} 0 +workqueue_depth{name="horizontalpodautoscaler"} 0 +workqueue_depth{name="job"} 0 +workqueue_depth{name="job_orphan_pod"} 0 +workqueue_depth{name="namespace"} 0 +workqueue_depth{name="node"} 1 +workqueue_depth{name="node_lifecycle_controller"} 0 +workqueue_depth{name="node_lifecycle_controller_pods"} 0 +workqueue_depth{name="noexec_taint_node"} 0 +workqueue_depth{name="noexec_taint_pod"} 0 +workqueue_depth{name="orphaned_pods_nodes"} 0 +workqueue_depth{name="pvcprotection"} 0 +workqueue_depth{name="pvcs"} 0 +workqueue_depth{name="pvprotection"} 0 +workqueue_depth{name="replicaset"} 0 +workqueue_depth{name="replicationmanager"} 0 +workqueue_depth{name="resource_quota_controller_resource_changes"} 0 +workqueue_depth{name="resourcequota_primary"} 0 +workqueue_depth{name="resourcequota_priority"} 0 +workqueue_depth{name="root_ca_cert_publisher"} 0 +workqueue_depth{name="service"} 0 +workqueue_depth{name="serviceaccount"} 0 +workqueue_depth{name="serviceaccount_tokens_secret"} 0 +workqueue_depth{name="serviceaccount_tokens_service"} 0 +workqueue_depth{name="stale_pod_disruption"} 0 +workqueue_depth{name="statefulset"} 0 +workqueue_depth{name="token_cleaner"} 0 +workqueue_depth{name="ttl_jobs_to_delete"} 0 +workqueue_depth{name="ttlcontroller"} 0 +workqueue_depth{name="volume_expand"} 0 +workqueue_depth{name="volumes"} 0 +# HELP workqueue_longest_running_processor_seconds [ALPHA] How many seconds has the longest running processor for workqueue been running. +# TYPE workqueue_longest_running_processor_seconds gauge +workqueue_longest_running_processor_seconds{name="ClusterRoleAggregator"} 0 +workqueue_longest_running_processor_seconds{name="DynamicCABundle-client-ca-bundle"} 0 +workqueue_longest_running_processor_seconds{name="DynamicCABundle-csr-controller"} 0 +workqueue_longest_running_processor_seconds{name="DynamicCABundle-request-header"} 0 +workqueue_longest_running_processor_seconds{name="DynamicServingCertificateController"} 0 +workqueue_longest_running_processor_seconds{name="bootstrap_signer_queue"} 0 +workqueue_longest_running_processor_seconds{name="certificate"} 0 +workqueue_longest_running_processor_seconds{name="claims"} 0 +workqueue_longest_running_processor_seconds{name="cronjob"} 0 +workqueue_longest_running_processor_seconds{name="daemonset"} 0 +workqueue_longest_running_processor_seconds{name="deployment"} 0 +workqueue_longest_running_processor_seconds{name="disruption"} 0 +workqueue_longest_running_processor_seconds{name="disruption_recheck"} 0 +workqueue_longest_running_processor_seconds{name="endpoint"} 0 +workqueue_longest_running_processor_seconds{name="endpoint_slice"} 0 +workqueue_longest_running_processor_seconds{name="endpoint_slice_mirroring"} 0 +workqueue_longest_running_processor_seconds{name="ephemeral_volume"} 0 +workqueue_longest_running_processor_seconds{name="garbage_collector_attempt_to_delete"} 0 +workqueue_longest_running_processor_seconds{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_longest_running_processor_seconds{name="garbage_collector_graph_changes"} 0 +workqueue_longest_running_processor_seconds{name="horizontalpodautoscaler"} 0 +workqueue_longest_running_processor_seconds{name="job"} 0 +workqueue_longest_running_processor_seconds{name="job_orphan_pod"} 0 +workqueue_longest_running_processor_seconds{name="namespace"} 0 +workqueue_longest_running_processor_seconds{name="node"} 0 +workqueue_longest_running_processor_seconds{name="node_lifecycle_controller"} 0 +workqueue_longest_running_processor_seconds{name="node_lifecycle_controller_pods"} 0 +workqueue_longest_running_processor_seconds{name="noexec_taint_node"} 0 +workqueue_longest_running_processor_seconds{name="noexec_taint_pod"} 0 +workqueue_longest_running_processor_seconds{name="orphaned_pods_nodes"} 0 +workqueue_longest_running_processor_seconds{name="pvcprotection"} 0 +workqueue_longest_running_processor_seconds{name="pvcs"} 0 +workqueue_longest_running_processor_seconds{name="pvprotection"} 0 +workqueue_longest_running_processor_seconds{name="replicaset"} 0 +workqueue_longest_running_processor_seconds{name="replicationmanager"} 0 +workqueue_longest_running_processor_seconds{name="resource_quota_controller_resource_changes"} 0 +workqueue_longest_running_processor_seconds{name="resourcequota_primary"} 0 +workqueue_longest_running_processor_seconds{name="resourcequota_priority"} 0 +workqueue_longest_running_processor_seconds{name="root_ca_cert_publisher"} 0 +workqueue_longest_running_processor_seconds{name="service"} 0 +workqueue_longest_running_processor_seconds{name="serviceaccount"} 0 +workqueue_longest_running_processor_seconds{name="serviceaccount_tokens_secret"} 0 +workqueue_longest_running_processor_seconds{name="serviceaccount_tokens_service"} 0 +workqueue_longest_running_processor_seconds{name="stale_pod_disruption"} 0 +workqueue_longest_running_processor_seconds{name="statefulset"} 0 +workqueue_longest_running_processor_seconds{name="token_cleaner"} 0 +workqueue_longest_running_processor_seconds{name="ttl_jobs_to_delete"} 0 +workqueue_longest_running_processor_seconds{name="ttlcontroller"} 0 +workqueue_longest_running_processor_seconds{name="volume_expand"} 0 +workqueue_longest_running_processor_seconds{name="volumes"} 0 +# HELP workqueue_queue_duration_seconds [ALPHA] How long in seconds an item stays in workqueue before being requested. +# TYPE workqueue_queue_duration_seconds histogram +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-06"} 2 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-05"} 9 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 12 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.01"} 15 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 18 +workqueue_queue_duration_seconds_sum{name="ClusterRoleAggregator"} 0.083220427 +workqueue_queue_duration_seconds_count{name="ClusterRoleAggregator"} 18 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-05"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.001"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.01"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="10"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="+Inf"} 1 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 9.4449e-05 +workqueue_queue_duration_seconds_count{name="DynamicCABundle-client-ca-bundle"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-05"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 4 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.01"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.1"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="10"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="+Inf"} 8 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.012802833999999999 +workqueue_queue_duration_seconds_count{name="DynamicCABundle-csr-controller"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-05"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.001"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.01"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.1"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="10"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="+Inf"} 2 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-request-header"} 0.00014659500000000002 +workqueue_queue_duration_seconds_count{name="DynamicCABundle-request-header"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 11 +workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.00016838400000000002 +workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 11 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.001"} 1 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.01"} 1 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1"} 1 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="10"} 1 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="+Inf"} 2 +workqueue_queue_duration_seconds_sum{name="bootstrap_signer_queue"} 13.20053605 +workqueue_queue_duration_seconds_count{name="bootstrap_signer_queue"} 2 +workqueue_queue_duration_seconds_bucket{name="certificate",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="certificate",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="certificate"} 0 +workqueue_queue_duration_seconds_count{name="certificate"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="claims",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="claims"} 0 +workqueue_queue_duration_seconds_count{name="claims"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="cronjob",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="cronjob"} 0 +workqueue_queue_duration_seconds_count{name="cronjob"} 0 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-06"} 7 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-05"} 13 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.001"} 14 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.01"} 15 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.1"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="1"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="10"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="+Inf"} 20 +workqueue_queue_duration_seconds_sum{name="daemonset"} 0.13628356 +workqueue_queue_duration_seconds_count{name="daemonset"} 20 +workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-06"} 5 +workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-05"} 14 +workqueue_queue_duration_seconds_bucket{name="deployment",le="0.001"} 15 +workqueue_queue_duration_seconds_bucket{name="deployment",le="0.01"} 19 +workqueue_queue_duration_seconds_bucket{name="deployment",le="0.1"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="1"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="10"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="+Inf"} 24 +workqueue_queue_duration_seconds_sum{name="deployment"} 0.19736604500000002 +workqueue_queue_duration_seconds_count{name="deployment"} 24 +workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="disruption"} 0 +workqueue_queue_duration_seconds_count{name="disruption"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="disruption_recheck",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="disruption_recheck"} 0 +workqueue_queue_duration_seconds_count{name="disruption_recheck"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-06"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.001"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.01"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.1"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="1"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="10"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="+Inf"} 7 +workqueue_queue_duration_seconds_sum{name="endpoint"} 0.096313131 +workqueue_queue_duration_seconds_count{name="endpoint"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-06"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-05"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.001"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="10"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 9 +workqueue_queue_duration_seconds_sum{name="endpoint_slice"} 0.10669576500000003 +workqueue_queue_duration_seconds_count{name="endpoint_slice"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-06"} 3 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-05"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 5 +workqueue_queue_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.054689076999999996 +workqueue_queue_duration_seconds_count{name="endpoint_slice_mirroring"} 5 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="ephemeral_volume"} 0 +workqueue_queue_duration_seconds_count{name="ephemeral_volume"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 6 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 6 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 6 +workqueue_queue_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 4.097001815 +workqueue_queue_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 6 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_queue_duration_seconds_count{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-06"} 2 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 1005 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 1239 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 1333 +workqueue_queue_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.032958143000000044 +workqueue_queue_duration_seconds_count{name="garbage_collector_graph_changes"} 1333 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="horizontalpodautoscaler"} 0 +workqueue_queue_duration_seconds_count{name="horizontalpodautoscaler"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="job",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="job"} 0 +workqueue_queue_duration_seconds_count{name="job"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="job_orphan_pod",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="job_orphan_pod"} 0 +workqueue_queue_duration_seconds_count{name="job_orphan_pod"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="namespace",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="namespace"} 0 +workqueue_queue_duration_seconds_count{name="namespace"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="node"} 0 +workqueue_queue_duration_seconds_count{name="node"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 3 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 6 +workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller"} 0.09706806599999998 +workqueue_queue_duration_seconds_count{name="node_lifecycle_controller"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-05"} 2 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.001"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.01"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.1"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1"} 10 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="10"} 10 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="+Inf"} 10 +workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.4169839409999999 +workqueue_queue_duration_seconds_count{name="node_lifecycle_controller_pods"} 10 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1"} 1 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="10"} 1 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="+Inf"} 1 +workqueue_queue_duration_seconds_sum{name="noexec_taint_node"} 0.097449632 +workqueue_queue_duration_seconds_count{name="noexec_taint_node"} 1 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 11 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-05"} 12 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.001"} 12 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.01"} 12 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.1"} 12 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1"} 16 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="10"} 16 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="+Inf"} 16 +workqueue_queue_duration_seconds_sum{name="noexec_taint_pod"} 0.41756404399999997 +workqueue_queue_duration_seconds_count{name="noexec_taint_pod"} 16 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="orphaned_pods_nodes"} 0 +workqueue_queue_duration_seconds_count{name="orphaned_pods_nodes"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcprotection",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="pvcprotection"} 0 +workqueue_queue_duration_seconds_count{name="pvcprotection"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="pvcs",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="pvcs"} 0 +workqueue_queue_duration_seconds_count{name="pvcs"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="pvprotection",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="pvprotection"} 0 +workqueue_queue_duration_seconds_count{name="pvprotection"} 0 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 8 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 16 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.001"} 17 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.01"} 19 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="replicaset"} 0.053872862999999986 +workqueue_queue_duration_seconds_count{name="replicaset"} 21 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="replicationmanager"} 0 +workqueue_queue_duration_seconds_count{name="replicationmanager"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="resource_quota_controller_resource_changes"} 0 +workqueue_queue_duration_seconds_count{name="resource_quota_controller_resource_changes"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_primary",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="resourcequota_primary"} 0 +workqueue_queue_duration_seconds_count{name="resourcequota_primary"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="resourcequota_priority",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="resourcequota_priority"} 0 +workqueue_queue_duration_seconds_count{name="resourcequota_priority"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 5 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="1"} 5 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="10"} 5 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="+Inf"} 5 +workqueue_queue_duration_seconds_sum{name="root_ca_cert_publisher"} 0.33130713 +workqueue_queue_duration_seconds_count{name="root_ca_cert_publisher"} 5 +workqueue_queue_duration_seconds_bucket{name="service",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="service",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="service"} 0 +workqueue_queue_duration_seconds_count{name="service"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.1"} 5 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="1"} 5 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="10"} 5 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="+Inf"} 5 +workqueue_queue_duration_seconds_sum{name="serviceaccount"} 0.155889986 +workqueue_queue_duration_seconds_count{name="serviceaccount"} 5 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="serviceaccount_tokens_secret"} 0 +workqueue_queue_duration_seconds_count{name="serviceaccount_tokens_secret"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 23 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-05"} 36 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.001"} 36 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.01"} 37 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.1"} 42 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1"} 42 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="10"} 42 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="+Inf"} 42 +workqueue_queue_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.2990801869999998 +workqueue_queue_duration_seconds_count{name="serviceaccount_tokens_service"} 42 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="stale_pod_disruption"} 0 +workqueue_queue_duration_seconds_count{name="stale_pod_disruption"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="statefulset",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="statefulset"} 0 +workqueue_queue_duration_seconds_count{name="statefulset"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="0.001"} 1 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="0.01"} 1 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="1"} 1 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="10"} 1 +workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="+Inf"} 1 +workqueue_queue_duration_seconds_sum{name="token_cleaner"} 0.00050785 +workqueue_queue_duration_seconds_count{name="token_cleaner"} 1 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="ttl_jobs_to_delete"} 0 +workqueue_queue_duration_seconds_count{name="ttl_jobs_to_delete"} 0 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 5 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 7 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 7 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="10"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 8 +workqueue_queue_duration_seconds_sum{name="ttlcontroller"} 0.0015355340000000003 +workqueue_queue_duration_seconds_count{name="ttlcontroller"} 8 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="volume_expand",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="volume_expand"} 0 +workqueue_queue_duration_seconds_count{name="volume_expand"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="volumes",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="volumes"} 0 +workqueue_queue_duration_seconds_count{name="volumes"} 0 +# HELP workqueue_retries_total [ALPHA] Total number of retries handled by workqueue +# TYPE workqueue_retries_total counter +workqueue_retries_total{name="ClusterRoleAggregator"} 0 +workqueue_retries_total{name="DynamicCABundle-client-ca-bundle"} 0 +workqueue_retries_total{name="DynamicCABundle-csr-controller"} 0 +workqueue_retries_total{name="DynamicCABundle-request-header"} 0 +workqueue_retries_total{name="DynamicServingCertificateController"} 0 +workqueue_retries_total{name="bootstrap_signer_queue"} 0 +workqueue_retries_total{name="certificate"} 0 +workqueue_retries_total{name="cronjob"} 0 +workqueue_retries_total{name="daemonset"} 4 +workqueue_retries_total{name="deployment"} 13 +workqueue_retries_total{name="disruption"} 0 +workqueue_retries_total{name="disruption_recheck"} 0 +workqueue_retries_total{name="endpoint"} 5 +workqueue_retries_total{name="endpoint_slice"} 9 +workqueue_retries_total{name="endpoint_slice_mirroring"} 0 +workqueue_retries_total{name="ephemeral_volume"} 0 +workqueue_retries_total{name="garbage_collector_attempt_to_delete"} 0 +workqueue_retries_total{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_retries_total{name="garbage_collector_graph_changes"} 0 +workqueue_retries_total{name="horizontalpodautoscaler"} 0 +workqueue_retries_total{name="job"} 0 +workqueue_retries_total{name="job_orphan_pod"} 0 +workqueue_retries_total{name="namespace"} 0 +workqueue_retries_total{name="node"} 0 +workqueue_retries_total{name="node_lifecycle_controller_pods"} 0 +workqueue_retries_total{name="orphaned_pods_nodes"} 0 +workqueue_retries_total{name="pvcprotection"} 0 +workqueue_retries_total{name="pvcs"} 0 +workqueue_retries_total{name="pvprotection"} 0 +workqueue_retries_total{name="replicaset"} 0 +workqueue_retries_total{name="replicationmanager"} 0 +workqueue_retries_total{name="resource_quota_controller_resource_changes"} 0 +workqueue_retries_total{name="resourcequota_primary"} 0 +workqueue_retries_total{name="resourcequota_priority"} 0 +workqueue_retries_total{name="root_ca_cert_publisher"} 0 +workqueue_retries_total{name="service"} 0 +workqueue_retries_total{name="serviceaccount"} 0 +workqueue_retries_total{name="serviceaccount_tokens_secret"} 0 +workqueue_retries_total{name="serviceaccount_tokens_service"} 0 +workqueue_retries_total{name="stale_pod_disruption"} 0 +workqueue_retries_total{name="statefulset"} 0 +workqueue_retries_total{name="token_cleaner"} 1 +workqueue_retries_total{name="ttl_jobs_to_delete"} 0 +workqueue_retries_total{name="ttlcontroller"} 0 +workqueue_retries_total{name="volume_expand"} 0 +# HELP workqueue_unfinished_work_seconds [ALPHA] How many seconds of work has done that is in progress and hasn't been observed by work_duration. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases. +# TYPE workqueue_unfinished_work_seconds gauge +workqueue_unfinished_work_seconds{name="ClusterRoleAggregator"} 0 +workqueue_unfinished_work_seconds{name="DynamicCABundle-client-ca-bundle"} 0 +workqueue_unfinished_work_seconds{name="DynamicCABundle-csr-controller"} 0 +workqueue_unfinished_work_seconds{name="DynamicCABundle-request-header"} 0 +workqueue_unfinished_work_seconds{name="DynamicServingCertificateController"} 0 +workqueue_unfinished_work_seconds{name="bootstrap_signer_queue"} 0 +workqueue_unfinished_work_seconds{name="certificate"} 0 +workqueue_unfinished_work_seconds{name="claims"} 0 +workqueue_unfinished_work_seconds{name="cronjob"} 0 +workqueue_unfinished_work_seconds{name="daemonset"} 0 +workqueue_unfinished_work_seconds{name="deployment"} 0 +workqueue_unfinished_work_seconds{name="disruption"} 0 +workqueue_unfinished_work_seconds{name="disruption_recheck"} 0 +workqueue_unfinished_work_seconds{name="endpoint"} 0 +workqueue_unfinished_work_seconds{name="endpoint_slice"} 0 +workqueue_unfinished_work_seconds{name="endpoint_slice_mirroring"} 0 +workqueue_unfinished_work_seconds{name="ephemeral_volume"} 0 +workqueue_unfinished_work_seconds{name="garbage_collector_attempt_to_delete"} 0 +workqueue_unfinished_work_seconds{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_unfinished_work_seconds{name="garbage_collector_graph_changes"} 0 +workqueue_unfinished_work_seconds{name="horizontalpodautoscaler"} 0 +workqueue_unfinished_work_seconds{name="job"} 0 +workqueue_unfinished_work_seconds{name="job_orphan_pod"} 0 +workqueue_unfinished_work_seconds{name="namespace"} 0 +workqueue_unfinished_work_seconds{name="node"} 0 +workqueue_unfinished_work_seconds{name="node_lifecycle_controller"} 0 +workqueue_unfinished_work_seconds{name="node_lifecycle_controller_pods"} 0 +workqueue_unfinished_work_seconds{name="noexec_taint_node"} 0 +workqueue_unfinished_work_seconds{name="noexec_taint_pod"} 0 +workqueue_unfinished_work_seconds{name="orphaned_pods_nodes"} 0 +workqueue_unfinished_work_seconds{name="pvcprotection"} 0 +workqueue_unfinished_work_seconds{name="pvcs"} 0 +workqueue_unfinished_work_seconds{name="pvprotection"} 0 +workqueue_unfinished_work_seconds{name="replicaset"} 0 +workqueue_unfinished_work_seconds{name="replicationmanager"} 0 +workqueue_unfinished_work_seconds{name="resource_quota_controller_resource_changes"} 0 +workqueue_unfinished_work_seconds{name="resourcequota_primary"} 0 +workqueue_unfinished_work_seconds{name="resourcequota_priority"} 0 +workqueue_unfinished_work_seconds{name="root_ca_cert_publisher"} 0 +workqueue_unfinished_work_seconds{name="service"} 0 +workqueue_unfinished_work_seconds{name="serviceaccount"} 0 +workqueue_unfinished_work_seconds{name="serviceaccount_tokens_secret"} 0 +workqueue_unfinished_work_seconds{name="serviceaccount_tokens_service"} 0 +workqueue_unfinished_work_seconds{name="stale_pod_disruption"} 0 +workqueue_unfinished_work_seconds{name="statefulset"} 0 +workqueue_unfinished_work_seconds{name="token_cleaner"} 0 +workqueue_unfinished_work_seconds{name="ttl_jobs_to_delete"} 0 +workqueue_unfinished_work_seconds{name="ttlcontroller"} 0 +workqueue_unfinished_work_seconds{name="volume_expand"} 0 +workqueue_unfinished_work_seconds{name="volumes"} 0 +# HELP workqueue_work_duration_seconds [ALPHA] How long in seconds processing an item from workqueue takes. +# TYPE workqueue_work_duration_seconds histogram +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 12 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.01"} 13 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 18 +workqueue_work_duration_seconds_sum{name="ClusterRoleAggregator"} 0.11454938699999999 +workqueue_work_duration_seconds_count{name="ClusterRoleAggregator"} 18 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-05"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.001"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.01"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.1"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="10"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="+Inf"} 1 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 8.4975e-05 +workqueue_work_duration_seconds_count{name="DynamicCABundle-client-ca-bundle"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.01"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.1"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="10"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="+Inf"} 8 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.025409607 +workqueue_work_duration_seconds_count{name="DynamicCABundle-csr-controller"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-05"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.001"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.01"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.1"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="10"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="+Inf"} 2 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-request-header"} 0.000267977 +workqueue_work_duration_seconds_count{name="DynamicCABundle-request-header"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 9 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 11 +workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.00047514399999999994 +workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 11 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-05"} 1 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.001"} 1 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.01"} 1 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.1"} 1 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1"} 2 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="10"} 2 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="+Inf"} 2 +workqueue_work_duration_seconds_sum{name="bootstrap_signer_queue"} 0.38498436100000005 +workqueue_work_duration_seconds_count{name="bootstrap_signer_queue"} 2 +workqueue_work_duration_seconds_bucket{name="certificate",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="certificate",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="certificate"} 0 +workqueue_work_duration_seconds_count{name="certificate"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="claims",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="claims"} 0 +workqueue_work_duration_seconds_count{name="claims"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="cronjob",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="cronjob"} 0 +workqueue_work_duration_seconds_count{name="cronjob"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.001"} 8 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.01"} 13 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.1"} 18 +workqueue_work_duration_seconds_bucket{name="daemonset",le="1"} 20 +workqueue_work_duration_seconds_bucket{name="daemonset",le="10"} 20 +workqueue_work_duration_seconds_bucket{name="daemonset",le="+Inf"} 20 +workqueue_work_duration_seconds_sum{name="daemonset"} 0.8108563479999998 +workqueue_work_duration_seconds_count{name="daemonset"} 20 +workqueue_work_duration_seconds_bucket{name="deployment",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="deployment",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="deployment",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="deployment",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="deployment",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.001"} 11 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.01"} 18 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.1"} 22 +workqueue_work_duration_seconds_bucket{name="deployment",le="1"} 24 +workqueue_work_duration_seconds_bucket{name="deployment",le="10"} 24 +workqueue_work_duration_seconds_bucket{name="deployment",le="+Inf"} 24 +workqueue_work_duration_seconds_sum{name="deployment"} 0.8284786330000001 +workqueue_work_duration_seconds_count{name="deployment"} 24 +workqueue_work_duration_seconds_bucket{name="disruption",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="disruption",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="disruption"} 0 +workqueue_work_duration_seconds_count{name="disruption"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="disruption_recheck",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="disruption_recheck"} 0 +workqueue_work_duration_seconds_count{name="disruption_recheck"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 3 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.001"} 3 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.01"} 6 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="endpoint",le="1"} 7 +workqueue_work_duration_seconds_bucket{name="endpoint",le="10"} 7 +workqueue_work_duration_seconds_bucket{name="endpoint",le="+Inf"} 7 +workqueue_work_duration_seconds_sum{name="endpoint"} 0.43761739 +workqueue_work_duration_seconds_count{name="endpoint"} 7 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-05"} 1 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.001"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 8 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 8 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="10"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 9 +workqueue_work_duration_seconds_sum{name="endpoint_slice"} 0.48552537400000007 +workqueue_work_duration_seconds_count{name="endpoint_slice"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-05"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 5 +workqueue_work_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.00024789 +workqueue_work_duration_seconds_count{name="endpoint_slice_mirroring"} 5 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="ephemeral_volume"} 0 +workqueue_work_duration_seconds_count{name="ephemeral_volume"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 6 +workqueue_work_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 0.053933561 +workqueue_work_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_work_duration_seconds_count{name="garbage_collector_attempt_to_orphan"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 272 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 1331 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 1333 +workqueue_work_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.02076810500000004 +workqueue_work_duration_seconds_count{name="garbage_collector_graph_changes"} 1333 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="horizontalpodautoscaler"} 0 +workqueue_work_duration_seconds_count{name="horizontalpodautoscaler"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="job",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="job"} 0 +workqueue_work_duration_seconds_count{name="job"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="job_orphan_pod",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="job_orphan_pod"} 0 +workqueue_work_duration_seconds_count{name="job_orphan_pod"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="namespace",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="namespace"} 0 +workqueue_work_duration_seconds_count{name="namespace"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="node"} 0 +workqueue_work_duration_seconds_count{name="node"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 4 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 5 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 6 +workqueue_work_duration_seconds_sum{name="node_lifecycle_controller"} 0.01082167 +workqueue_work_duration_seconds_count{name="node_lifecycle_controller"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-06"} 2 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-05"} 8 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.001"} 10 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.01"} 10 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.1"} 10 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1"} 10 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="10"} 10 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="+Inf"} 10 +workqueue_work_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.0005988570000000001 +workqueue_work_duration_seconds_count{name="node_lifecycle_controller_pods"} 10 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="9.999999999999999e-05"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="0.001"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="0.01"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="0.1"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="10"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="+Inf"} 1 +workqueue_work_duration_seconds_sum{name="noexec_taint_node"} 8.0701e-05 +workqueue_work_duration_seconds_count{name="noexec_taint_node"} 1 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 3 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-05"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.001"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.01"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.1"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="10"} 16 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="+Inf"} 16 +workqueue_work_duration_seconds_sum{name="noexec_taint_pod"} 0.00039294 +workqueue_work_duration_seconds_count{name="noexec_taint_pod"} 16 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="orphaned_pods_nodes"} 0 +workqueue_work_duration_seconds_count{name="orphaned_pods_nodes"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="pvcprotection",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="pvcprotection"} 0 +workqueue_work_duration_seconds_count{name="pvcprotection"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="pvcs",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="pvcs"} 0 +workqueue_work_duration_seconds_count{name="pvcs"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="pvprotection",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="pvprotection"} 0 +workqueue_work_duration_seconds_count{name="pvprotection"} 0 +workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 8 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 14 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 17 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 19 +workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="replicaset"} 0.59551322 +workqueue_work_duration_seconds_count{name="replicaset"} 21 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="replicationmanager",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="replicationmanager"} 0 +workqueue_work_duration_seconds_count{name="replicationmanager"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="resource_quota_controller_resource_changes",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="resource_quota_controller_resource_changes"} 0 +workqueue_work_duration_seconds_count{name="resource_quota_controller_resource_changes"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_primary",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="resourcequota_primary"} 0 +workqueue_work_duration_seconds_count{name="resourcequota_primary"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="resourcequota_priority",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="resourcequota_priority"} 0 +workqueue_work_duration_seconds_count{name="resourcequota_priority"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.01"} 4 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 5 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="1"} 5 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="10"} 5 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="+Inf"} 5 +workqueue_work_duration_seconds_sum{name="root_ca_cert_publisher"} 0.045449207000000005 +workqueue_work_duration_seconds_count{name="root_ca_cert_publisher"} 5 +workqueue_work_duration_seconds_bucket{name="service",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="service",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="service"} 0 +workqueue_work_duration_seconds_count{name="service"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.01"} 4 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.1"} 5 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="1"} 5 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="10"} 5 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="+Inf"} 5 +workqueue_work_duration_seconds_sum{name="serviceaccount"} 0.037981051 +workqueue_work_duration_seconds_count{name="serviceaccount"} 5 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="serviceaccount_tokens_secret"} 0 +workqueue_work_duration_seconds_count{name="serviceaccount_tokens_secret"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 24 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-05"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.001"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.01"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.1"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="10"} 42 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="+Inf"} 42 +workqueue_work_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.00041573900000000004 +workqueue_work_duration_seconds_count{name="serviceaccount_tokens_service"} 42 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="stale_pod_disruption"} 0 +workqueue_work_duration_seconds_count{name="stale_pod_disruption"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="statefulset",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="statefulset"} 0 +workqueue_work_duration_seconds_count{name="statefulset"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="0.001"} 1 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="0.01"} 1 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="0.1"} 1 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="1"} 1 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="10"} 1 +workqueue_work_duration_seconds_bucket{name="token_cleaner",le="+Inf"} 1 +workqueue_work_duration_seconds_sum{name="token_cleaner"} 0.000115156 +workqueue_work_duration_seconds_count{name="token_cleaner"} 1 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="ttl_jobs_to_delete"} 0 +workqueue_work_duration_seconds_count{name="ttl_jobs_to_delete"} 0 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 4 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="10"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 8 +workqueue_work_duration_seconds_sum{name="ttlcontroller"} 0.019944503999999995 +workqueue_work_duration_seconds_count{name="ttlcontroller"} 8 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="volume_expand",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="volume_expand"} 0 +workqueue_work_duration_seconds_count{name="volume_expand"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="volumes",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="volumes"} 0 +workqueue_work_duration_seconds_count{name="volumes"} 0 diff --git a/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27.expected b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27.expected new file mode 100644 index 00000000000..5bd7ffbd9be --- /dev/null +++ b/metricbeat/module/kubernetes/controllermanager/_meta/test/metrics.1.27.expected @@ -0,0 +1,2293 @@ +[ + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 33 + } + }, + "code": "404", + "host": "172.18.0.2: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": { + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 89, + "100000": 76, + "1000000": 89, + "15000000": 89, + "2000000": 89, + "25000": 57, + "250000": 77, + "30000000": 89, + "4000000": 89, + "5000": 20, + "500000": 89, + "60000000": 89, + "8000000": 89 + }, + "count": 89, + "sum": 5392320.426000001 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 89, + "1024": 69, + "1048576": 89, + "16384": 89, + "16777216": 89, + "256": 53, + "262144": 89, + "4096": 88, + "4194304": 89, + "512": 65, + "64": 1, + "65536": 89 + }, + "count": 89, + "sum": 47067 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 89, + "1024": 55, + "1048576": 89, + "16384": 89, + "16777216": 89, + "256": 41, + "262144": 89, + "4096": 87, + "4194304": 89, + "512": 42, + "64": 0, + "65536": 89 + }, + "count": 89, + "sum": 84305 + } + } + } + }, + "host": "172.18.0.2:6443", + "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": { + "name": "job", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "endpoint_slice", + "workqueue": { + "adds": { + "count": 9 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 9 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 5 + } + }, + "code": "409", + "host": "172.18.0.2:6443", + "method": "PUT" + }, + "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": 619 + } + }, + "code": "200", + "host": "172.18.0.2: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": { + "name": "replicationmanager", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "node": { + "collector": { + "count": 1, + "eviction": { + "count": 0 + }, + "health": { + "pct": 100 + }, + "unhealthy": { + "count": 0 + } + } + }, + "process": { + "cpu": { + "sec": 18 + }, + "fds": { + "max": { + "count": 1048576 + }, + "open": { + "count": 19 + } + }, + "memory": { + "resident": { + "bytes": 94121984 + }, + "virtual": { + "bytes": 800964608 + } + }, + "started": { + "sec": 1691572169.24 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "serviceaccount_tokens_service", + "workqueue": { + "adds": { + "count": 42 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "bootstrap_signer_queue", + "workqueue": { + "adds": { + "count": 2 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "claims", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 353, + "100000": 352, + "1000000": 353, + "15000000": 353, + "2000000": 353, + "25000": 351, + "250000": 352, + "30000000": 353, + "4000000": 353, + "5000": 29, + "500000": 353, + "60000000": 353, + "8000000": 353 + }, + "count": 353, + "sum": 3877152.228000004 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 353, + "1024": 321, + "1048576": 353, + "16384": 353, + "16777216": 353, + "256": 0, + "262144": 353, + "4096": 346, + "4194304": 353, + "512": 317, + "64": 0, + "65536": 353 + }, + "count": 353, + "sum": 264367 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 353, + "1024": 325, + "1048576": 353, + "16384": 353, + "16777216": 353, + "256": 2, + "262144": 353, + "4096": 346, + "4194304": 353, + "512": 322, + "64": 0, + "65536": 353 + }, + "count": 353, + "sum": 249739 + } + } + } + }, + "host": "172.18.0.2:6443", + "verb": "PUT" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicServingCertificateController", + "workqueue": { + "adds": { + "count": 11 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "node_lifecycle_controller_pods", + "workqueue": { + "adds": { + "count": 10 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "cronjob", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "noexec_taint_pod", + "workqueue": { + "adds": { + "count": 16 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "disruption_recheck", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "disruption", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 85 + } + }, + "code": "201", + "host": "172.18.0.2:6443", + "method": "POST" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "pvcs", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "garbage_collector_graph_changes", + "workqueue": { + "adds": { + "count": 1333 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicCABundle-request-header", + "workqueue": { + "adds": { + "count": 2 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 561, + "100000": 544, + "1000000": 560, + "15000000": 561, + "2000000": 560, + "25000": 501, + "250000": 553, + "30000000": 561, + "4000000": 561, + "5000": 447, + "500000": 558, + "60000000": 561, + "8000000": 561 + }, + "count": 561, + "sum": 11537652.950999988 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 561, + "1024": 561, + "1048576": 561, + "16384": 561, + "16777216": 561, + "256": 561, + "262144": 561, + "4096": 561, + "4194304": 561, + "512": 561, + "64": 561, + "65536": 561 + }, + "count": 561, + "sum": 0 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 561, + "1024": 441, + "1048576": 561, + "16384": 558, + "16777216": 561, + "256": 84, + "262144": 561, + "4096": 458, + "4194304": 561, + "512": 437, + "64": 20, + "65536": 561 + }, + "count": 561, + "sum": 1424272 + } + } + } + }, + "host": "172.18.0.2:6443", + "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": { + "name": "certificate", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "statefulset", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "leader": { + "is_master": true + }, + "name": "kube-controller-manager" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "node_lifecycle_controller", + "workqueue": { + "adds": { + "count": 6 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "root_ca_cert_publisher", + "workqueue": { + "adds": { + "count": 5 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "node", + "workqueue": { + "adds": { + "count": 1 + }, + "depth": { + "count": 1 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "ttlcontroller", + "workqueue": { + "adds": { + "count": 8 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 12 + } + }, + "code": "200", + "host": "172.18.0.2: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": { + "name": "ttl_jobs_to_delete", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "serviceaccount_tokens_secret", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "job_orphan_pod", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "endpoint", + "workqueue": { + "adds": { + "count": 7 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 5 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "volume_expand", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "ephemeral_volume", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "deployment", + "workqueue": { + "adds": { + "count": 24 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 13 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 12, + "100000": 12, + "1000000": 12, + "15000000": 12, + "2000000": 12, + "25000": 12, + "250000": 12, + "30000000": 12, + "4000000": 12, + "5000": 0, + "500000": 12, + "60000000": 12, + "8000000": 12 + }, + "count": 12, + "sum": 164656.37399999998 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 12, + "1024": 7, + "1048576": 12, + "16384": 12, + "16777216": 12, + "256": 6, + "262144": 12, + "4096": 12, + "4194304": 12, + "512": 7, + "64": 1, + "65536": 12 + }, + "count": 12, + "sum": 15373 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 12, + "1024": 4, + "1048576": 12, + "16384": 12, + "16777216": 12, + "256": 0, + "262144": 12, + "4096": 11, + "4194304": 12, + "512": 0, + "64": 0, + "65536": 12 + }, + "count": 12, + "sum": 28374 + } + } + } + }, + "host": "172.18.0.2:6443", + "verb": "PATCH" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "garbage_collector_attempt_to_orphan", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "token_cleaner", + "workqueue": { + "adds": { + "count": 1 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 1 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "stale_pod_disruption", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "resource_quota_controller_resource_changes", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "serviceaccount", + "workqueue": { + "adds": { + "count": 5 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "namespace", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "horizontalpodautoscaler", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicCABundle-client-ca-bundle", + "workqueue": { + "adds": { + "count": 1 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "pvprotection", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 4 + } + }, + "code": "403", + "host": "172.18.0.2:6443", + "method": "POST" + }, + "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": 348 + } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "ClusterRoleAggregator", + "workqueue": { + "adds": { + "count": 18 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "garbage_collector_attempt_to_delete", + "workqueue": { + "adds": { + "count": 6 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "volumes", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "noexec_taint_node", + "workqueue": { + "adds": { + "count": 1 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "replicaset", + "workqueue": { + "adds": { + "count": 21 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "pvcprotection", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "resourcequota_primary", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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 + } + }, + "code": "403", + "host": "172.18.0.2: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": { + "name": "resourcequota_priority", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "orphaned_pods_nodes", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicCABundle-csr-controller", + "workqueue": { + "adds": { + "count": 8 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "daemonset", + "workqueue": { + "adds": { + "count": 20 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 4 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "service", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "endpoint_slice_mirroring", + "workqueue": { + "adds": { + "count": 5 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "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/controllermanager/_meta/testdata/docs.plain b/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain index 84f25269142..7a63ccdf7be 100644 --- a/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain +++ b/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain @@ -1,3 +1,6 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 # HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. # TYPE apiserver_audit_event_total counter apiserver_audit_event_total 0 @@ -25,36 +28,36 @@ apiserver_client_certificate_expiration_seconds_sum 0 apiserver_client_certificate_expiration_seconds_count 0 # HELP apiserver_delegated_authn_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. # TYPE apiserver_delegated_authn_request_duration_seconds histogram -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 191 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 191 -apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.559200086 -apiserver_delegated_authn_request_duration_seconds_count{code="201"} 191 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.014738774999999999 +apiserver_delegated_authn_request_duration_seconds_count{code="201"} 2 # HELP apiserver_delegated_authn_request_total [ALPHA] Number of HTTP requests partitioned by status code. # TYPE apiserver_delegated_authn_request_total counter -apiserver_delegated_authn_request_total{code="201"} 191 +apiserver_delegated_authn_request_total{code="201"} 2 # HELP apiserver_delegated_authz_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. # TYPE apiserver_delegated_authz_request_duration_seconds histogram -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 191 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 191 -apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.413686805 -apiserver_delegated_authz_request_duration_seconds_count{code="201"} 191 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.005855873 +apiserver_delegated_authz_request_duration_seconds_count{code="201"} 2 # HELP apiserver_delegated_authz_request_total [ALPHA] Number of HTTP requests partitioned by status code. # TYPE apiserver_delegated_authz_request_total counter -apiserver_delegated_authz_request_total{code="201"} 191 +apiserver_delegated_authz_request_total{code="201"} 2 # HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. # TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge apiserver_envelope_encryption_dek_cache_fill_percent 0 @@ -94,151 +97,139 @@ apiserver_webhooks_x509_missing_san_total 0 attachdetach_controller_forced_detaches 0 # HELP authenticated_user_requests [ALPHA] Counter of authenticated requests broken out by username. # TYPE authenticated_user_requests counter -authenticated_user_requests{username="other"} 796 +authenticated_user_requests{username="other"} 66 # HELP authentication_attempts [ALPHA] Counter of authenticated attempts. # TYPE authentication_attempts counter -authentication_attempts{result="success"} 796 +authentication_attempts{result="success"} 66 # HELP authentication_duration_seconds [ALPHA] Authentication duration in seconds broken out by result. # TYPE authentication_duration_seconds histogram -authentication_duration_seconds_bucket{result="success",le="0.001"} 606 -authentication_duration_seconds_bucket{result="success",le="0.002"} 609 -authentication_duration_seconds_bucket{result="success",le="0.004"} 783 -authentication_duration_seconds_bucket{result="success",le="0.008"} 795 -authentication_duration_seconds_bucket{result="success",le="0.016"} 796 -authentication_duration_seconds_bucket{result="success",le="0.032"} 796 -authentication_duration_seconds_bucket{result="success",le="0.064"} 796 -authentication_duration_seconds_bucket{result="success",le="0.128"} 796 -authentication_duration_seconds_bucket{result="success",le="0.256"} 796 -authentication_duration_seconds_bucket{result="success",le="0.512"} 796 -authentication_duration_seconds_bucket{result="success",le="1.024"} 796 -authentication_duration_seconds_bucket{result="success",le="2.048"} 796 -authentication_duration_seconds_bucket{result="success",le="4.096"} 796 -authentication_duration_seconds_bucket{result="success",le="8.192"} 796 -authentication_duration_seconds_bucket{result="success",le="16.384"} 796 -authentication_duration_seconds_bucket{result="success",le="+Inf"} 796 -authentication_duration_seconds_sum{result="success"} 0.61730372 -authentication_duration_seconds_count{result="success"} 796 +authentication_duration_seconds_bucket{result="success",le="0.001"} 65 +authentication_duration_seconds_bucket{result="success",le="0.002"} 65 +authentication_duration_seconds_bucket{result="success",le="0.004"} 65 +authentication_duration_seconds_bucket{result="success",le="0.008"} 65 +authentication_duration_seconds_bucket{result="success",le="0.016"} 66 +authentication_duration_seconds_bucket{result="success",le="0.032"} 66 +authentication_duration_seconds_bucket{result="success",le="0.064"} 66 +authentication_duration_seconds_bucket{result="success",le="0.128"} 66 +authentication_duration_seconds_bucket{result="success",le="0.256"} 66 +authentication_duration_seconds_bucket{result="success",le="0.512"} 66 +authentication_duration_seconds_bucket{result="success",le="1.024"} 66 +authentication_duration_seconds_bucket{result="success",le="2.048"} 66 +authentication_duration_seconds_bucket{result="success",le="4.096"} 66 +authentication_duration_seconds_bucket{result="success",le="8.192"} 66 +authentication_duration_seconds_bucket{result="success",le="16.384"} 66 +authentication_duration_seconds_bucket{result="success",le="+Inf"} 66 +authentication_duration_seconds_sum{result="success"} 0.014726734000000002 +authentication_duration_seconds_count{result="success"} 66 # HELP authentication_token_cache_active_fetch_count [ALPHA] # TYPE authentication_token_cache_active_fetch_count gauge authentication_token_cache_active_fetch_count{status="blocked"} 0 authentication_token_cache_active_fetch_count{status="in_flight"} 0 # HELP authentication_token_cache_fetch_total [ALPHA] # TYPE authentication_token_cache_fetch_total counter -authentication_token_cache_fetch_total{status="ok"} 191 +authentication_token_cache_fetch_total{status="ok"} 2 # HELP authentication_token_cache_request_duration_seconds [ALPHA] # TYPE authentication_token_cache_request_duration_seconds histogram -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 190 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 1 authentication_token_cache_request_duration_seconds_sum{status="hit"} 0 -authentication_token_cache_request_duration_seconds_count{status="hit"} 190 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 189 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 191 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 191 -authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.4930000000000004 -authentication_token_cache_request_duration_seconds_count{status="miss"} 191 +authentication_token_cache_request_duration_seconds_count{status="hit"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 2 +authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.015 +authentication_token_cache_request_duration_seconds_count{status="miss"} 2 # HELP authentication_token_cache_request_total [ALPHA] # TYPE authentication_token_cache_request_total counter -authentication_token_cache_request_total{status="hit"} 190 -authentication_token_cache_request_total{status="miss"} 191 -# HELP bootstrap_signer_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for bootstrap_signer -# TYPE bootstrap_signer_rate_limiter_use gauge -bootstrap_signer_rate_limiter_use 0 -# HELP cronjob_controller_cronjob_job_creation_skew_duration_seconds [ALPHA] Time between when a cronjob is scheduled to be run, and when the corresponding job is created -# TYPE cronjob_controller_cronjob_job_creation_skew_duration_seconds histogram -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="1"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="2"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="4"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="8"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="16"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="32"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="64"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="128"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="256"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="512"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_bucket{le="+Inf"} 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_sum 0 -cronjob_controller_cronjob_job_creation_skew_duration_seconds_count 0 -# HELP cronjob_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for cronjob_controller -# TYPE cronjob_controller_rate_limiter_use gauge -cronjob_controller_rate_limiter_use 0 -# HELP daemon_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for daemon_controller -# TYPE daemon_controller_rate_limiter_use gauge -daemon_controller_rate_limiter_use 0 -# HELP deployment_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for deployment_controller -# TYPE deployment_controller_rate_limiter_use gauge -deployment_controller_rate_limiter_use 0 -# HELP endpoint_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for endpoint_controller -# TYPE endpoint_controller_rate_limiter_use gauge -endpoint_controller_rate_limiter_use 0 +authentication_token_cache_request_total{status="hit"} 1 +authentication_token_cache_request_total{status="miss"} 2 +# HELP cronjob_controller_job_creation_skew_duration_seconds [STABLE] Time between when a cronjob is scheduled to be run, and when the corresponding job is created +# TYPE cronjob_controller_job_creation_skew_duration_seconds histogram +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="1"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="2"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="4"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="8"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="16"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="32"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="64"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="128"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="256"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="512"} 0 +cronjob_controller_job_creation_skew_duration_seconds_bucket{le="+Inf"} 0 +cronjob_controller_job_creation_skew_duration_seconds_sum 0 +cronjob_controller_job_creation_skew_duration_seconds_count 0 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 # HELP endpoint_slice_controller_changes [ALPHA] Number of EndpointSlice changes # TYPE endpoint_slice_controller_changes counter endpoint_slice_controller_changes{operation="create"} 1 -endpoint_slice_controller_changes{operation="update"} 4 +endpoint_slice_controller_changes{operation="update"} 3 # HELP endpoint_slice_controller_desired_endpoint_slices [ALPHA] Number of EndpointSlices that would exist with perfect endpoint allocation # TYPE endpoint_slice_controller_desired_endpoint_slices gauge endpoint_slice_controller_desired_endpoint_slices 1 # HELP endpoint_slice_controller_endpoints_added_per_sync [ALPHA] Number of endpoints added on each Service sync # TYPE endpoint_slice_controller_endpoints_added_per_sync histogram -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="64"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="128"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="256"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="512"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="1024"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2048"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4096"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8192"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16384"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32768"} 9 -endpoint_slice_controller_endpoints_added_per_sync_bucket{le="+Inf"} 9 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="64"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="128"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="256"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="512"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="1024"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="2048"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="4096"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="8192"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="16384"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="32768"} 8 +endpoint_slice_controller_endpoints_added_per_sync_bucket{le="+Inf"} 8 endpoint_slice_controller_endpoints_added_per_sync_sum 2 -endpoint_slice_controller_endpoints_added_per_sync_count 9 +endpoint_slice_controller_endpoints_added_per_sync_count 8 # HELP endpoint_slice_controller_endpoints_desired [ALPHA] Number of endpoints desired # TYPE endpoint_slice_controller_endpoints_desired gauge endpoint_slice_controller_endpoints_desired 2 # HELP endpoint_slice_controller_endpoints_removed_per_sync [ALPHA] Number of endpoints removed on each Service sync # TYPE endpoint_slice_controller_endpoints_removed_per_sync histogram -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="64"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="128"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="256"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="512"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="1024"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2048"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4096"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8192"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16384"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32768"} 9 -endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="+Inf"} 9 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="64"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="128"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="256"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="512"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="1024"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="2048"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="4096"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="8192"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="16384"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="32768"} 8 +endpoint_slice_controller_endpoints_removed_per_sync_bucket{le="+Inf"} 8 endpoint_slice_controller_endpoints_removed_per_sync_sum 0 -endpoint_slice_controller_endpoints_removed_per_sync_count 9 +endpoint_slice_controller_endpoints_removed_per_sync_count 8 # HELP endpoint_slice_controller_endpointslices_changed_per_sync [ALPHA] Number of EndpointSlices changed on each Service sync # TYPE endpoint_slice_controller_endpointslices_changed_per_sync histogram endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.005"} 4 @@ -248,45 +239,39 @@ endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disab endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.1"} 4 endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.25"} 4 endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="0.5"} 4 -endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="1"} 9 -endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="2.5"} 9 -endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="5"} 9 -endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="10"} 9 -endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="+Inf"} 9 -endpoint_slice_controller_endpointslices_changed_per_sync_sum{topology="Disabled"} 5 -endpoint_slice_controller_endpointslices_changed_per_sync_count{topology="Disabled"} 9 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="1"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="2.5"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="5"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="10"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_bucket{topology="Disabled",le="+Inf"} 8 +endpoint_slice_controller_endpointslices_changed_per_sync_sum{topology="Disabled"} 4 +endpoint_slice_controller_endpointslices_changed_per_sync_count{topology="Disabled"} 8 # HELP endpoint_slice_controller_num_endpoint_slices [ALPHA] Number of EndpointSlices # TYPE endpoint_slice_controller_num_endpoint_slices gauge endpoint_slice_controller_num_endpoint_slices 1 -# HELP endpoint_slice_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for endpoint_slice_controller -# TYPE endpoint_slice_controller_rate_limiter_use gauge -endpoint_slice_controller_rate_limiter_use 0 # HELP endpoint_slice_controller_syncs [ALPHA] Number of EndpointSlice syncs # TYPE endpoint_slice_controller_syncs counter -endpoint_slice_controller_syncs{result="success"} 10 +endpoint_slice_controller_syncs{result="success"} 9 # HELP endpoint_slice_mirroring_controller_endpoints_sync_duration [ALPHA] Duration of syncEndpoints() in seconds # TYPE endpoint_slice_mirroring_controller_endpoints_sync_duration histogram -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.001"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.002"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.004"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.008"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.016"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.032"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.064"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.128"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.256"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.512"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="1.024"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="2.048"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="4.096"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="8.192"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="16.384"} 6 -endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="+Inf"} 6 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.001"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.002"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.004"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.008"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.016"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.032"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.064"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.128"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.256"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="0.512"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="1.024"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="2.048"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="4.096"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="8.192"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="16.384"} 5 +endpoint_slice_mirroring_controller_endpoints_sync_duration_bucket{le="+Inf"} 5 endpoint_slice_mirroring_controller_endpoints_sync_duration_sum 0 -endpoint_slice_mirroring_controller_endpoints_sync_duration_count 6 -# HELP endpoint_slice_mirroring_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for endpoint_slice_mirroring_controller -# TYPE endpoint_slice_mirroring_controller_rate_limiter_use gauge -endpoint_slice_mirroring_controller_rate_limiter_use 0 +endpoint_slice_mirroring_controller_endpoints_sync_duration_count 5 # HELP ephemeral_volume_controller_create_failures_total [ALPHA] Number of PersistenVolumeClaims creation requests # TYPE ephemeral_volume_controller_create_failures_total counter ephemeral_volume_controller_create_failures_total 0 @@ -296,125 +281,152 @@ ephemeral_volume_controller_create_total 0 # HELP garbagecollector_controller_resources_sync_error_total [ALPHA] Number of garbage collector resources sync errors # TYPE garbagecollector_controller_resources_sync_error_total counter garbagecollector_controller_resources_sync_error_total 0 -# HELP gc_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for gc_controller -# TYPE gc_controller_rate_limiter_use gauge -gc_controller_rate_limiter_use 0 # HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. # TYPE go_cgo_go_to_c_calls_calls_total counter go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.009350777 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.149717618 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.034730859 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.022017536 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.21581679 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 4385.415002366 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 4.99e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.00170814 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001708639 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 5015.342976168 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 629.710448373 # HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. # TYPE go_gc_cycles_automatic_gc_cycles_total counter -go_gc_cycles_automatic_gc_cycles_total 54 +go_gc_cycles_automatic_gc_cycles_total 16 # HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. # TYPE go_gc_cycles_forced_gc_cycles_total counter go_gc_cycles_forced_gc_cycles_total 0 # HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. # TYPE go_gc_cycles_total_gc_cycles_total counter -go_gc_cycles_total_gc_cycles_total 54 +go_gc_cycles_total_gc_cycles_total 16 # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary -go_gc_duration_seconds{quantile="0"} 2.549e-05 -go_gc_duration_seconds{quantile="0.25"} 6.9568e-05 -go_gc_duration_seconds{quantile="0.5"} 0.000123955 -go_gc_duration_seconds{quantile="0.75"} 0.000176831 -go_gc_duration_seconds{quantile="1"} 0.004689967 -go_gc_duration_seconds_sum 0.013351567 -go_gc_duration_seconds_count 54 -# HELP go_gc_heap_allocs_by_size_bytes_total Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_allocs_by_size_bytes_total histogram -go_gc_heap_allocs_by_size_bytes_total_bucket{le="8.999999999999998"} 104592 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="24.999999999999996"} 3.252912e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="64.99999999999999"} 5.342894e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="144.99999999999997"} 6.465044e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="320.99999999999994"} 6.764891e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="704.9999999999999"} 6.989767e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="1536.9999999999998"} 7.051505e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="3200.9999999999995"} 7.06161e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="6528.999999999999"} 7.067873e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="13568.999999999998"} 7.069963e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="27264.999999999996"} 7.070927e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="+Inf"} 7.07172e+06 -go_gc_heap_allocs_by_size_bytes_total_sum 7.56020632e+08 -go_gc_heap_allocs_by_size_bytes_total_count 7.07172e+06 +go_gc_duration_seconds{quantile="0"} 3.4792e-05 +go_gc_duration_seconds{quantile="0.25"} 8.5844e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000176279 +go_gc_duration_seconds{quantile="0.75"} 0.000245191 +go_gc_duration_seconds{quantile="1"} 0.000475774 +go_gc_duration_seconds_sum 0.002752192 +go_gc_duration_seconds_count 16 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 13986 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 337373 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 568393 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 712395 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 771930 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 798600 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 804899 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 807409 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 809058 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 809746 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 810071 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 810232 +go_gc_heap_allocs_by_size_bytes_sum 9.9479784e+07 +go_gc_heap_allocs_by_size_bytes_count 810232 # HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. # TYPE go_gc_heap_allocs_bytes_total counter -go_gc_heap_allocs_bytes_total 7.56020632e+08 +go_gc_heap_allocs_bytes_total 9.9479784e+07 # HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_allocs_objects_total counter -go_gc_heap_allocs_objects_total 7.07172e+06 -# HELP go_gc_heap_frees_by_size_bytes_total Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_frees_by_size_bytes_total histogram -go_gc_heap_frees_by_size_bytes_total_bucket{le="8.999999999999998"} 100683 -go_gc_heap_frees_by_size_bytes_total_bucket{le="24.999999999999996"} 3.151104e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="64.99999999999999"} 5.168805e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="144.99999999999997"} 6.254059e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="320.99999999999994"} 6.542976e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="704.9999999999999"} 6.760436e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="1536.9999999999998"} 6.82043e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="3200.9999999999995"} 6.830127e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="6528.999999999999"} 6.836184e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="13568.999999999998"} 6.838146e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="27264.999999999996"} 6.838921e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="+Inf"} 6.839593e+06 -go_gc_heap_frees_by_size_bytes_total_sum 7.21705584e+08 -go_gc_heap_frees_by_size_bytes_total_count 6.839593e+06 +go_gc_heap_allocs_objects_total 810232 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 9984 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 307650 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 511409 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 642707 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 695655 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 719614 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 725361 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 727523 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 729049 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 729619 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 729761 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 729826 +go_gc_heap_frees_by_size_bytes_sum 8.2895544e+07 +go_gc_heap_frees_by_size_bytes_count 729826 # HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. # TYPE go_gc_heap_frees_bytes_total counter -go_gc_heap_frees_bytes_total 7.21705584e+08 +go_gc_heap_frees_bytes_total 8.2895544e+07 # HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_frees_objects_total counter -go_gc_heap_frees_objects_total 6.839593e+06 +go_gc_heap_frees_objects_total 729826 # HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. # TYPE go_gc_heap_goal_bytes gauge -go_gc_heap_goal_bytes 4.2826072e+07 +go_gc_heap_goal_bytes 3.4482008e+07 # HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. # TYPE go_gc_heap_objects_objects gauge -go_gc_heap_objects_objects 232127 +go_gc_heap_objects_objects 80406 # HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. # TYPE go_gc_heap_tiny_allocs_objects_total counter -go_gc_heap_tiny_allocs_objects_total 1.222594e+06 +go_gc_heap_tiny_allocs_objects_total 93134 # HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. # TYPE go_gc_limiter_last_enabled_gc_cycle gauge go_gc_limiter_last_enabled_gc_cycle 0 -# HELP go_gc_pauses_seconds_total Distribution individual GC-related stop-the-world pause latencies. -# TYPE go_gc_pauses_seconds_total histogram -go_gc_pauses_seconds_total_bucket{le="-5e-324"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-10"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-09"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999998e-08"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-06"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-05"} 29 -go_gc_pauses_seconds_total_bucket{le="0.00010239999999999998"} 85 -go_gc_pauses_seconds_total_bucket{le="0.0010485759999999998"} 106 -go_gc_pauses_seconds_total_bucket{le="0.010485759999999998"} 108 -go_gc_pauses_seconds_total_bucket{le="0.10485759999999998"} 108 -go_gc_pauses_seconds_total_bucket{le="+Inf"} 108 -go_gc_pauses_seconds_total_sum NaN -go_gc_pauses_seconds_total_count 108 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 6 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 21 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 32 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 32 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 32 +go_gc_pauses_seconds_bucket{le="+Inf"} 32 +go_gc_pauses_seconds_sum 0.00101248 +go_gc_pauses_seconds_count 32 # HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. # TYPE go_gc_stack_starting_size_bytes gauge go_gc_stack_starting_size_bytes 4096 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge -go_goroutines 1119 +go_goroutines 1123 # HELP go_info Information about the Go environment. # TYPE go_info gauge -go_info{version="go1.19.2"} 1 +go_info{version="go1.20.3"} 1 # HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. # TYPE go_memory_classes_heap_free_bytes gauge -go_memory_classes_heap_free_bytes 4.169728e+06 +go_memory_classes_heap_free_bytes 5.562368e+06 # HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. # TYPE go_memory_classes_heap_objects_bytes gauge -go_memory_classes_heap_objects_bytes 3.4315048e+07 +go_memory_classes_heap_objects_bytes 1.658424e+07 # HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. # TYPE go_memory_classes_heap_released_bytes gauge -go_memory_classes_heap_released_bytes 5.20192e+06 +go_memory_classes_heap_released_bytes 4.907008e+06 # HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. # TYPE go_memory_classes_heap_stacks_bytes gauge -go_memory_classes_heap_stacks_bytes 7.471104e+06 +go_memory_classes_heap_stacks_bytes 5.963776e+06 # HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. # TYPE go_memory_classes_heap_unused_bytes gauge -go_memory_classes_heap_unused_bytes 7.562456e+06 +go_memory_classes_heap_unused_bytes 8.925648e+06 # HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. # TYPE go_memory_classes_metadata_mcache_free_bytes gauge go_memory_classes_metadata_mcache_free_bytes 6000 @@ -423,70 +435,67 @@ go_memory_classes_metadata_mcache_free_bytes 6000 go_memory_classes_metadata_mcache_inuse_bytes 9600 # HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. # TYPE go_memory_classes_metadata_mspan_free_bytes gauge -go_memory_classes_metadata_mspan_free_bytes 34816 +go_memory_classes_metadata_mspan_free_bytes 68320 # HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. # TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge -go_memory_classes_metadata_mspan_inuse_bytes 520064 +go_memory_classes_metadata_mspan_inuse_bytes 453920 # HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. # TYPE go_memory_classes_metadata_other_bytes gauge -go_memory_classes_metadata_other_bytes 1.0642304e+07 +go_memory_classes_metadata_other_bytes 9.368496e+06 # HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. # TYPE go_memory_classes_os_stacks_bytes gauge go_memory_classes_os_stacks_bytes 0 # HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. # TYPE go_memory_classes_other_bytes gauge -go_memory_classes_other_bytes 1.412968e+06 +go_memory_classes_other_bytes 1.823877e+06 # HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. # TYPE go_memory_classes_profiling_buckets_bytes gauge -go_memory_classes_profiling_buckets_bytes 1.641904e+06 +go_memory_classes_profiling_buckets_bytes 1.505251e+06 # HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. # TYPE go_memory_classes_total_bytes gauge -go_memory_classes_total_bytes 7.2987912e+07 +go_memory_classes_total_bytes 5.5178504e+07 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge -go_memstats_alloc_bytes 3.4315048e+07 +go_memstats_alloc_bytes 1.658424e+07 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter -go_memstats_alloc_bytes_total 7.56020632e+08 +go_memstats_alloc_bytes_total 9.9479784e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge -go_memstats_buck_hash_sys_bytes 1.641904e+06 +go_memstats_buck_hash_sys_bytes 1.505251e+06 # HELP go_memstats_frees_total Total number of frees. # TYPE go_memstats_frees_total counter -go_memstats_frees_total 8.062187e+06 -# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started. -# TYPE go_memstats_gc_cpu_fraction gauge -go_memstats_gc_cpu_fraction 0 +go_memstats_frees_total 822960 # HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. # TYPE go_memstats_gc_sys_bytes gauge -go_memstats_gc_sys_bytes 1.0642304e+07 +go_memstats_gc_sys_bytes 9.368496e+06 # HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. # TYPE go_memstats_heap_alloc_bytes gauge -go_memstats_heap_alloc_bytes 3.4315048e+07 +go_memstats_heap_alloc_bytes 1.658424e+07 # HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. # TYPE go_memstats_heap_idle_bytes gauge -go_memstats_heap_idle_bytes 9.371648e+06 +go_memstats_heap_idle_bytes 1.0469376e+07 # HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. # TYPE go_memstats_heap_inuse_bytes gauge -go_memstats_heap_inuse_bytes 4.1877504e+07 +go_memstats_heap_inuse_bytes 2.5509888e+07 # HELP go_memstats_heap_objects Number of allocated objects. # TYPE go_memstats_heap_objects gauge -go_memstats_heap_objects 232127 +go_memstats_heap_objects 80406 # HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. # TYPE go_memstats_heap_released_bytes gauge -go_memstats_heap_released_bytes 5.20192e+06 +go_memstats_heap_released_bytes 4.907008e+06 # HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. # TYPE go_memstats_heap_sys_bytes gauge -go_memstats_heap_sys_bytes 5.1249152e+07 +go_memstats_heap_sys_bytes 3.5979264e+07 # HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. # TYPE go_memstats_last_gc_time_seconds gauge -go_memstats_last_gc_time_seconds 1.671729558680934e+09 +go_memstats_last_gc_time_seconds 1.6915727966346712e+09 # HELP go_memstats_lookups_total Total number of pointer lookups. # TYPE go_memstats_lookups_total counter go_memstats_lookups_total 0 # HELP go_memstats_mallocs_total Total number of mallocs. # TYPE go_memstats_mallocs_total counter -go_memstats_mallocs_total 8.294314e+06 +go_memstats_mallocs_total 903366 # HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. # TYPE go_memstats_mcache_inuse_bytes gauge go_memstats_mcache_inuse_bytes 9600 @@ -495,67 +504,239 @@ go_memstats_mcache_inuse_bytes 9600 go_memstats_mcache_sys_bytes 15600 # HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. # TYPE go_memstats_mspan_inuse_bytes gauge -go_memstats_mspan_inuse_bytes 520064 +go_memstats_mspan_inuse_bytes 453920 # HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. # TYPE go_memstats_mspan_sys_bytes gauge -go_memstats_mspan_sys_bytes 554880 +go_memstats_mspan_sys_bytes 522240 # HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. # TYPE go_memstats_next_gc_bytes gauge -go_memstats_next_gc_bytes 4.2826072e+07 +go_memstats_next_gc_bytes 3.4482008e+07 # HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. # TYPE go_memstats_other_sys_bytes gauge -go_memstats_other_sys_bytes 1.412968e+06 +go_memstats_other_sys_bytes 1.823877e+06 # HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. # TYPE go_memstats_stack_inuse_bytes gauge -go_memstats_stack_inuse_bytes 7.471104e+06 +go_memstats_stack_inuse_bytes 5.963776e+06 # HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. # TYPE go_memstats_stack_sys_bytes gauge -go_memstats_stack_sys_bytes 7.471104e+06 +go_memstats_stack_sys_bytes 5.963776e+06 # HELP go_memstats_sys_bytes Number of bytes obtained from system. # TYPE go_memstats_sys_bytes gauge -go_memstats_sys_bytes 7.2987912e+07 +go_memstats_sys_bytes 5.5178504e+07 # HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. # TYPE go_sched_gomaxprocs_threads gauge go_sched_gomaxprocs_threads 8 # HELP go_sched_goroutines_goroutines Count of live goroutines. # TYPE go_sched_goroutines_goroutines gauge -go_sched_goroutines_goroutines 1119 +go_sched_goroutines_goroutines 1123 # HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. # TYPE go_sched_latencies_seconds histogram -go_sched_latencies_seconds_bucket{le="-5e-324"} 0 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-10"} 12452 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-09"} 12452 -go_sched_latencies_seconds_bucket{le="9.999999999999998e-08"} 12634 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-06"} 33665 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-05"} 65154 -go_sched_latencies_seconds_bucket{le="0.00010239999999999998"} 120235 -go_sched_latencies_seconds_bucket{le="0.0010485759999999998"} 123098 -go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 123133 -go_sched_latencies_seconds_bucket{le="0.10485759999999998"} 123133 -go_sched_latencies_seconds_bucket{le="+Inf"} 123133 -go_sched_latencies_seconds_sum NaN -go_sched_latencies_seconds_count 123133 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 1851 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 2551 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 5081 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 16961 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 17342 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 17353 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 17353 +go_sched_latencies_seconds_bucket{le="+Inf"} 17353 +go_sched_latencies_seconds_sum 0.128123904 +go_sched_latencies_seconds_count 17353 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0.272595736 # HELP go_threads Number of OS threads created. # TYPE go_threads gauge -go_threads 18 -# HELP job_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for job_controller -# TYPE job_controller_rate_limiter_use gauge -job_controller_rate_limiter_use 0 +go_threads 10 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 0 # HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. # TYPE kubernetes_build_info gauge -kubernetes_build_info{build_date="2022-10-25T19:35:11Z",compiler="gc",git_commit="434bfd82814af038ad94d62ebe59b133fcb50506",git_tree_state="clean",git_version="v1.25.3",go_version="go1.19.2",major="1",minor="25",platform="linux/amd64"} 1 +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 # HELP leader_election_master_status [ALPHA] Gauge of if the reporting system is master of the relevant lease, 0 indicates backup, 1 indicates master. 'name' is the string used to identify the lease. Please make sure to group by name. # TYPE leader_election_master_status gauge leader_election_master_status{name="kube-controller-manager"} 1 -# HELP namespace_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for namespace_controller -# TYPE namespace_controller_rate_limiter_use gauge -namespace_controller_rate_limiter_use 0 # HELP node_collector_evictions_total [STABLE] Number of Node evictions that happened since current instance of NodeController started. # TYPE node_collector_evictions_total counter node_collector_evictions_total{zone=""} 0 # HELP node_collector_unhealthy_nodes_in_zone [ALPHA] Gauge measuring number of not Ready Nodes per zones. # TYPE node_collector_unhealthy_nodes_in_zone gauge node_collector_unhealthy_nodes_in_zone{zone=""} 0 +# HELP node_collector_update_all_nodes_health_duration_seconds [ALPHA] Duration in seconds for NodeController to update the health of all nodes. +# TYPE node_collector_update_all_nodes_health_duration_seconds histogram +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.01"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.04"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.16"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="0.64"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="2.56"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="10.24"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="40.96"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="163.84"} 125 +node_collector_update_all_nodes_health_duration_seconds_bucket{le="+Inf"} 125 +node_collector_update_all_nodes_health_duration_seconds_sum 0.030889747000000002 +node_collector_update_all_nodes_health_duration_seconds_count 125 +# HELP node_collector_update_node_health_duration_seconds [ALPHA] Duration in seconds for NodeController to update the health of a single node. +# TYPE node_collector_update_node_health_duration_seconds histogram +node_collector_update_node_health_duration_seconds_bucket{le="0.001"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.004"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.016"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.064"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="0.256"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="1.024"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="4.096"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="16.384"} 125 +node_collector_update_node_health_duration_seconds_bucket{le="+Inf"} 125 +node_collector_update_node_health_duration_seconds_sum 0.018322937 +node_collector_update_node_health_duration_seconds_count 125 # HELP node_collector_zone_health [ALPHA] Gauge measuring percentage of healthy nodes per zone. # TYPE node_collector_zone_health gauge node_collector_zone_health{zone=""} 100 @@ -578,42 +759,34 @@ node_ipam_controller_cidrset_cidrs_allocations_total{clusterCIDR="10.244.0.0/16" # HELP node_ipam_controller_cidrset_usage_cidrs [ALPHA] Gauge measuring percentage of allocated CIDRs. # TYPE node_ipam_controller_cidrset_usage_cidrs gauge node_ipam_controller_cidrset_usage_cidrs{clusterCIDR="10.244.0.0/16"} 0.00390625 -# HELP node_ipam_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for node_ipam_controller -# TYPE node_ipam_controller_rate_limiter_use gauge -node_ipam_controller_rate_limiter_use 0 -# HELP node_lifecycle_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for node_lifecycle_controller -# TYPE node_lifecycle_controller_rate_limiter_use gauge -node_lifecycle_controller_rate_limiter_use 0 -# HELP persistentvolume_protection_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for persistentvolume_protection_controller -# TYPE persistentvolume_protection_controller_rate_limiter_use gauge -persistentvolume_protection_controller_rate_limiter_use 0 -# HELP persistentvolumeclaim_protection_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for persistentvolumeclaim_protection_controller -# TYPE persistentvolumeclaim_protection_controller_rate_limiter_use gauge -persistentvolumeclaim_protection_controller_rate_limiter_use 0 +# HELP node_ipam_controller_cirdset_max_cidrs [ALPHA] Maximum number of CIDRs that can be allocated. +# TYPE node_ipam_controller_cirdset_max_cidrs gauge +node_ipam_controller_cirdset_max_cidrs{clusterCIDR="10.244.0.0/16"} 256 # HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. # TYPE process_cpu_seconds_total counter -process_cpu_seconds_total 127.06 +process_cpu_seconds_total 18.91 # HELP process_max_fds Maximum number of open file descriptors. # TYPE process_max_fds gauge process_max_fds 1.048576e+06 # HELP process_open_fds Number of open file descriptors. # TYPE process_open_fds gauge -process_open_fds 42 +process_open_fds 19 # HELP process_resident_memory_bytes Resident memory size in bytes. # TYPE process_resident_memory_bytes gauge -process_resident_memory_bytes 1.03018496e+08 +process_resident_memory_bytes 9.4121984e+07 # HELP process_start_time_seconds Start time of the process since unix epoch in seconds. # TYPE process_start_time_seconds gauge -process_start_time_seconds 1.6717255061e+09 +process_start_time_seconds 1.69157216924e+09 # HELP process_virtual_memory_bytes Virtual memory size in bytes. # TYPE process_virtual_memory_bytes gauge -process_virtual_memory_bytes 7.92305664e+08 +process_virtual_memory_bytes 8.00964608e+08 # HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. # TYPE process_virtual_memory_max_bytes gauge process_virtual_memory_max_bytes 1.8446744073709552e+19 -# HELP replicaset_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for replicaset_controller -# TYPE replicaset_controller_rate_limiter_use gauge -replicaset_controller_rate_limiter_use 0 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 121 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 9 # HELP replicaset_controller_sorting_deletion_age_ratio [ALPHA] The ratio of chosen deleted pod's ages to the current youngest pod's age (at the time). Should be <2.The intent of this metric is to measure the rough efficacy of the LogarithmicScaleDown feature gate's effect onthe sorting (and deletion) of pods when a replicaset scales down. This only considers Ready pods when calculating and reporting. # TYPE replicaset_controller_sorting_deletion_age_ratio histogram replicaset_controller_sorting_deletion_age_ratio_bucket{le="0.25"} 0 @@ -625,12 +798,6 @@ replicaset_controller_sorting_deletion_age_ratio_bucket{le="8"} 0 replicaset_controller_sorting_deletion_age_ratio_bucket{le="+Inf"} 0 replicaset_controller_sorting_deletion_age_ratio_sum 0 replicaset_controller_sorting_deletion_age_ratio_count 0 -# HELP replication_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for replication_controller -# TYPE replication_controller_rate_limiter_use gauge -replication_controller_rate_limiter_use 0 -# HELP resource_quota_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for resource_quota_controller -# TYPE resource_quota_controller_rate_limiter_use gauge -resource_quota_controller_rate_limiter_use 0 # HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. # TYPE rest_client_exec_plugin_certificate_rotation_age histogram rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 @@ -652,276 +819,279 @@ rest_client_exec_plugin_certificate_rotation_age_count 0 rest_client_exec_plugin_ttl_seconds +Inf # HELP rest_client_rate_limiter_duration_seconds [ALPHA] Client side rate limiter latency in seconds. Broken down by verb, and host. # TYPE rest_client_rate_limiter_duration_seconds histogram -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 9432 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 9434 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 9474 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 9480 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 9489 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 9491 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 7.405728314999985 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 9491 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 19 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 4.2072e-05 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 19 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 447 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 448 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 465 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 465 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 473 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 3.8833401200000015 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 473 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 2102 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 2102 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.00459969700000001 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 2102 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 503 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 503 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 547 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 554 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 559 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 6.241064445999998 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 2.6931999999999996e-05 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 66 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 66 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 84 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 2.0618520720000015 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 353 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.0009427589999999995 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 353 # HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. # TYPE rest_client_request_duration_seconds histogram -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 9135 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 9430 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 9472 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 9479 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 9488 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 9490 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 9490 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 9490 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 9491 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 9491 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 9491 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 9491 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 9491 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 37.23989467399995 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 9491 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 6 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 15 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 15 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 15 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 16 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 19 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 2.2088020449999988 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 19 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 418 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 437 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 455 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 458 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 466 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 473 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 10.44710629600001 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 473 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 1984 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 2100 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 2101 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 2101 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 2101 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 2102 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 2102 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 8.147888260999999 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 2102 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 447 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 501 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 544 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 553 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 558 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 560 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 560 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 11.537652950999988 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 561 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 0 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 0.164656374 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 12 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 20 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 57 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 76 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 77 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 5.392320426000001 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 89 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 29 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 351 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 352 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 352 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 353 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 3.877152228000004 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 353 # HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. # TYPE rest_client_request_size_bytes histogram -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 9491 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 9491 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 561 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 0 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 9491 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 561 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 1 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 11 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 12 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 12 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 19 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 19 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 22369 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 19 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 6 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 7 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 7 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 12 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 15373 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 12 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 1 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 55 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 67 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 261 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 472 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 473 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 473 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 375253 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 473 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 53 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 65 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 69 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 88 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 89 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 47067 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 89 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 2069 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 2074 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 2098 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 2102 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 2102 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 1.018925e+06 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 2102 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 317 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 321 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 346 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 353 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 264367 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 353 # HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. # TYPE rest_client_requests_total counter -rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 9893 -rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PATCH"} 19 -rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 2100 -rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 465 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 619 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PATCH"} 12 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 348 +rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 85 rest_client_requests_total{code="403",host="172.18.0.2:6443",method="GET"} 1 -rest_client_requests_total{code="403",host="172.18.0.2:6443",method="POST"} 8 +rest_client_requests_total{code="403",host="172.18.0.2:6443",method="POST"} 4 rest_client_requests_total{code="404",host="172.18.0.2:6443",method="GET"} 33 -rest_client_requests_total{code="409",host="172.18.0.2:6443",method="PUT"} 2 +rest_client_requests_total{code="409",host="172.18.0.2:6443",method="PUT"} 5 # HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. # TYPE rest_client_response_size_bytes histogram -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 300 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 2326 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 7790 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 8634 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 9480 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 9488 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 9491 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 9491 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 9491 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 9491 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 9491 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 9491 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 4.926581e+06 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 9491 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 20 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 84 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 437 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 441 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 458 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 558 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 561 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 561 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 1.424272e+06 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 561 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 0 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 8 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 19 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 19 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 39824 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 19 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 4 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 11 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 12 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 12 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 28374 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 12 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 0 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 45 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 46 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 59 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 471 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 473 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 473 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 630891 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 473 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 41 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 42 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 55 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 87 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 89 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 89 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 84305 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 89 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 1 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 2071 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 2075 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 2097 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 2102 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 2102 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 1.015358e+06 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 2102 -# HELP root_ca_cert_publisher_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for root_ca_cert_publisher -# TYPE root_ca_cert_publisher_rate_limiter_use gauge -root_ca_cert_publisher_rate_limiter_use 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 2 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 322 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 325 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 346 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 353 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 353 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 249739 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 353 +# HELP retroactive_storageclass_errors_total [ALPHA] Total number of failed retroactive StorageClass assignments to persistent volume claim +# TYPE retroactive_storageclass_errors_total counter +retroactive_storageclass_errors_total 0 +# HELP retroactive_storageclass_total [ALPHA] Total number of retroactive StorageClass assignments to persistent volume claim +# TYPE retroactive_storageclass_total counter +retroactive_storageclass_total 0 # HELP root_ca_cert_publisher_sync_duration_seconds [ALPHA] Number of namespace syncs happened in root ca cert publisher. # TYPE root_ca_cert_publisher_sync_duration_seconds histogram root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.001"} 0 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.002"} 0 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.004"} 3 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.008"} 3 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.004"} 0 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.008"} 4 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.016"} 4 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.032"} 4 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.064"} 4 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.128"} 4 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.256"} 4 -root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.512"} 4 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.032"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.064"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.128"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.256"} 5 +root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="0.512"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="1.024"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="2.048"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="4.096"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="8.192"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="16.384"} 5 root_ca_cert_publisher_sync_duration_seconds_bucket{code="200",le="+Inf"} 5 -root_ca_cert_publisher_sync_duration_seconds_sum{code="200"} 0.7720283510000001 +root_ca_cert_publisher_sync_duration_seconds_sum{code="200"} 0.04534516 root_ca_cert_publisher_sync_duration_seconds_count{code="200"} 5 # HELP root_ca_cert_publisher_sync_total [ALPHA] Number of namespace syncs happened in root ca cert publisher. # TYPE root_ca_cert_publisher_sync_total counter @@ -929,6 +1099,12 @@ root_ca_cert_publisher_sync_total{code="200"} 5 # HELP running_managed_controllers [ALPHA] Indicates where instances of a controller are currently running # TYPE running_managed_controllers gauge running_managed_controllers{manager="kube-controller-manager",name="nodeipam"} 1 +# HELP service_controller_loadbalancer_sync_total [ALPHA] A metric counting the amount of times any load balancer has been configured, as an effect of service/node changes on the cluster +# TYPE service_controller_loadbalancer_sync_total counter +service_controller_loadbalancer_sync_total 0 +# HELP service_controller_nodesync_error_total [ALPHA] A metric counting the amount of times any load balancer has been configured and errored, as an effect of node changes on the cluster +# TYPE service_controller_nodesync_error_total counter +service_controller_nodesync_error_total 0 # HELP service_controller_nodesync_latency_seconds [ALPHA] A metric measuring the latency for nodesync which updates loadbalancer hosts on cluster node updates. # TYPE service_controller_nodesync_latency_seconds histogram service_controller_nodesync_latency_seconds_bucket{le="1"} 0 @@ -949,9 +1125,6 @@ service_controller_nodesync_latency_seconds_bucket{le="16384"} 0 service_controller_nodesync_latency_seconds_bucket{le="+Inf"} 0 service_controller_nodesync_latency_seconds_sum 0 service_controller_nodesync_latency_seconds_count 0 -# HELP service_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for service_controller -# TYPE service_controller_rate_limiter_use gauge -service_controller_rate_limiter_use 0 # HELP service_controller_update_loadbalancer_host_latency_seconds [ALPHA] A metric measuring the latency for updating each load balancer hosts. # TYPE service_controller_update_loadbalancer_host_latency_seconds histogram service_controller_update_loadbalancer_host_latency_seconds_bucket{le="1"} 0 @@ -972,15 +1145,6 @@ service_controller_update_loadbalancer_host_latency_seconds_bucket{le="16384"} 0 service_controller_update_loadbalancer_host_latency_seconds_bucket{le="+Inf"} 0 service_controller_update_loadbalancer_host_latency_seconds_sum 0 service_controller_update_loadbalancer_host_latency_seconds_count 0 -# HELP serviceaccount_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for serviceaccount_controller -# TYPE serviceaccount_controller_rate_limiter_use gauge -serviceaccount_controller_rate_limiter_use 0 -# HELP serviceaccount_tokens_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for serviceaccount_tokens_controller -# TYPE serviceaccount_tokens_controller_rate_limiter_use gauge -serviceaccount_tokens_controller_rate_limiter_use 0 -# HELP token_cleaner_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for token_cleaner -# TYPE token_cleaner_rate_limiter_use gauge -token_cleaner_rate_limiter_use 0 # HELP ttl_after_finished_controller_job_deletion_duration_seconds [ALPHA] The time it took to delete the job since it became eligible for deletion # TYPE ttl_after_finished_controller_job_deletion_duration_seconds histogram ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="0.1"} 0 @@ -1000,36 +1164,34 @@ ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="819.2"} 0 ttl_after_finished_controller_job_deletion_duration_seconds_bucket{le="+Inf"} 0 ttl_after_finished_controller_job_deletion_duration_seconds_sum 0 ttl_after_finished_controller_job_deletion_duration_seconds_count 0 -# HELP ttl_after_finished_controller_rate_limiter_use [ALPHA] A metric measuring the saturation of the rate limiter for ttl_after_finished_controller -# TYPE ttl_after_finished_controller_rate_limiter_use gauge -ttl_after_finished_controller_rate_limiter_use 0 # HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue # TYPE workqueue_adds_total counter -workqueue_adds_total{name="ClusterRoleAggregator"} 19 +workqueue_adds_total{name="ClusterRoleAggregator"} 18 workqueue_adds_total{name="DynamicCABundle-client-ca-bundle"} 1 workqueue_adds_total{name="DynamicCABundle-csr-controller"} 8 workqueue_adds_total{name="DynamicCABundle-request-header"} 2 -workqueue_adds_total{name="DynamicServingCertificateController"} 70 +workqueue_adds_total{name="DynamicServingCertificateController"} 11 workqueue_adds_total{name="bootstrap_signer_queue"} 2 workqueue_adds_total{name="certificate"} 0 workqueue_adds_total{name="claims"} 0 workqueue_adds_total{name="cronjob"} 0 -workqueue_adds_total{name="daemonset"} 26 -workqueue_adds_total{name="deployment"} 21 +workqueue_adds_total{name="daemonset"} 20 +workqueue_adds_total{name="deployment"} 24 workqueue_adds_total{name="disruption"} 0 workqueue_adds_total{name="disruption_recheck"} 0 -workqueue_adds_total{name="endpoint"} 9 -workqueue_adds_total{name="endpoint_slice"} 10 -workqueue_adds_total{name="endpoint_slice_mirroring"} 6 +workqueue_adds_total{name="endpoint"} 7 +workqueue_adds_total{name="endpoint_slice"} 9 +workqueue_adds_total{name="endpoint_slice_mirroring"} 5 workqueue_adds_total{name="ephemeral_volume"} 0 -workqueue_adds_total{name="garbage_collector_attempt_to_delete"} 1 +workqueue_adds_total{name="garbage_collector_attempt_to_delete"} 6 workqueue_adds_total{name="garbage_collector_attempt_to_orphan"} 0 -workqueue_adds_total{name="garbage_collector_graph_changes"} 4892 +workqueue_adds_total{name="garbage_collector_graph_changes"} 1333 workqueue_adds_total{name="horizontalpodautoscaler"} 0 workqueue_adds_total{name="job"} 0 workqueue_adds_total{name="job_orphan_pod"} 0 workqueue_adds_total{name="namespace"} 0 -workqueue_adds_total{name="node_lifecycle_controller"} 18 +workqueue_adds_total{name="node"} 1 +workqueue_adds_total{name="node_lifecycle_controller"} 6 workqueue_adds_total{name="node_lifecycle_controller_pods"} 10 workqueue_adds_total{name="noexec_taint_node"} 1 workqueue_adds_total{name="noexec_taint_pod"} 16 @@ -1037,7 +1199,7 @@ workqueue_adds_total{name="orphaned_pods_nodes"} 0 workqueue_adds_total{name="pvcprotection"} 0 workqueue_adds_total{name="pvcs"} 0 workqueue_adds_total{name="pvprotection"} 0 -workqueue_adds_total{name="replicaset"} 22 +workqueue_adds_total{name="replicaset"} 21 workqueue_adds_total{name="replicationmanager"} 0 workqueue_adds_total{name="resource_quota_controller_resource_changes"} 0 workqueue_adds_total{name="resourcequota_primary"} 0 @@ -1051,7 +1213,7 @@ workqueue_adds_total{name="stale_pod_disruption"} 0 workqueue_adds_total{name="statefulset"} 0 workqueue_adds_total{name="token_cleaner"} 1 workqueue_adds_total{name="ttl_jobs_to_delete"} 0 -workqueue_adds_total{name="ttlcontroller"} 19 +workqueue_adds_total{name="ttlcontroller"} 8 workqueue_adds_total{name="volume_expand"} 0 workqueue_adds_total{name="volumes"} 0 # HELP workqueue_depth [ALPHA] Current depth of workqueue @@ -1080,6 +1242,7 @@ workqueue_depth{name="horizontalpodautoscaler"} 0 workqueue_depth{name="job"} 0 workqueue_depth{name="job_orphan_pod"} 0 workqueue_depth{name="namespace"} 0 +workqueue_depth{name="node"} 1 workqueue_depth{name="node_lifecycle_controller"} 0 workqueue_depth{name="node_lifecycle_controller_pods"} 0 workqueue_depth{name="noexec_taint_node"} 0 @@ -1131,6 +1294,7 @@ workqueue_longest_running_processor_seconds{name="horizontalpodautoscaler"} 0 workqueue_longest_running_processor_seconds{name="job"} 0 workqueue_longest_running_processor_seconds{name="job_orphan_pod"} 0 workqueue_longest_running_processor_seconds{name="namespace"} 0 +workqueue_longest_running_processor_seconds{name="node"} 0 workqueue_longest_running_processor_seconds{name="node_lifecycle_controller"} 0 workqueue_longest_running_processor_seconds{name="node_lifecycle_controller_pods"} 0 workqueue_longest_running_processor_seconds{name="noexec_taint_node"} 0 @@ -1161,41 +1325,41 @@ workqueue_longest_running_processor_seconds{name="volumes"} 0 workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-06"} 5 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-05"} 7 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 9 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-06"} 2 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-05"} 9 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 12 workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.01"} 15 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 19 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 19 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 19 -workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 19 -workqueue_queue_duration_seconds_sum{name="ClusterRoleAggregator"} 0.149585818 -workqueue_queue_duration_seconds_count{name="ClusterRoleAggregator"} 19 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 18 +workqueue_queue_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 18 +workqueue_queue_duration_seconds_sum{name="ClusterRoleAggregator"} 0.083220427 +workqueue_queue_duration_seconds_count{name="ClusterRoleAggregator"} 18 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="9.999999999999999e-05"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.001"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.01"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="0.1"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="10"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="+Inf"} 1 -workqueue_queue_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 0.000260048 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 9.4449e-05 workqueue_queue_duration_seconds_count{name="DynamicCABundle-client-ca-bundle"} 1 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-05"} 6 -workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 8 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-05"} 2 +workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 4 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.01"} 8 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.1"} 8 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1"} 8 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="10"} 8 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="+Inf"} 8 -workqueue_queue_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.0007548170000000001 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.012802833999999999 workqueue_queue_duration_seconds_count{name="DynamicCABundle-csr-controller"} 8 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-07"} 0 @@ -1208,21 +1372,21 @@ workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1"} 2 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="10"} 2 workqueue_queue_duration_seconds_bucket{name="DynamicCABundle-request-header",le="+Inf"} 2 -workqueue_queue_duration_seconds_sum{name="DynamicCABundle-request-header"} 5.9761e-05 +workqueue_queue_duration_seconds_sum{name="DynamicCABundle-request-header"} 0.00014659500000000002 workqueue_queue_duration_seconds_count{name="DynamicCABundle-request-header"} 2 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 18 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 70 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 70 -workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.001253922 -workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 70 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 1 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 11 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 11 +workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.00016838400000000002 +workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 11 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-06"} 0 @@ -1232,9 +1396,9 @@ workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.001" workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.01"} 1 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.1"} 1 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="1"} 1 -workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="10"} 2 +workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="10"} 1 workqueue_queue_duration_seconds_bucket{name="bootstrap_signer_queue",le="+Inf"} 2 -workqueue_queue_duration_seconds_sum{name="bootstrap_signer_queue"} 2.600939265 +workqueue_queue_duration_seconds_sum{name="bootstrap_signer_queue"} 13.20053605 workqueue_queue_duration_seconds_count{name="bootstrap_signer_queue"} 2 workqueue_queue_duration_seconds_bucket{name="certificate",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="certificate",le="1e-07"} 0 @@ -1278,29 +1442,29 @@ workqueue_queue_duration_seconds_count{name="cronjob"} 0 workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="daemonset",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-06"} 11 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-05"} 17 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.001"} 21 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.01"} 23 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.1"} 26 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="1"} 26 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="10"} 26 -workqueue_queue_duration_seconds_bucket{name="daemonset",le="+Inf"} 26 -workqueue_queue_duration_seconds_sum{name="daemonset"} 0.10375501900000002 -workqueue_queue_duration_seconds_count{name="daemonset"} 26 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-06"} 7 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-05"} 13 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.001"} 14 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.01"} 15 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="0.1"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="1"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="10"} 20 +workqueue_queue_duration_seconds_bucket{name="daemonset",le="+Inf"} 20 +workqueue_queue_duration_seconds_sum{name="daemonset"} 0.13628356 +workqueue_queue_duration_seconds_count{name="daemonset"} 20 workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="deployment",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-06"} 7 -workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-05"} 10 +workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-06"} 5 +workqueue_queue_duration_seconds_bucket{name="deployment",le="9.999999999999999e-05"} 14 workqueue_queue_duration_seconds_bucket{name="deployment",le="0.001"} 15 -workqueue_queue_duration_seconds_bucket{name="deployment",le="0.01"} 17 -workqueue_queue_duration_seconds_bucket{name="deployment",le="0.1"} 21 -workqueue_queue_duration_seconds_bucket{name="deployment",le="1"} 21 -workqueue_queue_duration_seconds_bucket{name="deployment",le="10"} 21 -workqueue_queue_duration_seconds_bucket{name="deployment",le="+Inf"} 21 -workqueue_queue_duration_seconds_sum{name="deployment"} 0.22309287700000005 -workqueue_queue_duration_seconds_count{name="deployment"} 21 +workqueue_queue_duration_seconds_bucket{name="deployment",le="0.01"} 19 +workqueue_queue_duration_seconds_bucket{name="deployment",le="0.1"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="1"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="10"} 24 +workqueue_queue_duration_seconds_bucket{name="deployment",le="+Inf"} 24 +workqueue_queue_duration_seconds_sum{name="deployment"} 0.19736604500000002 +workqueue_queue_duration_seconds_count{name="deployment"} 24 workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="disruption",le="1e-06"} 0 @@ -1330,42 +1494,42 @@ workqueue_queue_duration_seconds_count{name="disruption_recheck"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-06"} 6 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 7 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.001"} 7 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.01"} 7 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.1"} 9 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="1"} 9 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="10"} 9 -workqueue_queue_duration_seconds_bucket{name="endpoint",le="+Inf"} 9 -workqueue_queue_duration_seconds_sum{name="endpoint"} 0.12066748599999999 -workqueue_queue_duration_seconds_count{name="endpoint"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-06"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.001"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.01"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="0.1"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="1"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="10"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint",le="+Inf"} 7 +workqueue_queue_duration_seconds_sum{name="endpoint"} 0.096313131 +workqueue_queue_duration_seconds_count{name="endpoint"} 7 workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-06"} 5 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-05"} 8 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.001"} 8 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 8 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 10 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1"} 10 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="10"} 10 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 10 -workqueue_queue_duration_seconds_sum{name="endpoint_slice"} 0.15430708799999998 -workqueue_queue_duration_seconds_count{name="endpoint_slice"} 10 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-05"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.001"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 7 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="1"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="10"} 9 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 9 +workqueue_queue_duration_seconds_sum{name="endpoint_slice"} 0.10669576500000003 +workqueue_queue_duration_seconds_count{name="endpoint_slice"} 9 workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-06"} 4 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-05"} 5 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 5 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 5 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 6 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 6 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 6 -workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 6 -workqueue_queue_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.035223085 -workqueue_queue_duration_seconds_count{name="endpoint_slice_mirroring"} 6 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-06"} 3 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-05"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 4 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 5 +workqueue_queue_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 5 +workqueue_queue_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.054689076999999996 +workqueue_queue_duration_seconds_count{name="endpoint_slice_mirroring"} 5 workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="ephemeral_volume",le="1e-06"} 0 @@ -1387,11 +1551,11 @@ workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delet workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.001"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.01"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.1"} 0 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 1 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 1 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 1 -workqueue_queue_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 0.581767547 -workqueue_queue_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 1 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 6 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 6 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 6 +workqueue_queue_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 4.097001815 +workqueue_queue_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 6 workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-06"} 0 @@ -1407,17 +1571,17 @@ workqueue_queue_duration_seconds_sum{name="garbage_collector_attempt_to_orphan"} workqueue_queue_duration_seconds_count{name="garbage_collector_attempt_to_orphan"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-07"} 0 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 4451 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 4718 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 4892 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 4892 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 4892 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 4892 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 4892 -workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 4892 -workqueue_queue_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.0873752039999999 -workqueue_queue_duration_seconds_count{name="garbage_collector_graph_changes"} 4892 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-06"} 2 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 1005 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 1239 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 1333 +workqueue_queue_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 1333 +workqueue_queue_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.032958143000000044 +workqueue_queue_duration_seconds_count{name="garbage_collector_graph_changes"} 1333 workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-06"} 0 @@ -1470,31 +1634,44 @@ workqueue_queue_duration_seconds_bucket{name="namespace",le="10"} 0 workqueue_queue_duration_seconds_bucket{name="namespace",le="+Inf"} 0 workqueue_queue_duration_seconds_sum{name="namespace"} 0 workqueue_queue_duration_seconds_count{name="namespace"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="node",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="node"} 0 +workqueue_queue_duration_seconds_count{name="node"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 15 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 17 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 17 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 17 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 18 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 18 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 18 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 18 -workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller"} 0.067439891 -workqueue_queue_duration_seconds_count{name="node_lifecycle_controller"} 18 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 3 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 5 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 6 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 6 +workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller"} 0.09706806599999998 +workqueue_queue_duration_seconds_count{name="node_lifecycle_controller"} 6 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-05"} 3 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-05"} 2 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.001"} 6 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.01"} 6 -workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.1"} 10 +workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.1"} 6 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1"} 10 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="10"} 10 workqueue_queue_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="+Inf"} 10 -workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.26939581399999996 +workqueue_queue_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.4169839409999999 workqueue_queue_duration_seconds_count{name="node_lifecycle_controller_pods"} 10 workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1e-07"} 0 @@ -1507,20 +1684,20 @@ workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="0.1"} 1 workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="1"} 1 workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="10"} 1 workqueue_queue_duration_seconds_bucket{name="noexec_taint_node",le="+Inf"} 1 -workqueue_queue_duration_seconds_sum{name="noexec_taint_node"} 0.067600684 +workqueue_queue_duration_seconds_sum{name="noexec_taint_node"} 0.097449632 workqueue_queue_duration_seconds_count{name="noexec_taint_node"} 1 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 12 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 11 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-05"} 12 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.001"} 12 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.01"} 12 -workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.1"} 16 +workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="0.1"} 12 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="1"} 16 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="10"} 16 workqueue_queue_duration_seconds_bucket{name="noexec_taint_pod",le="+Inf"} 16 -workqueue_queue_duration_seconds_sum{name="noexec_taint_pod"} 0.26962664999999997 +workqueue_queue_duration_seconds_sum{name="noexec_taint_pod"} 0.41756404399999997 workqueue_queue_duration_seconds_count{name="noexec_taint_pod"} 16 workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-07"} 0 @@ -1577,16 +1754,16 @@ workqueue_queue_duration_seconds_count{name="pvprotection"} 0 workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 18 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 19 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.001"} 20 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.01"} 20 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.1"} 22 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="1"} 22 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="10"} 22 -workqueue_queue_duration_seconds_bucket{name="replicaset",le="+Inf"} 22 -workqueue_queue_duration_seconds_sum{name="replicaset"} 0.035803684999999995 -workqueue_queue_duration_seconds_count{name="replicaset"} 22 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 8 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 16 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.001"} 17 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.01"} 19 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="replicaset",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="replicaset"} 0.053872862999999986 +workqueue_queue_duration_seconds_count{name="replicaset"} 21 workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="replicationmanager",le="1e-06"} 0 @@ -1646,11 +1823,11 @@ workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.9999 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-05"} 0 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.001"} 0 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.01"} 0 -workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 5 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="1"} 5 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="10"} 5 workqueue_queue_duration_seconds_bucket{name="root_ca_cert_publisher",le="+Inf"} 5 -workqueue_queue_duration_seconds_sum{name="root_ca_cert_publisher"} 3.487257962 +workqueue_queue_duration_seconds_sum{name="root_ca_cert_publisher"} 0.33130713 workqueue_queue_duration_seconds_count{name="root_ca_cert_publisher"} 5 workqueue_queue_duration_seconds_bucket{name="service",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="service",le="1e-07"} 0 @@ -1672,11 +1849,11 @@ workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="9.999999999999 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-05"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.001"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.01"} 0 -workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.1"} 1 +workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="0.1"} 5 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="1"} 5 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="10"} 5 workqueue_queue_duration_seconds_bucket{name="serviceaccount",le="+Inf"} 5 -workqueue_queue_duration_seconds_sum{name="serviceaccount"} 0.5996587179999999 +workqueue_queue_duration_seconds_sum{name="serviceaccount"} 0.155889986 workqueue_queue_duration_seconds_count{name="serviceaccount"} 5 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-07"} 0 @@ -1694,15 +1871,15 @@ workqueue_queue_duration_seconds_count{name="serviceaccount_tokens_secret"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 28 -workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-05"} 34 -workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.001"} 34 -workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.01"} 34 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 23 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-05"} 36 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.001"} 36 +workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.01"} 37 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.1"} 42 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1"} 42 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="10"} 42 workqueue_queue_duration_seconds_bucket{name="serviceaccount_tokens_service",le="+Inf"} 42 -workqueue_queue_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.5090574979999997 +workqueue_queue_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.2990801869999998 workqueue_queue_duration_seconds_count{name="serviceaccount_tokens_service"} 42 workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="stale_pod_disruption",le="1e-07"} 0 @@ -1741,7 +1918,7 @@ workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="0.1"} 1 workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="1"} 1 workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="10"} 1 workqueue_queue_duration_seconds_bucket{name="token_cleaner",le="+Inf"} 1 -workqueue_queue_duration_seconds_sum{name="token_cleaner"} 0.000145768 +workqueue_queue_duration_seconds_sum{name="token_cleaner"} 0.00050785 workqueue_queue_duration_seconds_count{name="token_cleaner"} 1 workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-07"} 0 @@ -1759,16 +1936,16 @@ workqueue_queue_duration_seconds_count{name="ttl_jobs_to_delete"} 0 workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 16 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 16 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 16 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 17 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 18 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1"} 19 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="10"} 19 -workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 19 -workqueue_queue_duration_seconds_sum{name="ttlcontroller"} 0.42874502500000006 -workqueue_queue_duration_seconds_count{name="ttlcontroller"} 19 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 5 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 7 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 7 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="1"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="10"} 8 +workqueue_queue_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 8 +workqueue_queue_duration_seconds_sum{name="ttlcontroller"} 0.0015355340000000003 +workqueue_queue_duration_seconds_count{name="ttlcontroller"} 8 workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="volume_expand",le="1e-06"} 0 @@ -1805,12 +1982,12 @@ workqueue_retries_total{name="DynamicServingCertificateController"} 0 workqueue_retries_total{name="bootstrap_signer_queue"} 0 workqueue_retries_total{name="certificate"} 0 workqueue_retries_total{name="cronjob"} 0 -workqueue_retries_total{name="daemonset"} 8 -workqueue_retries_total{name="deployment"} 10 +workqueue_retries_total{name="daemonset"} 4 +workqueue_retries_total{name="deployment"} 13 workqueue_retries_total{name="disruption"} 0 workqueue_retries_total{name="disruption_recheck"} 0 -workqueue_retries_total{name="endpoint"} 6 -workqueue_retries_total{name="endpoint_slice"} 10 +workqueue_retries_total{name="endpoint"} 5 +workqueue_retries_total{name="endpoint_slice"} 9 workqueue_retries_total{name="endpoint_slice_mirroring"} 0 workqueue_retries_total{name="ephemeral_volume"} 0 workqueue_retries_total{name="garbage_collector_attempt_to_delete"} 0 @@ -1820,6 +1997,7 @@ workqueue_retries_total{name="horizontalpodautoscaler"} 0 workqueue_retries_total{name="job"} 0 workqueue_retries_total{name="job_orphan_pod"} 0 workqueue_retries_total{name="namespace"} 0 +workqueue_retries_total{name="node"} 0 workqueue_retries_total{name="node_lifecycle_controller_pods"} 0 workqueue_retries_total{name="orphaned_pods_nodes"} 0 workqueue_retries_total{name="pvcprotection"} 0 @@ -1867,6 +2045,7 @@ workqueue_unfinished_work_seconds{name="horizontalpodautoscaler"} 0 workqueue_unfinished_work_seconds{name="job"} 0 workqueue_unfinished_work_seconds{name="job_orphan_pod"} 0 workqueue_unfinished_work_seconds{name="namespace"} 0 +workqueue_unfinished_work_seconds{name="node"} 0 workqueue_unfinished_work_seconds{name="node_lifecycle_controller"} 0 workqueue_unfinished_work_seconds{name="node_lifecycle_controller_pods"} 0 workqueue_unfinished_work_seconds{name="noexec_taint_node"} 0 @@ -1899,14 +2078,14 @@ workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-07"} workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="9.999999999999999e-05"} 0 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 11 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.01"} 14 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 16 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 19 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 19 -workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 19 -workqueue_work_duration_seconds_sum{name="ClusterRoleAggregator"} 1.7518140269999998 -workqueue_work_duration_seconds_count{name="ClusterRoleAggregator"} 19 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.001"} 12 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.01"} 13 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="0.1"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="1"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="10"} 18 +workqueue_work_duration_seconds_bucket{name="ClusterRoleAggregator",le="+Inf"} 18 +workqueue_work_duration_seconds_sum{name="ClusterRoleAggregator"} 0.11454938699999999 +workqueue_work_duration_seconds_count{name="ClusterRoleAggregator"} 18 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1e-06"} 0 @@ -1918,59 +2097,59 @@ workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",l workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="1"} 1 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="10"} 1 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-client-ca-bundle",le="+Inf"} 1 -workqueue_work_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 3.783e-05 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-client-ca-bundle"} 8.4975e-05 workqueue_work_duration_seconds_count{name="DynamicCABundle-client-ca-bundle"} 1 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="9.999999999999999e-05"} 0 -workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 8 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.001"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.01"} 8 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="0.1"} 8 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="1"} 8 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="10"} 8 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-csr-controller",le="+Inf"} 8 -workqueue_work_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.0020711930000000003 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-csr-controller"} 0.025409607 workqueue_work_duration_seconds_count{name="DynamicCABundle-csr-controller"} 8 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-06"} 0 -workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-05"} 2 +workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="9.999999999999999e-05"} 1 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.001"} 2 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.01"} 2 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="0.1"} 2 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="1"} 2 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="10"} 2 workqueue_work_duration_seconds_bucket{name="DynamicCABundle-request-header",le="+Inf"} 2 -workqueue_work_duration_seconds_sum{name="DynamicCABundle-request-header"} 9.4387e-05 +workqueue_work_duration_seconds_sum{name="DynamicCABundle-request-header"} 0.000267977 workqueue_work_duration_seconds_count{name="DynamicCABundle-request-header"} 2 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 67 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 70 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 70 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 70 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 70 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 70 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 70 -workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0027626259999999994 -workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 70 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 9 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 11 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 11 +workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.00047514399999999994 +workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 11 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-06"} 0 -workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="9.999999999999999e-05"} 1 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.001"} 1 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.01"} 1 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="0.1"} 1 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="1"} 2 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="10"} 2 workqueue_work_duration_seconds_bucket{name="bootstrap_signer_queue",le="+Inf"} 2 -workqueue_work_duration_seconds_sum{name="bootstrap_signer_queue"} 0.645685849 +workqueue_work_duration_seconds_sum{name="bootstrap_signer_queue"} 0.38498436100000005 workqueue_work_duration_seconds_count{name="bootstrap_signer_queue"} 2 workqueue_work_duration_seconds_bucket{name="certificate",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="certificate",le="1e-07"} 0 @@ -2016,27 +2195,27 @@ workqueue_work_duration_seconds_bucket{name="daemonset",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="daemonset",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="daemonset",le="9.999999999999999e-05"} 0 -workqueue_work_duration_seconds_bucket{name="daemonset",le="0.001"} 11 -workqueue_work_duration_seconds_bucket{name="daemonset",le="0.01"} 21 -workqueue_work_duration_seconds_bucket{name="daemonset",le="0.1"} 24 -workqueue_work_duration_seconds_bucket{name="daemonset",le="1"} 26 -workqueue_work_duration_seconds_bucket{name="daemonset",le="10"} 26 -workqueue_work_duration_seconds_bucket{name="daemonset",le="+Inf"} 26 -workqueue_work_duration_seconds_sum{name="daemonset"} 1.3695173059999999 -workqueue_work_duration_seconds_count{name="daemonset"} 26 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.001"} 8 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.01"} 13 +workqueue_work_duration_seconds_bucket{name="daemonset",le="0.1"} 18 +workqueue_work_duration_seconds_bucket{name="daemonset",le="1"} 20 +workqueue_work_duration_seconds_bucket{name="daemonset",le="10"} 20 +workqueue_work_duration_seconds_bucket{name="daemonset",le="+Inf"} 20 +workqueue_work_duration_seconds_sum{name="daemonset"} 0.8108563479999998 +workqueue_work_duration_seconds_count{name="daemonset"} 20 workqueue_work_duration_seconds_bucket{name="deployment",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="deployment",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="deployment",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="deployment",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="deployment",le="9.999999999999999e-05"} 0 -workqueue_work_duration_seconds_bucket{name="deployment",le="0.001"} 12 -workqueue_work_duration_seconds_bucket{name="deployment",le="0.01"} 17 -workqueue_work_duration_seconds_bucket{name="deployment",le="0.1"} 19 -workqueue_work_duration_seconds_bucket{name="deployment",le="1"} 21 -workqueue_work_duration_seconds_bucket{name="deployment",le="10"} 21 -workqueue_work_duration_seconds_bucket{name="deployment",le="+Inf"} 21 -workqueue_work_duration_seconds_sum{name="deployment"} 1.7036903709999998 -workqueue_work_duration_seconds_count{name="deployment"} 21 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.001"} 11 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.01"} 18 +workqueue_work_duration_seconds_bucket{name="deployment",le="0.1"} 22 +workqueue_work_duration_seconds_bucket{name="deployment",le="1"} 24 +workqueue_work_duration_seconds_bucket{name="deployment",le="10"} 24 +workqueue_work_duration_seconds_bucket{name="deployment",le="+Inf"} 24 +workqueue_work_duration_seconds_sum{name="deployment"} 0.8284786330000001 +workqueue_work_duration_seconds_count{name="deployment"} 24 workqueue_work_duration_seconds_bucket{name="disruption",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="disruption",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="disruption",le="1e-06"} 0 @@ -2067,41 +2246,41 @@ workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="endpoint",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-06"} 0 -workqueue_work_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 4 -workqueue_work_duration_seconds_bucket{name="endpoint",le="0.001"} 4 -workqueue_work_duration_seconds_bucket{name="endpoint",le="0.01"} 8 -workqueue_work_duration_seconds_bucket{name="endpoint",le="0.1"} 8 -workqueue_work_duration_seconds_bucket{name="endpoint",le="1"} 9 -workqueue_work_duration_seconds_bucket{name="endpoint",le="10"} 9 -workqueue_work_duration_seconds_bucket{name="endpoint",le="+Inf"} 9 -workqueue_work_duration_seconds_sum{name="endpoint"} 0.697256455 -workqueue_work_duration_seconds_count{name="endpoint"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint",le="9.999999999999999e-05"} 3 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.001"} 3 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.01"} 6 +workqueue_work_duration_seconds_bucket{name="endpoint",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="endpoint",le="1"} 7 +workqueue_work_duration_seconds_bucket{name="endpoint",le="10"} 7 +workqueue_work_duration_seconds_bucket{name="endpoint",le="+Inf"} 7 +workqueue_work_duration_seconds_sum{name="endpoint"} 0.43761739 +workqueue_work_duration_seconds_count{name="endpoint"} 7 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="9.999999999999999e-05"} 1 workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.001"} 5 -workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 9 -workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 9 -workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1"} 10 -workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="10"} 10 -workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 10 -workqueue_work_duration_seconds_sum{name="endpoint_slice"} 0.7379739679999999 -workqueue_work_duration_seconds_count{name="endpoint_slice"} 10 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.01"} 8 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="0.1"} 8 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="1"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="10"} 9 +workqueue_work_duration_seconds_bucket{name="endpoint_slice",le="+Inf"} 9 +workqueue_work_duration_seconds_sum{name="endpoint_slice"} 0.48552537400000007 +workqueue_work_duration_seconds_count{name="endpoint_slice"} 9 workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="9.999999999999999e-05"} 5 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 6 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 6 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 6 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 6 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 6 -workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 6 -workqueue_work_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.000355268 -workqueue_work_duration_seconds_count{name="endpoint_slice_mirroring"} 6 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.001"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="0.1"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="1"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="10"} 5 +workqueue_work_duration_seconds_bucket{name="endpoint_slice_mirroring",le="+Inf"} 5 +workqueue_work_duration_seconds_sum{name="endpoint_slice_mirroring"} 0.00024789 +workqueue_work_duration_seconds_count{name="endpoint_slice_mirroring"} 5 workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="ephemeral_volume",le="1e-06"} 0 @@ -2121,13 +2300,13 @@ workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="9.999999999999999e-05"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.001"} 0 -workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.01"} 0 -workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.1"} 1 -workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 1 -workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 1 -workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 1 -workqueue_work_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 0.018493646 -workqueue_work_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 1 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="1"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="10"} 6 +workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_delete",le="+Inf"} 6 +workqueue_work_duration_seconds_sum{name="garbage_collector_attempt_to_delete"} 0.053933561 +workqueue_work_duration_seconds_count{name="garbage_collector_attempt_to_delete"} 6 workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_attempt_to_orphan",le="1e-06"} 0 @@ -2144,16 +2323,16 @@ workqueue_work_duration_seconds_count{name="garbage_collector_attempt_to_orphan" workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 932 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 4890 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 4892 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 4892 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 4892 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 4892 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 4892 -workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 4892 -workqueue_work_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.07240897899999997 -workqueue_work_duration_seconds_count{name="garbage_collector_graph_changes"} 4892 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-06"} 272 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="9.999999999999999e-05"} 1331 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.001"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.01"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="0.1"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="1"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="10"} 1333 +workqueue_work_duration_seconds_bucket{name="garbage_collector_graph_changes",le="+Inf"} 1333 +workqueue_work_duration_seconds_sum{name="garbage_collector_graph_changes"} 0.02076810500000004 +workqueue_work_duration_seconds_count{name="garbage_collector_graph_changes"} 1333 workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="horizontalpodautoscaler",le="1e-06"} 0 @@ -2206,23 +2385,36 @@ workqueue_work_duration_seconds_bucket{name="namespace",le="10"} 0 workqueue_work_duration_seconds_bucket{name="namespace",le="+Inf"} 0 workqueue_work_duration_seconds_sum{name="namespace"} 0 workqueue_work_duration_seconds_count{name="namespace"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="node",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="node"} 0 +workqueue_work_duration_seconds_count{name="node"} 0 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 8 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 17 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 17 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 18 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 18 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 18 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 18 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 18 -workqueue_work_duration_seconds_sum{name="node_lifecycle_controller"} 0.008100643000000001 -workqueue_work_duration_seconds_count{name="node_lifecycle_controller"} 18 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="9.999999999999999e-05"} 4 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.001"} 5 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.01"} 5 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="0.1"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="1"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="10"} 6 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller",le="+Inf"} 6 +workqueue_work_duration_seconds_sum{name="node_lifecycle_controller"} 0.01082167 +workqueue_work_duration_seconds_count{name="node_lifecycle_controller"} 6 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-06"} 3 +workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-06"} 2 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="9.999999999999999e-05"} 8 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.001"} 10 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="0.01"} 10 @@ -2230,7 +2422,7 @@ workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le= workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="1"} 10 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="10"} 10 workqueue_work_duration_seconds_bucket{name="node_lifecycle_controller_pods",le="+Inf"} 10 -workqueue_work_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.00097725 +workqueue_work_duration_seconds_sum{name="node_lifecycle_controller_pods"} 0.0005988570000000001 workqueue_work_duration_seconds_count{name="node_lifecycle_controller_pods"} 10 workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1e-07"} 0 @@ -2243,12 +2435,12 @@ workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="0.1"} 1 workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="1"} 1 workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="10"} 1 workqueue_work_duration_seconds_bucket{name="noexec_taint_node",le="+Inf"} 1 -workqueue_work_duration_seconds_sum{name="noexec_taint_node"} 6.3684e-05 +workqueue_work_duration_seconds_sum{name="noexec_taint_node"} 8.0701e-05 workqueue_work_duration_seconds_count{name="noexec_taint_node"} 1 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 6 +workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-06"} 3 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="9.999999999999999e-05"} 16 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.001"} 16 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.01"} 16 @@ -2256,7 +2448,7 @@ workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="0.1"} 16 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="1"} 16 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="10"} 16 workqueue_work_duration_seconds_bucket{name="noexec_taint_pod",le="+Inf"} 16 -workqueue_work_duration_seconds_sum{name="noexec_taint_pod"} 0.00025511300000000006 +workqueue_work_duration_seconds_sum{name="noexec_taint_pod"} 0.00039294 workqueue_work_duration_seconds_count{name="noexec_taint_pod"} 16 workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="orphaned_pods_nodes",le="1e-07"} 0 @@ -2314,15 +2506,15 @@ workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 0 -workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 9 -workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 15 -workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 20 -workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 20 -workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 22 -workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 22 -workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 22 -workqueue_work_duration_seconds_sum{name="replicaset"} 0.281005149 -workqueue_work_duration_seconds_count{name="replicaset"} 22 +workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 8 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 14 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 17 +workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 19 +workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="replicaset"} 0.59551322 +workqueue_work_duration_seconds_count{name="replicaset"} 21 workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="replicationmanager",le="1e-06"} 0 @@ -2382,11 +2574,11 @@ workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.99999 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="9.999999999999999e-05"} 0 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.001"} 0 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.01"} 4 -workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 4 +workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="0.1"} 5 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="1"} 5 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="10"} 5 workqueue_work_duration_seconds_bucket{name="root_ca_cert_publisher",le="+Inf"} 5 -workqueue_work_duration_seconds_sum{name="root_ca_cert_publisher"} 0.772085499 +workqueue_work_duration_seconds_sum{name="root_ca_cert_publisher"} 0.045449207000000005 workqueue_work_duration_seconds_count{name="root_ca_cert_publisher"} 5 workqueue_work_duration_seconds_bucket{name="service",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="service",le="1e-07"} 0 @@ -2408,11 +2600,11 @@ workqueue_work_duration_seconds_bucket{name="serviceaccount",le="9.9999999999999 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="9.999999999999999e-05"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.001"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.01"} 4 -workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.1"} 4 +workqueue_work_duration_seconds_bucket{name="serviceaccount",le="0.1"} 5 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="1"} 5 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="10"} 5 workqueue_work_duration_seconds_bucket{name="serviceaccount",le="+Inf"} 5 -workqueue_work_duration_seconds_sum{name="serviceaccount"} 0.13304045599999997 +workqueue_work_duration_seconds_sum{name="serviceaccount"} 0.037981051 workqueue_work_duration_seconds_count{name="serviceaccount"} 5 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_secret",le="1e-07"} 0 @@ -2430,7 +2622,7 @@ workqueue_work_duration_seconds_count{name="serviceaccount_tokens_secret"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 25 +workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-06"} 24 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="9.999999999999999e-05"} 42 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.001"} 42 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="0.01"} 42 @@ -2438,7 +2630,7 @@ workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le=" workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="1"} 42 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="10"} 42 workqueue_work_duration_seconds_bucket{name="serviceaccount_tokens_service",le="+Inf"} 42 -workqueue_work_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.0004642880000000001 +workqueue_work_duration_seconds_sum{name="serviceaccount_tokens_service"} 0.00041573900000000004 workqueue_work_duration_seconds_count{name="serviceaccount_tokens_service"} 42 workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="stale_pod_disruption",le="1e-07"} 0 @@ -2477,7 +2669,7 @@ workqueue_work_duration_seconds_bucket{name="token_cleaner",le="0.1"} 1 workqueue_work_duration_seconds_bucket{name="token_cleaner",le="1"} 1 workqueue_work_duration_seconds_bucket{name="token_cleaner",le="10"} 1 workqueue_work_duration_seconds_bucket{name="token_cleaner",le="+Inf"} 1 -workqueue_work_duration_seconds_sum{name="token_cleaner"} 0.000153328 +workqueue_work_duration_seconds_sum{name="token_cleaner"} 0.000115156 workqueue_work_duration_seconds_count{name="token_cleaner"} 1 workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="ttl_jobs_to_delete",le="1e-07"} 0 @@ -2495,16 +2687,16 @@ workqueue_work_duration_seconds_count{name="ttl_jobs_to_delete"} 0 workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 15 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 17 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 17 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 18 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 18 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1"} 19 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="10"} 19 -workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 19 -workqueue_work_duration_seconds_sum{name="ttlcontroller"} 0.41880495500000003 -workqueue_work_duration_seconds_count{name="ttlcontroller"} 19 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-06"} 4 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="9.999999999999999e-05"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.001"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.01"} 7 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="0.1"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="1"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="10"} 8 +workqueue_work_duration_seconds_bucket{name="ttlcontroller",le="+Inf"} 8 +workqueue_work_duration_seconds_sum{name="ttlcontroller"} 0.019944503999999995 +workqueue_work_duration_seconds_count{name="ttlcontroller"} 8 workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="volume_expand",le="1e-06"} 0 diff --git a/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain-expected.json index eaf2af86089..e18c58eaccd 100644 --- a/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/controllermanager/_meta/testdata/docs.plain-expected.json @@ -70,6 +70,33 @@ "type": "kubernetes" } }, + { + "event": { + "dataset": "kubernetes.controllermanager", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "controllermanager": { + "client": { + "request": { + "count": 5 + } + }, + "code": "409", + "host": "172.18.0.2:6443", + "method": "PUT" + } + }, + "metricset": { + "name": "controllermanager", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, { "event": { "dataset": "kubernetes.controllermanager", @@ -107,6 +134,43 @@ "type": "kubernetes" } }, + { + "event": { + "dataset": "kubernetes.controllermanager", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "controllermanager": { + "name": "DynamicServingCertificateController", + "workqueue": { + "adds": { + "count": 11 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + } + }, + "metricset": { + "name": "controllermanager", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, { "event": { "dataset": "kubernetes.controllermanager", @@ -179,10 +243,10 @@ }, "kubernetes": { "controllermanager": { - "name": "deployment", + "name": "serviceaccount_tokens_secret", "workqueue": { "adds": { - "count": 21 + "count": 0 }, "depth": { "count": 0 @@ -191,7 +255,7 @@ "sec": 0 }, "retries": { - "count": 10 + "count": 0 }, "unfinished": { "sec": 0 @@ -216,10 +280,10 @@ }, "kubernetes": { "controllermanager": { - "name": "serviceaccount_tokens_secret", + "name": "ClusterRoleAggregator", "workqueue": { "adds": { - "count": 0 + "count": 18 }, "depth": { "count": 0 @@ -253,14 +317,24 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "count": 9893 + "name": "garbage_collector_graph_changes", + "workqueue": { + "adds": { + "count": 1333 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "GET" + } } }, "metricset": { @@ -344,10 +418,10 @@ }, "kubernetes": { "controllermanager": { - "name": "endpoint", + "name": "orphaned_pods_nodes", "workqueue": { "adds": { - "count": 9 + "count": 0 }, "depth": { "count": 0 @@ -356,7 +430,7 @@ "sec": 0 }, "retries": { - "count": 6 + "count": 0 }, "unfinished": { "sec": 0 @@ -381,10 +455,37 @@ }, "kubernetes": { "controllermanager": { - "name": "orphaned_pods_nodes", + "client": { + "request": { + "count": 348 + } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" + } + }, + "metricset": { + "name": "controllermanager", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.controllermanager", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "controllermanager": { + "name": "serviceaccount_tokens_service", "workqueue": { "adds": { - "count": 0 + "count": 42 }, "depth": { "count": 0 @@ -418,75 +519,24 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 19, - "100000": 15, - "1000000": 19, - "15000000": 19, - "2000000": 19, - "25000": 15, - "250000": 15, - "30000000": 19, - "4000000": 19, - "5000": 6, - "500000": 16, - "60000000": 19, - "8000000": 19 - }, - "count": 19, - "sum": 2208802.044999999 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 19, - "1024": 12, - "1048576": 19, - "16384": 19, - "16777216": 19, - "256": 11, - "262144": 19, - "4096": 19, - "4194304": 19, - "512": 12, - "64": 1, - "65536": 19 - }, - "count": 19, - "sum": 22369 - } - } + "name": "garbage_collector_attempt_to_delete", + "workqueue": { + "adds": { + "count": 6 }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 19, - "1024": 8, - "1048576": 19, - "16384": 19, - "16777216": 19, - "256": 0, - "262144": 19, - "4096": 19, - "4194304": 19, - "512": 0, - "64": 0, - "65536": 19 - }, - "count": 19, - "sum": 39824 - } - } + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "host": "172.18.0.2:6443", - "verb": "PATCH" + } } }, "metricset": { @@ -506,10 +556,10 @@ }, "kubernetes": { "controllermanager": { - "name": "serviceaccount_tokens_service", + "name": "replicationmanager", "workqueue": { "adds": { - "count": 42 + "count": 0 }, "depth": { "count": 0 @@ -543,10 +593,10 @@ }, "kubernetes": { "controllermanager": { - "name": "endpoint_slice_mirroring", + "name": "horizontalpodautoscaler", "workqueue": { "adds": { - "count": 6 + "count": 0 }, "depth": { "count": 0 @@ -580,14 +630,24 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "count": 2 + "name": "endpoint", + "workqueue": { + "adds": { + "count": 7 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 5 + }, + "unfinished": { + "sec": 0 } - }, - "code": "409", - "host": "172.18.0.2:6443", - "method": "PUT" + } } }, "metricset": { @@ -607,7 +667,7 @@ }, "kubernetes": { "controllermanager": { - "name": "replicationmanager", + "name": "resourcequota_priority", "workqueue": { "adds": { "count": 0 @@ -644,7 +704,7 @@ }, "kubernetes": { "controllermanager": { - "name": "horizontalpodautoscaler", + "name": "statefulset", "workqueue": { "adds": { "count": 0 @@ -681,10 +741,10 @@ }, "kubernetes": { "controllermanager": { - "name": "ClusterRoleAggregator", + "name": "ephemeral_volume", "workqueue": { "adds": { - "count": 19 + "count": 0 }, "depth": { "count": 0 @@ -718,10 +778,10 @@ }, "kubernetes": { "controllermanager": { - "name": "resourcequota_priority", + "name": "daemonset", "workqueue": { "adds": { - "count": 0 + "count": 20 }, "depth": { "count": 0 @@ -730,7 +790,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 4 }, "unfinished": { "sec": 0 @@ -755,7 +815,7 @@ }, "kubernetes": { "controllermanager": { - "name": "statefulset", + "name": "cronjob", "workqueue": { "adds": { "count": 0 @@ -792,24 +852,14 @@ }, "kubernetes": { "controllermanager": { - "name": "ephemeral_volume", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 619 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "GET" } }, "metricset": { @@ -829,7 +879,7 @@ }, "kubernetes": { "controllermanager": { - "name": "cronjob", + "name": "stale_pod_disruption", "workqueue": { "adds": { "count": 0 @@ -866,10 +916,10 @@ }, "kubernetes": { "controllermanager": { - "name": "garbage_collector_attempt_to_delete", + "name": "ttlcontroller", "workqueue": { "adds": { - "count": 1 + "count": 8 }, "depth": { "count": 0 @@ -903,7 +953,7 @@ }, "kubernetes": { "controllermanager": { - "name": "stale_pod_disruption", + "name": "pvprotection", "workqueue": { "adds": { "count": 0 @@ -940,47 +990,84 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 473, - "100000": 455, - "1000000": 473, - "15000000": 473, - "2000000": 473, - "25000": 437, - "250000": 458, - "30000000": 473, - "4000000": 473, - "5000": 418, - "500000": 466, - "60000000": 473, - "8000000": 473 - }, - "count": 473, - "sum": 10447106.29600001 + "name": "namespace", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + } + }, + "metricset": { + "name": "controllermanager", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.controllermanager", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "controllermanager": { + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 561, + "100000": 544, + "1000000": 560, + "15000000": 561, + "2000000": 560, + "25000": 501, + "250000": 553, + "30000000": 561, + "4000000": 561, + "5000": 447, + "500000": 558, + "60000000": 561, + "8000000": 561 + }, + "count": 561, + "sum": 11537652.950999988 } }, "size": { "bytes": { "bucket": { - "+Inf": 473, - "1024": 261, - "1048576": 473, - "16384": 473, - "16777216": 473, - "256": 55, - "262144": 473, - "4096": 472, - "4194304": 473, - "512": 67, - "64": 1, - "65536": 473 + "+Inf": 561, + "1024": 561, + "1048576": 561, + "16384": 561, + "16777216": 561, + "256": 561, + "262144": 561, + "4096": 561, + "4194304": 561, + "512": 561, + "64": 561, + "65536": 561 }, - "count": 473, - "sum": 375253 + "count": 561, + "sum": 0 } } }, @@ -988,27 +1075,27 @@ "size": { "bytes": { "bucket": { - "+Inf": 473, - "1024": 59, - "1048576": 473, - "16384": 473, - "16777216": 473, - "256": 45, - "262144": 473, - "4096": 471, - "4194304": 473, - "512": 46, - "64": 0, - "65536": 473 + "+Inf": 561, + "1024": 441, + "1048576": 561, + "16384": 558, + "16777216": 561, + "256": 84, + "262144": 561, + "4096": 458, + "4194304": 561, + "512": 437, + "64": 20, + "65536": 561 }, - "count": 473, - "sum": 630891 + "count": 561, + "sum": 1424272 } } } }, "host": "172.18.0.2:6443", - "verb": "POST" + "verb": "GET" } }, "metricset": { @@ -1028,10 +1115,44 @@ }, "kubernetes": { "controllermanager": { - "name": "endpoint_slice", + "name": "noexec_taint_node", "workqueue": { "adds": { - "count": 10 + "count": 1 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 + } + } + } + }, + "metricset": { + "name": "controllermanager", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.controllermanager", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "controllermanager": { + "name": "DynamicCABundle-client-ca-bundle", + "workqueue": { + "adds": { + "count": 1 }, "depth": { "count": 0 @@ -1040,7 +1161,7 @@ "sec": 0 }, "retries": { - "count": 10 + "count": 0 }, "unfinished": { "sec": 0 @@ -1067,12 +1188,73 @@ "controllermanager": { "client": { "request": { - "count": 465 + "duration": { + "us": { + "bucket": { + "+Inf": 89, + "100000": 76, + "1000000": 89, + "15000000": 89, + "2000000": 89, + "25000": 57, + "250000": 77, + "30000000": 89, + "4000000": 89, + "5000": 20, + "500000": 89, + "60000000": 89, + "8000000": 89 + }, + "count": 89, + "sum": 5392320.426000001 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 89, + "1024": 69, + "1048576": 89, + "16384": 89, + "16777216": 89, + "256": 53, + "262144": 89, + "4096": 88, + "4194304": 89, + "512": 65, + "64": 1, + "65536": 89 + }, + "count": 89, + "sum": 47067 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 89, + "1024": 55, + "1048576": 89, + "16384": 89, + "16777216": 89, + "256": 41, + "262144": 89, + "4096": 87, + "4194304": 89, + "512": 42, + "64": 0, + "65536": 89 + }, + "count": 89, + "sum": 84305 + } + } } }, - "code": "201", "host": "172.18.0.2:6443", - "method": "POST" + "verb": "POST" } }, "metricset": { @@ -1092,7 +1274,7 @@ }, "kubernetes": { "controllermanager": { - "name": "pvprotection", + "name": "job", "workqueue": { "adds": { "count": 0 @@ -1129,10 +1311,10 @@ }, "kubernetes": { "controllermanager": { - "name": "namespace", + "name": "replicaset", "workqueue": { "adds": { - "count": 0 + "count": 21 }, "depth": { "count": 0 @@ -1166,10 +1348,10 @@ }, "kubernetes": { "controllermanager": { - "name": "noexec_taint_node", + "name": "deployment", "workqueue": { "adds": { - "count": 1 + "count": 24 }, "depth": { "count": 0 @@ -1177,6 +1359,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 13 + }, "unfinished": { "sec": 0 } @@ -1200,10 +1385,10 @@ }, "kubernetes": { "controllermanager": { - "name": "DynamicCABundle-client-ca-bundle", + "name": "endpoint_slice_mirroring", "workqueue": { "adds": { - "count": 1 + "count": 5 }, "depth": { "count": 0 @@ -1237,14 +1422,10 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "count": 2100 - } + "leader": { + "is_master": true }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PUT" + "name": "kube-controller-manager" } }, "metricset": { @@ -1264,44 +1445,75 @@ }, "kubernetes": { "controllermanager": { - "node": { - "collector": { - "count": 1, - "eviction": { - "count": 0 - }, - "health": { - "pct": 100 - }, - "unhealthy": { - "count": 0 - } - } - }, - "process": { - "cpu": { - "sec": 127 - }, - "fds": { - "max": { - "count": 1048576 + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 12, + "100000": 12, + "1000000": 12, + "15000000": 12, + "2000000": 12, + "25000": 12, + "250000": 12, + "30000000": 12, + "4000000": 12, + "5000": 0, + "500000": 12, + "60000000": 12, + "8000000": 12 + }, + "count": 12, + "sum": 164656.37399999998 + } }, - "open": { - "count": 42 + "size": { + "bytes": { + "bucket": { + "+Inf": 12, + "1024": 7, + "1048576": 12, + "16384": 12, + "16777216": 12, + "256": 6, + "262144": 12, + "4096": 12, + "4194304": 12, + "512": 7, + "64": 1, + "65536": 12 + }, + "count": 12, + "sum": 15373 + } } }, - "memory": { - "resident": { - "bytes": 103018496 - }, - "virtual": { - "bytes": 792305664 + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 12, + "1024": 4, + "1048576": 12, + "16384": 12, + "16777216": 12, + "256": 0, + "262144": 12, + "4096": 11, + "4194304": 12, + "512": 0, + "64": 0, + "65536": 12 + }, + "count": 12, + "sum": 28374 + } } - }, - "started": { - "sec": 1671725506.1 } - } + }, + "host": "172.18.0.2:6443", + "verb": "PATCH" } }, "metricset": { @@ -1321,7 +1533,7 @@ }, "kubernetes": { "controllermanager": { - "name": "job", + "name": "pvcprotection", "workqueue": { "adds": { "count": 0 @@ -1358,10 +1570,10 @@ }, "kubernetes": { "controllermanager": { - "name": "replicaset", + "name": "disruption_recheck", "workqueue": { "adds": { - "count": 22 + "count": 0 }, "depth": { "count": 0 @@ -1395,64 +1607,7 @@ }, "kubernetes": { "controllermanager": { - "name": "node_lifecycle_controller", - "workqueue": { - "adds": { - "count": 18 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "unfinished": { - "sec": 0 - } - } - } - }, - "metricset": { - "name": "controllermanager", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.controllermanager", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "controllermanager": { - "leader": { - "is_master": true - }, - "name": "kube-controller-manager" - } - }, - "metricset": { - "name": "controllermanager", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.controllermanager", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "controllermanager": { - "name": "pvcprotection", + "name": "volume_expand", "workqueue": { "adds": { "count": 0 @@ -1489,34 +1644,7 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "count": 8 - } - }, - "code": "403", - "host": "172.18.0.2:6443", - "method": "POST" - } - }, - "metricset": { - "name": "controllermanager", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.controllermanager", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "controllermanager": { - "name": "disruption_recheck", + "name": "job_orphan_pod", "workqueue": { "adds": { "count": 0 @@ -1553,10 +1681,10 @@ }, "kubernetes": { "controllermanager": { - "name": "volume_expand", + "name": "bootstrap_signer_queue", "workqueue": { "adds": { - "count": 0 + "count": 2 }, "depth": { "count": 0 @@ -1590,22 +1718,42 @@ }, "kubernetes": { "controllermanager": { - "name": "job_orphan_pod", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 + "node": { + "collector": { + "count": 1, + "eviction": { + "count": 0 + }, + "health": { + "pct": 100 + }, + "unhealthy": { + "count": 0 + } + } + }, + "process": { + "cpu": { + "sec": 18 }, - "longestrunning": { - "sec": 0 + "fds": { + "max": { + "count": 1048576 + }, + "open": { + "count": 19 + } }, - "retries": { - "count": 0 + "memory": { + "resident": { + "bytes": 94121984 + }, + "virtual": { + "bytes": 800964608 + } }, - "unfinished": { - "sec": 0 + "started": { + "sec": 1691572169.24 } } } @@ -1627,10 +1775,10 @@ }, "kubernetes": { "controllermanager": { - "name": "DynamicServingCertificateController", + "name": "service", "workqueue": { "adds": { - "count": 70 + "count": 0 }, "depth": { "count": 0 @@ -1664,14 +1812,21 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "count": 19 + "name": "node_lifecycle_controller", + "workqueue": { + "adds": { + "count": 6 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PATCH" + } } }, "metricset": { @@ -1691,10 +1846,10 @@ }, "kubernetes": { "controllermanager": { - "name": "bootstrap_signer_queue", + "name": "certificate", "workqueue": { "adds": { - "count": 2 + "count": 0 }, "depth": { "count": 0 @@ -1728,10 +1883,10 @@ }, "kubernetes": { "controllermanager": { - "name": "service", + "name": "endpoint_slice", "workqueue": { "adds": { - "count": 0 + "count": 9 }, "depth": { "count": 0 @@ -1740,7 +1895,7 @@ "sec": 0 }, "retries": { - "count": 0 + "count": 9 }, "unfinished": { "sec": 0 @@ -1765,24 +1920,75 @@ }, "kubernetes": { "controllermanager": { - "name": "ttlcontroller", - "workqueue": { - "adds": { - "count": 19 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 353, + "100000": 352, + "1000000": 353, + "15000000": 353, + "2000000": 353, + "25000": 351, + "250000": 352, + "30000000": 353, + "4000000": 353, + "5000": 29, + "500000": 353, + "60000000": 353, + "8000000": 353 + }, + "count": 353, + "sum": 3877152.228000004 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 353, + "1024": 321, + "1048576": 353, + "16384": 353, + "16777216": 353, + "256": 0, + "262144": 353, + "4096": 346, + "4194304": 353, + "512": 317, + "64": 0, + "65536": 353 + }, + "count": 353, + "sum": 264367 + } + } }, - "unfinished": { - "sec": 0 + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 353, + "1024": 325, + "1048576": 353, + "16384": 353, + "16777216": 353, + "256": 2, + "262144": 353, + "4096": 346, + "4194304": 353, + "512": 322, + "64": 0, + "65536": 353 + }, + "count": 353, + "sum": 249739 + } + } } - } + }, + "host": "172.18.0.2:6443", + "verb": "PUT" } }, "metricset": { @@ -1802,7 +2008,7 @@ }, "kubernetes": { "controllermanager": { - "name": "certificate", + "name": "disruption", "workqueue": { "adds": { "count": 0 @@ -1839,24 +2045,14 @@ }, "kubernetes": { "controllermanager": { - "name": "disruption", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 4 } - } + }, + "code": "403", + "host": "172.18.0.2:6443", + "method": "POST" } }, "metricset": { @@ -1910,10 +2106,10 @@ }, "kubernetes": { "controllermanager": { - "name": "daemonset", + "name": "DynamicCABundle-request-header", "workqueue": { "adds": { - "count": 26 + "count": 2 }, "depth": { "count": 0 @@ -1922,7 +2118,7 @@ "sec": 0 }, "retries": { - "count": 8 + "count": 0 }, "unfinished": { "sec": 0 @@ -1947,10 +2143,10 @@ }, "kubernetes": { "controllermanager": { - "name": "DynamicCABundle-request-header", + "name": "resource_quota_controller_resource_changes", "workqueue": { "adds": { - "count": 2 + "count": 0 }, "depth": { "count": 0 @@ -1984,24 +2180,14 @@ }, "kubernetes": { "controllermanager": { - "name": "resource_quota_controller_resource_changes", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "client": { + "request": { + "count": 12 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PATCH" } }, "metricset": { @@ -2095,75 +2281,21 @@ }, "kubernetes": { "controllermanager": { - "client": { - "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 9491, - "100000": 9472, - "1000000": 9490, - "15000000": 9491, - "2000000": 9490, - "25000": 9430, - "250000": 9479, - "30000000": 9491, - "4000000": 9490, - "5000": 9135, - "500000": 9488, - "60000000": 9491, - "8000000": 9491 - }, - "count": 9491, - "sum": 37239894.67399995 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 9491, - "1024": 9491, - "1048576": 9491, - "16384": 9491, - "16777216": 9491, - "256": 9491, - "262144": 9491, - "4096": 9491, - "4194304": 9491, - "512": 9491, - "64": 9491, - "65536": 9491 - }, - "count": 9491, - "sum": 0 - } - } + "name": "claims", + "workqueue": { + "adds": { + "count": 0 }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 9491, - "1024": 8634, - "1048576": 9491, - "16384": 9488, - "16777216": 9491, - "256": 2326, - "262144": 9491, - "4096": 9480, - "4194304": 9491, - "512": 7790, - "64": 300, - "65536": 9491 - }, - "count": 9491, - "sum": 4926581 - } - } + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "unfinished": { + "sec": 0 } - }, - "host": "172.18.0.2:6443", - "verb": "GET" + } } }, "metricset": { @@ -2183,10 +2315,10 @@ }, "kubernetes": { "controllermanager": { - "name": "claims", + "name": "node_lifecycle_controller_pods", "workqueue": { "adds": { - "count": 0 + "count": 10 }, "depth": { "count": 0 @@ -2194,6 +2326,9 @@ "longestrunning": { "sec": 0 }, + "retries": { + "count": 0 + }, "unfinished": { "sec": 0 } @@ -2217,10 +2352,10 @@ }, "kubernetes": { "controllermanager": { - "name": "garbage_collector_graph_changes", + "name": "root_ca_cert_publisher", "workqueue": { "adds": { - "count": 4892 + "count": 5 }, "depth": { "count": 0 @@ -2256,110 +2391,12 @@ "controllermanager": { "client": { "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 2102, - "100000": 2101, - "1000000": 2102, - "15000000": 2102, - "2000000": 2102, - "25000": 2100, - "250000": 2101, - "30000000": 2102, - "4000000": 2102, - "5000": 1984, - "500000": 2101, - "60000000": 2102, - "8000000": 2102 - }, - "count": 2102, - "sum": 8147888.260999998 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 2102, - "1024": 2074, - "1048576": 2102, - "16384": 2102, - "16777216": 2102, - "256": 0, - "262144": 2102, - "4096": 2098, - "4194304": 2102, - "512": 2069, - "64": 0, - "65536": 2102 - }, - "count": 2102, - "sum": 1018925 - } - } - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 2102, - "1024": 2075, - "1048576": 2102, - "16384": 2102, - "16777216": 2102, - "256": 1, - "262144": 2102, - "4096": 2097, - "4194304": 2102, - "512": 2071, - "64": 0, - "65536": 2102 - }, - "count": 2102, - "sum": 1015358 - } - } + "count": 85 } }, + "code": "201", "host": "172.18.0.2:6443", - "verb": "PUT" - } - }, - "metricset": { - "name": "controllermanager", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.controllermanager", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "controllermanager": { - "name": "node_lifecycle_controller_pods", - "workqueue": { - "adds": { - "count": 10 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 - } - } + "method": "POST" } }, "metricset": { @@ -2379,13 +2416,13 @@ }, "kubernetes": { "controllermanager": { - "name": "root_ca_cert_publisher", + "name": "node", "workqueue": { "adds": { - "count": 5 + "count": 1 }, "depth": { - "count": 0 + "count": 1 }, "longestrunning": { "sec": 0 diff --git a/metricbeat/module/kubernetes/controllermanager/controllermanager_test.go b/metricbeat/module/kubernetes/controllermanager/controllermanager_test.go index 1c577bc6aa0..48eecde2c3e 100644 --- a/metricbeat/module/kubernetes/controllermanager/controllermanager_test.go +++ b/metricbeat/module/kubernetes/controllermanager/controllermanager_test.go @@ -22,26 +22,33 @@ package controllermanager 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" ) +var files = []string{ + "./_meta/test/metrics.1.25", + "./_meta/test/metrics.1.26", + "./_meta/test/metrics.1.27", +} + func TestEventMapping(t *testing.T) { - ptest.TestMetricSet(t, "kubernetes", "controllermanager", - ptest.TestCases{ - ptest.TestCase{ - MetricsFile: "./_meta/test/metrics.1.25", - ExpectedFile: "./_meta/test/metrics.1.25.expected", - }, - ptest.TestCase{ - MetricsFile: "./_meta/test/metrics.1.26", - ExpectedFile: "./_meta/test/metrics.1.26.expected", - }, - }, - ) + var testCases ptest.TestCases + for _, file := range files { + testCases = append(testCases, ptest.TestCase{ + MetricsFile: file, + ExpectedFile: file + ".expected", + }) + } + ptest.TestMetricSet(t, "kubernetes", "controllermanager", testCases) } func TestData(t *testing.T) { mbtest.TestDataFiles(t, "kubernetes", "controllermanager") } + +func TestMetricsFamily(t *testing.T) { + k.TestMetricsFamily(t, files, mapping) +} diff --git a/metricbeat/module/kubernetes/fields.go b/metricbeat/module/kubernetes/fields.go index 32a78e4395c..3cbfdbde396 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 "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" + return "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" } diff --git a/metricbeat/module/kubernetes/proxy/_meta/data.json b/metricbeat/module/kubernetes/proxy/_meta/data.json index 291af0b137e..172eef97c57 100644 --- a/metricbeat/module/kubernetes/proxy/_meta/data.json +++ b/metricbeat/module/kubernetes/proxy/_meta/data.json @@ -9,12 +9,73 @@ "proxy": { "client": { "request": { - "count": 25 + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "15000000": 1, + "2000000": 1, + "25000": 1, + "250000": 1, + "30000000": 1, + "4000000": 1, + "5000": 0, + "500000": 1, + "60000000": 1, + "8000000": 1 + }, + "count": 1, + "sum": 7487.781 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 259 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 503 + } + } } }, - "code": "200", "host": "kind-control-plane:6443", - "method": "GET" + "verb": "POST" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.26.expected b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.26.expected index 20f5fea7ad2..1903232f54a 100644 --- a/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.26.expected +++ b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.26.expected @@ -108,6 +108,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "count": 10 + } + }, + "code": "200", + "host": "kind-control-plane: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, @@ -268,30 +292,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 10 - } - }, - "code": "200", - "host": "kind-control-plane: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, diff --git a/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27 b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27 new file mode 100644 index 00000000000..cb96688c886 --- /dev/null +++ b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27 @@ -0,0 +1,796 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 +# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. +# TYPE apiserver_audit_event_total counter +apiserver_audit_event_total 0 +# HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend. +# TYPE apiserver_audit_requests_rejected_total counter +apiserver_audit_requests_rejected_total 0 +# HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request. +# TYPE apiserver_client_certificate_expiration_seconds histogram +apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="21600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="43200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="86400"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="172800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="345600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="604800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="2.592e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7.776e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1.5552e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3.1104e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="+Inf"} 0 +apiserver_client_certificate_expiration_seconds_sum 0 +apiserver_client_certificate_expiration_seconds_count 0 +# HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. +# TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge +apiserver_envelope_encryption_dek_cache_fill_percent 0 +# HELP apiserver_storage_data_key_generation_duration_seconds [ALPHA] Latencies in seconds of data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_duration_seconds histogram +apiserver_storage_data_key_generation_duration_seconds_bucket{le="5e-06"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="1e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="2e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="4e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="8e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00016"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00032"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00064"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00128"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00256"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00512"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.01024"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.02048"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.04096"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="+Inf"} 0 +apiserver_storage_data_key_generation_duration_seconds_sum 0 +apiserver_storage_data_key_generation_duration_seconds_count 0 +# HELP apiserver_storage_data_key_generation_failures_total [ALPHA] Total number of failed data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_failures_total counter +apiserver_storage_data_key_generation_failures_total 0 +# HELP apiserver_storage_envelope_transformation_cache_misses_total [ALPHA] Total number of cache misses while accessing key decryption key(KEK). +# TYPE apiserver_storage_envelope_transformation_cache_misses_total counter +apiserver_storage_envelope_transformation_cache_misses_total 0 +# HELP apiserver_webhooks_x509_insecure_sha1_total [ALPHA] Counts the number of requests to servers with insecure SHA1 signatures in their serving certificate OR the number of connection failures due to the insecure SHA1 signatures (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_insecure_sha1_total counter +apiserver_webhooks_x509_insecure_sha1_total 0 +# HELP apiserver_webhooks_x509_missing_san_total [ALPHA] Counts the number of requests to servers missing SAN extension in their serving certificate OR the number of connection failures due to the lack of x509 certificate SAN extension missing (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_missing_san_total counter +apiserver_webhooks_x509_missing_san_total 0 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 +# HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. +# TYPE go_cgo_go_to_c_calls_calls_total counter +go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.000961092 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.037852446 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.009219818 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.014189328 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.062222684 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 6811.644443772 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 2.44e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.00130717 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001307414 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 7760.349788544 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 948.641814674 +# HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. +# TYPE go_gc_cycles_automatic_gc_cycles_total counter +go_gc_cycles_automatic_gc_cycles_total 13 +# HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. +# TYPE go_gc_cycles_forced_gc_cycles_total counter +go_gc_cycles_forced_gc_cycles_total 0 +# HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. +# TYPE go_gc_cycles_total_gc_cycles_total counter +go_gc_cycles_total_gc_cycles_total 13 +# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 4.9281e-05 +go_gc_duration_seconds{quantile="0.25"} 7.2211e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000124378 +go_gc_duration_seconds{quantile="0.75"} 0.00021477 +go_gc_duration_seconds{quantile="1"} 0.000234768 +go_gc_duration_seconds_sum 0.001773666 +go_gc_duration_seconds_count 13 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 4418 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 34782 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 53949 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 75385 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 80167 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 82632 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 83817 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 84144 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 84373 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 84475 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 84512 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 84559 +go_gc_heap_allocs_by_size_bytes_sum 1.3746456e+07 +go_gc_heap_allocs_by_size_bytes_count 84559 +# HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. +# TYPE go_gc_heap_allocs_bytes_total counter +go_gc_heap_allocs_bytes_total 1.3746456e+07 +# HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_objects_total counter +go_gc_heap_allocs_objects_total 84559 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 2532 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 24640 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 36853 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 55352 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 58215 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 59913 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 60878 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 61056 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 61219 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 61276 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 61288 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 61322 +go_gc_heap_frees_by_size_bytes_sum 9.11112e+06 +go_gc_heap_frees_by_size_bytes_count 61322 +# HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. +# TYPE go_gc_heap_frees_bytes_total counter +go_gc_heap_frees_bytes_total 9.11112e+06 +# HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_objects_total counter +go_gc_heap_frees_objects_total 61322 +# HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. +# TYPE go_gc_heap_goal_bytes gauge +go_gc_heap_goal_bytes 9.774144e+06 +# HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. +# TYPE go_gc_heap_objects_objects gauge +go_gc_heap_objects_objects 23237 +# HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. +# TYPE go_gc_heap_tiny_allocs_objects_total counter +go_gc_heap_tiny_allocs_objects_total 4068 +# HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. +# TYPE go_gc_limiter_last_enabled_gc_cycle gauge +go_gc_limiter_last_enabled_gc_cycle 0 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 7 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 18 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 26 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 26 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 26 +go_gc_pauses_seconds_bucket{le="+Inf"} 26 +go_gc_pauses_seconds_sum 0.000738688 +go_gc_pauses_seconds_count 26 +# HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. +# TYPE go_gc_stack_starting_size_bytes gauge +go_gc_stack_starting_size_bytes 4096 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 51 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version="go1.20.3"} 1 +# HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. +# TYPE go_memory_classes_heap_free_bytes gauge +go_memory_classes_heap_free_bytes 737280 +# HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. +# TYPE go_memory_classes_heap_objects_bytes gauge +go_memory_classes_heap_objects_bytes 4.635336e+06 +# HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. +# TYPE go_memory_classes_heap_released_bytes gauge +go_memory_classes_heap_released_bytes 6.995968e+06 +# HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. +# TYPE go_memory_classes_heap_stacks_bytes gauge +go_memory_classes_heap_stacks_bytes 1.441792e+06 +# HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. +# TYPE go_memory_classes_heap_unused_bytes gauge +go_memory_classes_heap_unused_bytes 2.96684e+06 +# HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. +# TYPE go_memory_classes_metadata_mcache_free_bytes gauge +go_memory_classes_metadata_mcache_free_bytes 6000 +# HELP go_memory_classes_metadata_mcache_inuse_bytes Memory that is occupied by runtime mcache structures that are currently being used. +# TYPE go_memory_classes_metadata_mcache_inuse_bytes gauge +go_memory_classes_metadata_mcache_inuse_bytes 9600 +# HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. +# TYPE go_memory_classes_metadata_mspan_free_bytes gauge +go_memory_classes_metadata_mspan_free_bytes 32160 +# HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. +# TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge +go_memory_classes_metadata_mspan_inuse_bytes 196320 +# HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. +# TYPE go_memory_classes_metadata_other_bytes gauge +go_memory_classes_metadata_other_bytes 8.741456e+06 +# HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. +# TYPE go_memory_classes_os_stacks_bytes gauge +go_memory_classes_os_stacks_bytes 0 +# HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. +# TYPE go_memory_classes_other_bytes gauge +go_memory_classes_other_bytes 2.010708e+06 +# HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. +# TYPE go_memory_classes_profiling_buckets_bytes gauge +go_memory_classes_profiling_buckets_bytes 1.452788e+06 +# HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. +# TYPE go_memory_classes_total_bytes gauge +go_memory_classes_total_bytes 2.9226248e+07 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 4.635336e+06 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.3746456e+07 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.452788e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 65390 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 8.741456e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 4.635336e+06 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 7.733248e+06 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 7.602176e+06 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 23237 +# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes gauge +go_memstats_heap_released_bytes 6.995968e+06 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 1.5335424e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.69157316188872e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 88627 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 9600 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 15600 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 196320 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 228480 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 9.774144e+06 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 2.010708e+06 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 1.441792e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 1.441792e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained from system. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 2.9226248e+07 +# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. +# TYPE go_sched_gomaxprocs_threads gauge +go_sched_gomaxprocs_threads 8 +# HELP go_sched_goroutines_goroutines Count of live goroutines. +# TYPE go_sched_goroutines_goroutines gauge +go_sched_goroutines_goroutines 51 +# HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. +# TYPE go_sched_latencies_seconds histogram +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 703 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 760 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 801 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 949 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 970 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 970 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 970 +go_sched_latencies_seconds_bucket{le="+Inf"} 970 +go_sched_latencies_seconds_sum 0.002811072 +go_sched_latencies_seconds_count 970 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0 +# HELP go_threads Number of OS threads created. +# TYPE go_threads gauge +go_threads 10 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 0 +# HELP kubeproxy_network_programming_duration_seconds [ALPHA] In Cluster Network Programming Latency in seconds +# TYPE kubeproxy_network_programming_duration_seconds histogram +kubeproxy_network_programming_duration_seconds_bucket{le="0"} 0 +kubeproxy_network_programming_duration_seconds_bucket{le="0.25"} 0 +kubeproxy_network_programming_duration_seconds_bucket{le="0.5"} 1 +kubeproxy_network_programming_duration_seconds_bucket{le="1"} 1 +kubeproxy_network_programming_duration_seconds_bucket{le="2"} 2 +kubeproxy_network_programming_duration_seconds_bucket{le="3"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="4"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="5"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="6"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="7"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="8"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="9"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="10"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="11"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="12"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="13"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="14"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="15"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="16"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="17"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="18"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="19"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="20"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="21"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="22"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="23"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="24"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="25"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="26"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="27"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="28"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="29"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="30"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="31"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="32"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="33"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="34"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="35"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="36"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="37"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="38"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="39"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="40"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="41"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="42"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="43"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="44"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="45"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="46"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="47"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="48"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="49"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="50"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="51"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="52"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="53"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="54"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="55"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="56"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="57"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="58"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="59"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="60"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="65"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="70"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="75"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="80"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="85"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="90"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="95"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="100"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="105"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="110"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="115"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="120"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="150"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="180"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="210"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="240"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="270"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="300"} 3 +kubeproxy_network_programming_duration_seconds_bucket{le="+Inf"} 3 +kubeproxy_network_programming_duration_seconds_sum 4.4972745960000005 +kubeproxy_network_programming_duration_seconds_count 3 +# HELP kubeproxy_sync_proxy_rules_duration_seconds [ALPHA] SyncProxyRules latency in seconds +# TYPE kubeproxy_sync_proxy_rules_duration_seconds histogram +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.001"} 0 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.002"} 0 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.004"} 0 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.008"} 0 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.016"} 2 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.032"} 3 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.064"} 3 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.128"} 4 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.256"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.512"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="1.024"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="2.048"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="4.096"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="8.192"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="16.384"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="+Inf"} 5 +kubeproxy_sync_proxy_rules_duration_seconds_sum 0.301946608 +kubeproxy_sync_proxy_rules_duration_seconds_count 5 +# HELP kubeproxy_sync_proxy_rules_endpoint_changes_pending [ALPHA] Pending proxy rules Endpoint changes +# TYPE kubeproxy_sync_proxy_rules_endpoint_changes_pending gauge +kubeproxy_sync_proxy_rules_endpoint_changes_pending 0 +# HELP kubeproxy_sync_proxy_rules_endpoint_changes_total [ALPHA] Cumulative proxy rules Endpoint changes +# TYPE kubeproxy_sync_proxy_rules_endpoint_changes_total counter +kubeproxy_sync_proxy_rules_endpoint_changes_total 7 +# HELP kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total [ALPHA] Cumulative proxy iptables partial restore failures +# TYPE kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total counter +kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total 0 +# HELP kubeproxy_sync_proxy_rules_iptables_restore_failures_total [ALPHA] Cumulative proxy iptables restore failures +# TYPE kubeproxy_sync_proxy_rules_iptables_restore_failures_total counter +kubeproxy_sync_proxy_rules_iptables_restore_failures_total 0 +# HELP kubeproxy_sync_proxy_rules_iptables_total [ALPHA] Number of proxy iptables rules programmed +# TYPE kubeproxy_sync_proxy_rules_iptables_total gauge +kubeproxy_sync_proxy_rules_iptables_total{table="filter"} 4 +kubeproxy_sync_proxy_rules_iptables_total{table="nat"} 30 +# HELP kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds [ALPHA] The last time a sync of proxy rules was queued +# TYPE kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds gauge +kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds 1.6915721965056264e+09 +# HELP kubeproxy_sync_proxy_rules_last_timestamp_seconds [ALPHA] The last time proxy rules were successfully synced +# TYPE kubeproxy_sync_proxy_rules_last_timestamp_seconds gauge +kubeproxy_sync_proxy_rules_last_timestamp_seconds 1.691572197521507e+09 +# HELP kubeproxy_sync_proxy_rules_no_local_endpoints_total [ALPHA] Number of services with a Local traffic policy and no endpoints +# TYPE kubeproxy_sync_proxy_rules_no_local_endpoints_total gauge +kubeproxy_sync_proxy_rules_no_local_endpoints_total{traffic_policy="external"} 0 +kubeproxy_sync_proxy_rules_no_local_endpoints_total{traffic_policy="internal"} 0 +# HELP kubeproxy_sync_proxy_rules_service_changes_pending [ALPHA] Pending proxy rules Service changes +# TYPE kubeproxy_sync_proxy_rules_service_changes_pending gauge +kubeproxy_sync_proxy_rules_service_changes_pending 0 +# HELP kubeproxy_sync_proxy_rules_service_changes_total [ALPHA] Cumulative proxy rules Service changes +# TYPE kubeproxy_sync_proxy_rules_service_changes_total counter +kubeproxy_sync_proxy_rules_service_changes_total 8 +# HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. +# TYPE kubernetes_build_info gauge +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 0.42 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 12 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 4.8123904e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.69157219141e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 7.84257024e+08 +# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. +# TYPE process_virtual_memory_max_bytes gauge +process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 76 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 3 +# HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. +# TYPE rest_client_exec_plugin_certificate_rotation_age histogram +rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="14400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="86400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="604800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="2.592e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="7.776e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.5552e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3.1104e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.24416e+08"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="+Inf"} 0 +rest_client_exec_plugin_certificate_rotation_age_sum 0 +rest_client_exec_plugin_certificate_rotation_age_count 0 +# HELP rest_client_exec_plugin_ttl_seconds [ALPHA] Gauge of the shortest TTL (time-to-live) of the client certificate(s) managed by the auth exec plugin. The value is in seconds until certificate expiry (negative if already expired). If auth exec plugins are unused or manage no TLS certificates, the value will be +INF. +# TYPE rest_client_exec_plugin_ttl_seconds gauge +rest_client_exec_plugin_ttl_seconds +Inf +# HELP rest_client_rate_limiter_duration_seconds [ALPHA] Client side rate limiter latency in seconds. Broken down by verb, and host. +# TYPE rest_client_rate_limiter_duration_seconds histogram +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.005"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.025"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.1"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.25"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.5"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="1"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="2"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="4"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="8"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="15"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="30"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="60"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 +rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 1.2169e-05 +rest_client_rate_limiter_duration_seconds_count{host="kind-control-plane:6443",verb="GET"} 4 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.005"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.025"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.1"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.25"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.5"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="1"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="2"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="4"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="8"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="15"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="30"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="60"} 1 +rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 +rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 1.462e-06 +rest_client_rate_limiter_duration_seconds_count{host="kind-control-plane:6443",verb="POST"} 1 +# HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. +# TYPE rest_client_request_duration_seconds histogram +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.005"} 3 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.025"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.1"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.25"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.5"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="1"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="2"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="4"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="8"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="15"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="30"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="60"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 +rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 0.01651628 +rest_client_request_duration_seconds_count{host="kind-control-plane:6443",verb="GET"} 4 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.005"} 0 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.025"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.1"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.25"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.5"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="1"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="2"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="4"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="8"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="15"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="30"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="60"} 1 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 +rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 0.007487781 +rest_client_request_duration_seconds_count{host="kind-control-plane:6443",verb="POST"} 1 +# HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. +# TYPE rest_client_request_size_bytes histogram +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="64"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="256"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="512"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1024"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4096"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="16384"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="65536"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="262144"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1.048576e+06"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4.194304e+06"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1.6777216e+07"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 +rest_client_request_size_bytes_sum{host="kind-control-plane:6443",verb="GET"} 0 +rest_client_request_size_bytes_count{host="kind-control-plane:6443",verb="GET"} 4 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="64"} 0 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="256"} 0 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="512"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1024"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="4096"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="16384"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="65536"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="262144"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1.048576e+06"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="4.194304e+06"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1.6777216e+07"} 1 +rest_client_request_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 +rest_client_request_size_bytes_sum{host="kind-control-plane:6443",verb="POST"} 259 +rest_client_request_size_bytes_count{host="kind-control-plane:6443",verb="POST"} 1 +# HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. +# TYPE rest_client_requests_total counter +rest_client_requests_total{code="200",host="kind-control-plane:6443",method="GET"} 13 +rest_client_requests_total{code="201",host="kind-control-plane:6443",method="POST"} 1 +# HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. +# TYPE rest_client_response_size_bytes histogram +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="64"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="256"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="512"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1024"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4096"} 2 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="16384"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="65536"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="262144"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1.048576e+06"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4.194304e+06"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1.6777216e+07"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 +rest_client_response_size_bytes_sum{host="kind-control-plane:6443",verb="GET"} 11430 +rest_client_response_size_bytes_count{host="kind-control-plane:6443",verb="GET"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="64"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="256"} 0 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="512"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1024"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="4096"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="16384"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="65536"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="262144"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1.048576e+06"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="4.194304e+06"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="1.6777216e+07"} 1 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 +rest_client_response_size_bytes_sum{host="kind-control-plane:6443",verb="POST"} 503 +rest_client_response_size_bytes_count{host="kind-control-plane:6443",verb="POST"} 1 diff --git a/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27.expected b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27.expected new file mode 100644 index 00000000000..1299d5de0ae --- /dev/null +++ b/metricbeat/module/kubernetes/proxy/_meta/test/metrics.1.27.expected @@ -0,0 +1,380 @@ +[ + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 4, + "100000": 4, + "1000000": 4, + "15000000": 4, + "2000000": 4, + "25000": 4, + "250000": 4, + "30000000": 4, + "4000000": 4, + "5000": 3, + "500000": 4, + "60000000": 4, + "8000000": 4 + }, + "count": 4, + "sum": 16516.280000000002 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1024": 4, + "1048576": 4, + "16384": 4, + "16777216": 4, + "256": 4, + "262144": 4, + "4096": 4, + "4194304": 4, + "512": 4, + "64": 4, + "65536": 4 + }, + "count": 4, + "sum": 0 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 4, + "1024": 0, + "1048576": 4, + "16384": 4, + "16777216": 4, + "256": 0, + "262144": 4, + "4096": 2, + "4194304": 4, + "512": 0, + "64": 0, + "65536": 4 + }, + "count": 4, + "sum": 11430 + } + } + } + }, + "host": "kind-control-plane:6443", + "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": { + "client": { + "request": { + "count": 13 + } + }, + "code": "200", + "host": "kind-control-plane: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": { + "process": { + "cpu": { + "sec": 0 + }, + "fds": { + "max": { + "count": 1048576 + }, + "open": { + "count": 12 + } + }, + "memory": { + "resident": { + "bytes": 48123904 + }, + "virtual": { + "bytes": 784257024 + } + }, + "started": { + "sec": 1691572191.41 + } + }, + "sync": { + "networkprogramming": { + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "0": 0, + "1000000": 1, + "10000000": 3, + "100000000": 3, + "105000000": 3, + "11000000": 3, + "110000000": 3, + "115000000": 3, + "12000000": 3, + "120000000": 3, + "13000000": 3, + "14000000": 3, + "15000000": 3, + "150000000": 3, + "16000000": 3, + "17000000": 3, + "18000000": 3, + "180000000": 3, + "19000000": 3, + "2000000": 2, + "20000000": 3, + "21000000": 3, + "210000000": 3, + "22000000": 3, + "23000000": 3, + "24000000": 3, + "240000000": 3, + "250000": 0, + "25000000": 3, + "26000000": 3, + "27000000": 3, + "270000000": 3, + "28000000": 3, + "29000000": 3, + "3000000": 3, + "30000000": 3, + "300000000": 3, + "31000000": 3, + "32000000": 3, + "33000000": 3, + "34000000": 3, + "35000000": 3, + "36000000": 3, + "37000000": 3, + "38000000": 3, + "39000000": 3, + "4000000": 3, + "40000000": 3, + "41000000": 3, + "42000000": 3, + "43000000": 3, + "44000000": 3, + "45000000": 3, + "46000000": 3, + "47000000": 3, + "48000000": 3, + "49000000": 3, + "500000": 1, + "5000000": 3, + "50000000": 3, + "51000000": 3, + "52000000": 3, + "53000000": 3, + "54000000": 3, + "55000000": 3, + "56000000": 3, + "57000000": 3, + "58000000": 3, + "59000000": 3, + "6000000": 3, + "60000000": 3, + "65000000": 3, + "7000000": 3, + "70000000": 3, + "75000000": 3, + "8000000": 3, + "80000000": 3, + "85000000": 3, + "9000000": 3, + "90000000": 3, + "95000000": 3 + }, + "count": 3, + "sum": 4497274.596000001 + } + } + }, + "rules": { + "duration": { + "us": { + "bucket": { + "+Inf": 5, + "1000": 0, + "1024000": 5, + "128000": 4, + "16000": 2, + "16384000": 5, + "2000": 0, + "2048000": 5, + "256000": 5, + "32000": 3, + "4000": 0, + "4096000": 5, + "512000": 5, + "64000": 3, + "8000": 0, + "8192000": 5 + }, + "count": 5, + "sum": 301946.608 + } + } + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "15000000": 1, + "2000000": 1, + "25000": 1, + "250000": 1, + "30000000": 1, + "4000000": 1, + "5000": 0, + "500000": 1, + "60000000": 1, + "8000000": 1 + }, + "count": 1, + "sum": 7487.781 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 259 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 503 + } + } + } + }, + "host": "kind-control-plane:6443", + "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": { + "client": { + "request": { + "count": 1 + } + }, + "code": "201", + "host": "kind-control-plane:6443", + "method": "POST" + }, + "Index": "", + "ID": "", + "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/proxy/_meta/testdata/docs.plain b/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain index cd3f6571407..cb96688c886 100644 --- a/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain +++ b/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain @@ -1,125 +1,214 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 # HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. # TYPE apiserver_audit_event_total counter apiserver_audit_event_total 0 # HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend. # TYPE apiserver_audit_requests_rejected_total counter apiserver_audit_requests_rejected_total 0 +# HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request. +# TYPE apiserver_client_certificate_expiration_seconds histogram +apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="21600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="43200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="86400"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="172800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="345600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="604800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="2.592e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7.776e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1.5552e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3.1104e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="+Inf"} 0 +apiserver_client_certificate_expiration_seconds_sum 0 +apiserver_client_certificate_expiration_seconds_count 0 +# HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. +# TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge +apiserver_envelope_encryption_dek_cache_fill_percent 0 +# HELP apiserver_storage_data_key_generation_duration_seconds [ALPHA] Latencies in seconds of data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_duration_seconds histogram +apiserver_storage_data_key_generation_duration_seconds_bucket{le="5e-06"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="1e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="2e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="4e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="8e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00016"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00032"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00064"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00128"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00256"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00512"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.01024"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.02048"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.04096"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="+Inf"} 0 +apiserver_storage_data_key_generation_duration_seconds_sum 0 +apiserver_storage_data_key_generation_duration_seconds_count 0 +# HELP apiserver_storage_data_key_generation_failures_total [ALPHA] Total number of failed data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_failures_total counter +apiserver_storage_data_key_generation_failures_total 0 +# HELP apiserver_storage_envelope_transformation_cache_misses_total [ALPHA] Total number of cache misses while accessing key decryption key(KEK). +# TYPE apiserver_storage_envelope_transformation_cache_misses_total counter +apiserver_storage_envelope_transformation_cache_misses_total 0 +# HELP apiserver_webhooks_x509_insecure_sha1_total [ALPHA] Counts the number of requests to servers with insecure SHA1 signatures in their serving certificate OR the number of connection failures due to the insecure SHA1 signatures (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_insecure_sha1_total counter +apiserver_webhooks_x509_insecure_sha1_total 0 +# HELP apiserver_webhooks_x509_missing_san_total [ALPHA] Counts the number of requests to servers missing SAN extension in their serving certificate OR the number of connection failures due to the lack of x509 certificate SAN extension missing (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_missing_san_total counter +apiserver_webhooks_x509_missing_san_total 0 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 # HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. # TYPE go_cgo_go_to_c_calls_calls_total counter go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.000961092 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.037852446 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.009219818 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.014189328 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.062222684 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 6811.644443772 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 2.44e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.00130717 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001307414 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 7760.349788544 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 948.641814674 # HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. # TYPE go_gc_cycles_automatic_gc_cycles_total counter -go_gc_cycles_automatic_gc_cycles_total 31 +go_gc_cycles_automatic_gc_cycles_total 13 # HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. # TYPE go_gc_cycles_forced_gc_cycles_total counter go_gc_cycles_forced_gc_cycles_total 0 # HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. # TYPE go_gc_cycles_total_gc_cycles_total counter -go_gc_cycles_total_gc_cycles_total 31 +go_gc_cycles_total_gc_cycles_total 13 # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary -go_gc_duration_seconds{quantile="0"} 4.6193e-05 -go_gc_duration_seconds{quantile="0.25"} 7.4421e-05 -go_gc_duration_seconds{quantile="0.5"} 0.000120856 -go_gc_duration_seconds{quantile="0.75"} 0.000192312 -go_gc_duration_seconds{quantile="1"} 0.000315648 -go_gc_duration_seconds_sum 0.004231668 -go_gc_duration_seconds_count 31 -# HELP go_gc_heap_allocs_by_size_bytes_total Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_allocs_by_size_bytes_total histogram -go_gc_heap_allocs_by_size_bytes_total_bucket{le="8.999999999999998"} 28903 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="24.999999999999996"} 263402 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="64.99999999999999"} 412681 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="144.99999999999997"} 499852 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="320.99999999999994"} 510978 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="704.9999999999999"} 516384 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="1536.9999999999998"} 520200 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="3200.9999999999995"} 520825 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="6528.999999999999"} 522940 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="13568.999999999998"} 523308 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="27264.999999999996"} 523862 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="+Inf"} 524062 -go_gc_heap_allocs_by_size_bytes_total_sum 9.2867752e+07 -go_gc_heap_allocs_by_size_bytes_total_count 524062 +go_gc_duration_seconds{quantile="0"} 4.9281e-05 +go_gc_duration_seconds{quantile="0.25"} 7.2211e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000124378 +go_gc_duration_seconds{quantile="0.75"} 0.00021477 +go_gc_duration_seconds{quantile="1"} 0.000234768 +go_gc_duration_seconds_sum 0.001773666 +go_gc_duration_seconds_count 13 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 4418 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 34782 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 53949 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 75385 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 80167 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 82632 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 83817 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 84144 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 84373 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 84475 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 84512 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 84559 +go_gc_heap_allocs_by_size_bytes_sum 1.3746456e+07 +go_gc_heap_allocs_by_size_bytes_count 84559 # HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. # TYPE go_gc_heap_allocs_bytes_total counter -go_gc_heap_allocs_bytes_total 9.2867752e+07 +go_gc_heap_allocs_bytes_total 1.3746456e+07 # HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_allocs_objects_total counter -go_gc_heap_allocs_objects_total 524062 -# HELP go_gc_heap_frees_by_size_bytes_total Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_frees_by_size_bytes_total histogram -go_gc_heap_frees_by_size_bytes_total_bucket{le="8.999999999999998"} 27902 -go_gc_heap_frees_by_size_bytes_total_bucket{le="24.999999999999996"} 254843 -go_gc_heap_frees_by_size_bytes_total_bucket{le="64.99999999999999"} 397181 -go_gc_heap_frees_by_size_bytes_total_bucket{le="144.99999999999997"} 481131 -go_gc_heap_frees_by_size_bytes_total_bucket{le="320.99999999999994"} 490722 -go_gc_heap_frees_by_size_bytes_total_bucket{le="704.9999999999999"} 495575 -go_gc_heap_frees_by_size_bytes_total_bucket{le="1536.9999999999998"} 499198 -go_gc_heap_frees_by_size_bytes_total_bucket{le="3200.9999999999995"} 499708 -go_gc_heap_frees_by_size_bytes_total_bucket{le="6528.999999999999"} 501724 -go_gc_heap_frees_by_size_bytes_total_bucket{le="13568.999999999998"} 502051 -go_gc_heap_frees_by_size_bytes_total_bucket{le="27264.999999999996"} 502579 -go_gc_heap_frees_by_size_bytes_total_bucket{le="+Inf"} 502739 -go_gc_heap_frees_by_size_bytes_total_sum 8.1736888e+07 -go_gc_heap_frees_by_size_bytes_total_count 502739 +go_gc_heap_allocs_objects_total 84559 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 2532 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 24640 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 36853 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 55352 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 58215 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 59913 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 60878 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 61056 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 61219 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 61276 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 61288 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 61322 +go_gc_heap_frees_by_size_bytes_sum 9.11112e+06 +go_gc_heap_frees_by_size_bytes_count 61322 # HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. # TYPE go_gc_heap_frees_bytes_total counter -go_gc_heap_frees_bytes_total 8.1736888e+07 +go_gc_heap_frees_bytes_total 9.11112e+06 # HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_frees_objects_total counter -go_gc_heap_frees_objects_total 502739 +go_gc_heap_frees_objects_total 61322 # HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. # TYPE go_gc_heap_goal_bytes gauge -go_gc_heap_goal_bytes 1.5216248e+07 +go_gc_heap_goal_bytes 9.774144e+06 # HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. # TYPE go_gc_heap_objects_objects gauge -go_gc_heap_objects_objects 21323 +go_gc_heap_objects_objects 23237 # HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. # TYPE go_gc_heap_tiny_allocs_objects_total counter -go_gc_heap_tiny_allocs_objects_total 113620 +go_gc_heap_tiny_allocs_objects_total 4068 # HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. # TYPE go_gc_limiter_last_enabled_gc_cycle gauge go_gc_limiter_last_enabled_gc_cycle 0 -# HELP go_gc_pauses_seconds_total Distribution individual GC-related stop-the-world pause latencies. -# TYPE go_gc_pauses_seconds_total histogram -go_gc_pauses_seconds_total_bucket{le="-5e-324"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-10"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-09"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999998e-08"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-06"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-05"} 14 -go_gc_pauses_seconds_total_bucket{le="0.00010239999999999998"} 47 -go_gc_pauses_seconds_total_bucket{le="0.0010485759999999998"} 62 -go_gc_pauses_seconds_total_bucket{le="0.010485759999999998"} 62 -go_gc_pauses_seconds_total_bucket{le="0.10485759999999998"} 62 -go_gc_pauses_seconds_total_bucket{le="+Inf"} 62 -go_gc_pauses_seconds_total_sum NaN -go_gc_pauses_seconds_total_count 62 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 7 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 18 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 26 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 26 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 26 +go_gc_pauses_seconds_bucket{le="+Inf"} 26 +go_gc_pauses_seconds_sum 0.000738688 +go_gc_pauses_seconds_count 26 # HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. # TYPE go_gc_stack_starting_size_bytes gauge go_gc_stack_starting_size_bytes 4096 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge -go_goroutines 54 +go_goroutines 51 # HELP go_info Information about the Go environment. # TYPE go_info gauge -go_info{version="go1.19.2"} 1 +go_info{version="go1.20.3"} 1 # HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. # TYPE go_memory_classes_heap_free_bytes gauge -go_memory_classes_heap_free_bytes 884736 +go_memory_classes_heap_free_bytes 737280 # HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. # TYPE go_memory_classes_heap_objects_bytes gauge -go_memory_classes_heap_objects_bytes 1.1130864e+07 +go_memory_classes_heap_objects_bytes 4.635336e+06 # HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. # TYPE go_memory_classes_heap_released_bytes gauge -go_memory_classes_heap_released_bytes 4.05504e+06 +go_memory_classes_heap_released_bytes 6.995968e+06 # HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. # TYPE go_memory_classes_heap_stacks_bytes gauge -go_memory_classes_heap_stacks_bytes 1.47456e+06 +go_memory_classes_heap_stacks_bytes 1.441792e+06 # HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. # TYPE go_memory_classes_heap_unused_bytes gauge -go_memory_classes_heap_unused_bytes 3.42632e+06 +go_memory_classes_heap_unused_bytes 2.96684e+06 # HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. # TYPE go_memory_classes_metadata_mcache_free_bytes gauge go_memory_classes_metadata_mcache_free_bytes 6000 @@ -128,70 +217,67 @@ go_memory_classes_metadata_mcache_free_bytes 6000 go_memory_classes_metadata_mcache_inuse_bytes 9600 # HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. # TYPE go_memory_classes_metadata_mspan_free_bytes gauge -go_memory_classes_metadata_mspan_free_bytes 14416 +go_memory_classes_metadata_mspan_free_bytes 32160 # HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. # TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge -go_memory_classes_metadata_mspan_inuse_bytes 165104 +go_memory_classes_metadata_mspan_inuse_bytes 196320 # HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. # TYPE go_memory_classes_metadata_other_bytes gauge -go_memory_classes_metadata_other_bytes 9.660432e+06 +go_memory_classes_metadata_other_bytes 8.741456e+06 # HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. # TYPE go_memory_classes_os_stacks_bytes gauge go_memory_classes_os_stacks_bytes 0 # HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. # TYPE go_memory_classes_other_bytes gauge -go_memory_classes_other_bytes 1.901026e+06 +go_memory_classes_other_bytes 2.010708e+06 # HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. # TYPE go_memory_classes_profiling_buckets_bytes gauge -go_memory_classes_profiling_buckets_bytes 1.462502e+06 +go_memory_classes_profiling_buckets_bytes 1.452788e+06 # HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. # TYPE go_memory_classes_total_bytes gauge -go_memory_classes_total_bytes 3.41906e+07 +go_memory_classes_total_bytes 2.9226248e+07 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge -go_memstats_alloc_bytes 1.1130864e+07 +go_memstats_alloc_bytes 4.635336e+06 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter -go_memstats_alloc_bytes_total 9.2867752e+07 +go_memstats_alloc_bytes_total 1.3746456e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge -go_memstats_buck_hash_sys_bytes 1.462502e+06 +go_memstats_buck_hash_sys_bytes 1.452788e+06 # HELP go_memstats_frees_total Total number of frees. # TYPE go_memstats_frees_total counter -go_memstats_frees_total 616359 -# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started. -# TYPE go_memstats_gc_cpu_fraction gauge -go_memstats_gc_cpu_fraction 0 +go_memstats_frees_total 65390 # HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. # TYPE go_memstats_gc_sys_bytes gauge -go_memstats_gc_sys_bytes 9.660432e+06 +go_memstats_gc_sys_bytes 8.741456e+06 # HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. # TYPE go_memstats_heap_alloc_bytes gauge -go_memstats_heap_alloc_bytes 1.1130864e+07 +go_memstats_heap_alloc_bytes 4.635336e+06 # HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. # TYPE go_memstats_heap_idle_bytes gauge -go_memstats_heap_idle_bytes 4.939776e+06 +go_memstats_heap_idle_bytes 7.733248e+06 # HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. # TYPE go_memstats_heap_inuse_bytes gauge -go_memstats_heap_inuse_bytes 1.4557184e+07 +go_memstats_heap_inuse_bytes 7.602176e+06 # HELP go_memstats_heap_objects Number of allocated objects. # TYPE go_memstats_heap_objects gauge -go_memstats_heap_objects 21323 +go_memstats_heap_objects 23237 # HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. # TYPE go_memstats_heap_released_bytes gauge -go_memstats_heap_released_bytes 4.05504e+06 +go_memstats_heap_released_bytes 6.995968e+06 # HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. # TYPE go_memstats_heap_sys_bytes gauge -go_memstats_heap_sys_bytes 1.949696e+07 +go_memstats_heap_sys_bytes 1.5335424e+07 # HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. # TYPE go_memstats_last_gc_time_seconds gauge -go_memstats_last_gc_time_seconds 1.6717284822311628e+09 +go_memstats_last_gc_time_seconds 1.69157316188872e+09 # HELP go_memstats_lookups_total Total number of pointer lookups. # TYPE go_memstats_lookups_total counter go_memstats_lookups_total 0 # HELP go_memstats_mallocs_total Total number of mallocs. # TYPE go_memstats_mallocs_total counter -go_memstats_mallocs_total 637682 +go_memstats_mallocs_total 88627 # HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. # TYPE go_memstats_mcache_inuse_bytes gauge go_memstats_mcache_inuse_bytes 9600 @@ -200,56 +286,59 @@ go_memstats_mcache_inuse_bytes 9600 go_memstats_mcache_sys_bytes 15600 # HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. # TYPE go_memstats_mspan_inuse_bytes gauge -go_memstats_mspan_inuse_bytes 165104 +go_memstats_mspan_inuse_bytes 196320 # HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. # TYPE go_memstats_mspan_sys_bytes gauge -go_memstats_mspan_sys_bytes 179520 +go_memstats_mspan_sys_bytes 228480 # HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. # TYPE go_memstats_next_gc_bytes gauge -go_memstats_next_gc_bytes 1.5216248e+07 +go_memstats_next_gc_bytes 9.774144e+06 # HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. # TYPE go_memstats_other_sys_bytes gauge -go_memstats_other_sys_bytes 1.901026e+06 +go_memstats_other_sys_bytes 2.010708e+06 # HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. # TYPE go_memstats_stack_inuse_bytes gauge -go_memstats_stack_inuse_bytes 1.47456e+06 +go_memstats_stack_inuse_bytes 1.441792e+06 # HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. # TYPE go_memstats_stack_sys_bytes gauge -go_memstats_stack_sys_bytes 1.47456e+06 +go_memstats_stack_sys_bytes 1.441792e+06 # HELP go_memstats_sys_bytes Number of bytes obtained from system. # TYPE go_memstats_sys_bytes gauge -go_memstats_sys_bytes 3.41906e+07 +go_memstats_sys_bytes 2.9226248e+07 # HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. # TYPE go_sched_gomaxprocs_threads gauge go_sched_gomaxprocs_threads 8 # HELP go_sched_goroutines_goroutines Count of live goroutines. # TYPE go_sched_goroutines_goroutines gauge -go_sched_goroutines_goroutines 54 +go_sched_goroutines_goroutines 51 # HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. # TYPE go_sched_latencies_seconds histogram -go_sched_latencies_seconds_bucket{le="-5e-324"} 0 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-10"} 2229 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-09"} 2229 -go_sched_latencies_seconds_bucket{le="9.999999999999998e-08"} 2286 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-06"} 3899 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-05"} 4149 -go_sched_latencies_seconds_bucket{le="0.00010239999999999998"} 4660 -go_sched_latencies_seconds_bucket{le="0.0010485759999999998"} 4867 -go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 4882 -go_sched_latencies_seconds_bucket{le="0.10485759999999998"} 4882 -go_sched_latencies_seconds_bucket{le="+Inf"} 4882 -go_sched_latencies_seconds_sum NaN -go_sched_latencies_seconds_count 4882 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 703 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 760 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 801 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 949 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 970 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 970 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 970 +go_sched_latencies_seconds_bucket{le="+Inf"} 970 +go_sched_latencies_seconds_sum 0.002811072 +go_sched_latencies_seconds_count 970 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0 # HELP go_threads Number of OS threads created. # TYPE go_threads gauge -go_threads 11 +go_threads 10 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 0 # HELP kubeproxy_network_programming_duration_seconds [ALPHA] In Cluster Network Programming Latency in seconds # TYPE kubeproxy_network_programming_duration_seconds histogram kubeproxy_network_programming_duration_seconds_bucket{le="0"} 0 kubeproxy_network_programming_duration_seconds_bucket{le="0.25"} 0 -kubeproxy_network_programming_duration_seconds_bucket{le="0.5"} 0 -kubeproxy_network_programming_duration_seconds_bucket{le="1"} 0 -kubeproxy_network_programming_duration_seconds_bucket{le="2"} 1 +kubeproxy_network_programming_duration_seconds_bucket{le="0.5"} 1 +kubeproxy_network_programming_duration_seconds_bucket{le="1"} 1 +kubeproxy_network_programming_duration_seconds_bucket{le="2"} 2 kubeproxy_network_programming_duration_seconds_bucket{le="3"} 3 kubeproxy_network_programming_duration_seconds_bucket{le="4"} 3 kubeproxy_network_programming_duration_seconds_bucket{le="5"} 3 @@ -327,7 +416,7 @@ kubeproxy_network_programming_duration_seconds_bucket{le="240"} 3 kubeproxy_network_programming_duration_seconds_bucket{le="270"} 3 kubeproxy_network_programming_duration_seconds_bucket{le="300"} 3 kubeproxy_network_programming_duration_seconds_bucket{le="+Inf"} 3 -kubeproxy_network_programming_duration_seconds_sum 5.296157497 +kubeproxy_network_programming_duration_seconds_sum 4.4972745960000005 kubeproxy_network_programming_duration_seconds_count 3 # HELP kubeproxy_sync_proxy_rules_duration_seconds [ALPHA] SyncProxyRules latency in seconds # TYPE kubeproxy_sync_proxy_rules_duration_seconds histogram @@ -335,11 +424,11 @@ kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.001"} 0 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.002"} 0 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.004"} 0 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.008"} 0 -kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.016"} 0 -kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.032"} 0 -kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.064"} 2 -kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.128"} 3 -kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.256"} 4 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.016"} 2 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.032"} 3 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.064"} 3 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.128"} 4 +kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.256"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.512"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="1.024"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="2.048"} 5 @@ -347,27 +436,30 @@ kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="4.096"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="8.192"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="16.384"} 5 kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="+Inf"} 5 -kubeproxy_sync_proxy_rules_duration_seconds_sum 0.6648678979999999 +kubeproxy_sync_proxy_rules_duration_seconds_sum 0.301946608 kubeproxy_sync_proxy_rules_duration_seconds_count 5 # HELP kubeproxy_sync_proxy_rules_endpoint_changes_pending [ALPHA] Pending proxy rules Endpoint changes # TYPE kubeproxy_sync_proxy_rules_endpoint_changes_pending gauge kubeproxy_sync_proxy_rules_endpoint_changes_pending 0 # HELP kubeproxy_sync_proxy_rules_endpoint_changes_total [ALPHA] Cumulative proxy rules Endpoint changes # TYPE kubeproxy_sync_proxy_rules_endpoint_changes_total counter -kubeproxy_sync_proxy_rules_endpoint_changes_total 12 +kubeproxy_sync_proxy_rules_endpoint_changes_total 7 +# HELP kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total [ALPHA] Cumulative proxy iptables partial restore failures +# TYPE kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total counter +kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total 0 # HELP kubeproxy_sync_proxy_rules_iptables_restore_failures_total [ALPHA] Cumulative proxy iptables restore failures # TYPE kubeproxy_sync_proxy_rules_iptables_restore_failures_total counter kubeproxy_sync_proxy_rules_iptables_restore_failures_total 0 # HELP kubeproxy_sync_proxy_rules_iptables_total [ALPHA] Number of proxy iptables rules programmed # TYPE kubeproxy_sync_proxy_rules_iptables_total gauge -kubeproxy_sync_proxy_rules_iptables_total{table="filter"} 3 -kubeproxy_sync_proxy_rules_iptables_total{table="nat"} 34 +kubeproxy_sync_proxy_rules_iptables_total{table="filter"} 4 +kubeproxy_sync_proxy_rules_iptables_total{table="nat"} 30 # HELP kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds [ALPHA] The last time a sync of proxy rules was queued # TYPE kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds gauge -kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds 1.671725537742441e+09 +kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds 1.6915721965056264e+09 # HELP kubeproxy_sync_proxy_rules_last_timestamp_seconds [ALPHA] The last time proxy rules were successfully synced # TYPE kubeproxy_sync_proxy_rules_last_timestamp_seconds gauge -kubeproxy_sync_proxy_rules_last_timestamp_seconds 1.6717255381731546e+09 +kubeproxy_sync_proxy_rules_last_timestamp_seconds 1.691572197521507e+09 # HELP kubeproxy_sync_proxy_rules_no_local_endpoints_total [ALPHA] Number of services with a Local traffic policy and no endpoints # TYPE kubeproxy_sync_proxy_rules_no_local_endpoints_total gauge kubeproxy_sync_proxy_rules_no_local_endpoints_total{traffic_policy="external"} 0 @@ -377,31 +469,184 @@ kubeproxy_sync_proxy_rules_no_local_endpoints_total{traffic_policy="internal"} 0 kubeproxy_sync_proxy_rules_service_changes_pending 0 # HELP kubeproxy_sync_proxy_rules_service_changes_total [ALPHA] Cumulative proxy rules Service changes # TYPE kubeproxy_sync_proxy_rules_service_changes_total counter -kubeproxy_sync_proxy_rules_service_changes_total 16 +kubeproxy_sync_proxy_rules_service_changes_total 8 # HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. # TYPE kubernetes_build_info gauge -kubernetes_build_info{build_date="2022-10-25T19:35:11Z",compiler="gc",git_commit="434bfd82814af038ad94d62ebe59b133fcb50506",git_tree_state="clean",git_version="v1.25.3",go_version="go1.19.2",major="1",minor="25",platform="linux/amd64"} 1 +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 # HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. # TYPE process_cpu_seconds_total counter -process_cpu_seconds_total 2.18 +process_cpu_seconds_total 0.42 # HELP process_max_fds Maximum number of open file descriptors. # TYPE process_max_fds gauge process_max_fds 1.048576e+06 # HELP process_open_fds Number of open file descriptors. # TYPE process_open_fds gauge -process_open_fds 17 +process_open_fds 12 # HELP process_resident_memory_bytes Resident memory size in bytes. # TYPE process_resident_memory_bytes gauge -process_resident_memory_bytes 4.8283648e+07 +process_resident_memory_bytes 4.8123904e+07 # HELP process_start_time_seconds Start time of the process since unix epoch in seconds. # TYPE process_start_time_seconds gauge -process_start_time_seconds 1.67172552929e+09 +process_start_time_seconds 1.69157219141e+09 # HELP process_virtual_memory_bytes Virtual memory size in bytes. # TYPE process_virtual_memory_bytes gauge -process_virtual_memory_bytes 7.73107712e+08 +process_virtual_memory_bytes 7.84257024e+08 # HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. # TYPE process_virtual_memory_max_bytes gauge process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 76 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 3 # HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. # TYPE rest_client_exec_plugin_certificate_rotation_age histogram rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 @@ -436,7 +681,7 @@ rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443", rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="30"} 4 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="60"} 4 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 -rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 6.471e-06 +rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 1.2169e-05 rest_client_rate_limiter_duration_seconds_count{host="kind-control-plane:6443",verb="GET"} 4 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.005"} 1 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.025"} 1 @@ -451,12 +696,12 @@ rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443", rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="30"} 1 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="60"} 1 rest_client_rate_limiter_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 -rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 2.39e-06 +rest_client_rate_limiter_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 1.462e-06 rest_client_rate_limiter_duration_seconds_count{host="kind-control-plane:6443",verb="POST"} 1 # HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. # TYPE rest_client_request_duration_seconds histogram -rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.005"} 0 -rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.025"} 3 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.005"} 3 +rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.025"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.1"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.25"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="0.5"} 4 @@ -468,7 +713,7 @@ rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb= rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="30"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="60"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 -rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 0.049223906 +rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="GET"} 0.01651628 rest_client_request_duration_seconds_count{host="kind-control-plane:6443",verb="GET"} 4 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.005"} 0 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="0.025"} 1 @@ -483,7 +728,7 @@ rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb= rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="30"} 1 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="60"} 1 rest_client_request_duration_seconds_bucket{host="kind-control-plane:6443",verb="POST",le="+Inf"} 1 -rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 0.009699516 +rest_client_request_duration_seconds_sum{host="kind-control-plane:6443",verb="POST"} 0.007487781 rest_client_request_duration_seconds_count{host="kind-control-plane:6443",verb="POST"} 1 # HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. # TYPE rest_client_request_size_bytes histogram @@ -517,7 +762,7 @@ rest_client_request_size_bytes_sum{host="kind-control-plane:6443",verb="POST"} 2 rest_client_request_size_bytes_count{host="kind-control-plane:6443",verb="POST"} 1 # HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. # TYPE rest_client_requests_total counter -rest_client_requests_total{code="200",host="kind-control-plane:6443",method="GET"} 25 +rest_client_requests_total{code="200",host="kind-control-plane:6443",method="GET"} 13 rest_client_requests_total{code="201",host="kind-control-plane:6443",method="POST"} 1 # HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. # TYPE rest_client_response_size_bytes histogram @@ -525,7 +770,7 @@ rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET" rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="256"} 0 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="512"} 0 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1024"} 0 -rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4096"} 4 +rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4096"} 2 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="16384"} 4 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="65536"} 4 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="262144"} 4 @@ -533,7 +778,7 @@ rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET" rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="4.194304e+06"} 4 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="1.6777216e+07"} 4 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="GET",le="+Inf"} 4 -rest_client_response_size_bytes_sum{host="kind-control-plane:6443",verb="GET"} 10956 +rest_client_response_size_bytes_sum{host="kind-control-plane:6443",verb="GET"} 11430 rest_client_response_size_bytes_count{host="kind-control-plane:6443",verb="GET"} 4 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="64"} 0 rest_client_response_size_bytes_bucket{host="kind-control-plane:6443",verb="POST",le="256"} 0 diff --git a/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain-expected.json index b24175bb0b1..d8d15c50b3b 100644 --- a/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/proxy/_meta/testdata/docs.plain-expected.json @@ -9,39 +9,73 @@ "proxy": { "client": { "request": { - "count": 25 - } - }, - "code": "200", - "host": "kind-control-plane:6443", - "method": "GET" - } - }, - "metricset": { - "name": "proxy", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.proxy", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "proxy": { - "client": { - "request": { - "count": 1 + "duration": { + "us": { + "bucket": { + "+Inf": 1, + "100000": 1, + "1000000": 1, + "15000000": 1, + "2000000": 1, + "25000": 1, + "250000": 1, + "30000000": 1, + "4000000": 1, + "5000": 0, + "500000": 1, + "60000000": 1, + "8000000": 1 + }, + "count": 1, + "sum": 7487.781 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 259 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1, + "1024": 1, + "1048576": 1, + "16384": 1, + "16777216": 1, + "256": 0, + "262144": 1, + "4096": 1, + "4194304": 1, + "512": 1, + "64": 0, + "65536": 1 + }, + "count": 1, + "sum": 503 + } + } } }, - "code": "201", "host": "kind-control-plane:6443", - "method": "POST" + "verb": "POST" } }, "metricset": { @@ -71,17 +105,17 @@ "1000000": 4, "15000000": 4, "2000000": 4, - "25000": 3, + "25000": 4, "250000": 4, "30000000": 4, "4000000": 4, - "5000": 0, + "5000": 3, "500000": 4, "60000000": 4, "8000000": 4 }, "count": 4, - "sum": 49223.905999999995 + "sum": 16516.280000000002 } }, "size": { @@ -116,14 +150,14 @@ "16777216": 4, "256": 0, "262144": 4, - "4096": 4, + "4096": 2, "4194304": 4, "512": 0, "64": 0, "65536": 4 }, "count": 4, - "sum": 10956 + "sum": 11430 } } } @@ -151,26 +185,26 @@ "proxy": { "process": { "cpu": { - "sec": 2 + "sec": 0 }, "fds": { "max": { "count": 1048576 }, "open": { - "count": 17 + "count": 12 } }, "memory": { "resident": { - "bytes": 48283648 + "bytes": 48123904 }, "virtual": { - "bytes": 773107712 + "bytes": 784257024 } }, "started": { - "sec": 1671725529.29 + "sec": 1691572191.41 } }, "sync": { @@ -180,7 +214,7 @@ "bucket": { "+Inf": 3, "0": 0, - "1000000": 0, + "1000000": 1, "10000000": 3, "100000000": 3, "105000000": 3, @@ -198,7 +232,7 @@ "18000000": 3, "180000000": 3, "19000000": 3, - "2000000": 1, + "2000000": 2, "20000000": 3, "21000000": 3, "210000000": 3, @@ -236,7 +270,7 @@ "47000000": 3, "48000000": 3, "49000000": 3, - "500000": 0, + "500000": 1, "5000000": 3, "50000000": 3, "51000000": 3, @@ -262,7 +296,7 @@ "95000000": 3 }, "count": 3, - "sum": 5296157.497 + "sum": 4497274.596000001 } } }, @@ -273,22 +307,22 @@ "+Inf": 5, "1000": 0, "1024000": 5, - "128000": 3, - "16000": 0, + "128000": 4, + "16000": 2, "16384000": 5, "2000": 0, "2048000": 5, - "256000": 4, - "32000": 0, + "256000": 5, + "32000": 3, "4000": 0, "4096000": 5, "512000": 5, - "64000": 2, + "64000": 3, "8000": 0, "8192000": 5 }, "count": 5, - "sum": 664867.8979999999 + "sum": 301946.608 } } } @@ -314,73 +348,39 @@ "proxy": { "client": { "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 1, - "100000": 1, - "1000000": 1, - "15000000": 1, - "2000000": 1, - "25000": 1, - "250000": 1, - "30000000": 1, - "4000000": 1, - "5000": 0, - "500000": 1, - "60000000": 1, - "8000000": 1 - }, - "count": 1, - "sum": 9699.516 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1024": 1, - "1048576": 1, - "16384": 1, - "16777216": 1, - "256": 0, - "262144": 1, - "4096": 1, - "4194304": 1, - "512": 1, - "64": 0, - "65536": 1 - }, - "count": 1, - "sum": 259 - } - } - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1, - "1024": 1, - "1048576": 1, - "16384": 1, - "16777216": 1, - "256": 0, - "262144": 1, - "4096": 1, - "4194304": 1, - "512": 1, - "64": 0, - "65536": 1 - }, - "count": 1, - "sum": 503 - } - } + "count": 1 } }, + "code": "201", "host": "kind-control-plane:6443", - "verb": "POST" + "method": "POST" + } + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.proxy", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "proxy": { + "client": { + "request": { + "count": 13 + } + }, + "code": "200", + "host": "kind-control-plane:6443", + "method": "GET" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/proxy/proxy_test.go b/metricbeat/module/kubernetes/proxy/proxy_test.go index def8ad10190..5c636cb9d79 100644 --- a/metricbeat/module/kubernetes/proxy/proxy_test.go +++ b/metricbeat/module/kubernetes/proxy/proxy_test.go @@ -23,27 +23,33 @@ package proxy 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" ) +var files = []string{ + "./_meta/test/metrics.1.25", + "./_meta/test/metrics.1.26", + "./_meta/test/metrics.1.27", +} + func TestEventMapping(t *testing.T) { - ptest.TestMetricSet(t, "kubernetes", "proxy", - ptest.TestCases{ - { - MetricsFile: "./_meta/test/metrics.1.25", - ExpectedFile: "./_meta/test/metrics.1.25.expected", - }, - { - MetricsFile: "./_meta/test/metrics.1.26", - ExpectedFile: "./_meta/test/metrics.1.26.expected", - }, - }, - ) + var testCases ptest.TestCases + for _, file := range files { + testCases = append(testCases, ptest.TestCase{ + MetricsFile: file, + ExpectedFile: file + ".expected", + }) + } + ptest.TestMetricSet(t, "kubernetes", "proxy", testCases) } func TestData(t *testing.T) { mbtest.TestDataFiles(t, "kubernetes", "proxy") } + +func TestMetricsFamily(t *testing.T) { + k.TestMetricsFamily(t, files, mapping) +} diff --git a/metricbeat/module/kubernetes/scheduler/_meta/data.json b/metricbeat/module/kubernetes/scheduler/_meta/data.json index 7c322d0f3d7..2a4be7aad40 100644 --- a/metricbeat/module/kubernetes/scheduler/_meta/data.json +++ b/metricbeat/module/kubernetes/scheduler/_meta/data.json @@ -7,10 +7,10 @@ }, "kubernetes": { "scheduler": { - "name": "RequestHeaderAuthRequestController", + "name": "DynamicServingCertificateController", "workqueue": { "adds": { - "count": 0 + "count": 21 }, "depth": { "count": 0 diff --git a/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.25.expected b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.25.expected index 898a08bc3ff..fcd3c289343 100644 --- a/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.25.expected +++ b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.25.expected @@ -287,30 +287,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "client": { - "request": { - "count": 255 - } - }, - "code": "201", - "host": "172.18.0.2:6443", - "method": "POST" - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -379,14 +355,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "queue": "unschedulable", - "scheduling": { - "pending": { - "pods": { - "count": 0 - } + "client": { + "request": { + "count": 255 } - } + }, + "code": "201", + "host": "172.18.0.2:6443", + "method": "POST" }, "Index": "", "ID": "", @@ -443,6 +419,30 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "queue": "unschedulable", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -481,14 +481,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "queue": "backoff", - "scheduling": { - "pending": { - "pods": { - "count": 0 - } + "client": { + "request": { + "count": 1350 } - } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" }, "Index": "", "ID": "", @@ -551,99 +551,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 1350 - } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "PUT" - }, - "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": { - "duration": { - "us": { - "bucket": { - "+Inf": 1393, - "100000": 1392, - "1000000": 1392, - "15000000": 1393, - "2000000": 1392, - "25000": 1392, - "250000": 1392, - "30000000": 1393, - "4000000": 1392, - "5000": 1368, - "500000": 1392, - "60000000": 1393, - "8000000": 1393 - }, - "count": 1393, - "sum": 9186328.12299999 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 1393, - "1024": 1393, - "1048576": 1393, - "16384": 1393, - "16777216": 1393, - "256": 1393, - "262144": 1393, - "4096": 1393, - "4194304": 1393, - "512": 1393, - "64": 1393, - "65536": 1393 - }, - "count": 1393, - "sum": 0 - } - } - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1393, - "1024": 1389, - "1048576": 1393, - "16384": 1392, - "16777216": 1393, - "256": 31, - "262144": 1393, - "4096": 1392, - "4194304": 1393, - "512": 1388, - "64": 10, - "65536": 1393 - }, - "count": 1393, - "sum": 609699 - } + "queue": "backoff", + "scheduling": { + "pending": { + "pods": { + "count": 0 } } - }, - "host": "172.18.0.2:6443", - "verb": "GET" + } }, "Index": "", "ID": "", @@ -745,24 +660,75 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicServingCertificateController", - "workqueue": { - "adds": { - "count": 47 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 1393, + "100000": 1392, + "1000000": 1392, + "15000000": 1393, + "2000000": 1392, + "25000": 1392, + "250000": 1392, + "30000000": 1393, + "4000000": 1392, + "5000": 1368, + "500000": 1392, + "60000000": 1393, + "8000000": 1393 + }, + "count": 1393, + "sum": 9186328.12299999 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 1393, + "1024": 1393, + "1048576": 1393, + "16384": 1393, + "16777216": 1393, + "256": 1393, + "262144": 1393, + "4096": 1393, + "4194304": 1393, + "512": 1393, + "64": 1393, + "65536": 1393 + }, + "count": 1393, + "sum": 0 + } + } }, - "unfinished": { - "sec": 0 + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 1393, + "1024": 1389, + "1048576": 1393, + "16384": 1392, + "16777216": 1393, + "256": 31, + "262144": 1393, + "4096": 1392, + "4194304": 1393, + "512": 1388, + "64": 10, + "65536": 1393 + }, + "count": 1393, + "sum": 609699 + } + } } - } + }, + "host": "172.18.0.2:6443", + "verb": "GET" }, "Index": "", "ID": "", @@ -779,7 +745,7 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "name": "DynamicConfigMapCABundle-client-ca", + "name": "DynamicServingCertificateController", "workqueue": { "adds": { "count": 47 @@ -832,5 +798,39 @@ "Took": 0, "Period": 0, "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicConfigMapCABundle-client-ca", + "workqueue": { + "adds": { + "count": 47 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "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/scheduler/_meta/test/metrics.1.26.expected b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.26.expected index 94f56994b4b..57663edd9d8 100644 --- a/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.26.expected +++ b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.26.expected @@ -141,6 +141,26 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "leader": { + "is_master": true + }, + "name": "kube-scheduler" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -169,10 +189,14 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "leader": { - "is_master": true + "client": { + "request": { + "count": 292 + } }, - "name": "kube-scheduler" + "code": "200", + "host": "172.18.0.2:6443", + "method": "GET" }, "Index": "", "ID": "", @@ -189,14 +213,24 @@ "RootFields": {}, "ModuleFields": null, "MetricSetFields": { - "client": { - "request": { - "count": 292 + "name": "RequestHeaderAuthRequestController", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "GET" + } }, "Index": "", "ID": "", @@ -294,40 +328,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "name": "RequestHeaderAuthRequestController", - "workqueue": { - "adds": { - "count": 0 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, @@ -666,6 +666,40 @@ "Period": 0, "DisableTimeSeries": false }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "DynamicConfigMapCABundle-client-ca", + "workqueue": { + "adds": { + "count": 10 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, { "RootFields": {}, "ModuleFields": null, @@ -751,40 +785,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": {}, - "ModuleFields": null, - "MetricSetFields": { - "name": "DynamicConfigMapCABundle-client-ca", - "workqueue": { - "adds": { - "count": 10 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 - } - } - }, - "Index": "", - "ID": "", - "Namespace": "", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": {}, "ModuleFields": null, diff --git a/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27 b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27 new file mode 100644 index 00000000000..a27a0ff92c9 --- /dev/null +++ b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27 @@ -0,0 +1,1603 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 +# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. +# TYPE apiserver_audit_event_total counter +apiserver_audit_event_total 0 +# HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend. +# TYPE apiserver_audit_requests_rejected_total counter +apiserver_audit_requests_rejected_total 0 +# HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request. +# TYPE apiserver_client_certificate_expiration_seconds histogram +apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="21600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="43200"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="86400"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="172800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="345600"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="604800"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="2.592e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="7.776e+06"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="1.5552e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="3.1104e+07"} 0 +apiserver_client_certificate_expiration_seconds_bucket{le="+Inf"} 0 +apiserver_client_certificate_expiration_seconds_sum 0 +apiserver_client_certificate_expiration_seconds_count 0 +# HELP apiserver_delegated_authn_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. +# TYPE apiserver_delegated_authn_request_duration_seconds histogram +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.006375487 +apiserver_delegated_authn_request_duration_seconds_count{code="201"} 2 +# HELP apiserver_delegated_authn_request_total [ALPHA] Number of HTTP requests partitioned by status code. +# TYPE apiserver_delegated_authn_request_total counter +apiserver_delegated_authn_request_total{code="201"} 2 +# HELP apiserver_delegated_authz_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. +# TYPE apiserver_delegated_authz_request_duration_seconds histogram +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.007088867 +apiserver_delegated_authz_request_duration_seconds_count{code="201"} 2 +# HELP apiserver_delegated_authz_request_total [ALPHA] Number of HTTP requests partitioned by status code. +# TYPE apiserver_delegated_authz_request_total counter +apiserver_delegated_authz_request_total{code="201"} 2 +# HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. +# TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge +apiserver_envelope_encryption_dek_cache_fill_percent 0 +# HELP apiserver_storage_data_key_generation_duration_seconds [ALPHA] Latencies in seconds of data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_duration_seconds histogram +apiserver_storage_data_key_generation_duration_seconds_bucket{le="5e-06"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="1e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="2e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="4e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="8e-05"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00016"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00032"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00064"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00128"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00256"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.00512"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.01024"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.02048"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="0.04096"} 0 +apiserver_storage_data_key_generation_duration_seconds_bucket{le="+Inf"} 0 +apiserver_storage_data_key_generation_duration_seconds_sum 0 +apiserver_storage_data_key_generation_duration_seconds_count 0 +# HELP apiserver_storage_data_key_generation_failures_total [ALPHA] Total number of failed data encryption key(DEK) generation operations. +# TYPE apiserver_storage_data_key_generation_failures_total counter +apiserver_storage_data_key_generation_failures_total 0 +# HELP apiserver_storage_envelope_transformation_cache_misses_total [ALPHA] Total number of cache misses while accessing key decryption key(KEK). +# TYPE apiserver_storage_envelope_transformation_cache_misses_total counter +apiserver_storage_envelope_transformation_cache_misses_total 0 +# HELP apiserver_webhooks_x509_insecure_sha1_total [ALPHA] Counts the number of requests to servers with insecure SHA1 signatures in their serving certificate OR the number of connection failures due to the insecure SHA1 signatures (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_insecure_sha1_total counter +apiserver_webhooks_x509_insecure_sha1_total 0 +# HELP apiserver_webhooks_x509_missing_san_total [ALPHA] Counts the number of requests to servers missing SAN extension in their serving certificate OR the number of connection failures due to the lack of x509 certificate SAN extension missing (either/or, based on the runtime environment) +# TYPE apiserver_webhooks_x509_missing_san_total counter +apiserver_webhooks_x509_missing_san_total 0 +# HELP authenticated_user_requests [ALPHA] Counter of authenticated requests broken out by username. +# TYPE authenticated_user_requests counter +authenticated_user_requests{username="other"} 121 +# HELP authentication_attempts [ALPHA] Counter of authenticated attempts. +# TYPE authentication_attempts counter +authentication_attempts{result="success"} 121 +# HELP authentication_duration_seconds [ALPHA] Authentication duration in seconds broken out by result. +# TYPE authentication_duration_seconds histogram +authentication_duration_seconds_bucket{result="success",le="0.001"} 120 +authentication_duration_seconds_bucket{result="success",le="0.002"} 120 +authentication_duration_seconds_bucket{result="success",le="0.004"} 121 +authentication_duration_seconds_bucket{result="success",le="0.008"} 121 +authentication_duration_seconds_bucket{result="success",le="0.016"} 121 +authentication_duration_seconds_bucket{result="success",le="0.032"} 121 +authentication_duration_seconds_bucket{result="success",le="0.064"} 121 +authentication_duration_seconds_bucket{result="success",le="0.128"} 121 +authentication_duration_seconds_bucket{result="success",le="0.256"} 121 +authentication_duration_seconds_bucket{result="success",le="0.512"} 121 +authentication_duration_seconds_bucket{result="success",le="1.024"} 121 +authentication_duration_seconds_bucket{result="success",le="2.048"} 121 +authentication_duration_seconds_bucket{result="success",le="4.096"} 121 +authentication_duration_seconds_bucket{result="success",le="8.192"} 121 +authentication_duration_seconds_bucket{result="success",le="16.384"} 121 +authentication_duration_seconds_bucket{result="success",le="+Inf"} 121 +authentication_duration_seconds_sum{result="success"} 0.007299385000000001 +authentication_duration_seconds_count{result="success"} 121 +# HELP authentication_token_cache_active_fetch_count [ALPHA] +# TYPE authentication_token_cache_active_fetch_count gauge +authentication_token_cache_active_fetch_count{status="blocked"} 0 +authentication_token_cache_active_fetch_count{status="in_flight"} 0 +# HELP authentication_token_cache_fetch_total [ALPHA] +# TYPE authentication_token_cache_fetch_total counter +authentication_token_cache_fetch_total{status="ok"} 2 +# HELP authentication_token_cache_request_duration_seconds [ALPHA] +# TYPE authentication_token_cache_request_duration_seconds histogram +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 1 +authentication_token_cache_request_duration_seconds_sum{status="hit"} 0 +authentication_token_cache_request_duration_seconds_count{status="hit"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 2 +authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.006 +authentication_token_cache_request_duration_seconds_count{status="miss"} 2 +# HELP authentication_token_cache_request_total [ALPHA] +# TYPE authentication_token_cache_request_total counter +authentication_token_cache_request_total{status="hit"} 1 +authentication_token_cache_request_total{status="miss"} 2 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 +# HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. +# TYPE go_cgo_go_to_c_calls_calls_total counter +go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.008079706 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.086176314 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.019868985 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.024395008 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.138520013 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 7713.429833094 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 4.43e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.001458433 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001458876 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 8817.213977184 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 1103.644165201 +# HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. +# TYPE go_gc_cycles_automatic_gc_cycles_total counter +go_gc_cycles_automatic_gc_cycles_total 20 +# HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. +# TYPE go_gc_cycles_forced_gc_cycles_total counter +go_gc_cycles_forced_gc_cycles_total 0 +# HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. +# TYPE go_gc_cycles_total_gc_cycles_total counter +go_gc_cycles_total_gc_cycles_total 20 +# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 4.8356e-05 +go_gc_duration_seconds{quantile="0.25"} 8.5317e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000127535 +go_gc_duration_seconds{quantile="0.75"} 0.000222715 +go_gc_duration_seconds{quantile="1"} 0.000325782 +go_gc_duration_seconds_sum 0.003049376 +go_gc_duration_seconds_count 20 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 8495 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 191251 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 358479 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 492192 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 563573 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 577807 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 580583 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 581466 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 583279 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 583421 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 583478 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 583536 +go_gc_heap_allocs_by_size_bytes_sum 6.8647168e+07 +go_gc_heap_allocs_by_size_bytes_count 583536 +# HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. +# TYPE go_gc_heap_allocs_bytes_total counter +go_gc_heap_allocs_bytes_total 6.8647168e+07 +# HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_objects_total counter +go_gc_heap_allocs_objects_total 583536 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 5837 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 163562 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 308952 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 429271 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 496853 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 509217 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 511566 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 512219 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 513926 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 514008 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 514024 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 514066 +go_gc_heap_frees_by_size_bytes_sum 5.9847008e+07 +go_gc_heap_frees_by_size_bytes_count 514066 +# HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. +# TYPE go_gc_heap_frees_bytes_total counter +go_gc_heap_frees_bytes_total 5.9847008e+07 +# HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_objects_total counter +go_gc_heap_frees_objects_total 514066 +# HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. +# TYPE go_gc_heap_goal_bytes gauge +go_gc_heap_goal_bytes 1.2893368e+07 +# HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. +# TYPE go_gc_heap_objects_objects gauge +go_gc_heap_objects_objects 69470 +# HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. +# TYPE go_gc_heap_tiny_allocs_objects_total counter +go_gc_heap_tiny_allocs_objects_total 53436 +# HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. +# TYPE go_gc_limiter_last_enabled_gc_cycle gauge +go_gc_limiter_last_enabled_gc_cycle 0 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 7 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 29 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 40 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 40 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 40 +go_gc_pauses_seconds_bucket{le="+Inf"} 40 +go_gc_pauses_seconds_sum 0.001063296 +go_gc_pauses_seconds_count 40 +# HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. +# TYPE go_gc_stack_starting_size_bytes gauge +go_gc_stack_starting_size_bytes 2048 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 172 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version="go1.20.3"} 1 +# HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. +# TYPE go_memory_classes_heap_free_bytes gauge +go_memory_classes_heap_free_bytes 655360 +# HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. +# TYPE go_memory_classes_heap_objects_bytes gauge +go_memory_classes_heap_objects_bytes 8.80016e+06 +# HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. +# TYPE go_memory_classes_heap_released_bytes gauge +go_memory_classes_heap_released_bytes 5.914624e+06 +# HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. +# TYPE go_memory_classes_heap_stacks_bytes gauge +go_memory_classes_heap_stacks_bytes 1.6384e+06 +# HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. +# TYPE go_memory_classes_heap_unused_bytes gauge +go_memory_classes_heap_unused_bytes 3.962976e+06 +# HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. +# TYPE go_memory_classes_metadata_mcache_free_bytes gauge +go_memory_classes_metadata_mcache_free_bytes 6000 +# HELP go_memory_classes_metadata_mcache_inuse_bytes Memory that is occupied by runtime mcache structures that are currently being used. +# TYPE go_memory_classes_metadata_mcache_inuse_bytes gauge +go_memory_classes_metadata_mcache_inuse_bytes 9600 +# HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. +# TYPE go_memory_classes_metadata_mspan_free_bytes gauge +go_memory_classes_metadata_mspan_free_bytes 8640 +# HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. +# TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge +go_memory_classes_metadata_mspan_inuse_bytes 268800 +# HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. +# TYPE go_memory_classes_metadata_other_bytes gauge +go_memory_classes_metadata_other_bytes 8.957288e+06 +# HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. +# TYPE go_memory_classes_os_stacks_bytes gauge +go_memory_classes_os_stacks_bytes 0 +# HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. +# TYPE go_memory_classes_other_bytes gauge +go_memory_classes_other_bytes 1.433287e+06 +# HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. +# TYPE go_memory_classes_profiling_buckets_bytes gauge +go_memory_classes_profiling_buckets_bytes 1.503273e+06 +# HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. +# TYPE go_memory_classes_total_bytes gauge +go_memory_classes_total_bytes 3.3158408e+07 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 8.80016e+06 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 6.8647168e+07 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.503273e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 567502 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 8.957288e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 8.80016e+06 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 6.569984e+06 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 1.2763136e+07 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 69470 +# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes gauge +go_memstats_heap_released_bytes 5.914624e+06 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 1.933312e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.6915732718005395e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 636972 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 9600 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 15600 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 268800 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 277440 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 1.2893368e+07 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 1.433287e+06 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 1.6384e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 1.6384e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained from system. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 3.3158408e+07 +# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. +# TYPE go_sched_gomaxprocs_threads gauge +go_sched_gomaxprocs_threads 8 +# HELP go_sched_goroutines_goroutines Count of live goroutines. +# TYPE go_sched_goroutines_goroutines gauge +go_sched_goroutines_goroutines 172 +# HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. +# TYPE go_sched_latencies_seconds histogram +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 2372 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 2635 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 3677 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 6413 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 6800 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 6801 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 6801 +go_sched_latencies_seconds_bucket{le="+Inf"} 6801 +go_sched_latencies_seconds_sum 0.052915904 +go_sched_latencies_seconds_count 6801 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0.000617744 +# HELP go_threads Number of OS threads created. +# TYPE go_threads gauge +go_threads 13 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 1 +# HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. +# TYPE kubernetes_build_info gauge +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 +# HELP leader_election_master_status [ALPHA] Gauge of if the reporting system is master of the relevant lease, 0 indicates backup, 1 indicates master. 'name' is the string used to identify the lease. Please make sure to group by name. +# TYPE leader_election_master_status gauge +leader_election_master_status{name="kube-scheduler"} 1 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 8.31 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 11 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 5.8523648e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.69157216915e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 7.85260544e+08 +# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. +# TYPE process_virtual_memory_max_bytes gauge +process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 77 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 12 +# HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. +# TYPE rest_client_exec_plugin_certificate_rotation_age histogram +rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3600"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="14400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="86400"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="604800"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="2.592e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="7.776e+06"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.5552e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="3.1104e+07"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="1.24416e+08"} 0 +rest_client_exec_plugin_certificate_rotation_age_bucket{le="+Inf"} 0 +rest_client_exec_plugin_certificate_rotation_age_sum 0 +rest_client_exec_plugin_certificate_rotation_age_count 0 +# HELP rest_client_exec_plugin_ttl_seconds [ALPHA] Gauge of the shortest TTL (time-to-live) of the client certificate(s) managed by the auth exec plugin. The value is in seconds until certificate expiry (negative if already expired). If auth exec plugins are unused or manage no TLS certificates, the value will be +INF. +# TYPE rest_client_exec_plugin_ttl_seconds gauge +rest_client_exec_plugin_ttl_seconds +Inf +# HELP rest_client_rate_limiter_duration_seconds [ALPHA] Client side rate limiter latency in seconds. Broken down by verb, and host. +# TYPE rest_client_rate_limiter_duration_seconds histogram +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 0.002401599999999998 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 9.098e-06 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 3 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 8.7868e-05 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.0015607319999999996 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 589 +# HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. +# TYPE rest_client_request_duration_seconds histogram +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 620 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 4.443225512000004 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 0 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.25"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.5"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="1"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="2"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="4"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="8"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="15"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 0.036600519000000005 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 3 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 6 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 0.12807385899999996 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 50 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 588 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 5.999108381000003 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 589 +# HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. +# TYPE rest_client_request_size_bytes histogram +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 0 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 1029 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 3 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 7 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 17 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 19 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 8318 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 250590 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 589 +# HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. +# TYPE rest_client_requests_total counter +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 650 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PATCH"} 3 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 589 +rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 21 +rest_client_requests_total{code="403",host="172.18.0.2:6443",method="GET"} 29 +rest_client_requests_total{code="404",host="172.18.0.2:6443",method="GET"} 1 +# HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. +# TYPE rest_client_response_size_bytes histogram +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 9 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 33 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 628 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 629 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 271449 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1024"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4096"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="16384"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="65536"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="262144"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.048576e+06"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 10950 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 3 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 6 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 6 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 7 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 17 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 12863 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 250591 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 589 +# HELP scheduler_framework_extension_point_duration_seconds [STABLE] Latency for running all plugins of a specific extension point. +# TYPE scheduler_framework_extension_point_duration_seconds histogram +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0001"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0002"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0004"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0008"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0016"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0032"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0064"} 0 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0128"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0256"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0512"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.1024"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.2048"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="+Inf"} 6 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Bind",profile="default-scheduler",status="Success"} 0.050149431999999994 +scheduler_framework_extension_point_duration_seconds_count{extension_point="Bind",profile="default-scheduler",status="Success"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0002"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0004"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0008"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0016"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0032"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0064"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0128"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0256"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0512"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.1024"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.2048"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="+Inf"} 9 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Filter",profile="default-scheduler",status="Success"} 0.0007958830000000002 +scheduler_framework_extension_point_duration_seconds_count{extension_point="Filter",profile="default-scheduler",status="Success"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0002"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0004"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0008"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0016"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0032"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0064"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0128"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0256"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0512"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.1024"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.2048"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="+Inf"} 6 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Permit",profile="default-scheduler",status="Success"} 7.728e-06 +scheduler_framework_extension_point_duration_seconds_count{extension_point="Permit",profile="default-scheduler",status="Success"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0002"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0004"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0008"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0016"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0032"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0064"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0128"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0256"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0512"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.1024"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.2048"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="+Inf"} 6 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostBind",profile="default-scheduler",status="Success"} 7.348e-06 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PostBind",profile="default-scheduler",status="Success"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0001"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0002"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0004"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0008"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0016"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0032"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0064"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0128"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0256"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0512"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.1024"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.2048"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="+Inf"} 3 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable"} 6.301499999999999e-05 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable"} 3 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0002"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0004"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0008"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0016"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0032"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0064"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0128"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0256"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0512"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.1024"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.2048"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="+Inf"} 6 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreBind",profile="default-scheduler",status="Success"} 0.000122495 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PreBind",profile="default-scheduler",status="Success"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0001"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0002"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0004"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0008"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0016"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0032"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0064"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0128"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0256"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0512"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.1024"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.2048"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="+Inf"} 9 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreEnqueue",profile="default-scheduler",status="Success"} 0.000139373 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PreEnqueue",profile="default-scheduler",status="Success"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0001"} 7 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0002"} 8 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0004"} 8 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0008"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0016"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0032"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0064"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0128"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0256"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0512"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.1024"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.2048"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="+Inf"} 9 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreFilter",profile="default-scheduler",status="Success"} 0.0009478259999999999 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PreFilter",profile="default-scheduler",status="Success"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0002"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0004"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0008"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0016"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0032"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0064"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0128"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0256"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0512"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.1024"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.2048"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="+Inf"} 6 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Reserve",profile="default-scheduler",status="Success"} 1.9262e-05 +scheduler_framework_extension_point_duration_seconds_count{extension_point="Reserve",profile="default-scheduler",status="Success"} 6 +# HELP scheduler_goroutines [ALPHA] Number of running goroutines split by the work they do such as binding. +# TYPE scheduler_goroutines gauge +scheduler_goroutines{operation="Filter"} 0 +scheduler_goroutines{operation="InterPodAffinity"} 0 +scheduler_goroutines{operation="binding"} 0 +# HELP scheduler_pending_pods [STABLE] Number of pending pods, by the queue type. 'active' means number of pods in activeQ; 'backoff' means number of pods in backoffQ; 'unschedulable' means number of pods in unschedulablePods that the scheduler attempted to schedule and failed; 'gated' is the number of unschedulable pods that the scheduler never attempted to schedule because they are gated. +# TYPE scheduler_pending_pods gauge +scheduler_pending_pods{queue="active"} 0 +scheduler_pending_pods{queue="backoff"} 0 +scheduler_pending_pods{queue="gated"} 0 +scheduler_pending_pods{queue="unschedulable"} 0 +# HELP scheduler_plugin_evaluation_total [ALPHA] Number of attempts to schedule pods by each plugin and the extension point (available only in PreFilter and Filter.). +# TYPE scheduler_plugin_evaluation_total counter +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="AzureDiskLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="EBSLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="GCEPDLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeAffinity",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeName",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodePorts",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeResourcesFit",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeUnschedulable",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeVolumeLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="PodTopologySpread",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="TaintToleration",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="VolumeRestrictions",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodeAffinity",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodePorts",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodeResourcesFit",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="PodTopologySpread",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="VolumeRestrictions",profile="default-scheduler"} 9 +# HELP scheduler_plugin_execution_duration_seconds [ALPHA] Duration for running a plugin at a specific extension point. +# TYPE scheduler_plugin_execution_duration_seconds histogram +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="NodeName",status="Success"} 1.91e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="NodeName",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="NodeUnschedulable",status="Success"} 5.94e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="NodeUnschedulable",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable"} 4.447e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="1e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="1.5000000000000002e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable"} 1.7988e-05 +scheduler_plugin_execution_duration_seconds_count{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success"} 1.5e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="1e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip"} 1.3978e-05 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodeAffinity",status="Success"} 3.87e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodeAffinity",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodePorts",status="Success"} 2.55e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodePorts",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success"} 4.947e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="PodTopologySpread",status="Success"} 2.634e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="PodTopologySpread",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeBinding",status="Skip"} 2.108e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeBinding",status="Skip"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success"} 2.3e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeZone",status="Skip"} 8.1e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeZone",status="Skip"} 1 +# HELP scheduler_pod_scheduling_attempts [STABLE] Number of attempts to successfully schedule a pod. +# TYPE scheduler_pod_scheduling_attempts histogram +scheduler_pod_scheduling_attempts_bucket{le="1"} 3 +scheduler_pod_scheduling_attempts_bucket{le="2"} 6 +scheduler_pod_scheduling_attempts_bucket{le="4"} 6 +scheduler_pod_scheduling_attempts_bucket{le="8"} 6 +scheduler_pod_scheduling_attempts_bucket{le="16"} 6 +scheduler_pod_scheduling_attempts_bucket{le="+Inf"} 6 +scheduler_pod_scheduling_attempts_sum 9 +scheduler_pod_scheduling_attempts_count 6 +# HELP scheduler_pod_scheduling_duration_seconds [STABLE] E2e latency for a pod being scheduled which may include multiple scheduling attempts. +# TYPE scheduler_pod_scheduling_duration_seconds histogram +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.01"} 2 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.02"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.04"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.08"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.16"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.32"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.64"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="1.28"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="2.56"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="5.12"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="10.24"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="20.48"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="40.96"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="81.92"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="163.84"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="327.68"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="655.36"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="1310.72"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="2621.44"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="5242.88"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="+Inf"} 3 +scheduler_pod_scheduling_duration_seconds_sum{attempts="1"} 0.025937717 +scheduler_pod_scheduling_duration_seconds_count{attempts="1"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.01"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.02"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.04"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.08"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.16"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.32"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.64"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="1.28"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="2.56"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="5.12"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="10.24"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="20.48"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="40.96"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="81.92"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="163.84"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="327.68"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="655.36"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="1310.72"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="2621.44"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="5242.88"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="+Inf"} 3 +scheduler_pod_scheduling_duration_seconds_sum{attempts="2"} 12.24573007 +scheduler_pod_scheduling_duration_seconds_count{attempts="2"} 3 +# HELP scheduler_preemption_attempts_total [STABLE] Total preemption attempts in the cluster till now +# TYPE scheduler_preemption_attempts_total counter +scheduler_preemption_attempts_total 3 +# HELP scheduler_preemption_victims [STABLE] Number of selected preemption victims +# TYPE scheduler_preemption_victims histogram +scheduler_preemption_victims_bucket{le="1"} 0 +scheduler_preemption_victims_bucket{le="2"} 0 +scheduler_preemption_victims_bucket{le="4"} 0 +scheduler_preemption_victims_bucket{le="8"} 0 +scheduler_preemption_victims_bucket{le="16"} 0 +scheduler_preemption_victims_bucket{le="32"} 0 +scheduler_preemption_victims_bucket{le="64"} 0 +scheduler_preemption_victims_bucket{le="+Inf"} 0 +scheduler_preemption_victims_sum 0 +scheduler_preemption_victims_count 0 +# HELP scheduler_queue_incoming_pods_total [STABLE] Number of pods added to scheduling queues by event and queue type. +# TYPE scheduler_queue_incoming_pods_total counter +scheduler_queue_incoming_pods_total{event="NodeTaintChange",queue="active"} 3 +scheduler_queue_incoming_pods_total{event="PodAdd",queue="active"} 6 +scheduler_queue_incoming_pods_total{event="ScheduleAttemptFailure",queue="unschedulable"} 3 +# HELP scheduler_schedule_attempts_total [STABLE] Number of attempts to schedule pods, by the result. 'unschedulable' means a pod could not be scheduled, while 'error' means an internal scheduler problem. +# TYPE scheduler_schedule_attempts_total counter +scheduler_schedule_attempts_total{profile="default-scheduler",result="scheduled"} 6 +scheduler_schedule_attempts_total{profile="default-scheduler",result="unschedulable"} 3 +# HELP scheduler_scheduler_cache_size [ALPHA] Number of nodes, pods, and assumed (bound) pods in the scheduler cache. +# TYPE scheduler_scheduler_cache_size gauge +scheduler_scheduler_cache_size{type="assumed_pods"} 0 +scheduler_scheduler_cache_size{type="nodes"} 1 +scheduler_scheduler_cache_size{type="pods"} 10 +# HELP scheduler_scheduling_algorithm_duration_seconds [ALPHA] Scheduling algorithm latency in seconds +# TYPE scheduler_scheduling_algorithm_duration_seconds histogram +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.001"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.002"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.004"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.008"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.016"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.032"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.064"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.128"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.256"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.512"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="1.024"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="2.048"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="4.096"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="8.192"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="16.384"} 6 +scheduler_scheduling_algorithm_duration_seconds_bucket{le="+Inf"} 6 +scheduler_scheduling_algorithm_duration_seconds_sum 0.001461413 +scheduler_scheduling_algorithm_duration_seconds_count 6 +# HELP scheduler_scheduling_attempt_duration_seconds [STABLE] Scheduling attempt latency in seconds (scheduling algorithm + binding) +# TYPE scheduler_scheduling_attempt_duration_seconds histogram +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.001"} 0 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.002"} 0 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.004"} 0 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.008"} 2 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.016"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.032"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.064"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.128"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.256"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.512"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="1.024"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="2.048"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="4.096"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="8.192"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="16.384"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="+Inf"} 6 +scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="scheduled"} 0.052896684 +scheduler_scheduling_attempt_duration_seconds_count{profile="default-scheduler",result="scheduled"} 6 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.001"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.002"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.004"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.008"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.016"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.032"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.064"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.128"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.256"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.512"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="1.024"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="2.048"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="4.096"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="8.192"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="16.384"} 3 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="+Inf"} 3 +scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="unschedulable"} 0.000695599 +scheduler_scheduling_attempt_duration_seconds_count{profile="default-scheduler",result="unschedulable"} 3 +# HELP scheduler_unschedulable_pods [ALPHA] The number of unschedulable pods broken down by plugin name. A pod will increment the gauge for all plugins that caused it to not schedule and so this metric have meaning only when broken down by plugin. +# TYPE scheduler_unschedulable_pods gauge +scheduler_unschedulable_pods{plugin="TaintToleration",profile="default-scheduler"} 0 +# HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue +# TYPE workqueue_adds_total counter +workqueue_adds_total{name="DynamicConfigMapCABundle-client-ca"} 21 +workqueue_adds_total{name="DynamicServingCertificateController"} 21 +workqueue_adds_total{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_depth [ALPHA] Current depth of workqueue +# TYPE workqueue_depth gauge +workqueue_depth{name="DynamicConfigMapCABundle-client-ca"} 0 +workqueue_depth{name="DynamicServingCertificateController"} 0 +workqueue_depth{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_longest_running_processor_seconds [ALPHA] How many seconds has the longest running processor for workqueue been running. +# TYPE workqueue_longest_running_processor_seconds gauge +workqueue_longest_running_processor_seconds{name="DynamicConfigMapCABundle-client-ca"} 0 +workqueue_longest_running_processor_seconds{name="DynamicServingCertificateController"} 0 +workqueue_longest_running_processor_seconds{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_queue_duration_seconds [ALPHA] How long in seconds an item stays in workqueue before being requested. +# TYPE workqueue_queue_duration_seconds histogram +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 18 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 20 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.007058608 +workqueue_queue_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0008254900000000001 +workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 21 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="RequestHeaderAuthRequestController"} 0 +workqueue_queue_duration_seconds_count{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_retries_total [ALPHA] Total number of retries handled by workqueue +# TYPE workqueue_retries_total counter +workqueue_retries_total{name="DynamicConfigMapCABundle-client-ca"} 0 +workqueue_retries_total{name="DynamicServingCertificateController"} 0 +workqueue_retries_total{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_unfinished_work_seconds [ALPHA] How many seconds of work has done that is in progress and hasn't been observed by work_duration. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases. +# TYPE workqueue_unfinished_work_seconds gauge +workqueue_unfinished_work_seconds{name="DynamicConfigMapCABundle-client-ca"} 0 +workqueue_unfinished_work_seconds{name="DynamicServingCertificateController"} 0 +workqueue_unfinished_work_seconds{name="RequestHeaderAuthRequestController"} 0 +# HELP workqueue_work_duration_seconds [ALPHA] How long in seconds processing an item from workqueue takes. +# TYPE workqueue_work_duration_seconds histogram +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-06"} 1 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.0007422840000000001 +workqueue_work_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0016760350000000002 +workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 21 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="RequestHeaderAuthRequestController"} 0 +workqueue_work_duration_seconds_count{name="RequestHeaderAuthRequestController"} 0 diff --git a/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27.expected b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27.expected new file mode 100644 index 00000000000..5ad056870b4 --- /dev/null +++ b/metricbeat/module/kubernetes/scheduler/_meta/test/metrics.1.27.expected @@ -0,0 +1,857 @@ +[ + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 21, + "100000": 21, + "1000000": 21, + "15000000": 21, + "2000000": 21, + "25000": 21, + "250000": 21, + "30000000": 21, + "4000000": 21, + "5000": 6, + "500000": 21, + "60000000": 21, + "8000000": 21 + }, + "count": 21, + "sum": 128073.85899999995 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 21, + "1024": 19, + "1048576": 21, + "16384": 21, + "16777216": 21, + "256": 7, + "262144": 21, + "4096": 21, + "4194304": 21, + "512": 17, + "64": 0, + "65536": 21 + }, + "count": 21, + "sum": 8318 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 21, + "1024": 17, + "1048576": 21, + "16384": 21, + "16777216": 21, + "256": 6, + "262144": 21, + "4096": 21, + "4194304": 21, + "512": 7, + "64": 6, + "65536": 21 + }, + "count": 21, + "sum": 12863 + } + } + } + }, + "host": "172.18.0.2:6443", + "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": { + "name": "DynamicServingCertificateController", + "workqueue": { + "adds": { + "count": 21 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 3 + } + }, + "code": "200", + "host": "172.18.0.2: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": { + "client": { + "request": { + "count": 1 + } + }, + "code": "404", + "host": "172.18.0.2: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": { + "name": "DynamicConfigMapCABundle-client-ca", + "workqueue": { + "adds": { + "count": 21 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "100000": 3, + "1000000": 3, + "15000000": 3, + "2000000": 3, + "25000": 3, + "250000": 3, + "30000000": 3, + "4000000": 3, + "5000": 0, + "500000": 3, + "60000000": 3, + "8000000": 3 + }, + "count": 3, + "sum": 36600.51900000001 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1024": 3, + "1048576": 3, + "16384": 3, + "16777216": 3, + "256": 0, + "262144": 3, + "4096": 3, + "4194304": 3, + "512": 3, + "64": 0, + "65536": 3 + }, + "count": 3, + "sum": 1029 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1024": 0, + "1048576": 3, + "16384": 3, + "16777216": 3, + "256": 0, + "262144": 3, + "4096": 3, + "4194304": 3, + "512": 0, + "64": 0, + "65536": 3 + }, + "count": 3, + "sum": 10950 + } + } + } + }, + "host": "172.18.0.2:6443", + "verb": "PATCH" + }, + "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": 589 + } + }, + "code": "200", + "host": "172.18.0.2:6443", + "method": "PUT" + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 634, + "100000": 633, + "1000000": 633, + "15000000": 634, + "2000000": 633, + "25000": 633, + "250000": 633, + "30000000": 634, + "4000000": 634, + "5000": 620, + "500000": 633, + "60000000": 634, + "8000000": 634 + }, + "count": 634, + "sum": 4443225.512000004 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 634, + "1024": 634, + "1048576": 634, + "16384": 634, + "16777216": 634, + "256": 634, + "262144": 634, + "4096": 634, + "4194304": 634, + "512": 634, + "64": 634, + "65536": 634 + }, + "count": 634, + "sum": 0 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 634, + "1024": 629, + "1048576": 634, + "16384": 634, + "16777216": 634, + "256": 33, + "262144": 634, + "4096": 634, + "4194304": 634, + "512": 628, + "64": 9, + "65536": 634 + }, + "count": 634, + "sum": 271449 + } + } + } + }, + "host": "172.18.0.2:6443", + "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": { + "client": { + "request": { + "count": 21 + } + }, + "code": "201", + "host": "172.18.0.2:6443", + "method": "POST" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "process": { + "cpu": { + "sec": 8 + }, + "fds": { + "max": { + "count": 1048576 + }, + "open": { + "count": 11 + } + }, + "memory": { + "resident": { + "bytes": 58523648 + }, + "virtual": { + "bytes": 785260544 + } + }, + "started": { + "sec": 1691572169.15 + } + }, + "scheduling": { + "preemption": { + "attempts": { + "count": 3 + }, + "victims": { + "bucket": { + "+Inf": 0, + "1": 0, + "16": 0, + "2": 0, + "32": 0, + "4": 0, + "64": 0, + "8": 0 + }, + "count": 0, + "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": { + "queue": "gated", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } + } + } + }, + "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": { + "duration": { + "us": { + "bucket": { + "+Inf": 589, + "100000": 589, + "1000000": 589, + "15000000": 589, + "2000000": 589, + "25000": 588, + "250000": 589, + "30000000": 589, + "4000000": 589, + "5000": 50, + "500000": 589, + "60000000": 589, + "8000000": 589 + }, + "count": 589, + "sum": 5999108.381000003 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 589, + "1024": 589, + "1048576": 589, + "16384": 589, + "16777216": 589, + "256": 0, + "262144": 589, + "4096": 589, + "4194304": 589, + "512": 589, + "64": 0, + "65536": 589 + }, + "count": 589, + "sum": 250590 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 589, + "1024": 589, + "1048576": 589, + "16384": 589, + "16777216": 589, + "256": 0, + "262144": 589, + "4096": 589, + "4194304": 589, + "512": 589, + "64": 0, + "65536": 589 + }, + "count": 589, + "sum": 250591 + } + } + } + }, + "host": "172.18.0.2:6443", + "verb": "PUT" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "leader": { + "is_master": true + }, + "name": "kube-scheduler" + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "profile": "default-scheduler", + "result": "unschedulable", + "scheduling": { + "attempts": { + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "1000": 3, + "1024000": 3, + "128000": 3, + "16000": 3, + "16384000": 3, + "2000": 3, + "2048000": 3, + "256000": 3, + "32000": 3, + "4000": 3, + "4096000": 3, + "512000": 3, + "64000": 3, + "8000": 3, + "8192000": 3 + }, + "count": 3, + "sum": 695.5989999999999 + } + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "queue": "unschedulable", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "name": "RequestHeaderAuthRequestController", + "workqueue": { + "adds": { + "count": 0 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } + }, + "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": 29 + } + }, + "code": "403", + "host": "172.18.0.2: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": { + "queue": "backoff", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } + } + } + }, + "Index": "", + "ID": "", + "Namespace": "", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": null, + "MetricSetFields": { + "profile": "default-scheduler", + "result": "scheduled", + "scheduling": { + "attempts": { + "duration": { + "us": { + "bucket": { + "+Inf": 6, + "1000": 0, + "1024000": 6, + "128000": 6, + "16000": 6, + "16384000": 6, + "2000": 0, + "2048000": 6, + "256000": 6, + "32000": 6, + "4000": 0, + "4096000": 6, + "512000": 6, + "64000": 6, + "8000": 2, + "8192000": 6 + }, + "count": 6, + "sum": 52896.684 + } + } + } + } + }, + "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": 650 + } + }, + "code": "200", + "host": "172.18.0.2: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": { + "queue": "active", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } + } + } + }, + "Index": "", + "ID": "", + "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/scheduler/_meta/testdata/docs.plain b/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain index 34d26ade173..a27a0ff92c9 100644 --- a/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain +++ b/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain @@ -1,3 +1,6 @@ +# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated +# TYPE aggregator_discovery_aggregation_count_total counter +aggregator_discovery_aggregation_count_total 0 # HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. # TYPE apiserver_audit_event_total counter apiserver_audit_event_total 0 @@ -25,36 +28,36 @@ apiserver_client_certificate_expiration_seconds_sum 0 apiserver_client_certificate_expiration_seconds_count 0 # HELP apiserver_delegated_authn_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. # TYPE apiserver_delegated_authn_request_duration_seconds histogram -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 119 -apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 119 -apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.33122635699999986 -apiserver_delegated_authn_request_duration_seconds_count{code="201"} 119 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authn_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authn_request_duration_seconds_sum{code="201"} 0.006375487 +apiserver_delegated_authn_request_duration_seconds_count{code="201"} 2 # HELP apiserver_delegated_authn_request_total [ALPHA] Number of HTTP requests partitioned by status code. # TYPE apiserver_delegated_authn_request_total counter -apiserver_delegated_authn_request_total{code="201"} 119 +apiserver_delegated_authn_request_total{code="201"} 2 # HELP apiserver_delegated_authz_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by status code. # TYPE apiserver_delegated_authz_request_duration_seconds histogram -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 119 -apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 119 -apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.26759214700000017 -apiserver_delegated_authz_request_duration_seconds_count{code="201"} 119 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.25"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="0.7"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="1.5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="3"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="5"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="10"} 2 +apiserver_delegated_authz_request_duration_seconds_bucket{code="201",le="+Inf"} 2 +apiserver_delegated_authz_request_duration_seconds_sum{code="201"} 0.007088867 +apiserver_delegated_authz_request_duration_seconds_count{code="201"} 2 # HELP apiserver_delegated_authz_request_total [ALPHA] Number of HTTP requests partitioned by status code. # TYPE apiserver_delegated_authz_request_total counter -apiserver_delegated_authz_request_total{code="201"} 119 +apiserver_delegated_authz_request_total{code="201"} 2 # HELP apiserver_envelope_encryption_dek_cache_fill_percent [ALPHA] Percent of the cache slots currently occupied by cached DEKs. # TYPE apiserver_envelope_encryption_dek_cache_fill_percent gauge apiserver_envelope_encryption_dek_cache_fill_percent 0 @@ -91,187 +94,220 @@ apiserver_webhooks_x509_insecure_sha1_total 0 apiserver_webhooks_x509_missing_san_total 0 # HELP authenticated_user_requests [ALPHA] Counter of authenticated requests broken out by username. # TYPE authenticated_user_requests counter -authenticated_user_requests{username="other"} 507 +authenticated_user_requests{username="other"} 121 # HELP authentication_attempts [ALPHA] Counter of authenticated attempts. # TYPE authentication_attempts counter -authentication_attempts{result="success"} 507 +authentication_attempts{result="success"} 121 # HELP authentication_duration_seconds [ALPHA] Authentication duration in seconds broken out by result. # TYPE authentication_duration_seconds histogram -authentication_duration_seconds_bucket{result="success",le="0.001"} 388 -authentication_duration_seconds_bucket{result="success",le="0.002"} 389 -authentication_duration_seconds_bucket{result="success",le="0.004"} 500 -authentication_duration_seconds_bucket{result="success",le="0.008"} 507 -authentication_duration_seconds_bucket{result="success",le="0.016"} 507 -authentication_duration_seconds_bucket{result="success",le="0.032"} 507 -authentication_duration_seconds_bucket{result="success",le="0.064"} 507 -authentication_duration_seconds_bucket{result="success",le="0.128"} 507 -authentication_duration_seconds_bucket{result="success",le="0.256"} 507 -authentication_duration_seconds_bucket{result="success",le="0.512"} 507 -authentication_duration_seconds_bucket{result="success",le="1.024"} 507 -authentication_duration_seconds_bucket{result="success",le="2.048"} 507 -authentication_duration_seconds_bucket{result="success",le="4.096"} 507 -authentication_duration_seconds_bucket{result="success",le="8.192"} 507 -authentication_duration_seconds_bucket{result="success",le="16.384"} 507 -authentication_duration_seconds_bucket{result="success",le="+Inf"} 507 -authentication_duration_seconds_sum{result="success"} 0.3685639910000003 -authentication_duration_seconds_count{result="success"} 507 +authentication_duration_seconds_bucket{result="success",le="0.001"} 120 +authentication_duration_seconds_bucket{result="success",le="0.002"} 120 +authentication_duration_seconds_bucket{result="success",le="0.004"} 121 +authentication_duration_seconds_bucket{result="success",le="0.008"} 121 +authentication_duration_seconds_bucket{result="success",le="0.016"} 121 +authentication_duration_seconds_bucket{result="success",le="0.032"} 121 +authentication_duration_seconds_bucket{result="success",le="0.064"} 121 +authentication_duration_seconds_bucket{result="success",le="0.128"} 121 +authentication_duration_seconds_bucket{result="success",le="0.256"} 121 +authentication_duration_seconds_bucket{result="success",le="0.512"} 121 +authentication_duration_seconds_bucket{result="success",le="1.024"} 121 +authentication_duration_seconds_bucket{result="success",le="2.048"} 121 +authentication_duration_seconds_bucket{result="success",le="4.096"} 121 +authentication_duration_seconds_bucket{result="success",le="8.192"} 121 +authentication_duration_seconds_bucket{result="success",le="16.384"} 121 +authentication_duration_seconds_bucket{result="success",le="+Inf"} 121 +authentication_duration_seconds_sum{result="success"} 0.007299385000000001 +authentication_duration_seconds_count{result="success"} 121 # HELP authentication_token_cache_active_fetch_count [ALPHA] # TYPE authentication_token_cache_active_fetch_count gauge authentication_token_cache_active_fetch_count{status="blocked"} 0 authentication_token_cache_active_fetch_count{status="in_flight"} 0 # HELP authentication_token_cache_fetch_total [ALPHA] # TYPE authentication_token_cache_fetch_total counter -authentication_token_cache_fetch_total{status="ok"} 119 +authentication_token_cache_fetch_total{status="ok"} 2 # HELP authentication_token_cache_request_duration_seconds [ALPHA] # TYPE authentication_token_cache_request_duration_seconds histogram -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 117 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.005"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.01"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.025"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.05"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.25"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="0.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="1"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="2.5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="5"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="10"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="hit",le="+Inf"} 1 authentication_token_cache_request_duration_seconds_sum{status="hit"} 0 -authentication_token_cache_request_duration_seconds_count{status="hit"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 117 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 119 -authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 119 -authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.2920000000000002 -authentication_token_cache_request_duration_seconds_count{status="miss"} 119 +authentication_token_cache_request_duration_seconds_count{status="hit"} 1 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.005"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.01"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.025"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.05"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.25"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="0.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="1"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="2.5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="5"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="10"} 2 +authentication_token_cache_request_duration_seconds_bucket{status="miss",le="+Inf"} 2 +authentication_token_cache_request_duration_seconds_sum{status="miss"} 0.006 +authentication_token_cache_request_duration_seconds_count{status="miss"} 2 # HELP authentication_token_cache_request_total [ALPHA] # TYPE authentication_token_cache_request_total counter -authentication_token_cache_request_total{status="hit"} 117 -authentication_token_cache_request_total{status="miss"} 119 +authentication_token_cache_request_total{status="hit"} 1 +authentication_token_cache_request_total{status="miss"} 2 +# HELP disabled_metric_total [ALPHA] The count of disabled metrics. +# TYPE disabled_metric_total counter +disabled_metric_total 0 # HELP go_cgo_go_to_c_calls_calls_total Count of calls made from Go to C by the current process. # TYPE go_cgo_go_to_c_calls_calls_total counter go_cgo_go_to_c_calls_calls_total 0 +# HELP go_cpu_classes_gc_mark_assist_cpu_seconds_total Estimated total CPU time goroutines spent performing GC tasks to assist the GC and prevent it from falling behind the application. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_assist_cpu_seconds_total counter +go_cpu_classes_gc_mark_assist_cpu_seconds_total 0.008079706 +# HELP go_cpu_classes_gc_mark_dedicated_cpu_seconds_total Estimated total CPU time spent performing GC tasks on processors (as defined by GOMAXPROCS) dedicated to those tasks. This includes time spent with the world stopped due to the GC. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_dedicated_cpu_seconds_total counter +go_cpu_classes_gc_mark_dedicated_cpu_seconds_total 0.086176314 +# HELP go_cpu_classes_gc_mark_idle_cpu_seconds_total Estimated total CPU time spent performing GC tasks on spare CPU resources that the Go scheduler could not otherwise find a use for. This should be subtracted from the total GC CPU time to obtain a measure of compulsory GC CPU time. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_mark_idle_cpu_seconds_total counter +go_cpu_classes_gc_mark_idle_cpu_seconds_total 0.019868985 +# HELP go_cpu_classes_gc_pause_cpu_seconds_total Estimated total CPU time spent with the application paused by the GC. Even if only one thread is running during the pause, this is computed as GOMAXPROCS times the pause latency because nothing else can be executing. This is the exact sum of samples in /gc/pause:seconds if each sample is multiplied by GOMAXPROCS at the time it is taken. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_gc_pause_cpu_seconds_total counter +go_cpu_classes_gc_pause_cpu_seconds_total 0.024395008 +# HELP go_cpu_classes_gc_total_cpu_seconds_total Estimated total CPU time spent performing GC tasks. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/gc. +# TYPE go_cpu_classes_gc_total_cpu_seconds_total counter +go_cpu_classes_gc_total_cpu_seconds_total 0.138520013 +# HELP go_cpu_classes_idle_cpu_seconds_total Estimated total available CPU time not spent executing any Go or Go runtime code. In other words, the part of /cpu/classes/total:cpu-seconds that was unused. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_idle_cpu_seconds_total counter +go_cpu_classes_idle_cpu_seconds_total 7713.429833094 +# HELP go_cpu_classes_scavenge_assist_cpu_seconds_total Estimated total CPU time spent returning unused memory to the underlying platform in response eagerly in response to memory pressure. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_assist_cpu_seconds_total counter +go_cpu_classes_scavenge_assist_cpu_seconds_total 4.43e-07 +# HELP go_cpu_classes_scavenge_background_cpu_seconds_total Estimated total CPU time spent performing background tasks to return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_scavenge_background_cpu_seconds_total counter +go_cpu_classes_scavenge_background_cpu_seconds_total 0.001458433 +# HELP go_cpu_classes_scavenge_total_cpu_seconds_total Estimated total CPU time spent performing tasks that return unused memory to the underlying platform. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes/scavenge. +# TYPE go_cpu_classes_scavenge_total_cpu_seconds_total counter +go_cpu_classes_scavenge_total_cpu_seconds_total 0.001458876 +# HELP go_cpu_classes_total_cpu_seconds_total Estimated total available CPU time for user Go code or the Go runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS integrated over the wall-clock duration this process has been executing for. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. Sum of all metrics in /cpu/classes. +# TYPE go_cpu_classes_total_cpu_seconds_total counter +go_cpu_classes_total_cpu_seconds_total 8817.213977184 +# HELP go_cpu_classes_user_cpu_seconds_total Estimated total CPU time spent running user Go code. This may also include some small amount of time spent in the Go runtime. This metric is an overestimate, and not directly comparable to system CPU time measurements. Compare only with other /cpu/classes metrics. +# TYPE go_cpu_classes_user_cpu_seconds_total counter +go_cpu_classes_user_cpu_seconds_total 1103.644165201 # HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime. # TYPE go_gc_cycles_automatic_gc_cycles_total counter -go_gc_cycles_automatic_gc_cycles_total 41 +go_gc_cycles_automatic_gc_cycles_total 20 # HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application. # TYPE go_gc_cycles_forced_gc_cycles_total counter go_gc_cycles_forced_gc_cycles_total 0 # HELP go_gc_cycles_total_gc_cycles_total Count of all completed GC cycles. # TYPE go_gc_cycles_total_gc_cycles_total counter -go_gc_cycles_total_gc_cycles_total 41 +go_gc_cycles_total_gc_cycles_total 20 # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary -go_gc_duration_seconds{quantile="0"} 4.7464e-05 -go_gc_duration_seconds{quantile="0.25"} 8.3248e-05 -go_gc_duration_seconds{quantile="0.5"} 0.000106577 -go_gc_duration_seconds{quantile="0.75"} 0.000129668 -go_gc_duration_seconds{quantile="1"} 0.001131829 -go_gc_duration_seconds_sum 0.005994 -go_gc_duration_seconds_count 41 -# HELP go_gc_heap_allocs_by_size_bytes_total Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_allocs_by_size_bytes_total histogram -go_gc_heap_allocs_by_size_bytes_total_bucket{le="8.999999999999998"} 41819 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="24.999999999999996"} 746098 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="64.99999999999999"} 1.32204e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="144.99999999999997"} 1.695358e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="320.99999999999994"} 1.801169e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="704.9999999999999"} 1.837913e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="1536.9999999999998"} 1.847263e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="3200.9999999999995"} 1.849925e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="6528.999999999999"} 1.852682e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="13568.999999999998"} 1.85334e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="27264.999999999996"} 1.853863e+06 -go_gc_heap_allocs_by_size_bytes_total_bucket{le="+Inf"} 1.854197e+06 -go_gc_heap_allocs_by_size_bytes_total_sum 2.32318648e+08 -go_gc_heap_allocs_by_size_bytes_total_count 1.854197e+06 +go_gc_duration_seconds{quantile="0"} 4.8356e-05 +go_gc_duration_seconds{quantile="0.25"} 8.5317e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000127535 +go_gc_duration_seconds{quantile="0.75"} 0.000222715 +go_gc_duration_seconds{quantile="1"} 0.000325782 +go_gc_duration_seconds_sum 0.003049376 +go_gc_duration_seconds_count 20 +# HELP go_gc_heap_allocs_by_size_bytes Distribution of heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_allocs_by_size_bytes histogram +go_gc_heap_allocs_by_size_bytes_bucket{le="8.999999999999998"} 8495 +go_gc_heap_allocs_by_size_bytes_bucket{le="24.999999999999996"} 191251 +go_gc_heap_allocs_by_size_bytes_bucket{le="64.99999999999999"} 358479 +go_gc_heap_allocs_by_size_bytes_bucket{le="144.99999999999997"} 492192 +go_gc_heap_allocs_by_size_bytes_bucket{le="320.99999999999994"} 563573 +go_gc_heap_allocs_by_size_bytes_bucket{le="704.9999999999999"} 577807 +go_gc_heap_allocs_by_size_bytes_bucket{le="1536.9999999999998"} 580583 +go_gc_heap_allocs_by_size_bytes_bucket{le="3200.9999999999995"} 581466 +go_gc_heap_allocs_by_size_bytes_bucket{le="6528.999999999999"} 583279 +go_gc_heap_allocs_by_size_bytes_bucket{le="13568.999999999998"} 583421 +go_gc_heap_allocs_by_size_bytes_bucket{le="27264.999999999996"} 583478 +go_gc_heap_allocs_by_size_bytes_bucket{le="+Inf"} 583536 +go_gc_heap_allocs_by_size_bytes_sum 6.8647168e+07 +go_gc_heap_allocs_by_size_bytes_count 583536 # HELP go_gc_heap_allocs_bytes_total Cumulative sum of memory allocated to the heap by the application. # TYPE go_gc_heap_allocs_bytes_total counter -go_gc_heap_allocs_bytes_total 2.32318648e+08 +go_gc_heap_allocs_bytes_total 6.8647168e+07 # HELP go_gc_heap_allocs_objects_total Cumulative count of heap allocations triggered by the application. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_allocs_objects_total counter -go_gc_heap_allocs_objects_total 1.854197e+06 -# HELP go_gc_heap_frees_by_size_bytes_total Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. -# TYPE go_gc_heap_frees_by_size_bytes_total histogram -go_gc_heap_frees_by_size_bytes_total_bucket{le="8.999999999999998"} 39499 -go_gc_heap_frees_by_size_bytes_total_bucket{le="24.999999999999996"} 729999 -go_gc_heap_frees_by_size_bytes_total_bucket{le="64.99999999999999"} 1.295546e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="144.99999999999997"} 1.66386e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="320.99999999999994"} 1.767238e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="704.9999999999999"} 1.802711e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="1536.9999999999998"} 1.811716e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="3200.9999999999995"} 1.814174e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="6528.999999999999"} 1.816821e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="13568.999999999998"} 1.817426e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="27264.999999999996"} 1.817909e+06 -go_gc_heap_frees_by_size_bytes_total_bucket{le="+Inf"} 1.818208e+06 -go_gc_heap_frees_by_size_bytes_total_sum 2.21141744e+08 -go_gc_heap_frees_by_size_bytes_total_count 1.818208e+06 +go_gc_heap_allocs_objects_total 583536 +# HELP go_gc_heap_frees_by_size_bytes Distribution of freed heap allocations by approximate size. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. +# TYPE go_gc_heap_frees_by_size_bytes histogram +go_gc_heap_frees_by_size_bytes_bucket{le="8.999999999999998"} 5837 +go_gc_heap_frees_by_size_bytes_bucket{le="24.999999999999996"} 163562 +go_gc_heap_frees_by_size_bytes_bucket{le="64.99999999999999"} 308952 +go_gc_heap_frees_by_size_bytes_bucket{le="144.99999999999997"} 429271 +go_gc_heap_frees_by_size_bytes_bucket{le="320.99999999999994"} 496853 +go_gc_heap_frees_by_size_bytes_bucket{le="704.9999999999999"} 509217 +go_gc_heap_frees_by_size_bytes_bucket{le="1536.9999999999998"} 511566 +go_gc_heap_frees_by_size_bytes_bucket{le="3200.9999999999995"} 512219 +go_gc_heap_frees_by_size_bytes_bucket{le="6528.999999999999"} 513926 +go_gc_heap_frees_by_size_bytes_bucket{le="13568.999999999998"} 514008 +go_gc_heap_frees_by_size_bytes_bucket{le="27264.999999999996"} 514024 +go_gc_heap_frees_by_size_bytes_bucket{le="+Inf"} 514066 +go_gc_heap_frees_by_size_bytes_sum 5.9847008e+07 +go_gc_heap_frees_by_size_bytes_count 514066 # HELP go_gc_heap_frees_bytes_total Cumulative sum of heap memory freed by the garbage collector. # TYPE go_gc_heap_frees_bytes_total counter -go_gc_heap_frees_bytes_total 2.21141744e+08 +go_gc_heap_frees_bytes_total 5.9847008e+07 # HELP go_gc_heap_frees_objects_total Cumulative count of heap allocations whose storage was freed by the garbage collector. Note that this does not include tiny objects as defined by /gc/heap/tiny/allocs:objects, only tiny blocks. # TYPE go_gc_heap_frees_objects_total counter -go_gc_heap_frees_objects_total 1.818208e+06 +go_gc_heap_frees_objects_total 514066 # HELP go_gc_heap_goal_bytes Heap size target for the end of the GC cycle. # TYPE go_gc_heap_goal_bytes gauge -go_gc_heap_goal_bytes 1.910848e+07 +go_gc_heap_goal_bytes 1.2893368e+07 # HELP go_gc_heap_objects_objects Number of objects, live or unswept, occupying heap memory. # TYPE go_gc_heap_objects_objects gauge -go_gc_heap_objects_objects 35989 +go_gc_heap_objects_objects 69470 # HELP go_gc_heap_tiny_allocs_objects_total Count of small allocations that are packed together into blocks. These allocations are counted separately from other allocations because each individual allocation is not tracked by the runtime, only their block. Each block is already accounted for in allocs-by-size and frees-by-size. # TYPE go_gc_heap_tiny_allocs_objects_total counter -go_gc_heap_tiny_allocs_objects_total 303774 +go_gc_heap_tiny_allocs_objects_total 53436 # HELP go_gc_limiter_last_enabled_gc_cycle GC cycle the last time the GC CPU limiter was enabled. This metric is useful for diagnosing the root cause of an out-of-memory error, because the limiter trades memory for CPU time when the GC's CPU time gets too high. This is most likely to occur with use of SetMemoryLimit. The first GC cycle is cycle 1, so a value of 0 indicates that it was never enabled. # TYPE go_gc_limiter_last_enabled_gc_cycle gauge go_gc_limiter_last_enabled_gc_cycle 0 -# HELP go_gc_pauses_seconds_total Distribution individual GC-related stop-the-world pause latencies. -# TYPE go_gc_pauses_seconds_total histogram -go_gc_pauses_seconds_total_bucket{le="-5e-324"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-10"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999999e-09"} 0 -go_gc_pauses_seconds_total_bucket{le="9.999999999999998e-08"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-06"} 0 -go_gc_pauses_seconds_total_bucket{le="1.0239999999999999e-05"} 15 -go_gc_pauses_seconds_total_bucket{le="0.00010239999999999998"} 68 -go_gc_pauses_seconds_total_bucket{le="0.0010485759999999998"} 82 -go_gc_pauses_seconds_total_bucket{le="0.010485759999999998"} 82 -go_gc_pauses_seconds_total_bucket{le="0.10485759999999998"} 82 -go_gc_pauses_seconds_total_bucket{le="+Inf"} 82 -go_gc_pauses_seconds_total_sum NaN -go_gc_pauses_seconds_total_count 82 +# HELP go_gc_pauses_seconds Distribution individual GC-related stop-the-world pause latencies. +# TYPE go_gc_pauses_seconds histogram +go_gc_pauses_seconds_bucket{le="6.399999999999999e-08"} 0 +go_gc_pauses_seconds_bucket{le="6.399999999999999e-07"} 0 +go_gc_pauses_seconds_bucket{le="7.167999999999999e-06"} 7 +go_gc_pauses_seconds_bucket{le="8.191999999999999e-05"} 29 +go_gc_pauses_seconds_bucket{le="0.0009175039999999999"} 40 +go_gc_pauses_seconds_bucket{le="0.010485759999999998"} 40 +go_gc_pauses_seconds_bucket{le="0.11744051199999998"} 40 +go_gc_pauses_seconds_bucket{le="+Inf"} 40 +go_gc_pauses_seconds_sum 0.001063296 +go_gc_pauses_seconds_count 40 # HELP go_gc_stack_starting_size_bytes The stack size of new goroutines. # TYPE go_gc_stack_starting_size_bytes gauge go_gc_stack_starting_size_bytes 2048 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge -go_goroutines 173 +go_goroutines 172 # HELP go_info Information about the Go environment. # TYPE go_info gauge -go_info{version="go1.19.2"} 1 +go_info{version="go1.20.3"} 1 # HELP go_memory_classes_heap_free_bytes Memory that is completely free and eligible to be returned to the underlying system, but has not been. This metric is the runtime's estimate of free address space that is backed by physical memory. # TYPE go_memory_classes_heap_free_bytes gauge -go_memory_classes_heap_free_bytes 4.251648e+06 +go_memory_classes_heap_free_bytes 655360 # HELP go_memory_classes_heap_objects_bytes Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. # TYPE go_memory_classes_heap_objects_bytes gauge -go_memory_classes_heap_objects_bytes 1.1176904e+07 +go_memory_classes_heap_objects_bytes 8.80016e+06 # HELP go_memory_classes_heap_released_bytes Memory that is completely free and has been returned to the underlying system. This metric is the runtime's estimate of free address space that is still mapped into the process, but is not backed by physical memory. # TYPE go_memory_classes_heap_released_bytes gauge -go_memory_classes_heap_released_bytes 6.144e+06 +go_memory_classes_heap_released_bytes 5.914624e+06 # HELP go_memory_classes_heap_stacks_bytes Memory allocated from the heap that is reserved for stack space, whether or not it is currently in-use. # TYPE go_memory_classes_heap_stacks_bytes gauge -go_memory_classes_heap_stacks_bytes 1.80224e+06 +go_memory_classes_heap_stacks_bytes 1.6384e+06 # HELP go_memory_classes_heap_unused_bytes Memory that is reserved for heap objects but is not currently used to hold heap objects. # TYPE go_memory_classes_heap_unused_bytes gauge -go_memory_classes_heap_unused_bytes 5.985336e+06 +go_memory_classes_heap_unused_bytes 3.962976e+06 # HELP go_memory_classes_metadata_mcache_free_bytes Memory that is reserved for runtime mcache structures, but not in-use. # TYPE go_memory_classes_metadata_mcache_free_bytes gauge go_memory_classes_metadata_mcache_free_bytes 6000 @@ -280,70 +316,67 @@ go_memory_classes_metadata_mcache_free_bytes 6000 go_memory_classes_metadata_mcache_inuse_bytes 9600 # HELP go_memory_classes_metadata_mspan_free_bytes Memory that is reserved for runtime mspan structures, but not in-use. # TYPE go_memory_classes_metadata_mspan_free_bytes gauge -go_memory_classes_metadata_mspan_free_bytes 48280 +go_memory_classes_metadata_mspan_free_bytes 8640 # HELP go_memory_classes_metadata_mspan_inuse_bytes Memory that is occupied by runtime mspan structures that are currently being used. # TYPE go_memory_classes_metadata_mspan_inuse_bytes gauge -go_memory_classes_metadata_mspan_inuse_bytes 229160 +go_memory_classes_metadata_mspan_inuse_bytes 268800 # HELP go_memory_classes_metadata_other_bytes Memory that is reserved for or used to hold runtime metadata. # TYPE go_memory_classes_metadata_other_bytes gauge -go_memory_classes_metadata_other_bytes 1.0065592e+07 +go_memory_classes_metadata_other_bytes 8.957288e+06 # HELP go_memory_classes_os_stacks_bytes Stack memory allocated by the underlying operating system. # TYPE go_memory_classes_os_stacks_bytes gauge go_memory_classes_os_stacks_bytes 0 # HELP go_memory_classes_other_bytes Memory used by execution trace buffers, structures for debugging the runtime, finalizer and profiler specials, and more. # TYPE go_memory_classes_other_bytes gauge -go_memory_classes_other_bytes 1.83414e+06 +go_memory_classes_other_bytes 1.433287e+06 # HELP go_memory_classes_profiling_buckets_bytes Memory that is used by the stack trace hash map used for profiling. # TYPE go_memory_classes_profiling_buckets_bytes gauge -go_memory_classes_profiling_buckets_bytes 1.550596e+06 +go_memory_classes_profiling_buckets_bytes 1.503273e+06 # HELP go_memory_classes_total_bytes All memory mapped by the Go runtime into the current process as read-write. Note that this does not include memory mapped by code called via cgo or via the syscall package. Sum of all metrics in /memory/classes. # TYPE go_memory_classes_total_bytes gauge -go_memory_classes_total_bytes 4.3103496e+07 +go_memory_classes_total_bytes 3.3158408e+07 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge -go_memstats_alloc_bytes 1.1176904e+07 +go_memstats_alloc_bytes 8.80016e+06 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter -go_memstats_alloc_bytes_total 2.32318648e+08 +go_memstats_alloc_bytes_total 6.8647168e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge -go_memstats_buck_hash_sys_bytes 1.550596e+06 +go_memstats_buck_hash_sys_bytes 1.503273e+06 # HELP go_memstats_frees_total Total number of frees. # TYPE go_memstats_frees_total counter -go_memstats_frees_total 2.121982e+06 -# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started. -# TYPE go_memstats_gc_cpu_fraction gauge -go_memstats_gc_cpu_fraction 0 +go_memstats_frees_total 567502 # HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. # TYPE go_memstats_gc_sys_bytes gauge -go_memstats_gc_sys_bytes 1.0065592e+07 +go_memstats_gc_sys_bytes 8.957288e+06 # HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. # TYPE go_memstats_heap_alloc_bytes gauge -go_memstats_heap_alloc_bytes 1.1176904e+07 +go_memstats_heap_alloc_bytes 8.80016e+06 # HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. # TYPE go_memstats_heap_idle_bytes gauge -go_memstats_heap_idle_bytes 1.0395648e+07 +go_memstats_heap_idle_bytes 6.569984e+06 # HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. # TYPE go_memstats_heap_inuse_bytes gauge -go_memstats_heap_inuse_bytes 1.716224e+07 +go_memstats_heap_inuse_bytes 1.2763136e+07 # HELP go_memstats_heap_objects Number of allocated objects. # TYPE go_memstats_heap_objects gauge -go_memstats_heap_objects 35989 +go_memstats_heap_objects 69470 # HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. # TYPE go_memstats_heap_released_bytes gauge -go_memstats_heap_released_bytes 6.144e+06 +go_memstats_heap_released_bytes 5.914624e+06 # HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. # TYPE go_memstats_heap_sys_bytes gauge -go_memstats_heap_sys_bytes 2.7557888e+07 +go_memstats_heap_sys_bytes 1.933312e+07 # HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. # TYPE go_memstats_last_gc_time_seconds gauge -go_memstats_last_gc_time_seconds 1.6717282122015142e+09 +go_memstats_last_gc_time_seconds 1.6915732718005395e+09 # HELP go_memstats_lookups_total Total number of pointer lookups. # TYPE go_memstats_lookups_total counter go_memstats_lookups_total 0 # HELP go_memstats_mallocs_total Total number of mallocs. # TYPE go_memstats_mallocs_total counter -go_memstats_mallocs_total 2.157971e+06 +go_memstats_mallocs_total 636972 # HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. # TYPE go_memstats_mcache_inuse_bytes gauge go_memstats_mcache_inuse_bytes 9600 @@ -352,76 +385,232 @@ go_memstats_mcache_inuse_bytes 9600 go_memstats_mcache_sys_bytes 15600 # HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. # TYPE go_memstats_mspan_inuse_bytes gauge -go_memstats_mspan_inuse_bytes 229160 +go_memstats_mspan_inuse_bytes 268800 # HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. # TYPE go_memstats_mspan_sys_bytes gauge go_memstats_mspan_sys_bytes 277440 # HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. # TYPE go_memstats_next_gc_bytes gauge -go_memstats_next_gc_bytes 1.910848e+07 +go_memstats_next_gc_bytes 1.2893368e+07 # HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. # TYPE go_memstats_other_sys_bytes gauge -go_memstats_other_sys_bytes 1.83414e+06 +go_memstats_other_sys_bytes 1.433287e+06 # HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. # TYPE go_memstats_stack_inuse_bytes gauge -go_memstats_stack_inuse_bytes 1.80224e+06 +go_memstats_stack_inuse_bytes 1.6384e+06 # HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. # TYPE go_memstats_stack_sys_bytes gauge -go_memstats_stack_sys_bytes 1.80224e+06 +go_memstats_stack_sys_bytes 1.6384e+06 # HELP go_memstats_sys_bytes Number of bytes obtained from system. # TYPE go_memstats_sys_bytes gauge -go_memstats_sys_bytes 4.3103496e+07 +go_memstats_sys_bytes 3.3158408e+07 # HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. # TYPE go_sched_gomaxprocs_threads gauge go_sched_gomaxprocs_threads 8 # HELP go_sched_goroutines_goroutines Count of live goroutines. # TYPE go_sched_goroutines_goroutines gauge -go_sched_goroutines_goroutines 173 +go_sched_goroutines_goroutines 172 # HELP go_sched_latencies_seconds Distribution of the time goroutines have spent in the scheduler in a runnable state before actually running. # TYPE go_sched_latencies_seconds histogram -go_sched_latencies_seconds_bucket{le="-5e-324"} 0 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-10"} 5491 -go_sched_latencies_seconds_bucket{le="9.999999999999999e-09"} 5491 -go_sched_latencies_seconds_bucket{le="9.999999999999998e-08"} 5584 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-06"} 11017 -go_sched_latencies_seconds_bucket{le="1.0239999999999999e-05"} 13999 -go_sched_latencies_seconds_bucket{le="0.00010239999999999998"} 19402 -go_sched_latencies_seconds_bucket{le="0.0010485759999999998"} 20145 -go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 20148 -go_sched_latencies_seconds_bucket{le="0.10485759999999998"} 20149 -go_sched_latencies_seconds_bucket{le="+Inf"} 20149 -go_sched_latencies_seconds_sum NaN -go_sched_latencies_seconds_count 20149 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-08"} 2372 +go_sched_latencies_seconds_bucket{le="6.399999999999999e-07"} 2635 +go_sched_latencies_seconds_bucket{le="7.167999999999999e-06"} 3677 +go_sched_latencies_seconds_bucket{le="8.191999999999999e-05"} 6413 +go_sched_latencies_seconds_bucket{le="0.0009175039999999999"} 6800 +go_sched_latencies_seconds_bucket{le="0.010485759999999998"} 6801 +go_sched_latencies_seconds_bucket{le="0.11744051199999998"} 6801 +go_sched_latencies_seconds_bucket{le="+Inf"} 6801 +go_sched_latencies_seconds_sum 0.052915904 +go_sched_latencies_seconds_count 6801 +# HELP go_sync_mutex_wait_total_seconds_total Approximate cumulative time goroutines have spent blocked on a sync.Mutex or sync.RWMutex. This metric is useful for identifying global changes in lock contention. Collect a mutex or block profile using the runtime/pprof package for more detailed contention data. +# TYPE go_sync_mutex_wait_total_seconds_total counter +go_sync_mutex_wait_total_seconds_total 0.000617744 # HELP go_threads Number of OS threads created. # TYPE go_threads gauge -go_threads 14 +go_threads 13 +# HELP hidden_metric_total [ALPHA] The count of hidden metrics. +# TYPE hidden_metric_total counter +hidden_metric_total 1 # HELP kubernetes_build_info [ALPHA] A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running. # TYPE kubernetes_build_info gauge -kubernetes_build_info{build_date="2022-10-25T19:35:11Z",compiler="gc",git_commit="434bfd82814af038ad94d62ebe59b133fcb50506",git_tree_state="clean",git_version="v1.25.3",go_version="go1.19.2",major="1",minor="25",platform="linux/amd64"} 1 +kubernetes_build_info{build_date="2023-04-11T20:50:51Z",compiler="gc",git_commit="1b4df30b3cdfeaba6024e81e559a6cd09a089d65",git_tree_state="clean",git_version="v1.27.0",go_version="go1.20.3",major="1",minor="27",platform="linux/amd64"} 1 +# HELP kubernetes_feature_enabled [ALPHA] This metric records the data about the stage and enablement of a k8s feature. +# TYPE kubernetes_feature_enabled gauge +kubernetes_feature_enabled{name="APIListChunking",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIPriorityAndFairness",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIResponseCompression",stage="BETA"} 1 +kubernetes_feature_enabled{name="APISelfSubjectReview",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerIdentity",stage="BETA"} 1 +kubernetes_feature_enabled{name="APIServerTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="AdmissionWebhookMatchConditions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AdvancedAuditing",stage=""} 1 +kubernetes_feature_enabled{name="AggregatedDiscoveryEndpoint",stage="BETA"} 1 +kubernetes_feature_enabled{name="AllAlpha",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="AllBeta",stage="BETA"} 0 +kubernetes_feature_enabled{name="AnyVolumeDataSource",stage="BETA"} 1 +kubernetes_feature_enabled{name="AppArmor",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManager",stage=""} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CPUManagerPolicyBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CPUManagerPolicyOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIMigrationAzureFile",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationGCE",stage=""} 1 +kubernetes_feature_enabled{name="CSIMigrationPortworx",stage="BETA"} 0 +kubernetes_feature_enabled{name="CSIMigrationRBD",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CSIMigrationvSphere",stage=""} 1 +kubernetes_feature_enabled{name="CSINodeExpandSecret",stage="BETA"} 1 +kubernetes_feature_enabled{name="CSIStorageCapacity",stage=""} 1 +kubernetes_feature_enabled{name="CSIVolumeHealth",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudControllerManagerWebhook",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CloudDualStackNodeIPs",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ClusterTrustBundle",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ComponentSLIs",stage="BETA"} 1 +kubernetes_feature_enabled{name="ConsistentHTTPGetHandlers",stage=""} 1 +kubernetes_feature_enabled{name="ContainerCheckpoint",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ContextualLogging",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CronJobTimeZone",stage=""} 1 +kubernetes_feature_enabled{name="CrossNamespaceVolumeDataSource",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomCPUCFSQuotaPeriod",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="CustomResourceValidationExpressions",stage="BETA"} 1 +kubernetes_feature_enabled{name="DelegateFSGroupToCSIDriver",stage=""} 1 +kubernetes_feature_enabled{name="DevicePlugins",stage=""} 1 +kubernetes_feature_enabled{name="DisableAcceleratorUsageMetrics",stage=""} 1 +kubernetes_feature_enabled{name="DisableCloudProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DisableKubeletCloudCredentialProviders",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="DownwardAPIHugePages",stage=""} 1 +kubernetes_feature_enabled{name="DryRun",stage=""} 1 +kubernetes_feature_enabled{name="DynamicResourceAllocation",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="EfficientWatchResumption",stage=""} 1 +kubernetes_feature_enabled{name="ElasticIndexedJob",stage="BETA"} 1 +kubernetes_feature_enabled{name="EndpointSliceTerminatingCondition",stage=""} 1 +kubernetes_feature_enabled{name="EventedPLEG",stage="BETA"} 0 +kubernetes_feature_enabled{name="ExecProbeTimeout",stage=""} 1 +kubernetes_feature_enabled{name="ExpandedDNSConfig",stage="BETA"} 1 +kubernetes_feature_enabled{name="ExperimentalHostUserNamespaceDefaulting",stage="BETA"} 0 +kubernetes_feature_enabled{name="GRPCContainerProbe",stage=""} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdown",stage="BETA"} 1 +kubernetes_feature_enabled{name="GracefulNodeShutdownBasedOnPodPriority",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAContainerMetrics",stage="BETA"} 1 +kubernetes_feature_enabled{name="HPAScaleToZero",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="HonorPVReclaimPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="IPTablesOwnershipCleanup",stage="BETA"} 1 +kubernetes_feature_enabled{name="InPlacePodVerticalScaling",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAWSUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureDiskUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginAzureFileUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginGCEUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginOpenStackUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginPortworxUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginRBDUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="InTreePluginvSphereUnregister",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="JobMutableNodeSchedulingDirectives",stage=""} 1 +kubernetes_feature_enabled{name="JobPodFailurePolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobReadyPods",stage="BETA"} 1 +kubernetes_feature_enabled{name="JobTrackingWithFinalizers",stage=""} 1 +kubernetes_feature_enabled{name="KMSv2",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletCredentialProviders",stage=""} 1 +kubernetes_feature_enabled{name="KubeletInUserNamespace",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResources",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletPodResourcesDynamicResources",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="KubeletPodResourcesGetAllocatable",stage="BETA"} 1 +kubernetes_feature_enabled{name="KubeletTracing",stage="BETA"} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenNoAutoGeneration",stage=""} 1 +kubernetes_feature_enabled{name="LegacyServiceAccountTokenTracking",stage="BETA"} 1 +kubernetes_feature_enabled{name="LocalStorageCapacityIsolationFSQuotaMonitoring",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LogarithmicScaleDown",stage="BETA"} 1 +kubernetes_feature_enabled{name="LoggingAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="LoggingBetaOptions",stage="BETA"} 1 +kubernetes_feature_enabled{name="MatchLabelKeysInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MaxUnavailableStatefulSet",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MemoryManager",stage="BETA"} 1 +kubernetes_feature_enabled{name="MemoryQoS",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MinDomainsInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="MinimizeIPTablesRestore",stage="BETA"} 1 +kubernetes_feature_enabled{name="MixedProtocolLBService",stage=""} 1 +kubernetes_feature_enabled{name="MultiCIDRRangeAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="MultiCIDRServiceAllocator",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NetworkPolicyStatus",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NewVolumeManagerReconstruction",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeInclusionPolicyInPodTopologySpread",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeLogQuery",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="NodeOutOfServiceVolumeDetach",stage="BETA"} 1 +kubernetes_feature_enabled{name="NodeSwap",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="OpenAPIEnums",stage="BETA"} 1 +kubernetes_feature_enabled{name="OpenAPIV3",stage=""} 1 +kubernetes_feature_enabled{name="PDBUnhealthyPodEvictionPolicy",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodAndContainerStatsFromCRI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodDeletionCost",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodDisruptionConditions",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodHasNetworkCondition",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="PodSchedulingReadiness",stage="BETA"} 1 +kubernetes_feature_enabled{name="PodSecurity",stage=""} 1 +kubernetes_feature_enabled{name="ProbeTerminationGracePeriod",stage="BETA"} 1 +kubernetes_feature_enabled{name="ProcMountType",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1 +kubernetes_feature_enabled{name="QOSReserved",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="RecoverVolumeExpansionFailure",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="RemainingItemCount",stage="BETA"} 1 +kubernetes_feature_enabled{name="RemoveSelfLink",stage=""} 1 +kubernetes_feature_enabled{name="RetroactiveDefaultStorageClass",stage="BETA"} 1 +kubernetes_feature_enabled{name="RotateKubeletServerCertificate",stage="BETA"} 1 +kubernetes_feature_enabled{name="SELinuxMountReadWriteOncePod",stage="BETA"} 1 +kubernetes_feature_enabled{name="SeccompDefault",stage=""} 1 +kubernetes_feature_enabled{name="SecurityContextDeny",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ServerSideApply",stage=""} 1 +kubernetes_feature_enabled{name="ServerSideFieldValidation",stage=""} 1 +kubernetes_feature_enabled{name="ServiceIPStaticSubrange",stage=""} 1 +kubernetes_feature_enabled{name="ServiceInternalTrafficPolicy",stage=""} 1 +kubernetes_feature_enabled{name="ServiceNodePortStaticSubrange",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="SizeMemoryBackedVolumes",stage="BETA"} 1 +kubernetes_feature_enabled{name="StableLoadBalancerNodeSet",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetAutoDeletePVC",stage="BETA"} 1 +kubernetes_feature_enabled{name="StatefulSetStartOrdinal",stage="BETA"} 1 +kubernetes_feature_enabled{name="StorageVersionAPI",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="StorageVersionHash",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyAwareHints",stage="BETA"} 1 +kubernetes_feature_enabled{name="TopologyManager",stage=""} 1 +kubernetes_feature_enabled{name="TopologyManagerPolicyAlphaOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyBetaOptions",stage="BETA"} 0 +kubernetes_feature_enabled{name="TopologyManagerPolicyOptions",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="UserNamespacesStatelessPodsSupport",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="ValidatingAdmissionPolicy",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="VolumeCapacityPriority",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WatchBookmark",stage=""} 1 +kubernetes_feature_enabled{name="WatchList",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinDSR",stage="ALPHA"} 0 +kubernetes_feature_enabled{name="WinOverlay",stage="BETA"} 1 +kubernetes_feature_enabled{name="WindowsHostNetwork",stage="ALPHA"} 1 +kubernetes_feature_enabled{name="WindowsHostProcessContainers",stage=""} 1 # HELP leader_election_master_status [ALPHA] Gauge of if the reporting system is master of the relevant lease, 0 indicates backup, 1 indicates master. 'name' is the string used to identify the lease. Please make sure to group by name. # TYPE leader_election_master_status gauge leader_election_master_status{name="kube-scheduler"} 1 # HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. # TYPE process_cpu_seconds_total counter -process_cpu_seconds_total 17.31 +process_cpu_seconds_total 8.31 # HELP process_max_fds Maximum number of open file descriptors. # TYPE process_max_fds gauge process_max_fds 1.048576e+06 # HELP process_open_fds Number of open file descriptors. # TYPE process_open_fds gauge -process_open_fds 13 +process_open_fds 11 # HELP process_resident_memory_bytes Resident memory size in bytes. # TYPE process_resident_memory_bytes gauge -process_resident_memory_bytes 6.28736e+07 +process_resident_memory_bytes 5.8523648e+07 # HELP process_start_time_seconds Start time of the process since unix epoch in seconds. # TYPE process_start_time_seconds gauge -process_start_time_seconds 1.67172550595e+09 +process_start_time_seconds 1.69157216915e+09 # HELP process_virtual_memory_bytes Virtual memory size in bytes. # TYPE process_virtual_memory_bytes gauge -process_virtual_memory_bytes 7.79169792e+08 +process_virtual_memory_bytes 7.85260544e+08 # HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. # TYPE process_virtual_memory_max_bytes gauge process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP registered_metric_total [ALPHA] The count of registered metrics broken by stability level and deprecation version. +# TYPE registered_metric_total counter +registered_metric_total{deprecated_version="",stability_level="ALPHA"} 77 +registered_metric_total{deprecated_version="",stability_level="STABLE"} 12 # HELP rest_client_exec_plugin_certificate_rotation_age [ALPHA] Histogram of the number of seconds the last auth exec plugin client certificate lived before being rotated. If auth exec plugin client certificates are unused, histogram will contain no data. # TYPE rest_client_exec_plugin_certificate_rotation_age histogram rest_client_exec_plugin_certificate_rotation_age_bucket{le="600"} 0 @@ -443,21 +632,21 @@ rest_client_exec_plugin_certificate_rotation_age_count 0 rest_client_exec_plugin_ttl_seconds +Inf # HELP rest_client_rate_limiter_duration_seconds [ALPHA] Client side rate limiter latency in seconds. Broken down by verb, and host. # TYPE rest_client_rate_limiter_duration_seconds histogram -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 1393 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 1393 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 0.004619482999999999 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 1393 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 634 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 0.002401599999999998 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 634 rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 3 rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 3 rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 3 @@ -471,55 +660,55 @@ rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PA rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 3 rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 3 rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 9.217999999999999e-06 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 9.098e-06 rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 3 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 255 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 0.0009783420000000003 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 255 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 1350 -rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 1350 -rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.0030941300000000035 -rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 1350 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 8.7868e-05 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 589 +rest_client_rate_limiter_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_rate_limiter_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 0.0015607319999999996 +rest_client_rate_limiter_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 589 # HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb, and host. # TYPE rest_client_request_duration_seconds histogram -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 1368 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 1392 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 1393 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 1393 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 1393 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 1393 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 1393 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 9.18632812299999 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 1393 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.005"} 620 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.025"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.1"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.25"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="0.5"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="1"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="2"} 633 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="4"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="8"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="15"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="30"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="60"} 634 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="GET"} 4.443225512000004 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="GET"} 634 rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.005"} 0 rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.025"} 3 rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="0.1"} 3 @@ -533,54 +722,54 @@ rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH", rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="30"} 3 rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="60"} 3 rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 0.04037545 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PATCH"} 0.036600519000000005 rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PATCH"} 3 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 242 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 255 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 0.653478026 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 255 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 1289 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 1350 -rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 1350 -rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 4.7740565049999955 -rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 1350 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.005"} 6 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.025"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.1"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.25"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="0.5"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="1"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="2"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="4"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="8"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="15"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="30"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="60"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="POST"} 0.12807385899999996 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="POST"} 21 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.005"} 50 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.025"} 588 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.1"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.25"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="0.5"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="1"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="2"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="4"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="8"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="15"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="30"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="60"} 589 +rest_client_request_duration_seconds_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_request_duration_seconds_sum{host="172.18.0.2:6443",verb="PUT"} 5.999108381000003 +rest_client_request_duration_seconds_count{host="172.18.0.2:6443",verb="PUT"} 589 # HELP rest_client_request_size_bytes [ALPHA] Request size in bytes. Broken down by verb and host. # TYPE rest_client_request_size_bytes histogram -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 1393 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 1393 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 634 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 0 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 1393 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 634 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 3 @@ -593,60 +782,60 @@ rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1. rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 3 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 3 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 1026 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 1029 rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 3 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 0 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 7 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 17 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 136 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 255 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 255 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 208805 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 255 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 19 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 21 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 8318 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 21 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 1350 -rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 1350 -rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 574521 -rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 1350 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 589 +rest_client_request_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_request_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 250590 +rest_client_request_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 589 # HELP rest_client_requests_total [ALPHA] Number of HTTP requests, partitioned by status code, method, and host. # TYPE rest_client_requests_total counter -rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 1464 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="GET"} 650 rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PATCH"} 3 -rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 1350 -rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 255 -rest_client_requests_total{code="403",host="172.18.0.2:6443",method="GET"} 27 +rest_client_requests_total{code="200",host="172.18.0.2:6443",method="PUT"} 589 +rest_client_requests_total{code="201",host="172.18.0.2:6443",method="POST"} 21 +rest_client_requests_total{code="403",host="172.18.0.2:6443",method="GET"} 29 rest_client_requests_total{code="404",host="172.18.0.2:6443",method="GET"} 1 # HELP rest_client_response_size_bytes [ALPHA] Response size in bytes. Broken down by verb and host. # TYPE rest_client_response_size_bytes histogram -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 10 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 31 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 1388 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 1389 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 1392 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 1392 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 1393 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 1393 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 1393 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 1393 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 1393 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 1393 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 609699 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 1393 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="64"} 9 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="256"} 33 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="512"} 628 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1024"} 629 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4096"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="16384"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="65536"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="262144"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.048576e+06"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="4.194304e+06"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="1.6777216e+07"} 634 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="GET",le="+Inf"} 634 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="GET"} 271449 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="GET"} 634 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="64"} 0 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="256"} 0 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="512"} 0 @@ -659,36 +848,36 @@ rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="4.194304e+06"} 3 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="1.6777216e+07"} 3 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PATCH",le="+Inf"} 3 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 10897 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PATCH"} 10950 rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PATCH"} 3 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="64"} 6 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="256"} 6 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="512"} 7 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1024"} 17 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 255 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 255 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 348458 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 255 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4096"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="16384"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="65536"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="262144"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.048576e+06"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="4.194304e+06"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="1.6777216e+07"} 21 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="POST",le="+Inf"} 21 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="POST"} 12863 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="POST"} 21 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="64"} 0 rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="256"} 0 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 1350 -rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 1350 -rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 574522 -rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 1350 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="512"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1024"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4096"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="16384"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="65536"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="262144"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.048576e+06"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="4.194304e+06"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="1.6777216e+07"} 589 +rest_client_response_size_bytes_bucket{host="172.18.0.2:6443",verb="PUT",le="+Inf"} 589 +rest_client_response_size_bytes_sum{host="172.18.0.2:6443",verb="PUT"} 250591 +rest_client_response_size_bytes_count{host="172.18.0.2:6443",verb="PUT"} 589 # HELP scheduler_framework_extension_point_duration_seconds [STABLE] Latency for running all plugins of a specific extension point. # TYPE scheduler_framework_extension_point_duration_seconds histogram scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0001"} 0 @@ -697,17 +886,17 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bin scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0008"} 0 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0016"} 0 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0032"} 0 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0064"} 4 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0064"} 0 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0128"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0256"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.0512"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.1024"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="0.2048"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Bind",profile="default-scheduler",status="Success",le="+Inf"} 6 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="Bind",profile="default-scheduler",status="Success"} 0.034327052000000004 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Bind",profile="default-scheduler",status="Success"} 0.050149431999999994 scheduler_framework_extension_point_duration_seconds_count{extension_point="Bind",profile="default-scheduler",status="Success"} 6 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0001"} 7 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0002"} 8 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0001"} 6 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0002"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0004"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0008"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.0016"} 9 @@ -719,7 +908,7 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Fil scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.1024"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="0.2048"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Filter",profile="default-scheduler",status="Success",le="+Inf"} 9 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="Filter",profile="default-scheduler",status="Success"} 0.000739345 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Filter",profile="default-scheduler",status="Success"} 0.0007958830000000002 scheduler_framework_extension_point_duration_seconds_count{extension_point="Filter",profile="default-scheduler",status="Success"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0001"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.0002"} 6 @@ -734,7 +923,7 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Per scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.1024"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="0.2048"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Permit",profile="default-scheduler",status="Success",le="+Inf"} 6 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="Permit",profile="default-scheduler",status="Success"} 7.592e-06 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Permit",profile="default-scheduler",status="Success"} 7.728e-06 scheduler_framework_extension_point_duration_seconds_count{extension_point="Permit",profile="default-scheduler",status="Success"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0001"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.0002"} 6 @@ -749,7 +938,7 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Pos scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.1024"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="0.2048"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostBind",profile="default-scheduler",status="Success",le="+Inf"} 6 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostBind",profile="default-scheduler",status="Success"} 9.288e-06 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostBind",profile="default-scheduler",status="Success"} 7.348e-06 scheduler_framework_extension_point_duration_seconds_count{extension_point="PostBind",profile="default-scheduler",status="Success"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0001"} 3 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.0002"} 3 @@ -764,7 +953,7 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Pos scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.1024"} 3 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="0.2048"} 3 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable",le="+Inf"} 3 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable"} 4.3234e-05 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable"} 6.301499999999999e-05 scheduler_framework_extension_point_duration_seconds_count{extension_point="PostFilter",profile="default-scheduler",status="Unschedulable"} 3 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0001"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.0002"} 6 @@ -779,11 +968,26 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Pre scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.1024"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="0.2048"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreBind",profile="default-scheduler",status="Success",le="+Inf"} 6 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreBind",profile="default-scheduler",status="Success"} 2.3860000000000002e-05 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreBind",profile="default-scheduler",status="Success"} 0.000122495 scheduler_framework_extension_point_duration_seconds_count{extension_point="PreBind",profile="default-scheduler",status="Success"} 6 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0001"} 9 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0002"} 9 -scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0004"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0001"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0002"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0004"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0008"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0016"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0032"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0064"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0128"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0256"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0512"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.1024"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.2048"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="+Inf"} 9 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreEnqueue",profile="default-scheduler",status="Success"} 0.000139373 +scheduler_framework_extension_point_duration_seconds_count{extension_point="PreEnqueue",profile="default-scheduler",status="Success"} 9 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0001"} 7 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0002"} 8 +scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0004"} 8 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0008"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0016"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.0032"} 9 @@ -794,7 +998,7 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Pre scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.1024"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="0.2048"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreFilter",profile="default-scheduler",status="Success",le="+Inf"} 9 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreFilter",profile="default-scheduler",status="Success"} 0.000297379 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="PreFilter",profile="default-scheduler",status="Success"} 0.0009478259999999999 scheduler_framework_extension_point_duration_seconds_count{extension_point="PreFilter",profile="default-scheduler",status="Success"} 9 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0001"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.0002"} 6 @@ -809,13 +1013,339 @@ scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Res scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.1024"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="0.2048"} 6 scheduler_framework_extension_point_duration_seconds_bucket{extension_point="Reserve",profile="default-scheduler",status="Success",le="+Inf"} 6 -scheduler_framework_extension_point_duration_seconds_sum{extension_point="Reserve",profile="default-scheduler",status="Success"} 1.6251e-05 +scheduler_framework_extension_point_duration_seconds_sum{extension_point="Reserve",profile="default-scheduler",status="Success"} 1.9262e-05 scheduler_framework_extension_point_duration_seconds_count{extension_point="Reserve",profile="default-scheduler",status="Success"} 6 -# HELP scheduler_pending_pods [STABLE] Number of pending pods, by the queue type. 'active' means number of pods in activeQ; 'backoff' means number of pods in backoffQ; 'unschedulable' means number of pods in unschedulablePods. +# HELP scheduler_goroutines [ALPHA] Number of running goroutines split by the work they do such as binding. +# TYPE scheduler_goroutines gauge +scheduler_goroutines{operation="Filter"} 0 +scheduler_goroutines{operation="InterPodAffinity"} 0 +scheduler_goroutines{operation="binding"} 0 +# HELP scheduler_pending_pods [STABLE] Number of pending pods, by the queue type. 'active' means number of pods in activeQ; 'backoff' means number of pods in backoffQ; 'unschedulable' means number of pods in unschedulablePods that the scheduler attempted to schedule and failed; 'gated' is the number of unschedulable pods that the scheduler never attempted to schedule because they are gated. # TYPE scheduler_pending_pods gauge scheduler_pending_pods{queue="active"} 0 scheduler_pending_pods{queue="backoff"} 0 +scheduler_pending_pods{queue="gated"} 0 scheduler_pending_pods{queue="unschedulable"} 0 +# HELP scheduler_plugin_evaluation_total [ALPHA] Number of attempts to schedule pods by each plugin and the extension point (available only in PreFilter and Filter.). +# TYPE scheduler_plugin_evaluation_total counter +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="AzureDiskLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="EBSLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="GCEPDLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeAffinity",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeName",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodePorts",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeResourcesFit",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeUnschedulable",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="NodeVolumeLimits",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="PodTopologySpread",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="TaintToleration",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="Filter",plugin="VolumeRestrictions",profile="default-scheduler"} 6 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodeAffinity",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodePorts",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="NodeResourcesFit",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="PodTopologySpread",profile="default-scheduler"} 9 +scheduler_plugin_evaluation_total{extension_point="PreFilter",plugin="VolumeRestrictions",profile="default-scheduler"} 9 +# HELP scheduler_plugin_execution_duration_seconds [ALPHA] Duration for running a plugin at a specific extension point. +# TYPE scheduler_plugin_execution_duration_seconds histogram +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeName",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="NodeName",status="Success"} 1.91e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="NodeName",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="NodeUnschedulable",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="NodeUnschedulable",status="Success"} 5.94e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="NodeUnschedulable",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable"} 4.447e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="Filter",plugin="TaintToleration",status="UnschedulableAndUnresolvable"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="1e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="1.5000000000000002e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable"} 1.7988e-05 +scheduler_plugin_execution_duration_seconds_count{extension_point="PostFilter",plugin="DefaultPreemption",status="Unschedulable"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success"} 1.5e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreEnqueue",plugin="SchedulingGates",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="1e-05"} 0 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip"} 1.3978e-05 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="InterPodAffinity",status="Skip"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeAffinity",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodeAffinity",status="Success"} 3.87e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodeAffinity",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodePorts",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodePorts",status="Success"} 2.55e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodePorts",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success"} 4.947e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="NodeResourcesFit",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="PodTopologySpread",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="PodTopologySpread",status="Success"} 2.634e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="PodTopologySpread",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeBinding",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeBinding",status="Skip"} 2.108e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeBinding",status="Skip"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success"} 2.3e-06 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeRestrictions",status="Success"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="1e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="1.5000000000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="2.2500000000000005e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="3.375000000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="5.062500000000001e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="7.593750000000002e-05"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00011390625000000003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00017085937500000006"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0002562890625000001"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.00038443359375000017"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0005766503906250003"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0008649755859375004"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0012974633789062506"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0019461950683593758"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.0029192926025390638"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.004378938903808595"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.006568408355712893"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.009852612533569338"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.014778918800354007"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="0.02216837820053101"} 1 +scheduler_plugin_execution_duration_seconds_bucket{extension_point="PreFilter",plugin="VolumeZone",status="Skip",le="+Inf"} 1 +scheduler_plugin_execution_duration_seconds_sum{extension_point="PreFilter",plugin="VolumeZone",status="Skip"} 8.1e-07 +scheduler_plugin_execution_duration_seconds_count{extension_point="PreFilter",plugin="VolumeZone",status="Skip"} 1 # HELP scheduler_pod_scheduling_attempts [STABLE] Number of attempts to successfully schedule a pod. # TYPE scheduler_pod_scheduling_attempts histogram scheduler_pod_scheduling_attempts_bucket{le="1"} 3 @@ -828,7 +1358,7 @@ scheduler_pod_scheduling_attempts_sum 9 scheduler_pod_scheduling_attempts_count 6 # HELP scheduler_pod_scheduling_duration_seconds [STABLE] E2e latency for a pod being scheduled which may include multiple scheduling attempts. # TYPE scheduler_pod_scheduling_duration_seconds histogram -scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.01"} 3 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.01"} 2 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.02"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.04"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="0.08"} 3 @@ -849,7 +1379,7 @@ scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="1310.72"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="2621.44"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="5242.88"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="1",le="+Inf"} 3 -scheduler_pod_scheduling_duration_seconds_sum{attempts="1"} 0.017989869999999998 +scheduler_pod_scheduling_duration_seconds_sum{attempts="1"} 0.025937717 scheduler_pod_scheduling_duration_seconds_count{attempts="1"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.01"} 0 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.02"} 0 @@ -860,7 +1390,7 @@ scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.32"} 0 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="0.64"} 0 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="1.28"} 0 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="2.56"} 0 -scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="5.12"} 0 +scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="5.12"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="10.24"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="20.48"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="40.96"} 3 @@ -872,23 +1402,20 @@ scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="1310.72"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="2621.44"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="5242.88"} 3 scheduler_pod_scheduling_duration_seconds_bucket{attempts="2",le="+Inf"} 3 -scheduler_pod_scheduling_duration_seconds_sum{attempts="2"} 20.726500758 +scheduler_pod_scheduling_duration_seconds_sum{attempts="2"} 12.24573007 scheduler_pod_scheduling_duration_seconds_count{attempts="2"} 3 # HELP scheduler_preemption_attempts_total [STABLE] Total preemption attempts in the cluster till now # TYPE scheduler_preemption_attempts_total counter scheduler_preemption_attempts_total 3 # HELP scheduler_preemption_victims [STABLE] Number of selected preemption victims # TYPE scheduler_preemption_victims histogram -scheduler_preemption_victims_bucket{le="5"} 0 -scheduler_preemption_victims_bucket{le="10"} 0 -scheduler_preemption_victims_bucket{le="15"} 0 -scheduler_preemption_victims_bucket{le="20"} 0 -scheduler_preemption_victims_bucket{le="25"} 0 -scheduler_preemption_victims_bucket{le="30"} 0 -scheduler_preemption_victims_bucket{le="35"} 0 -scheduler_preemption_victims_bucket{le="40"} 0 -scheduler_preemption_victims_bucket{le="45"} 0 -scheduler_preemption_victims_bucket{le="50"} 0 +scheduler_preemption_victims_bucket{le="1"} 0 +scheduler_preemption_victims_bucket{le="2"} 0 +scheduler_preemption_victims_bucket{le="4"} 0 +scheduler_preemption_victims_bucket{le="8"} 0 +scheduler_preemption_victims_bucket{le="16"} 0 +scheduler_preemption_victims_bucket{le="32"} 0 +scheduler_preemption_victims_bucket{le="64"} 0 scheduler_preemption_victims_bucket{le="+Inf"} 0 scheduler_preemption_victims_sum 0 scheduler_preemption_victims_count 0 @@ -906,9 +1433,6 @@ scheduler_schedule_attempts_total{profile="default-scheduler",result="unschedula scheduler_scheduler_cache_size{type="assumed_pods"} 0 scheduler_scheduler_cache_size{type="nodes"} 1 scheduler_scheduler_cache_size{type="pods"} 10 -# HELP scheduler_scheduler_goroutines [ALPHA] Number of running goroutines split by the work they do such as binding. -# TYPE scheduler_scheduler_goroutines gauge -scheduler_scheduler_goroutines{work="binding"} 0 # HELP scheduler_scheduling_algorithm_duration_seconds [ALPHA] Scheduling algorithm latency in seconds # TYPE scheduler_scheduling_algorithm_duration_seconds histogram scheduler_scheduling_algorithm_duration_seconds_bucket{le="0.001"} 6 @@ -927,14 +1451,14 @@ scheduler_scheduling_algorithm_duration_seconds_bucket{le="4.096"} 6 scheduler_scheduling_algorithm_duration_seconds_bucket{le="8.192"} 6 scheduler_scheduling_algorithm_duration_seconds_bucket{le="16.384"} 6 scheduler_scheduling_algorithm_duration_seconds_bucket{le="+Inf"} 6 -scheduler_scheduling_algorithm_duration_seconds_sum 0.000934998 +scheduler_scheduling_algorithm_duration_seconds_sum 0.001461413 scheduler_scheduling_algorithm_duration_seconds_count 6 # HELP scheduler_scheduling_attempt_duration_seconds [STABLE] Scheduling attempt latency in seconds (scheduling algorithm + binding) # TYPE scheduler_scheduling_attempt_duration_seconds histogram scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.001"} 0 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.002"} 0 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.004"} 0 -scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.008"} 5 +scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.008"} 2 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.016"} 6 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.032"} 6 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="0.064"} 6 @@ -947,7 +1471,7 @@ scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler" scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="8.192"} 6 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="16.384"} 6 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="scheduled",le="+Inf"} 6 -scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="scheduled"} 0.036963698 +scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="scheduled"} 0.052896684 scheduler_scheduling_attempt_duration_seconds_count{profile="default-scheduler",result="scheduled"} 6 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.001"} 3 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="0.002"} 3 @@ -965,15 +1489,15 @@ scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler" scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="8.192"} 3 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="16.384"} 3 scheduler_scheduling_attempt_duration_seconds_bucket{profile="default-scheduler",result="unschedulable",le="+Inf"} 3 -scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="unschedulable"} 0.000403655 +scheduler_scheduling_attempt_duration_seconds_sum{profile="default-scheduler",result="unschedulable"} 0.000695599 scheduler_scheduling_attempt_duration_seconds_count{profile="default-scheduler",result="unschedulable"} 3 # HELP scheduler_unschedulable_pods [ALPHA] The number of unschedulable pods broken down by plugin name. A pod will increment the gauge for all plugins that caused it to not schedule and so this metric have meaning only when broken down by plugin. # TYPE scheduler_unschedulable_pods gauge scheduler_unschedulable_pods{plugin="TaintToleration",profile="default-scheduler"} 0 # HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue # TYPE workqueue_adds_total counter -workqueue_adds_total{name="DynamicConfigMapCABundle-client-ca"} 47 -workqueue_adds_total{name="DynamicServingCertificateController"} 47 +workqueue_adds_total{name="DynamicConfigMapCABundle-client-ca"} 21 +workqueue_adds_total{name="DynamicServingCertificateController"} 21 workqueue_adds_total{name="RequestHeaderAuthRequestController"} 0 # HELP workqueue_depth [ALPHA] Current depth of workqueue # TYPE workqueue_depth gauge @@ -991,28 +1515,28 @@ workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 44 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 46 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 46 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 47 -workqueue_queue_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.06912464700000001 -workqueue_queue_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 47 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 18 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 20 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.007058608 +workqueue_queue_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 21 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 47 -workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 47 -workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0016463600000000004 -workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 47 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 21 +workqueue_queue_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 21 +workqueue_queue_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0008254900000000001 +workqueue_queue_duration_seconds_count{name="DynamicServingCertificateController"} 21 workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-08"} 0 workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-07"} 0 workqueue_queue_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-06"} 0 @@ -1042,28 +1566,28 @@ workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca" workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-06"} 1 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 46 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 47 -workqueue_work_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.0015928729999999999 -workqueue_work_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 47 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="9.999999999999999e-05"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.001"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.01"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="0.1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicConfigMapCABundle-client-ca",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="DynamicConfigMapCABundle-client-ca"} 0.0007422840000000001 +workqueue_work_duration_seconds_count{name="DynamicConfigMapCABundle-client-ca"} 21 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1e-06"} 0 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 3 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 46 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 47 -workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 47 -workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0012661480000000001 -workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 47 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="9.999999999999999e-05"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.001"} 20 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.01"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="0.1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="1"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="10"} 21 +workqueue_work_duration_seconds_bucket{name="DynamicServingCertificateController",le="+Inf"} 21 +workqueue_work_duration_seconds_sum{name="DynamicServingCertificateController"} 0.0016760350000000002 +workqueue_work_duration_seconds_count{name="DynamicServingCertificateController"} 21 workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="RequestHeaderAuthRequestController",le="1e-06"} 0 diff --git a/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain-expected.json index 5f8b594cb72..5390d42c8a8 100644 --- a/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/scheduler/_meta/testdata/docs.plain-expected.json @@ -7,10 +7,10 @@ }, "kubernetes": { "scheduler": { - "name": "RequestHeaderAuthRequestController", + "name": "DynamicServingCertificateController", "workqueue": { "adds": { - "count": 0 + "count": 21 }, "depth": { "count": 0 @@ -44,10 +44,14 @@ }, "kubernetes": { "scheduler": { - "leader": { - "is_master": true + "client": { + "request": { + "count": 29 + } }, - "name": "kube-scheduler" + "code": "403", + "host": "172.18.0.2:6443", + "method": "GET" } }, "metricset": { @@ -67,75 +71,61 @@ }, "kubernetes": { "scheduler": { - "client": { - "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 3, - "100000": 3, - "1000000": 3, - "15000000": 3, - "2000000": 3, - "25000": 3, - "250000": 3, - "30000000": 3, - "4000000": 3, - "5000": 0, - "500000": 3, - "60000000": 3, - "8000000": 3 - }, - "count": 3, - "sum": 40375.45 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1024": 3, - "1048576": 3, - "16384": 3, - "16777216": 3, - "256": 0, - "262144": 3, - "4096": 3, - "4194304": 3, - "512": 3, - "64": 0, - "65536": 3 - }, - "count": 3, - "sum": 1026 - } - } + "name": "RequestHeaderAuthRequestController", + "workqueue": { + "adds": { + "count": 0 }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 3, - "1024": 0, - "1048576": 3, - "16384": 3, - "16777216": 3, - "256": 0, - "262144": 3, - "4096": 3, - "4194304": 3, - "512": 0, - "64": 0, - "65536": 3 - }, - "count": 3, - "sum": 10897 - } - } + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 } - }, - "host": "172.18.0.2:6443", - "verb": "PATCH" + } + } + }, + "metricset": { + "name": "scheduler", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.scheduler", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "scheduler": { + "name": "DynamicConfigMapCABundle-client-ca", + "workqueue": { + "adds": { + "count": 21 + }, + "depth": { + "count": 0 + }, + "longestrunning": { + "sec": 0 + }, + "retries": { + "count": 0 + }, + "unfinished": { + "sec": 0 + } + } } }, "metricset": { @@ -160,42 +150,42 @@ "duration": { "us": { "bucket": { - "+Inf": 1350, - "100000": 1350, - "1000000": 1350, - "15000000": 1350, - "2000000": 1350, - "25000": 1350, - "250000": 1350, - "30000000": 1350, - "4000000": 1350, - "5000": 1289, - "500000": 1350, - "60000000": 1350, - "8000000": 1350 + "+Inf": 21, + "100000": 21, + "1000000": 21, + "15000000": 21, + "2000000": 21, + "25000": 21, + "250000": 21, + "30000000": 21, + "4000000": 21, + "5000": 6, + "500000": 21, + "60000000": 21, + "8000000": 21 }, - "count": 1350, - "sum": 4774056.504999995 + "count": 21, + "sum": 128073.85899999995 } }, "size": { "bytes": { "bucket": { - "+Inf": 1350, - "1024": 1350, - "1048576": 1350, - "16384": 1350, - "16777216": 1350, - "256": 0, - "262144": 1350, - "4096": 1350, - "4194304": 1350, - "512": 1350, + "+Inf": 21, + "1024": 19, + "1048576": 21, + "16384": 21, + "16777216": 21, + "256": 7, + "262144": 21, + "4096": 21, + "4194304": 21, + "512": 17, "64": 0, - "65536": 1350 + "65536": 21 }, - "count": 1350, - "sum": 574521 + "count": 21, + "sum": 8318 } } }, @@ -203,27 +193,27 @@ "size": { "bytes": { "bucket": { - "+Inf": 1350, - "1024": 1350, - "1048576": 1350, - "16384": 1350, - "16777216": 1350, - "256": 0, - "262144": 1350, - "4096": 1350, - "4194304": 1350, - "512": 1350, - "64": 0, - "65536": 1350 + "+Inf": 21, + "1024": 17, + "1048576": 21, + "16384": 21, + "16777216": 21, + "256": 6, + "262144": 21, + "4096": 21, + "4194304": 21, + "512": 7, + "64": 6, + "65536": 21 }, - "count": 1350, - "sum": 574522 + "count": 21, + "sum": 12863 } } } }, "host": "172.18.0.2:6443", - "verb": "PUT" + "verb": "POST" } }, "metricset": { @@ -243,14 +233,10 @@ }, "kubernetes": { "scheduler": { - "queue": "unschedulable", - "scheduling": { - "pending": { - "pods": { - "count": 0 - } - } - } + "leader": { + "is_master": true + }, + "name": "kube-scheduler" } }, "metricset": { @@ -270,36 +256,75 @@ }, "kubernetes": { "scheduler": { - "profile": "default-scheduler", - "result": "unschedulable", - "scheduling": { - "attempts": { + "client": { + "request": { "duration": { "us": { "bucket": { "+Inf": 3, - "1000": 3, - "1024000": 3, - "128000": 3, - "16000": 3, - "16384000": 3, - "2000": 3, - "2048000": 3, - "256000": 3, - "32000": 3, - "4000": 3, - "4096000": 3, - "512000": 3, - "64000": 3, - "8000": 3, - "8192000": 3 + "100000": 3, + "1000000": 3, + "15000000": 3, + "2000000": 3, + "25000": 3, + "250000": 3, + "30000000": 3, + "4000000": 3, + "5000": 0, + "500000": 3, + "60000000": 3, + "8000000": 3 + }, + "count": 3, + "sum": 36600.51900000001 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1024": 3, + "1048576": 3, + "16384": 3, + "16777216": 3, + "256": 0, + "262144": 3, + "4096": 3, + "4194304": 3, + "512": 3, + "64": 0, + "65536": 3 + }, + "count": 3, + "sum": 1029 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 3, + "1024": 0, + "1048576": 3, + "16384": 3, + "16777216": 3, + "256": 0, + "262144": 3, + "4096": 3, + "4194304": 3, + "512": 0, + "64": 0, + "65536": 3 }, "count": 3, - "sum": 403.655 + "sum": 10950 } } } - } + }, + "host": "172.18.0.2:6443", + "verb": "PATCH" } }, "metricset": { @@ -319,7 +344,7 @@ }, "kubernetes": { "scheduler": { - "queue": "backoff", + "queue": "unschedulable", "scheduling": { "pending": { "pods": { @@ -346,75 +371,36 @@ }, "kubernetes": { "scheduler": { - "client": { - "request": { + "profile": "default-scheduler", + "result": "scheduled", + "scheduling": { + "attempts": { "duration": { "us": { "bucket": { - "+Inf": 1393, - "100000": 1392, - "1000000": 1392, - "15000000": 1393, - "2000000": 1392, - "25000": 1392, - "250000": 1392, - "30000000": 1393, - "4000000": 1392, - "5000": 1368, - "500000": 1392, - "60000000": 1393, - "8000000": 1393 - }, - "count": 1393, - "sum": 9186328.12299999 - } - }, - "size": { - "bytes": { - "bucket": { - "+Inf": 1393, - "1024": 1393, - "1048576": 1393, - "16384": 1393, - "16777216": 1393, - "256": 1393, - "262144": 1393, - "4096": 1393, - "4194304": 1393, - "512": 1393, - "64": 1393, - "65536": 1393 - }, - "count": 1393, - "sum": 0 - } - } - }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 1393, - "1024": 1389, - "1048576": 1393, - "16384": 1392, - "16777216": 1393, - "256": 31, - "262144": 1393, - "4096": 1392, - "4194304": 1393, - "512": 1388, - "64": 10, - "65536": 1393 + "+Inf": 6, + "1000": 0, + "1024000": 6, + "128000": 6, + "16000": 6, + "16384000": 6, + "2000": 0, + "2048000": 6, + "256000": 6, + "32000": 6, + "4000": 0, + "4096000": 6, + "512000": 6, + "64000": 6, + "8000": 2, + "8192000": 6 }, - "count": 1393, - "sum": 609699 + "count": 6, + "sum": 52896.684 } } } - }, - "host": "172.18.0.2:6443", - "verb": "GET" + } } }, "metricset": { @@ -436,12 +422,12 @@ "scheduler": { "client": { "request": { - "count": 1 + "count": 21 } }, - "code": "404", + "code": "201", "host": "172.18.0.2:6443", - "method": "GET" + "method": "POST" } }, "metricset": { @@ -461,33 +447,11 @@ }, "kubernetes": { "scheduler": { - "profile": "default-scheduler", - "result": "scheduled", + "queue": "backoff", "scheduling": { - "attempts": { - "duration": { - "us": { - "bucket": { - "+Inf": 6, - "1000": 0, - "1024000": 6, - "128000": 6, - "16000": 6, - "16384000": 6, - "2000": 0, - "2048000": 6, - "256000": 6, - "32000": 6, - "4000": 0, - "4096000": 6, - "512000": 6, - "64000": 6, - "8000": 5, - "8192000": 6 - }, - "count": 6, - "sum": 36963.698000000004 - } + "pending": { + "pods": { + "count": 0 } } } @@ -512,12 +476,12 @@ "scheduler": { "client": { "request": { - "count": 3 + "count": 589 } }, "code": "200", "host": "172.18.0.2:6443", - "method": "PATCH" + "method": "PUT" } }, "metricset": { @@ -539,10 +503,10 @@ "scheduler": { "client": { "request": { - "count": 27 + "count": 1 } }, - "code": "403", + "code": "404", "host": "172.18.0.2:6443", "method": "GET" } @@ -564,75 +528,51 @@ }, "kubernetes": { "scheduler": { - "client": { - "request": { - "duration": { - "us": { - "bucket": { - "+Inf": 255, - "100000": 255, - "1000000": 255, - "15000000": 255, - "2000000": 255, - "25000": 255, - "250000": 255, - "30000000": 255, - "4000000": 255, - "5000": 242, - "500000": 255, - "60000000": 255, - "8000000": 255 - }, - "count": 255, - "sum": 653478.0260000001 - } + "process": { + "cpu": { + "sec": 8 + }, + "fds": { + "max": { + "count": 1048576 }, - "size": { - "bytes": { - "bucket": { - "+Inf": 255, - "1024": 136, - "1048576": 255, - "16384": 255, - "16777216": 255, - "256": 7, - "262144": 255, - "4096": 255, - "4194304": 255, - "512": 17, - "64": 0, - "65536": 255 - }, - "count": 255, - "sum": 208805 - } + "open": { + "count": 11 } }, - "response": { - "size": { - "bytes": { - "bucket": { - "+Inf": 255, - "1024": 17, - "1048576": 255, - "16384": 255, - "16777216": 255, - "256": 6, - "262144": 255, - "4096": 255, - "4194304": 255, - "512": 7, - "64": 6, - "65536": 255 - }, - "count": 255, - "sum": 348458 - } + "memory": { + "resident": { + "bytes": 58523648 + }, + "virtual": { + "bytes": 785260544 } + }, + "started": { + "sec": 1691572169.15 } }, - "host": "172.18.0.2:6443", - "verb": "POST" + "scheduling": { + "preemption": { + "attempts": { + "count": 3 + }, + "victims": { + "bucket": { + "+Inf": 0, + "1": 0, + "16": 0, + "2": 0, + "32": 0, + "4": 0, + "64": 0, + "8": 0 + }, + "count": 0, + "sum": 0 + } + } + } } }, "metricset": { @@ -652,24 +592,75 @@ }, "kubernetes": { "scheduler": { - "name": "DynamicServingCertificateController", - "workqueue": { - "adds": { - "count": 47 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 589, + "100000": 589, + "1000000": 589, + "15000000": 589, + "2000000": 589, + "25000": 588, + "250000": 589, + "30000000": 589, + "4000000": 589, + "5000": 50, + "500000": 589, + "60000000": 589, + "8000000": 589 + }, + "count": 589, + "sum": 5999108.381000003 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 589, + "1024": 589, + "1048576": 589, + "16384": 589, + "16777216": 589, + "256": 0, + "262144": 589, + "4096": 589, + "4194304": 589, + "512": 589, + "64": 0, + "65536": 589 + }, + "count": 589, + "sum": 250590 + } + } }, - "unfinished": { - "sec": 0 + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 589, + "1024": 589, + "1048576": 589, + "16384": 589, + "16777216": 589, + "256": 0, + "262144": 589, + "4096": 589, + "4194304": 589, + "512": 589, + "64": 0, + "65536": 589 + }, + "count": 589, + "sum": 250591 + } + } } - } + }, + "host": "172.18.0.2:6443", + "verb": "PUT" } }, "metricset": { @@ -691,12 +682,12 @@ "scheduler": { "client": { "request": { - "count": 255 + "count": 3 } }, - "code": "201", + "code": "200", "host": "172.18.0.2:6443", - "method": "POST" + "method": "PATCH" } }, "metricset": { @@ -716,14 +707,36 @@ }, "kubernetes": { "scheduler": { - "client": { - "request": { - "count": 1464 + "profile": "default-scheduler", + "result": "unschedulable", + "scheduling": { + "attempts": { + "duration": { + "us": { + "bucket": { + "+Inf": 3, + "1000": 3, + "1024000": 3, + "128000": 3, + "16000": 3, + "16384000": 3, + "2000": 3, + "2048000": 3, + "256000": 3, + "32000": 3, + "4000": 3, + "4096000": 3, + "512000": 3, + "64000": 3, + "8000": 3, + "8192000": 3 + }, + "count": 3, + "sum": 695.5989999999999 + } + } } - }, - "code": "200", - "host": "172.18.0.2:6443", - "method": "GET" + } } }, "metricset": { @@ -743,22 +756,12 @@ }, "kubernetes": { "scheduler": { - "name": "DynamicConfigMapCABundle-client-ca", - "workqueue": { - "adds": { - "count": 47 - }, - "depth": { - "count": 0 - }, - "longestrunning": { - "sec": 0 - }, - "retries": { - "count": 0 - }, - "unfinished": { - "sec": 0 + "queue": "active", + "scheduling": { + "pending": { + "pods": { + "count": 0 + } } } } @@ -780,51 +783,11 @@ }, "kubernetes": { "scheduler": { - "process": { - "cpu": { - "sec": 17 - }, - "fds": { - "max": { - "count": 1048576 - }, - "open": { - "count": 13 - } - }, - "memory": { - "resident": { - "bytes": 62873600 - }, - "virtual": { - "bytes": 779169792 - } - }, - "started": { - "sec": 1671725505.95 - } - }, + "queue": "gated", "scheduling": { - "preemption": { - "attempts": { - "count": 3 - }, - "victims": { - "bucket": { - "+Inf": 0, - "10": 0, - "15": 0, - "20": 0, - "25": 0, - "30": 0, - "35": 0, - "40": 0, - "45": 0, - "5": 0, - "50": 0 - }, - "count": 0, - "sum": 0 + "pending": { + "pods": { + "count": 0 } } } @@ -847,14 +810,75 @@ }, "kubernetes": { "scheduler": { - "queue": "active", - "scheduling": { - "pending": { - "pods": { - "count": 0 + "client": { + "request": { + "duration": { + "us": { + "bucket": { + "+Inf": 634, + "100000": 633, + "1000000": 633, + "15000000": 634, + "2000000": 633, + "25000": 633, + "250000": 633, + "30000000": 634, + "4000000": 634, + "5000": 620, + "500000": 633, + "60000000": 634, + "8000000": 634 + }, + "count": 634, + "sum": 4443225.512000004 + } + }, + "size": { + "bytes": { + "bucket": { + "+Inf": 634, + "1024": 634, + "1048576": 634, + "16384": 634, + "16777216": 634, + "256": 634, + "262144": 634, + "4096": 634, + "4194304": 634, + "512": 634, + "64": 634, + "65536": 634 + }, + "count": 634, + "sum": 0 + } + } + }, + "response": { + "size": { + "bytes": { + "bucket": { + "+Inf": 634, + "1024": 629, + "1048576": 634, + "16384": 634, + "16777216": 634, + "256": 33, + "262144": 634, + "4096": 634, + "4194304": 634, + "512": 628, + "64": 9, + "65536": 634 + }, + "count": 634, + "sum": 271449 + } } } - } + }, + "host": "172.18.0.2:6443", + "verb": "GET" } }, "metricset": { @@ -876,12 +900,12 @@ "scheduler": { "client": { "request": { - "count": 1350 + "count": 650 } }, "code": "200", "host": "172.18.0.2:6443", - "method": "PUT" + "method": "GET" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/scheduler/scheduler_test.go b/metricbeat/module/kubernetes/scheduler/scheduler_test.go index db1b0b0001e..4143a0b29eb 100644 --- a/metricbeat/module/kubernetes/scheduler/scheduler_test.go +++ b/metricbeat/module/kubernetes/scheduler/scheduler_test.go @@ -23,27 +23,33 @@ package scheduler 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" ) +var files = []string{ + "./_meta/test/metrics.1.25", + "./_meta/test/metrics.1.26", + "./_meta/test/metrics.1.27", +} + func TestEventMapping(t *testing.T) { - ptest.TestMetricSet(t, "kubernetes", "scheduler", - ptest.TestCases{ - { - MetricsFile: "./_meta/test/metrics.1.25", - ExpectedFile: "./_meta/test/metrics.1.25.expected", - }, - { - MetricsFile: "./_meta/test/metrics.1.26", - ExpectedFile: "./_meta/test/metrics.1.26.expected", - }, - }, - ) + var testCases ptest.TestCases + for _, file := range files { + testCases = append(testCases, ptest.TestCase{ + MetricsFile: file, + ExpectedFile: file + ".expected", + }) + } + ptest.TestMetricSet(t, "kubernetes", "scheduler", testCases) } func TestData(t *testing.T) { mbtest.TestDataFiles(t, "kubernetes", "scheduler") } + +func TestMetricsFamily(t *testing.T) { + k.TestMetricsFamily(t, files, mapping) +} diff --git a/metricbeat/module/kubernetes/state_container/_meta/data.json b/metricbeat/module/kubernetes/state_container/_meta/data.json index f856ffb9303..674719a243e 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/data.json +++ b/metricbeat/module/kubernetes/state_container/_meta/data.json @@ -1,9 +1,9 @@ { "@timestamp": "2019-03-01T08:05:34.853Z", "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" }, @@ -14,24 +14,8 @@ }, "kubernetes": { "container": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { "phase": "running", "ready": true, @@ -43,7 +27,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "kube-proxy-nw7gg" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 68ce7f8e2d5..00000000000 --- a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,710 +0,0 @@ -[ - { - "RootFields": { - "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kindnet-4tnzw" - } - }, - "MetricSetFields": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "image": { - "name": "docker.io/library/perl:5.34.0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "pi-m88dn" - } - }, - "MetricSetFields": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "name": "pi", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-scheduler-kind-control-plane" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "89392d8ac34feb009401e4d3b1e8f19293b952355f8c8a6b54a0e19ad74c5892", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899500-skmng" - } - }, - "MetricSetFields": { - "id": "89392d8ac34feb009401e4d3b1e8f19293b952355f8c8a6b54a0e19ad74c5892", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "coredns-565d847f94-dgwk8" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899498-q8cl7" - } - }, - "MetricSetFields": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" - } - }, - "MetricSetFields": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "cfcec5447b0a83749e71ac33db2b97db3271f576281f51daf50b3cd3220353af", - "image": { - "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.6.0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-state-metrics-5897f6cf77-jq242" - } - }, - "MetricSetFields": { - "id": "cfcec5447b0a83749e71ac33db2b97db3271f576281f51daf50b3cd3220353af", - "name": "kube-state-metrics", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-proxy-flrd6" - } - }, - "MetricSetFields": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-controller-manager-kind-control-plane" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.2 - } - }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-apiserver-kind-control-plane" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.25 - } - }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "d1149ce4c5c9fed787e0858c53f2e78c6f739dd48db2845f315287efd1c7f54e", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899501-t2lnn" - } - }, - "MetricSetFields": { - "id": "d1149ce4c5c9fed787e0858c53f2e78c6f739dd48db2845f315287efd1c7f54e", - "name": "hello-cronjob", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "metricbeat-h24sg" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "memory": { - "limit": { - "bytes": 209715200 - }, - "request": { - "bytes": 104857600 - } - }, - "name": "metricbeat", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899499-k5d56" - } - }, - "MetricSetFields": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", - "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "etcd-kind-control-plane" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", - "memory": { - "request": { - "bytes": 104857600 - } - }, - "name": "etcd", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "coredns-565d847f94-q2mmv" - } - }, - "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "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_container/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.7.0.plain.expected index 3d099c65dac..461e1b852ce 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.7.0.plain.expected @@ -312,9 +312,9 @@ { "RootFields": { "container": { - "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", + "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" } @@ -325,16 +325,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27900585-6zngl" + "name": "coredns-565d847f94-dgwk8" } }, "MetricSetFields": { - "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", - "name": "hello-cronjob", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -352,9 +364,9 @@ { "RootFields": { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "docker.io/library/busybox:1.28" }, "runtime": "containerd" } @@ -365,28 +377,16 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "hello-cronjob-27900585-6zngl" } }, "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", + "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", + "name": "hello-cronjob", "status": { - "phase": "running", - "ready": true, + "phase": "terminated", + "ready": false, + "reason": "Completed", "restarts": 0 } }, diff --git a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.8.2.plain.expected similarity index 68% rename from metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.8.2.plain.expected index 9d9806a4c3e..118a32bf915 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.8.2.plain.expected @@ -2,41 +2,25 @@ { "RootFields": { "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "local-path-provisioner-75f5b54ffd-bm5sx" } }, "MetricSetFields": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", + "name": "local-path-provisioner", "status": { "phase": "running", "ready": true, @@ -57,9 +41,11 @@ { "RootFields": { "container": { + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", "image": { - "name": "perl:5.34.0" - } + "name": "registry.k8s.io/coredns/coredns:v1.9.3" + }, + "runtime": "containerd" } }, "ModuleFields": { @@ -68,15 +54,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "pi-m88dn" + "name": "coredns-787d4945fb-rb564" } }, "MetricSetFields": { - "name": "pi", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { - "phase": "waiting", - "ready": false, - "reason": "ContainerCreating", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -94,9 +93,9 @@ { "RootFields": { "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" + "name": "registry.k8s.io/etcd:3.5.6-0" }, "runtime": "containerd" } @@ -107,7 +106,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-scheduler-kind-control-plane" + "name": "etcd-kind-control-plane" } }, "MetricSetFields": { @@ -116,8 +115,13 @@ "cores": 0.1 } }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", + "memory": { + "request": { + "bytes": 104857600 + } + }, + "name": "etcd", "status": { "phase": "running", "ready": true, @@ -138,9 +142,9 @@ { "RootFields": { "container": { - "id": "69a6e1720df542c8a662873e8ad0694c3d120259fa625bf527269c4d4f1bff34", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" } @@ -151,16 +155,15 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899487-6vx8l" + "name": "kube-proxy-nw7gg" } }, "MetricSetFields": { - "id": "69a6e1720df542c8a662873e8ad0694c3d120259fa625bf527269c4d4f1bff34", - "name": "hello-cronjob", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -178,9 +181,9 @@ { "RootFields": { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "registry.k8s.io/kube-scheduler:v1.26.3" }, "runtime": "containerd" } @@ -191,7 +194,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "kube-scheduler-kind-control-plane" } }, "MetricSetFields": { @@ -200,16 +203,8 @@ "cores": 0.1 } }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", + "name": "kube-scheduler", "status": { "phase": "running", "ready": true, @@ -230,25 +225,25 @@ { "RootFields": { "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", + "id": "d7ccd676642697b9c11ccd6789aa8ab9048ee18ee0f9627227db5e12006e0342", "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" + "name": "docker.io/library/nginx:1.24.0-alpine-slim" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "local-path-storage", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" + "name": "web-0" } }, "MetricSetFields": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", + "id": "d7ccd676642697b9c11ccd6789aa8ab9048ee18ee0f9627227db5e12006e0342", + "name": "nginx", "status": { "phase": "running", "ready": true, @@ -269,9 +264,9 @@ { "RootFields": { "container": { - "id": "26d7459f5f6e7dfce46638648c6bfec8771152583c743ae6a65adf6a3a3419a9", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "image": { - "name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.4.2" + "name": "registry.k8s.io/kube-apiserver:v1.26.3" }, "runtime": "containerd" } @@ -282,12 +277,17 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-state-metrics-77bcd445dd-tnbvx" + "name": "kube-apiserver-kind-control-plane" } }, "MetricSetFields": { - "id": "26d7459f5f6e7dfce46638648c6bfec8771152583c743ae6a65adf6a3a3419a9", - "name": "kube-state-metrics", + "cpu": { + "request": { + "cores": 0.25 + } + }, + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", + "name": "kube-apiserver", "status": { "phase": "running", "ready": true, @@ -308,9 +308,9 @@ { "RootFields": { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" + "name": "registry.k8s.io/kube-controller-manager:v1.26.3" }, "runtime": "containerd" } @@ -321,12 +321,17 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-proxy-flrd6" + "name": "kube-controller-manager-kind-control-plane" } }, "MetricSetFields": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", + "cpu": { + "request": { + "cores": 0.2 + } + }, + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", + "name": "kube-controller-manager", "status": { "phase": "running", "ready": true, @@ -347,33 +352,29 @@ { "RootFields": { "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", + "id": "792a785041217bf9d4784f80510bd60bb21fc179088f5b72286af6d350166a91", "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-controller-manager-kind-control-plane" + "name": "hello-28192807-p6f5s" } }, "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.2 - } - }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", + "id": "792a785041217bf9d4784f80510bd60bb21fc179088f5b72286af6d350166a91", + "name": "hello", "status": { - "phase": "running", - "ready": true, + "phase": "terminated", + "ready": false, + "reason": "Completed", "restarts": 0 } }, @@ -391,9 +392,9 @@ { "RootFields": { "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "2385de25be8a2c1ec1c1490d5aab898d0d1202c981840b41de1d2cc67d891a8d", "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" + "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2" }, "runtime": "containerd" } @@ -404,17 +405,12 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-apiserver-kind-control-plane" + "name": "kube-state-metrics-fb945547c-zdncb" } }, "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.25 - } - }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", + "id": "2385de25be8a2c1ec1c1490d5aab898d0d1202c981840b41de1d2cc67d891a8d", + "name": "kube-state-metrics", "status": { "phase": "running", "ready": true, @@ -435,9 +431,9 @@ { "RootFields": { "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" } @@ -448,7 +444,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "metricbeat-h24sg" + "name": "coredns-787d4945fb-kx4f4" } }, "MetricSetFields": { @@ -457,16 +453,16 @@ "cores": 0.1 } }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "memory": { "limit": { - "bytes": 209715200 + "bytes": 178257920 }, "request": { - "bytes": 104857600 + "bytes": 73400320 } }, - "name": "metricbeat", + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -487,25 +483,25 @@ { "RootFields": { "container": { - "id": "30514fd6f76760a37d429af91f1d84301b9d1bae00a4b6c2845f07ab8b86eb30", + "id": "9db55f876bbf229af92f6825e4ffb58ac7b98c7519f1471fa90c1342fd6a9abc", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899489-sl9hn" + "name": "hello-7dfgp" } }, "MetricSetFields": { - "id": "30514fd6f76760a37d429af91f1d84301b9d1bae00a4b6c2845f07ab8b86eb30", - "name": "hello-cronjob", + "id": "9db55f876bbf229af92f6825e4ffb58ac7b98c7519f1471fa90c1342fd6a9abc", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -527,9 +523,9 @@ { "RootFields": { "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" + "name": "sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb" }, "runtime": "containerd" } @@ -540,22 +536,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "etcd-kind-control-plane" + "name": "kindnet-7l48v" } }, "MetricSetFields": { "cpu": { + "limit": { + "cores": 0.1 + }, "request": { "cores": 0.1 } }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "memory": { + "limit": { + "bytes": 52428800 + }, "request": { - "bytes": 104857600 + "bytes": 52428800 } }, - "name": "etcd", + "name": "kindnet-cni", "status": { "phase": "running", "ready": true, @@ -576,9 +578,9 @@ { "RootFields": { "container": { - "id": "cbc3ddaeb5fda1bbd6063297b75340fc69063f9247d6cc3de20a92438b961e1f", + "id": "a4f1799a2236665489587b54ff78e36c9eebd8a4134d75b768149551f5a564b3", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "quay.io/fluentd_elasticsearch/fluentd:v2.5.2" }, "runtime": "containerd" } @@ -589,47 +591,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899488-mctvl" - } - }, - "MetricSetFields": { - "id": "cbc3ddaeb5fda1bbd6063297b75340fc69063f9247d6cc3de20a92438b961e1f", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "coredns-565d847f94-q2mmv" + "name": "fluentd-elasticsearch-qrlkt" } }, "MetricSetFields": { @@ -638,16 +600,16 @@ "cores": 0.1 } }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", + "id": "a4f1799a2236665489587b54ff78e36c9eebd8a4134d75b768149551f5a564b3", "memory": { "limit": { - "bytes": 178257920 + "bytes": 209715200 }, "request": { - "bytes": 73400320 + "bytes": 209715200 } }, - "name": "coredns", + "name": "fluentd-elasticsearch", "status": { "phase": "running", "ready": true, diff --git a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.9.2.plain.expected similarity index 67% rename from metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.9.2.plain.expected index 2fe96241eb9..bc46b7ab549 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_container/_meta/test/ksm.v2.9.2.plain.expected @@ -2,41 +2,25 @@ { "RootFields": { "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "local-path-provisioner-75f5b54ffd-bm5sx" } }, "MetricSetFields": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", + "name": "local-path-provisioner", "status": { "phase": "running", "ready": true, @@ -57,25 +41,25 @@ { "RootFields": { "container": { - "id": "3ba2b0ddb34668d521831c06e4c0553e3f93458738356e97647837a13eda1063", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899497-ffm4g" + "name": "hello-28192809-jbn5z" } }, "MetricSetFields": { - "id": "3ba2b0ddb34668d521831c06e4c0553e3f93458738356e97647837a13eda1063", - "name": "hello-cronjob", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -97,9 +81,9 @@ { "RootFields": { "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", "image": { - "name": "docker.io/library/perl:5.34.0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" } @@ -110,16 +94,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "pi-m88dn" + "name": "coredns-787d4945fb-rb564" } }, "MetricSetFields": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "name": "pi", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -137,9 +133,9 @@ { "RootFields": { "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" + "name": "registry.k8s.io/etcd:3.5.6-0" }, "runtime": "containerd" } @@ -150,7 +146,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-scheduler-kind-control-plane" + "name": "etcd-kind-control-plane" } }, "MetricSetFields": { @@ -159,8 +155,13 @@ "cores": 0.1 } }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", + "memory": { + "request": { + "bytes": 104857600 + } + }, + "name": "etcd", "status": { "phase": "running", "ready": true, @@ -181,9 +182,9 @@ { "RootFields": { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "quay.io/fluentd_elasticsearch/fluentd:v2.5.2" }, "runtime": "containerd" } @@ -194,7 +195,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "fluentd-elasticsearch-fwg46" } }, "MetricSetFields": { @@ -203,16 +204,16 @@ "cores": 0.1 } }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "memory": { "limit": { - "bytes": 178257920 + "bytes": 209715200 }, "request": { - "bytes": 73400320 + "bytes": 209715200 } }, - "name": "coredns", + "name": "fluentd-elasticsearch", "status": { "phase": "running", "ready": true, @@ -233,9 +234,9 @@ { "RootFields": { "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" } @@ -246,52 +247,12 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899498-q8cl7" + "name": "kube-proxy-nw7gg" } }, "MetricSetFields": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.container", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" - }, - "runtime": "containerd" - } - }, - "ModuleFields": { - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" - } - }, - "MetricSetFields": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { "phase": "running", "ready": true, @@ -312,9 +273,9 @@ { "RootFields": { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" + "name": "registry.k8s.io/kube-scheduler:v1.26.3" }, "runtime": "containerd" } @@ -325,12 +286,17 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-proxy-flrd6" + "name": "kube-scheduler-kind-control-plane" } }, "MetricSetFields": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", + "name": "kube-scheduler", "status": { "phase": "running", "ready": true, @@ -351,33 +317,29 @@ { "RootFields": { "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-controller-manager-kind-control-plane" + "name": "hello-fddcc" } }, "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.2 - } - }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", + "name": "hello", "status": { - "phase": "running", - "ready": true, + "phase": "terminated", + "ready": false, + "reason": "Completed", "restarts": 0 } }, @@ -395,9 +357,9 @@ { "RootFields": { "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" + "name": "registry.k8s.io/kube-apiserver:v1.26.3" }, "runtime": "containerd" } @@ -417,7 +379,7 @@ "cores": 0.25 } }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "name": "kube-apiserver", "status": { "phase": "running", @@ -439,9 +401,9 @@ { "RootFields": { "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" + "name": "registry.k8s.io/kube-controller-manager:v1.26.3" }, "runtime": "containerd" } @@ -452,25 +414,17 @@ "name": "kind-control-plane" }, "pod": { - "name": "metricbeat-h24sg" + "name": "kube-controller-manager-kind-control-plane" } }, "MetricSetFields": { "cpu": { "request": { - "cores": 0.1 - } - }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "memory": { - "limit": { - "bytes": 209715200 - }, - "request": { - "bytes": 104857600 + "cores": 0.2 } }, - "name": "metricbeat", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", + "name": "kube-controller-manager", "status": { "phase": "running", "ready": true, @@ -491,9 +445,9 @@ { "RootFields": { "container": { - "id": "4c58768671aab3b73013a030c4125c8f9d39d51772a3c75df19c84bc055094ed", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", "image": { - "name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0" + "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2" }, "runtime": "containerd" } @@ -504,11 +458,11 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-state-metrics-8595684f78-ppcnj" + "name": "kube-state-metrics-7bc9d484b6-79ph2" } }, "MetricSetFields": { - "id": "4c58768671aab3b73013a030c4125c8f9d39d51772a3c75df19c84bc055094ed", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", "name": "kube-state-metrics", "status": { "phase": "running", @@ -530,9 +484,9 @@ { "RootFields": { "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" } @@ -543,16 +497,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899499-k5d56" + "name": "coredns-787d4945fb-kx4f4" } }, "MetricSetFields": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "name": "hello-cronjob", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -570,9 +536,9 @@ { "RootFields": { "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" + "name": "sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb" }, "runtime": "containerd" } @@ -583,22 +549,28 @@ "name": "kind-control-plane" }, "pod": { - "name": "etcd-kind-control-plane" + "name": "kindnet-7l48v" } }, "MetricSetFields": { "cpu": { + "limit": { + "cores": 0.1 + }, "request": { "cores": 0.1 } }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "memory": { + "limit": { + "bytes": 52428800 + }, "request": { - "bytes": 104857600 + "bytes": 52428800 } }, - "name": "etcd", + "name": "kindnet-cni", "status": { "phase": "running", "ready": true, @@ -619,38 +591,25 @@ { "RootFields": { "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "docker.io/library/nginx:1.24.0-alpine-slim" }, "runtime": "containerd" } }, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-q2mmv" + "name": "web-0" } }, "MetricSetFields": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", + "name": "nginx", "status": { "phase": "running", "ready": true, diff --git a/metricbeat/module/kubernetes/state_container/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_container/_meta/testdata/docs.plain-expected.json index 0bc2879952d..0cc18e6dc5c 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_container/_meta/testdata/docs.plain-expected.json @@ -1,9 +1,9 @@ [ { "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" }, @@ -14,24 +14,8 @@ }, "kubernetes": { "container": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { "phase": "running", "ready": true, @@ -43,7 +27,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "kube-proxy-nw7gg" } }, "metricset": { @@ -57,9 +41,9 @@ }, { "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -75,13 +59,16 @@ "cores": 0.1 } }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "memory": { + "limit": { + "bytes": 178257920 + }, "request": { - "bytes": 104857600 + "bytes": 73400320 } }, - "name": "etcd", + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -93,7 +80,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "etcd-kind-control-plane" + "name": "coredns-787d4945fb-kx4f4" } }, "metricset": { @@ -107,9 +94,9 @@ }, { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "quay.io/fluentd_elasticsearch/fluentd:v2.5.2" }, "runtime": "containerd" }, @@ -125,16 +112,16 @@ "cores": 0.1 } }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "memory": { "limit": { - "bytes": 178257920 + "bytes": 209715200 }, "request": { - "bytes": 73400320 + "bytes": 209715200 } }, - "name": "coredns", + "name": "fluentd-elasticsearch", "status": { "phase": "running", "ready": true, @@ -146,7 +133,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "fluentd-elasticsearch-fwg46" } }, "metricset": { @@ -160,9 +147,9 @@ }, { "container": { - "id": "18bddca29930370d9cfa083969de095894f7b77b5c63fd0712128ea7de6c64fd", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-apiserver:v1.26.3" }, "runtime": "containerd" }, @@ -173,61 +160,25 @@ }, "kubernetes": { "container": { - "id": "18bddca29930370d9cfa083969de095894f7b77b5c63fd0712128ea7de6c64fd", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27900587-r7g6w" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", + "cpu": { + "request": { + "cores": 0.25 + } + }, + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", + "name": "kube-apiserver", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" }, "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" + "name": "kube-apiserver-kind-control-plane" } }, "metricset": { @@ -241,9 +192,9 @@ }, { "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -259,8 +210,16 @@ "cores": 0.1 } }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -272,7 +231,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-scheduler-kind-control-plane" + "name": "coredns-787d4945fb-rb564" } }, "metricset": { @@ -286,9 +245,9 @@ }, { "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" + "name": "docker.io/library/nginx:1.24.0-alpine-slim" }, "runtime": "containerd" }, @@ -299,25 +258,20 @@ }, "kubernetes": { "container": { - "cpu": { - "request": { - "cores": 0.25 - } - }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", + "name": "nginx", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-apiserver-kind-control-plane" + "name": "web-0" } }, "metricset": { @@ -331,9 +285,9 @@ }, { "container": { - "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc" }, "runtime": "containerd" }, @@ -344,21 +298,20 @@ }, "kubernetes": { "container": { - "id": "f8e2e2fe9a308d4e81707c0a2daa53424a862e8889601ac7307a54e6aae03612", - "name": "hello-cronjob", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", + "name": "local-path-provisioner", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27900585-6zngl" + "name": "local-path-provisioner-75f5b54ffd-bm5sx" } }, "metricset": { @@ -372,9 +325,9 @@ }, { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -385,20 +338,21 @@ }, "kubernetes": { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", + "name": "hello", "status": { - "phase": "running", - "ready": true, + "phase": "terminated", + "ready": false, + "reason": "Completed", "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-proxy-flrd6" + "name": "hello-28192809-jbn5z" } }, "metricset": { @@ -412,9 +366,9 @@ }, { "container": { - "id": "bbecc08bbf0158bdc85f4ed006cddbf40f51d7348ce5cbd95e86d367d20e8fbb", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" + "name": "sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb" }, "runtime": "containerd" }, @@ -426,20 +380,23 @@ "kubernetes": { "container": { "cpu": { + "limit": { + "cores": 0.1 + }, "request": { "cores": 0.1 } }, - "id": "bbecc08bbf0158bdc85f4ed006cddbf40f51d7348ce5cbd95e86d367d20e8fbb", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "memory": { "limit": { - "bytes": 209715200 + "bytes": 52428800 }, "request": { - "bytes": 104857600 + "bytes": 52428800 } }, - "name": "metricbeat", + "name": "kindnet-cni", "status": { "phase": "running", "ready": true, @@ -451,7 +408,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "metricbeat-6xfvl" + "name": "kindnet-7l48v" } }, "metricset": { @@ -465,9 +422,9 @@ }, { "container": { - "id": "d58ac7bcd7b24a58132d3021f13301d2a0995e74f98596956e8f20e19029f2be", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", "image": { - "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0" + "name": "registry.k8s.io/kube-scheduler:v1.26.3" }, "runtime": "containerd" }, @@ -478,8 +435,13 @@ }, "kubernetes": { "container": { - "id": "d58ac7bcd7b24a58132d3021f13301d2a0995e74f98596956e8f20e19029f2be", - "name": "kube-state-metrics", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", + "name": "kube-scheduler", "status": { "phase": "running", "ready": true, @@ -491,7 +453,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-state-metrics-548546fc89-qrkzb" + "name": "kube-scheduler-kind-control-plane" } }, "metricset": { @@ -505,9 +467,9 @@ }, { "container": { - "id": "77d181df6b24476654d367bdcadc543c65371de07cc71044fc8a0bafc20a2105", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2" }, "runtime": "containerd" }, @@ -518,12 +480,11 @@ }, "kubernetes": { "container": { - "id": "77d181df6b24476654d367bdcadc543c65371de07cc71044fc8a0bafc20a2105", - "name": "hello-cronjob", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", + "name": "kube-state-metrics", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -532,7 +493,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27900586-psw5h" + "name": "kube-state-metrics-7bc9d484b6-79ph2" } }, "metricset": { @@ -546,9 +507,9 @@ }, { "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "registry.k8s.io/kube-controller-manager:v1.26.3" }, "runtime": "containerd" }, @@ -561,19 +522,11 @@ "container": { "cpu": { "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 + "cores": 0.2 } }, - "name": "coredns", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", + "name": "kube-controller-manager", "status": { "phase": "running", "ready": true, @@ -585,7 +538,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-q2mmv" + "name": "kube-controller-manager-kind-control-plane" } }, "metricset": { @@ -599,9 +552,9 @@ }, { "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", "image": { - "name": "docker.io/library/perl:5.34.0" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -612,8 +565,8 @@ }, "kubernetes": { "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "name": "pi", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -621,12 +574,12 @@ "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "pi-m88dn" + "name": "hello-fddcc" } }, "metricset": { @@ -640,9 +593,9 @@ }, { "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" + "name": "registry.k8s.io/etcd:3.5.6-0" }, "runtime": "containerd" }, @@ -655,11 +608,16 @@ "container": { "cpu": { "request": { - "cores": 0.2 + "cores": 0.1 } }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", + "memory": { + "request": { + "bytes": 104857600 + } + }, + "name": "etcd", "status": { "phase": "running", "ready": true, @@ -671,7 +629,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-controller-manager-kind-control-plane" + "name": "etcd-kind-control-plane" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index ec45e07bc98..00000000000 --- a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,726 +0,0 @@ -[ - { - "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kindnet-4tnzw" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", - "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", - "memory": { - "request": { - "bytes": 104857600 - } - }, - "name": "etcd", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "etcd-kind-control-plane" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "coredns-565d847f94-dgwk8" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-scheduler-kind-control-plane" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "cfcec5447b0a83749e71ac33db2b97db3271f576281f51daf50b3cd3220353af", - "image": { - "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.6.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "cfcec5447b0a83749e71ac33db2b97db3271f576281f51daf50b3cd3220353af", - "name": "kube-state-metrics", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-state-metrics-5897f6cf77-jq242" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.25 - } - }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-apiserver-kind-control-plane" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-proxy-flrd6" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "memory": { - "limit": { - "bytes": 209715200 - }, - "request": { - "bytes": 104857600 - } - }, - "name": "metricbeat", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "metricbeat-h24sg" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899499-k5d56" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "89392d8ac34feb009401e4d3b1e8f19293b952355f8c8a6b54a0e19ad74c5892", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "89392d8ac34feb009401e4d3b1e8f19293b952355f8c8a6b54a0e19ad74c5892", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899500-skmng" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "d1149ce4c5c9fed787e0858c53f2e78c6f739dd48db2845f315287efd1c7f54e", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "d1149ce4c5c9fed787e0858c53f2e78c6f739dd48db2845f315287efd1c7f54e", - "name": "hello-cronjob", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899501-t2lnn" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "image": { - "name": "docker.io/library/busybox:1.28" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "name": "hello-cronjob", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "hello-cronjob-27899498-q8cl7" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "coredns-565d847f94-q2mmv" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "image": { - "name": "docker.io/library/perl:5.34.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "name": "pi", - "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "pi-m88dn" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "cpu": { - "request": { - "cores": 0.2 - } - }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-controller-manager-kind-control-plane" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 74% rename from metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.8.2.plain-expected.json index b84bf945700..205962e10b5 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ b/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -1,9 +1,9 @@ [ { "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" }, @@ -14,24 +14,8 @@ }, "kubernetes": { "container": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { "phase": "running", "ready": true, @@ -43,7 +27,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "kube-proxy-nw7gg" } }, "metricset": { @@ -57,9 +41,9 @@ }, { "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -75,13 +59,16 @@ "cores": 0.1 } }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "memory": { + "limit": { + "bytes": 178257920 + }, "request": { - "bytes": 104857600 + "bytes": 73400320 } }, - "name": "etcd", + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -93,7 +80,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "etcd-kind-control-plane" + "name": "coredns-787d4945fb-kx4f4" } }, "metricset": { @@ -107,9 +94,9 @@ }, { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "registry.k8s.io/kube-apiserver:v1.26.3" }, "runtime": "containerd" }, @@ -122,19 +109,11 @@ "container": { "cpu": { "request": { - "cores": 0.1 - } - }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 + "cores": 0.25 } }, - "name": "coredns", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", + "name": "kube-apiserver", "status": { "phase": "running", "ready": true, @@ -146,7 +125,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "kube-apiserver-kind-control-plane" } }, "metricset": { @@ -160,9 +139,9 @@ }, { "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -173,20 +152,33 @@ }, "kubernetes": { "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" }, "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" + "name": "coredns-787d4945fb-rb564" } }, "metricset": { @@ -200,9 +192,9 @@ }, { "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" + "name": "sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc" }, "runtime": "containerd" }, @@ -213,25 +205,20 @@ }, "kubernetes": { "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", + "name": "local-path-provisioner", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-scheduler-kind-control-plane" + "name": "local-path-provisioner-75f5b54ffd-bm5sx" } }, "metricset": { @@ -245,9 +232,9 @@ }, { "container": { - "id": "69a6e1720df542c8a662873e8ad0694c3d120259fa625bf527269c4d4f1bff34", + "id": "9db55f876bbf229af92f6825e4ffb58ac7b98c7519f1471fa90c1342fd6a9abc", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -258,8 +245,8 @@ }, "kubernetes": { "container": { - "id": "69a6e1720df542c8a662873e8ad0694c3d120259fa625bf527269c4d4f1bff34", - "name": "hello-cronjob", + "id": "9db55f876bbf229af92f6825e4ffb58ac7b98c7519f1471fa90c1342fd6a9abc", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -267,12 +254,12 @@ "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899487-6vx8l" + "name": "hello-7dfgp" } }, "metricset": { @@ -286,9 +273,9 @@ }, { "container": { - "id": "26d7459f5f6e7dfce46638648c6bfec8771152583c743ae6a65adf6a3a3419a9", + "id": "2385de25be8a2c1ec1c1490d5aab898d0d1202c981840b41de1d2cc67d891a8d", "image": { - "name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.4.2" + "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2" }, "runtime": "containerd" }, @@ -299,7 +286,7 @@ }, "kubernetes": { "container": { - "id": "26d7459f5f6e7dfce46638648c6bfec8771152583c743ae6a65adf6a3a3419a9", + "id": "2385de25be8a2c1ec1c1490d5aab898d0d1202c981840b41de1d2cc67d891a8d", "name": "kube-state-metrics", "status": { "phase": "running", @@ -312,7 +299,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-state-metrics-77bcd445dd-tnbvx" + "name": "kube-state-metrics-fb945547c-zdncb" } }, "metricset": { @@ -326,9 +313,9 @@ }, { "container": { - "id": "cbc3ddaeb5fda1bbd6063297b75340fc69063f9247d6cc3de20a92438b961e1f", + "id": "792a785041217bf9d4784f80510bd60bb21fc179088f5b72286af6d350166a91", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -339,8 +326,8 @@ }, "kubernetes": { "container": { - "id": "cbc3ddaeb5fda1bbd6063297b75340fc69063f9247d6cc3de20a92438b961e1f", - "name": "hello-cronjob", + "id": "792a785041217bf9d4784f80510bd60bb21fc179088f5b72286af6d350166a91", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -348,12 +335,12 @@ "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899488-mctvl" + "name": "hello-28192807-p6f5s" } }, "metricset": { @@ -367,9 +354,9 @@ }, { "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "a4f1799a2236665489587b54ff78e36c9eebd8a4134d75b768149551f5a564b3", "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" + "name": "quay.io/fluentd_elasticsearch/fluentd:v2.5.2" }, "runtime": "containerd" }, @@ -382,51 +369,19 @@ "container": { "cpu": { "request": { - "cores": 0.25 + "cores": 0.1 } }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "kube-apiserver-kind-control-plane" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", + "id": "a4f1799a2236665489587b54ff78e36c9eebd8a4134d75b768149551f5a564b3", + "memory": { + "limit": { + "bytes": 209715200 + }, + "request": { + "bytes": 209715200 + } + }, + "name": "fluentd-elasticsearch", "status": { "phase": "running", "ready": true, @@ -438,7 +393,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-proxy-flrd6" + "name": "fluentd-elasticsearch-qrlkt" } }, "metricset": { @@ -452,9 +407,9 @@ }, { "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" + "name": "sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb" }, "runtime": "containerd" }, @@ -466,20 +421,23 @@ "kubernetes": { "container": { "cpu": { + "limit": { + "cores": 0.1 + }, "request": { "cores": 0.1 } }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "memory": { "limit": { - "bytes": 209715200 + "bytes": 52428800 }, "request": { - "bytes": 104857600 + "bytes": 52428800 } }, - "name": "metricbeat", + "name": "kindnet-cni", "status": { "phase": "running", "ready": true, @@ -491,7 +449,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "metricbeat-h24sg" + "name": "kindnet-7l48v" } }, "metricset": { @@ -505,9 +463,9 @@ }, { "container": { - "id": "30514fd6f76760a37d429af91f1d84301b9d1bae00a4b6c2845f07ab8b86eb30", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-scheduler:v1.26.3" }, "runtime": "containerd" }, @@ -518,12 +476,16 @@ }, "kubernetes": { "container": { - "id": "30514fd6f76760a37d429af91f1d84301b9d1bae00a4b6c2845f07ab8b86eb30", - "name": "hello-cronjob", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", + "name": "kube-scheduler", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -532,7 +494,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899489-sl9hn" + "name": "kube-scheduler-kind-control-plane" } }, "metricset": { @@ -546,9 +508,11 @@ }, { "container": { + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", "image": { - "name": "perl:5.34.0" - } + "name": "registry.k8s.io/kube-controller-manager:v1.26.3" + }, + "runtime": "containerd" }, "event": { "dataset": "kubernetes.container", @@ -557,11 +521,16 @@ }, "kubernetes": { "container": { - "name": "pi", + "cpu": { + "request": { + "cores": 0.2 + } + }, + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", + "name": "kube-controller-manager", "status": { - "phase": "waiting", - "ready": false, - "reason": "ContainerCreating", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -570,7 +539,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "pi-m88dn" + "name": "kube-controller-manager-kind-control-plane" } }, "metricset": { @@ -584,9 +553,9 @@ }, { "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", + "id": "d7ccd676642697b9c11ccd6789aa8ab9048ee18ee0f9627227db5e12006e0342", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "docker.io/library/nginx:1.24.0-alpine-slim" }, "runtime": "containerd" }, @@ -597,33 +566,20 @@ }, "kubernetes": { "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 - } - }, - "name": "coredns", + "id": "d7ccd676642697b9c11ccd6789aa8ab9048ee18ee0f9627227db5e12006e0342", + "name": "nginx", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-q2mmv" + "name": "web-0" } }, "metricset": { @@ -637,9 +593,9 @@ }, { "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" + "name": "registry.k8s.io/etcd:3.5.6-0" }, "runtime": "containerd" }, @@ -652,11 +608,16 @@ "container": { "cpu": { "request": { - "cores": 0.2 + "cores": 0.1 } }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", + "memory": { + "request": { + "bytes": 104857600 + } + }, + "name": "etcd", "status": { "phase": "running", "ready": true, @@ -668,7 +629,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-controller-manager-kind-control-plane" + "name": "etcd-kind-control-plane" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 73% rename from metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.9.2.plain-expected.json index 25a54f795dd..0cc18e6dc5c 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_container/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -1,9 +1,9 @@ [ { "container": { - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", "image": { - "name": "docker.io/kindest/kindnetd:v20221004-44d545d1" + "name": "registry.k8s.io/kube-proxy:v1.26.3" }, "runtime": "containerd" }, @@ -14,24 +14,8 @@ }, "kubernetes": { "container": { - "cpu": { - "limit": { - "cores": 0.1 - }, - "request": { - "cores": 0.1 - } - }, - "id": "db273ae4a6486d1e52dda314a8d0ce84d9014ce5e0f9c94812119a73d579e2fc", - "memory": { - "limit": { - "bytes": 52428800 - }, - "request": { - "bytes": 52428800 - } - }, - "name": "kindnet-cni", + "id": "c260e83eedc09fc53e541d1ce22f4f75c3d316341ccb7b8f028abdfb9fc9945f", + "name": "kube-proxy", "status": { "phase": "running", "ready": true, @@ -43,7 +27,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kindnet-4tnzw" + "name": "kube-proxy-nw7gg" } }, "metricset": { @@ -57,9 +41,9 @@ }, { "container": { - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "image": { - "name": "registry.k8s.io/etcd:3.5.4-0" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -75,13 +59,16 @@ "cores": 0.1 } }, - "id": "e2738582ad159bb495172b9571bed309f16f3a5977ca6fd9184e89700369d22b", + "id": "95a5d65b9727fe3c68ac865bfbe52590965b7f04dcb6a4e142bd45561ab4229d", "memory": { + "limit": { + "bytes": 178257920 + }, "request": { - "bytes": 104857600 + "bytes": 73400320 } }, - "name": "etcd", + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -93,7 +80,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "etcd-kind-control-plane" + "name": "coredns-787d4945fb-kx4f4" } }, "metricset": { @@ -107,9 +94,9 @@ }, { "container": { - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "quay.io/fluentd_elasticsearch/fluentd:v2.5.2" }, "runtime": "containerd" }, @@ -125,16 +112,16 @@ "cores": 0.1 } }, - "id": "6f8e923de52f2af9aa23e91b97bf5f45dc6c631aa950c0a3782f847634bbe60b", + "id": "d34823a90b7406d61d95530cf800bc1fbd2307f9ab6c6031da1d22ae577ca081", "memory": { "limit": { - "bytes": 178257920 + "bytes": 209715200 }, "request": { - "bytes": 73400320 + "bytes": 209715200 } }, - "name": "coredns", + "name": "fluentd-elasticsearch", "status": { "phase": "running", "ready": true, @@ -146,7 +133,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-dgwk8" + "name": "fluentd-elasticsearch-fwg46" } }, "metricset": { @@ -160,49 +147,9 @@ }, { "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", "image": { - "name": "docker.io/kindest/local-path-provisioner:v0.0.22-kind.0" - }, - "runtime": "containerd" - }, - "event": { - "dataset": "kubernetes.container", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "container": { - "id": "003627b6d02209f47b06938519f61ca8d3baf740f2f04866bfeb9f7d4533e997", - "name": "local-path-provisioner", - "status": { - "phase": "running", - "ready": true, - "restarts": 0 - } - }, - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "name": "local-path-provisioner-684f458cdd-wvdbd" - } - }, - "metricset": { - "name": "state_container", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "container": { - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "image": { - "name": "registry.k8s.io/kube-scheduler:v1.25.3" + "name": "registry.k8s.io/kube-apiserver:v1.26.3" }, "runtime": "containerd" }, @@ -215,11 +162,11 @@ "container": { "cpu": { "request": { - "cores": 0.1 + "cores": 0.25 } }, - "id": "f2aa38ca30cec5c42fae07ed5cda3046f9392c2a93624815542881ace6aa3ad2", - "name": "kube-scheduler", + "id": "146ae7ab6b3e9fd79e0f1fc721b54943302747fa4f84041f67b0cbdc89632427", + "name": "kube-apiserver", "status": { "phase": "running", "ready": true, @@ -231,7 +178,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-scheduler-kind-control-plane" + "name": "kube-apiserver-kind-control-plane" } }, "metricset": { @@ -245,9 +192,9 @@ }, { "container": { - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", "image": { - "name": "registry.k8s.io/kube-apiserver:v1.25.3" + "name": "registry.k8s.io/coredns/coredns:v1.9.3" }, "runtime": "containerd" }, @@ -260,11 +207,19 @@ "container": { "cpu": { "request": { - "cores": 0.25 + "cores": 0.1 } }, - "id": "01e704051af1b269270266aa05b6f330d16d88da286600c34744f7abb23618a8", - "name": "kube-apiserver", + "id": "acb7f4db2e68f827dfb83b71efcdc896dcd3c732b54f021e10897d4da333b06d", + "memory": { + "limit": { + "bytes": 178257920 + }, + "request": { + "bytes": 73400320 + } + }, + "name": "coredns", "status": { "phase": "running", "ready": true, @@ -276,7 +231,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-apiserver-kind-control-plane" + "name": "coredns-787d4945fb-rb564" } }, "metricset": { @@ -290,9 +245,9 @@ }, { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", "image": { - "name": "registry.k8s.io/kube-proxy:v1.25.3" + "name": "docker.io/library/nginx:1.24.0-alpine-slim" }, "runtime": "containerd" }, @@ -303,20 +258,20 @@ }, "kubernetes": { "container": { - "id": "9a7de41e53002ae76fe82103317edb4565ce383e3bf0395b796b4486ebc70d05", - "name": "kube-proxy", + "id": "861bef44f73cfb196df58121080eb7705eef21dbc975526341ac6078755bb063", + "name": "nginx", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "kube-proxy-flrd6" + "name": "web-0" } }, "metricset": { @@ -330,9 +285,9 @@ }, { "container": { - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", "image": { - "name": "docker.elastic.co/beats/metricbeat:8.6.0" + "name": "sha256:c408b2276bb76627a6f633bf0d26052c208ebd51681c6c89866cc9647471c0bc" }, "runtime": "containerd" }, @@ -343,33 +298,20 @@ }, "kubernetes": { "container": { - "cpu": { - "request": { - "cores": 0.1 - } - }, - "id": "94e7f7b11c08aa225de5477d74f9780548626cb49e60f29b9a7a3fd1d5c27df8", - "memory": { - "limit": { - "bytes": 209715200 - }, - "request": { - "bytes": 104857600 - } - }, - "name": "metricbeat", + "id": "0360af3d5202db264445277bbf97357bc5304a03f189307d25816272467afece", + "name": "local-path-provisioner", "status": { "phase": "running", "ready": true, "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { - "name": "metricbeat-h24sg" + "name": "local-path-provisioner-75f5b54ffd-bm5sx" } }, "metricset": { @@ -383,9 +325,9 @@ }, { "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -396,8 +338,8 @@ }, "kubernetes": { "container": { - "id": "e937b71f248fd8327b1261ba9d7f8c52be4377ae374c24ddc6911cb8ab918687", - "name": "hello-cronjob", + "id": "a7ae8b5da39c739c3298ea9e07f24c8ddb987137244ddc1bc9b71dca542a2e76", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -405,12 +347,12 @@ "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899499-k5d56" + "name": "hello-28192809-jbn5z" } }, "metricset": { @@ -424,9 +366,9 @@ }, { "container": { - "id": "3ba2b0ddb34668d521831c06e4c0553e3f93458738356e97647837a13eda1063", + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "sha256:a329ae3c2c52fe00e9c4eaf48b081cd184ee4bf9aea059e497f4965f0a8deedb" }, "runtime": "containerd" }, @@ -437,12 +379,27 @@ }, "kubernetes": { "container": { - "id": "3ba2b0ddb34668d521831c06e4c0553e3f93458738356e97647837a13eda1063", - "name": "hello-cronjob", + "cpu": { + "limit": { + "cores": 0.1 + }, + "request": { + "cores": 0.1 + } + }, + "id": "c77a6a9b32ec9a78572697bd6b0ecd3cb8a7e5bbd6e6953d35877b70ecef1072", + "memory": { + "limit": { + "bytes": 52428800 + }, + "request": { + "bytes": 52428800 + } + }, + "name": "kindnet-cni", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -451,7 +408,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899497-ffm4g" + "name": "kindnet-7l48v" } }, "metricset": { @@ -465,9 +422,9 @@ }, { "container": { - "id": "4c58768671aab3b73013a030c4125c8f9d39d51772a3c75df19c84bc055094ed", + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", "image": { - "name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0" + "name": "registry.k8s.io/kube-scheduler:v1.26.3" }, "runtime": "containerd" }, @@ -478,8 +435,13 @@ }, "kubernetes": { "container": { - "id": "4c58768671aab3b73013a030c4125c8f9d39d51772a3c75df19c84bc055094ed", - "name": "kube-state-metrics", + "cpu": { + "request": { + "cores": 0.1 + } + }, + "id": "abdf93a03aed7a187e8105c26769406d171a15e381c3d780ae97ad8f62cf4e36", + "name": "kube-scheduler", "status": { "phase": "running", "ready": true, @@ -491,7 +453,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-state-metrics-8595684f78-ppcnj" + "name": "kube-scheduler-kind-control-plane" } }, "metricset": { @@ -505,9 +467,9 @@ }, { "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", "image": { - "name": "docker.io/library/busybox:1.28" + "name": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2" }, "runtime": "containerd" }, @@ -518,12 +480,11 @@ }, "kubernetes": { "container": { - "id": "f315b3d7ed76c1a93eb20f2adfdbd0783a235c8714fb26462eb9a555427d0246", - "name": "hello-cronjob", + "id": "d3e044cc786b110c508979573f77aa17c017bd73b19a9eca2f90c931269c8e23", + "name": "kube-state-metrics", "status": { - "phase": "terminated", - "ready": false, - "reason": "Completed", + "phase": "running", + "ready": true, "restarts": 0 } }, @@ -532,7 +493,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "hello-cronjob-27899498-q8cl7" + "name": "kube-state-metrics-7bc9d484b6-79ph2" } }, "metricset": { @@ -546,9 +507,9 @@ }, { "container": { - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", "image": { - "name": "registry.k8s.io/coredns/coredns:v1.9.3" + "name": "registry.k8s.io/kube-controller-manager:v1.26.3" }, "runtime": "containerd" }, @@ -561,19 +522,11 @@ "container": { "cpu": { "request": { - "cores": 0.1 - } - }, - "id": "849233d7c0fa232729cb223a66d8fb6287feadf4e4369201067397c92d413fe6", - "memory": { - "limit": { - "bytes": 178257920 - }, - "request": { - "bytes": 73400320 + "cores": 0.2 } }, - "name": "coredns", + "id": "9b733a1a21db2c08e88b6d0bb81c77a90971b349363d84115a32bcda7b6d07c7", + "name": "kube-controller-manager", "status": { "phase": "running", "ready": true, @@ -585,7 +538,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "coredns-565d847f94-q2mmv" + "name": "kube-controller-manager-kind-control-plane" } }, "metricset": { @@ -599,9 +552,9 @@ }, { "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", "image": { - "name": "docker.io/library/perl:5.34.0" + "name": "docker.io/library/busybox:latest" }, "runtime": "containerd" }, @@ -612,8 +565,8 @@ }, "kubernetes": { "container": { - "id": "b1ca049c0844dbb44840975d0fb8e0cfd90eeec664bfbc5e0e70d2e2ac47d839", - "name": "pi", + "id": "332d23c3143978bf7924a98fd162b9e98781ffa5eb6c7a8a99e2da7c293f1910", + "name": "hello", "status": { "phase": "terminated", "ready": false, @@ -621,12 +574,12 @@ "restarts": 0 } }, - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { - "name": "pi-m88dn" + "name": "hello-fddcc" } }, "metricset": { @@ -640,9 +593,9 @@ }, { "container": { - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", "image": { - "name": "registry.k8s.io/kube-controller-manager:v1.25.3" + "name": "registry.k8s.io/etcd:3.5.6-0" }, "runtime": "containerd" }, @@ -655,11 +608,16 @@ "container": { "cpu": { "request": { - "cores": 0.2 + "cores": 0.1 } }, - "id": "548badac9b0ece0c96e7222138e40aa7b9e47832cab06dc84f45a7591ec378cb", - "name": "kube-controller-manager", + "id": "a1273d6e88e83111f28f1545849ec12913c3a35d24ae2203cd1bd35db3f5d068", + "memory": { + "request": { + "bytes": 104857600 + } + }, + "name": "etcd", "status": { "phase": "running", "ready": true, @@ -671,7 +629,7 @@ "name": "kind-control-plane" }, "pod": { - "name": "kube-controller-manager-kind-control-plane" + "name": "etcd-kind-control-plane" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_container/state_container_test.go b/metricbeat/module/kubernetes/state_container/state_container_test.go index 4ed7b0b932c..5d1361ed5b8 100644 --- a/metricbeat/module/kubernetes/state_container/state_container_test.go +++ b/metricbeat/module/kubernetes/state_container/state_container_test.go @@ -28,10 +28,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_container" @@ -45,5 +44,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/data.json b/metricbeat/module/kubernetes/state_cronjob/_meta/data.json index 533c8118a17..a11ec4b5066 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/data.json +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/data.json @@ -11,18 +11,18 @@ "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568526 }, "is_suspended": false, "last_schedule": { - "sec": 1674035220 + "sec": 1691568540 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1674035280 + "sec": 1691568600 } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_cronjob", diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index d97aa0375cc..00000000000 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "active": { - "count": 1 - }, - "created": { - "sec": 1673949613 - }, - "is_suspended": false, - "last_schedule": { - "sec": 1673970060 - }, - "name": "hello-cronjob", - "next_schedule": { - "sec": 1673970120 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.cronjob", - "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_cronjob/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.8.2.plain.expected similarity index 77% rename from metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.8.2.plain.expected index 5b4c041158f..bd301eb08a7 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.8.2.plain.expected @@ -2,22 +2,22 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system" + "namespace": "default" }, "MetricSetFields": { "active": { "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568402 }, "is_suspended": false, "last_schedule": { - "sec": 1673969340 + "sec": 1691568420 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1673969400 + "sec": 1691568480 } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.9.2.plain.expected similarity index 77% rename from metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.9.2.plain.expected index 7b8b896e97d..728c1a98c0e 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/test/ksm.v2.9.2.plain.expected @@ -2,22 +2,22 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system" + "namespace": "default" }, "MetricSetFields": { "active": { "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568526 }, "is_suspended": false, "last_schedule": { - "sec": 1673969940 + "sec": 1691568540 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1673970000 + "sec": 1691568600 } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/docs.plain-expected.json index 54e3e44e534..6594e93fd5b 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/docs.plain-expected.json @@ -11,18 +11,18 @@ "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568526 }, "is_suspended": false, "last_schedule": { - "sec": 1674035220 + "sec": 1691568540 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1674035280 + "sec": 1691568600 } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_cronjob", diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index fe73e24db3a..00000000000 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.cronjob", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "cronjob": { - "active": { - "count": 1 - }, - "created": { - "sec": 1673949613 - }, - "is_suspended": false, - "last_schedule": { - "sec": 1673970060 - }, - "name": "hello-cronjob", - "next_schedule": { - "sec": 1673970120 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_cronjob", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 78% rename from metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.8.2.plain-expected.json index 29d27cbbabe..1ea412f1f6e 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -11,18 +11,18 @@ "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568402 }, "is_suspended": false, "last_schedule": { - "sec": 1673969940 + "sec": 1691568420 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1673970000 + "sec": 1691568480 } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_cronjob", diff --git a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 78% rename from metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.9.2.plain-expected.json index 520b9ca0c61..6594e93fd5b 100644 --- a/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ b/metricbeat/module/kubernetes/state_cronjob/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -11,18 +11,18 @@ "count": 0 }, "created": { - "sec": 1673949613 + "sec": 1691568526 }, "is_suspended": false, "last_schedule": { - "sec": 1673969340 + "sec": 1691568540 }, - "name": "hello-cronjob", + "name": "hello", "next_schedule": { - "sec": 1673969400 + "sec": 1691568600 } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_cronjob", diff --git a/metricbeat/module/kubernetes/state_cronjob/state_cronjob_test.go b/metricbeat/module/kubernetes/state_cronjob/state_cronjob_test.go index 33d36b9e71b..ad30355609f 100644 --- a/metricbeat/module/kubernetes/state_cronjob/state_cronjob_test.go +++ b/metricbeat/module/kubernetes/state_cronjob/state_cronjob_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_cronjob" @@ -46,5 +45,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/data.json b/metricbeat/module/kubernetes/state_daemonset/_meta/data.json index cf841f67707..5856069d568 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/data.json +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/data.json @@ -7,7 +7,7 @@ }, "kubernetes": { "daemonset": { - "name": "metricbeat", + "name": "kube-proxy", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 68152f3e905..00000000000 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,77 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "kindnet", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.daemonset", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "metricbeat", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.daemonset", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "kube-proxy", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.daemonset", - "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_daemonset/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.7.0.plain.expected index 68152f3e905..9d821d27069 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.7.0.plain.expected @@ -30,7 +30,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "metricbeat", + "name": "kube-proxy", "replicas": { "available": 1, "desired": 1, @@ -55,7 +55,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "kube-proxy", + "name": "metricbeat", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.8.2.plain.expected similarity index 97% rename from metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.8.2.plain.expected index 68152f3e905..12c6e8842b8 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.8.2.plain.expected @@ -5,7 +5,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "kindnet", + "name": "fluentd-elasticsearch", "replicas": { "available": 1, "desired": 1, @@ -30,7 +30,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "metricbeat", + "name": "kindnet", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.9.2.plain.expected similarity index 97% rename from metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.9.2.plain.expected index 68152f3e905..12c6e8842b8 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/test/ksm.v2.9.2.plain.expected @@ -5,7 +5,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "kindnet", + "name": "fluentd-elasticsearch", "replicas": { "available": 1, "desired": 1, @@ -30,7 +30,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "metricbeat", + "name": "kindnet", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/docs.plain-expected.json index f29928b41e3..d4f9d69fc11 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/docs.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "daemonset": { - "name": "metricbeat", + "name": "kube-proxy", "replicas": { "available": 1, "desired": 1, @@ -34,7 +34,7 @@ }, "kubernetes": { "daemonset": { - "name": "kube-proxy", + "name": "kindnet", "replicas": { "available": 1, "desired": 1, @@ -61,7 +61,7 @@ }, "kubernetes": { "daemonset": { - "name": "kindnet", + "name": "fluentd-elasticsearch", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index f29928b41e3..00000000000 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,83 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.daemonset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "daemonset": { - "name": "metricbeat", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_daemonset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.daemonset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "daemonset": { - "name": "kube-proxy", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_daemonset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.daemonset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "daemonset": { - "name": "kindnet", - "replicas": { - "available": 1, - "desired": 1, - "ready": 1, - "unavailable": 0 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_daemonset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 97% rename from metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.8.2.plain-expected.json index f29928b41e3..d4f9d69fc11 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "daemonset": { - "name": "metricbeat", + "name": "kube-proxy", "replicas": { "available": 1, "desired": 1, @@ -34,7 +34,7 @@ }, "kubernetes": { "daemonset": { - "name": "kube-proxy", + "name": "kindnet", "replicas": { "available": 1, "desired": 1, @@ -61,7 +61,7 @@ }, "kubernetes": { "daemonset": { - "name": "kindnet", + "name": "fluentd-elasticsearch", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 97% rename from metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.9.2.plain-expected.json index f29928b41e3..d4f9d69fc11 100644 --- a/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_daemonset/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "daemonset": { - "name": "metricbeat", + "name": "kube-proxy", "replicas": { "available": 1, "desired": 1, @@ -34,7 +34,7 @@ }, "kubernetes": { "daemonset": { - "name": "kube-proxy", + "name": "kindnet", "replicas": { "available": 1, "desired": 1, @@ -61,7 +61,7 @@ }, "kubernetes": { "daemonset": { - "name": "kindnet", + "name": "fluentd-elasticsearch", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_daemonset/state_daemonset_test.go b/metricbeat/module/kubernetes/state_daemonset/state_daemonset_test.go index 2c4568376d0..fa038b23aa8 100644 --- a/metricbeat/module/kubernetes/state_daemonset/state_daemonset_test.go +++ b/metricbeat/module/kubernetes/state_daemonset/state_daemonset_test.go @@ -31,10 +31,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_daemonset" @@ -48,5 +47,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/data.json b/metricbeat/module/kubernetes/state_deployment/_meta/data.json index 40d0ae89c35..56ac481dc35 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/data.json +++ b/metricbeat/module/kubernetes/state_deployment/_meta/data.json @@ -14,6 +14,10 @@ "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "namespace": "kube-system" diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/fields.yml b/metricbeat/module/kubernetes/state_deployment/_meta/fields.yml index cc89c601abe..98f341b0bfc 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/fields.yml +++ b/metricbeat/module/kubernetes/state_deployment/_meta/fields.yml @@ -8,6 +8,16 @@ type: boolean description: > Kubernetes deployment paused status + - name: status + type: group + fields: + - name: available + type: keyword + description: | + Deployment Available Condition status (true, false or unknown) + - name: progressing + type: keyword + description: Deployment Progresing Condition status (true, false or unknown) - name: replicas type: group description: > diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 8d8cfcb2927..00000000000 --- a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "kube-state-metrics", - "paused": false, - "replicas": { - "available": 1, - "desired": 1, - "unavailable": 0, - "updated": 1 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.deployment", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "local-path-storage" - }, - "MetricSetFields": { - "name": "local-path-provisioner", - "paused": false, - "replicas": { - "available": 1, - "desired": 1, - "unavailable": 0, - "updated": 1 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.deployment", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "coredns", - "paused": false, - "replicas": { - "available": 2, - "desired": 2, - "unavailable": 0, - "updated": 2 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.deployment", - "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_deployment/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.7.0.plain.expected index 8d8cfcb2927..255f9a998a1 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.7.0.plain.expected @@ -2,16 +2,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system" + "namespace": "local-path-storage" }, "MetricSetFields": { - "name": "kube-state-metrics", + "name": "local-path-provisioner", "paused": false, "replicas": { "available": 1, "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -28,16 +32,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage" + "namespace": "kube-system" }, "MetricSetFields": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -57,13 +65,17 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "coredns", + "name": "kube-state-metrics", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.8.2.plain.expected similarity index 86% rename from metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.8.2.plain.expected index 8d8cfcb2927..255f9a998a1 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.8.2.plain.expected @@ -2,16 +2,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system" + "namespace": "local-path-storage" }, "MetricSetFields": { - "name": "kube-state-metrics", + "name": "local-path-provisioner", "paused": false, "replicas": { "available": 1, "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -28,16 +32,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage" + "namespace": "kube-system" }, "MetricSetFields": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -57,13 +65,17 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "coredns", + "name": "kube-state-metrics", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.9.2.plain.expected similarity index 86% rename from metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.9.2.plain.expected index 8d8cfcb2927..255f9a998a1 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_deployment/_meta/test/ksm.v2.9.2.plain.expected @@ -2,16 +2,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system" + "namespace": "local-path-storage" }, "MetricSetFields": { - "name": "kube-state-metrics", + "name": "local-path-provisioner", "paused": false, "replicas": { "available": 1, "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -28,16 +32,20 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage" + "namespace": "kube-system" }, "MetricSetFields": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", @@ -57,13 +65,17 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "coredns", + "name": "kube-state-metrics", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/docs.plain-expected.json index 57c8514aa53..c8ae3128b6c 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/docs.plain-expected.json @@ -14,6 +14,10 @@ "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "namespace": "kube-system" @@ -35,16 +39,20 @@ }, "kubernetes": { "deployment": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "local-path-storage" + "namespace": "kube-system" }, "metricset": { "name": "state_deployment", @@ -63,16 +71,20 @@ }, "kubernetes": { "deployment": { - "name": "coredns", + "name": "local-path-provisioner", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "kube-system" + "namespace": "local-path-storage" }, "metricset": { "name": "state_deployment", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index 57c8514aa53..00000000000 --- a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,86 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.deployment", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "deployment": { - "name": "kube-state-metrics", - "paused": false, - "replicas": { - "available": 1, - "desired": 1, - "unavailable": 0, - "updated": 1 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_deployment", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.deployment", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "deployment": { - "name": "local-path-provisioner", - "paused": false, - "replicas": { - "available": 1, - "desired": 1, - "unavailable": 0, - "updated": 1 - } - }, - "namespace": "local-path-storage" - }, - "metricset": { - "name": "state_deployment", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.deployment", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "deployment": { - "name": "coredns", - "paused": false, - "replicas": { - "available": 2, - "desired": 2, - "unavailable": 0, - "updated": 2 - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_deployment", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.7.0.plain-expected.json b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.7.0.plain-expected.json index 57c8514aa53..c8ae3128b6c 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.7.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.7.0.plain-expected.json @@ -14,6 +14,10 @@ "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "namespace": "kube-system" @@ -35,16 +39,20 @@ }, "kubernetes": { "deployment": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "local-path-storage" + "namespace": "kube-system" }, "metricset": { "name": "state_deployment", @@ -63,16 +71,20 @@ }, "kubernetes": { "deployment": { - "name": "coredns", + "name": "local-path-provisioner", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "kube-system" + "namespace": "local-path-storage" }, "metricset": { "name": "state_deployment", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 85% rename from metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.8.2.plain-expected.json index 57c8514aa53..c8ae3128b6c 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -14,6 +14,10 @@ "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "namespace": "kube-system" @@ -35,16 +39,20 @@ }, "kubernetes": { "deployment": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "local-path-storage" + "namespace": "kube-system" }, "metricset": { "name": "state_deployment", @@ -63,16 +71,20 @@ }, "kubernetes": { "deployment": { - "name": "coredns", + "name": "local-path-provisioner", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "kube-system" + "namespace": "local-path-storage" }, "metricset": { "name": "state_deployment", diff --git a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 85% rename from metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.9.2.plain-expected.json index 57c8514aa53..c8ae3128b6c 100644 --- a/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_deployment/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -14,6 +14,10 @@ "desired": 1, "unavailable": 0, "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, "namespace": "kube-system" @@ -35,16 +39,20 @@ }, "kubernetes": { "deployment": { - "name": "local-path-provisioner", + "name": "coredns", "paused": false, "replicas": { - "available": 1, - "desired": 1, + "available": 2, + "desired": 2, "unavailable": 0, - "updated": 1 + "updated": 2 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "local-path-storage" + "namespace": "kube-system" }, "metricset": { "name": "state_deployment", @@ -63,16 +71,20 @@ }, "kubernetes": { "deployment": { - "name": "coredns", + "name": "local-path-provisioner", "paused": false, "replicas": { - "available": 2, - "desired": 2, + "available": 1, + "desired": 1, "unavailable": 0, - "updated": 2 + "updated": 1 + }, + "status": { + "available": "true", + "progressing": "true" } }, - "namespace": "kube-system" + "namespace": "local-path-storage" }, "metricset": { "name": "state_deployment", diff --git a/metricbeat/module/kubernetes/state_deployment/state_deployment.go b/metricbeat/module/kubernetes/state_deployment/state_deployment.go index 1e7129719b4..31bb53f9e33 100644 --- a/metricbeat/module/kubernetes/state_deployment/state_deployment.go +++ b/metricbeat/module/kubernetes/state_deployment/state_deployment.go @@ -32,7 +32,23 @@ var mapping = &p.MetricsMapping{ "kube_deployment_status_replicas_unavailable": p.Metric("replicas.unavailable"), "kube_deployment_status_replicas_available": p.Metric("replicas.available"), "kube_deployment_spec_replicas": p.Metric("replicas.desired"), - "kube_deployment_spec_paused": p.BooleanMetric("paused"), + /* + This is how deployment_status_condition field will be exported: + + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Available",status="true"} 0 + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Available",status="false"} 1 + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Available",status="unknown"} 0 + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Progressing",status="true"} 1 + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Progressing",status="false"} 0 + kube_deployment_status_condition{namespace="default",deployment="test-deployment",condition="Progressing",status="unknown"} 0 + */ + "kube_deployment_status_condition": p.LabelMetric("status", "status", p.OpFilterMap( + "condition", map[string]string{ + "Progressing": "progressing", + "Available": "available", + }, + )), //The current status conditions of a deployment + "kube_deployment_spec_paused": p.BooleanMetric("paused"), }, Labels: map[string]p.LabelMap{ diff --git a/metricbeat/module/kubernetes/state_deployment/state_deployment_test.go b/metricbeat/module/kubernetes/state_deployment/state_deployment_test.go index f2202ceaef4..e064a1e0c30 100644 --- a/metricbeat/module/kubernetes/state_deployment/state_deployment_test.go +++ b/metricbeat/module/kubernetes/state_deployment/state_deployment_test.go @@ -30,10 +30,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_deployment" @@ -47,5 +46,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_job/_meta/data.json b/metricbeat/module/kubernetes/state_job/_meta/data.json index af6abf00413..e328c10329d 100644 --- a/metricbeat/module/kubernetes/state_job/_meta/data.json +++ b/metricbeat/module/kubernetes/state_job/_meta/data.json @@ -10,11 +10,11 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900586", + "name": "hello-28192809", "owner": { "is_controller": "true", "kind": "CronJob", - "name": "hello-cronjob" + "name": "hello" }, "parallelism": { "desired": 1 @@ -28,11 +28,11 @@ "complete": "true" }, "time": { - "completed": "2023-01-18T09:46:04.000Z", - "created": "2023-01-18T09:46:00.000Z" + "completed": "2023-08-09T08:09:04.000Z", + "created": "2023-08-09T08:09:00.000Z" } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_job", diff --git a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index 962ed512d7a..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,166 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899487", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:27:04.000Z", - "created": "2023-01-17T15:27:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899489", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:29:04.000Z", - "created": "2023-01-17T15:29:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 1, - "failed": 0, - "succeeded": 0 - }, - "time": { - "created": "2023-01-17T15:29:15.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899488", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:28:04.000Z", - "created": "2023-01-17T15:28:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "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_job/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.5.0.plain.expected deleted file mode 100644 index 616b930587b..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.5.0.plain.expected +++ /dev/null @@ -1,170 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899497", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:37:04.000Z", - "created": "2023-01-17T15:37:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899498", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:38:04.000Z", - "created": "2023-01-17T15:38:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899499", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:39:04.000Z", - "created": "2023-01-17T15:39:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "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_job/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index e8bbc7b92eb..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,208 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899500", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:40:04.000Z", - "created": "2023-01-17T15:40:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899498", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:38:04.000Z", - "created": "2023-01-17T15:38:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899501", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 1, - "failed": 0, - "succeeded": 0 - }, - "time": { - "created": "2023-01-17T15:41:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899499", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:39:04.000Z", - "created": "2023-01-17T15:39:00.000Z" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.job", - "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_job/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.7.0.plain.expected index 54b1e310ea9..41427922b48 100644 --- a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.7.0.plain.expected @@ -8,7 +8,7 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900585", + "name": "hello-cronjob-27900586", "owner": { "is_controller": "true", "kind": "CronJob", @@ -26,8 +26,8 @@ "complete": "true" }, "time": { - "completed": "2023-01-18T09:45:04.000Z", - "created": "2023-01-18T09:45:00.000Z" + "completed": "2023-01-18T09:46:04.000Z", + "created": "2023-01-18T09:46:00.000Z" } }, "Index": "", @@ -50,7 +50,7 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900586", + "name": "hello-cronjob-27900585", "owner": { "is_controller": "true", "kind": "CronJob", @@ -68,8 +68,8 @@ "complete": "true" }, "time": { - "completed": "2023-01-18T09:46:04.000Z", - "created": "2023-01-18T09:46:00.000Z" + "completed": "2023-01-18T09:45:04.000Z", + "created": "2023-01-18T09:45:00.000Z" } }, "Index": "", @@ -92,11 +92,11 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900587", + "name": "pi", "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" + "is_controller": "\u003cnone\u003e", + "kind": "\u003cnone\u003e", + "name": "\u003cnone\u003e" }, "parallelism": { "desired": 1 @@ -110,8 +110,8 @@ "complete": "true" }, "time": { - "completed": "2023-01-18T09:47:04.000Z", - "created": "2023-01-18T09:47:00.000Z" + "completed": "2023-01-17T15:30:11.000Z", + "created": "2023-01-17T15:29:15.000Z" } }, "Index": "", @@ -134,11 +134,11 @@ "completions": { "desired": 1 }, - "name": "pi", + "name": "hello-cronjob-27900587", "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" + "is_controller": "true", + "kind": "CronJob", + "name": "hello-cronjob" }, "parallelism": { "desired": 1 @@ -152,8 +152,8 @@ "complete": "true" }, "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" + "completed": "2023-01-18T09:47:04.000Z", + "created": "2023-01-18T09:47:00.000Z" } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.8.2.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.8.2.plain.expected new file mode 100644 index 00000000000..f43115e55ab --- /dev/null +++ b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.8.2.plain.expected @@ -0,0 +1,81 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "completions": { + "desired": 1 + }, + "name": "hello", + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:06:46.000Z", + "created": "2023-08-09T08:06:42.000Z" + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.job", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "completions": { + "desired": 1 + }, + "name": "hello-28192807", + "owner": { + "is_controller": "true", + "kind": "CronJob", + "name": "hello" + }, + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:07:04.000Z", + "created": "2023-08-09T08:07:00.000Z" + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.job", + "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_job/_meta/test/ksm.v2.9.2.plain.expected b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.9.2.plain.expected new file mode 100644 index 00000000000..5b54736e74c --- /dev/null +++ b/metricbeat/module/kubernetes/state_job/_meta/test/ksm.v2.9.2.plain.expected @@ -0,0 +1,81 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "completions": { + "desired": 1 + }, + "name": "hello", + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:08:51.000Z", + "created": "2023-08-09T08:08:46.000Z" + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.job", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "completions": { + "desired": 1 + }, + "name": "hello-28192809", + "owner": { + "is_controller": "true", + "kind": "CronJob", + "name": "hello" + }, + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:09:04.000Z", + "created": "2023-08-09T08:09:00.000Z" + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.job", + "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_job/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/docs.plain-expected.json index 46e73200695..ce8e62c4e25 100644 --- a/metricbeat/module/kubernetes/state_job/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_job/_meta/testdata/docs.plain-expected.json @@ -10,11 +10,11 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900586", + "name": "hello-28192809", "owner": { "is_controller": "true", "kind": "CronJob", - "name": "hello-cronjob" + "name": "hello" }, "parallelism": { "desired": 1 @@ -28,11 +28,11 @@ "complete": "true" }, "time": { - "completed": "2023-01-18T09:46:04.000Z", - "created": "2023-01-18T09:46:00.000Z" + "completed": "2023-08-09T08:09:04.000Z", + "created": "2023-08-09T08:09:00.000Z" } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_job", @@ -54,100 +54,7 @@ "completions": { "desired": 1 }, - "name": "hello-cronjob-27900587", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-18T09:47:04.000Z", - "created": "2023-01-18T09:47:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27900585", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-18T09:45:04.000Z", - "created": "2023-01-18T09:45:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, + "name": "hello", "parallelism": { "desired": 1 }, @@ -160,11 +67,11 @@ "complete": "true" }, "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" + "completed": "2023-08-09T08:08:51.000Z", + "created": "2023-08-09T08:08:46.000Z" } }, - "namespace": "kube-system" + "namespace": "default" }, "metricset": { "name": "state_job", diff --git a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 817ba754bfc..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,174 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899488", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:28:04.000Z", - "created": "2023-01-17T15:28:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899487", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:27:04.000Z", - "created": "2023-01-17T15:27:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 1, - "failed": 0, - "succeeded": 0 - }, - "time": { - "created": "2023-01-17T15:29:15.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899489", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:29:04.000Z", - "created": "2023-01-17T15:29:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.5.0.plain-expected.json deleted file mode 100644 index 38133364104..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ /dev/null @@ -1,178 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899499", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:39:04.000Z", - "created": "2023-01-17T15:39:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899497", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:37:04.000Z", - "created": "2023-01-17T15:37:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899498", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:38:04.000Z", - "created": "2023-01-17T15:38:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index 6c4190e31f2..00000000000 --- a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,218 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899499", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:39:04.000Z", - "created": "2023-01-17T15:39:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899498", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:38:04.000Z", - "created": "2023-01-17T15:38:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899501", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 1, - "failed": 0, - "succeeded": 0 - }, - "time": { - "created": "2023-01-17T15:41:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "hello-cronjob-27899500", - "owner": { - "is_controller": "true", - "kind": "CronJob", - "name": "hello-cronjob" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:40:04.000Z", - "created": "2023-01-17T15:40:00.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.job", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "job": { - "completions": { - "desired": 1 - }, - "name": "pi", - "owner": { - "is_controller": "\u003cnone\u003e", - "kind": "\u003cnone\u003e", - "name": "\u003cnone\u003e" - }, - "parallelism": { - "desired": 1 - }, - "pods": { - "active": 0, - "failed": 0, - "succeeded": 1 - }, - "status": { - "complete": "true" - }, - "time": { - "completed": "2023-01-17T15:30:11.000Z", - "created": "2023-01-17T15:29:15.000Z" - } - }, - "namespace": "kube-system" - }, - "metricset": { - "name": "state_job", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.8.2.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.8.2.plain-expected.json new file mode 100644 index 00000000000..a5083d1d7eb --- /dev/null +++ b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -0,0 +1,85 @@ +[ + { + "event": { + "dataset": "kubernetes.job", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "job": { + "completions": { + "desired": 1 + }, + "name": "hello", + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:06:46.000Z", + "created": "2023-08-09T08:06:42.000Z" + } + }, + "namespace": "default" + }, + "metricset": { + "name": "state_job", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.job", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "job": { + "completions": { + "desired": 1 + }, + "name": "hello-28192807", + "owner": { + "is_controller": "true", + "kind": "CronJob", + "name": "hello" + }, + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:07:04.000Z", + "created": "2023-08-09T08:07:00.000Z" + } + }, + "namespace": "default" + }, + "metricset": { + "name": "state_job", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.9.2.plain-expected.json b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.9.2.plain-expected.json new file mode 100644 index 00000000000..ce8e62c4e25 --- /dev/null +++ b/metricbeat/module/kubernetes/state_job/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -0,0 +1,85 @@ +[ + { + "event": { + "dataset": "kubernetes.job", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "job": { + "completions": { + "desired": 1 + }, + "name": "hello-28192809", + "owner": { + "is_controller": "true", + "kind": "CronJob", + "name": "hello" + }, + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:09:04.000Z", + "created": "2023-08-09T08:09:00.000Z" + } + }, + "namespace": "default" + }, + "metricset": { + "name": "state_job", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.job", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "job": { + "completions": { + "desired": 1 + }, + "name": "hello", + "parallelism": { + "desired": 1 + }, + "pods": { + "active": 0, + "failed": 0, + "succeeded": 1 + }, + "status": { + "complete": "true" + }, + "time": { + "completed": "2023-08-09T08:08:51.000Z", + "created": "2023-08-09T08:08:46.000Z" + } + }, + "namespace": "default" + }, + "metricset": { + "name": "state_job", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_job/state_job_test.go b/metricbeat/module/kubernetes/state_job/state_job_test.go index 3c2805dd4f1..914f2e8e1c8 100644 --- a/metricbeat/module/kubernetes/state_job/state_job_test.go +++ b/metricbeat/module/kubernetes/state_job/state_job_test.go @@ -30,10 +30,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_job" @@ -47,5 +46,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 5a128b0b8e7..00000000000 --- a/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,50 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": null, - "MetricSetFields": { - "cpu": { - "allocatable": { - "cores": 8 - }, - "capacity": { - "cores": 8 - } - }, - "memory": { - "allocatable": { - "bytes": 16259682304 - }, - "capacity": { - "bytes": 16259682304 - } - }, - "name": "kind-control-plane", - "pod": { - "allocatable": { - "total": 110 - }, - "capacity": { - "total": 110 - } - }, - "status": { - "disk_pressure": "false", - "memory_pressure": "false", - "pid_pressure": "false", - "ready": "true", - "unschedulable": false - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.node", - "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_node/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.8.2.plain.expected similarity index 100% rename from metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.8.2.plain.expected diff --git a/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.9.2.plain.expected similarity index 100% rename from metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_node/_meta/test/ksm.v2.9.2.plain.expected diff --git a/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index d8a1b91b599..00000000000 --- a/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,53 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.node", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "node": { - "cpu": { - "allocatable": { - "cores": 8 - }, - "capacity": { - "cores": 8 - } - }, - "memory": { - "allocatable": { - "bytes": 16259682304 - }, - "capacity": { - "bytes": 16259682304 - } - }, - "name": "kind-control-plane", - "pod": { - "allocatable": { - "total": 110 - }, - "capacity": { - "total": 110 - } - }, - "status": { - "disk_pressure": "false", - "memory_pressure": "false", - "pid_pressure": "false", - "ready": "true", - "unschedulable": false - } - } - }, - "metricset": { - "name": "state_node", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 100% rename from metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.8.2.plain-expected.json diff --git a/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 100% rename from metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_node/_meta/testdata/ksm.v2.9.2.plain-expected.json diff --git a/metricbeat/module/kubernetes/state_node/state_node_test.go b/metricbeat/module/kubernetes/state_node/state_node_test.go index baaf0fe4ee4..22a42644253 100644 --- a/metricbeat/module/kubernetes/state_node/state_node_test.go +++ b/metricbeat/module/kubernetes/state_node/state_node_test.go @@ -31,10 +31,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_node" @@ -48,5 +47,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/data.json b/metricbeat/module/kubernetes/state_persistentvolume/_meta/data.json index 53a91321488..b62b5a8b3dd 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/data.json +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/data.json @@ -8,11 +8,11 @@ "kubernetes": { "persistentvolume": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index c3ebcf645bf..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": null, - "MetricSetFields": { - "capacity": { - "bytes": 5368709120 - }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolume", - "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_persistentvolume/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.8.2.plain.expected similarity index 76% rename from metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.8.2.plain.expected index c3ebcf645bf..cac996ee049 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.8.2.plain.expected @@ -4,11 +4,11 @@ "ModuleFields": null, "MetricSetFields": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" }, "Index": "", "ID": "", diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.9.2.plain.expected similarity index 76% rename from metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.6.0.plain.expected rename to metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.9.2.plain.expected index c3ebcf645bf..cac996ee049 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.6.0.plain.expected +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/test/ksm.v2.9.2.plain.expected @@ -4,11 +4,11 @@ "ModuleFields": null, "MetricSetFields": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" }, "Index": "", "ID": "", diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/docs.plain-expected.json index 331d97ff689..bbc74ddff93 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/docs.plain-expected.json @@ -8,11 +8,11 @@ "kubernetes": { "persistentvolume": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 331d97ff689..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,27 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.persistentvolume", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "persistentvolume": { - "capacity": { - "bytes": 5368709120 - }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" - } - }, - "metricset": { - "name": "state_persistentvolume", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 76% rename from metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.8.2.plain-expected.json index 331d97ff689..bbc74ddff93 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -8,11 +8,11 @@ "kubernetes": { "persistentvolume": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 76% rename from metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.6.0.plain-expected.json rename to metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.9.2.plain-expected.json index 331d97ff689..bbc74ddff93 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_persistentvolume/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -8,11 +8,11 @@ "kubernetes": { "persistentvolume": { "capacity": { - "bytes": 5368709120 + "bytes": 2048 }, - "name": "pv0003", - "phase": "Available", - "storage_class": "slow" + "name": "task-pv-volume", + "phase": "Bound", + "storage_class": "generic" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolume/state_persistentvolume_test.go b/metricbeat/module/kubernetes/state_persistentvolume/state_persistentvolume_test.go index 4000c5374d1..4a612271f31 100644 --- a/metricbeat/module/kubernetes/state_persistentvolume/state_persistentvolume_test.go +++ b/metricbeat/module/kubernetes/state_persistentvolume/state_persistentvolume_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_persistentvolume" @@ -46,5 +45,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/data.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/data.json index c485d62edc8..624e765cc32 100644 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/data.json +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/data.json @@ -9,12 +9,13 @@ "namespace": "default", "persistentvolumeclaim": { "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", + "name": "task-pv-claim", + "phase": "Bound", "request_storage": { - "bytes": 1073741824 + "bytes": 1024 }, - "storage_class": "my-storage-class" + "storage_class": "generic", + "volume_name": "task-pv-volume" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index 79767fa3444..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "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_persistentvolumeclaim/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.5.0.plain.expected deleted file mode 100644 index 79767fa3444..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.5.0.plain.expected +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "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_persistentvolumeclaim/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 79767fa3444..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.persistentvolumeclaim", - "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_statefulset/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.8.2.plain.expected similarity index 54% rename from metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.8.2.plain.expected index 619c1663f19..c23e59c4514 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.8.2.plain.expected @@ -5,21 +5,18 @@ "namespace": "default" }, "MetricSetFields": { - "created": 1673969356, - "generation": { - "desired": 1, - "observed": 1 + "access_mode": "ReadWriteOnce", + "name": "task-pv-claim", + "phase": "Bound", + "request_storage": { + "bytes": 1024 }, - "name": "web", - "replicas": { - "desired": 3, - "observed": 1, - "ready": 0 - } + "storage_class": "generic", + "volume_name": "task-pv-volume" }, "Index": "", "ID": "", - "Namespace": "kubernetes.statefulset", + "Namespace": "kubernetes.persistentvolumeclaim", "Timestamp": "0001-01-01T00:00:00Z", "Error": null, "Host": "", diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.9.2.plain.expected b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.9.2.plain.expected new file mode 100644 index 00000000000..c23e59c4514 --- /dev/null +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/test/ksm.v2.9.2.plain.expected @@ -0,0 +1,28 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "access_mode": "ReadWriteOnce", + "name": "task-pv-claim", + "phase": "Bound", + "request_storage": { + "bytes": 1024 + }, + "storage_class": "generic", + "volume_name": "task-pv-volume" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.persistentvolumeclaim", + "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_persistentvolumeclaim/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/docs.plain-expected.json index a5381ecbe64..a6d085f310e 100644 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/docs.plain-expected.json @@ -9,39 +9,13 @@ "namespace": "default", "persistentvolumeclaim": { "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", + "name": "task-pv-claim", + "phase": "Bound", "request_storage": { - "bytes": 1073741824 + "bytes": 1024 }, - "storage_class": "my-storage-class" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" + "storage_class": "generic", + "volume_name": "task-pv-volume" } }, "metricset": { diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index a5381ecbe64..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.5.0.plain-expected.json deleted file mode 100644 index a5381ecbe64..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index a5381ecbe64..00000000000 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "www-web-0", - "phase": "Pending", - "request_storage": { - "bytes": 1073741824 - }, - "storage_class": "my-storage-class" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.persistentvolumeclaim", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "persistentvolumeclaim": { - "access_mode": "ReadWriteOnce", - "name": "myclaim", - "phase": "Pending", - "request_storage": { - "bytes": 8589934592 - }, - "storage_class": "slow" - } - }, - "metricset": { - "name": "state_persistentvolumeclaim", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.8.2.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.8.2.plain-expected.json new file mode 100644 index 00000000000..a6d085f310e --- /dev/null +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -0,0 +1,30 @@ +[ + { + "event": { + "dataset": "kubernetes.persistentvolumeclaim", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "persistentvolumeclaim": { + "access_mode": "ReadWriteOnce", + "name": "task-pv-claim", + "phase": "Bound", + "request_storage": { + "bytes": 1024 + }, + "storage_class": "generic", + "volume_name": "task-pv-volume" + } + }, + "metricset": { + "name": "state_persistentvolumeclaim", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.9.2.plain-expected.json b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.9.2.plain-expected.json new file mode 100644 index 00000000000..a6d085f310e --- /dev/null +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -0,0 +1,30 @@ +[ + { + "event": { + "dataset": "kubernetes.persistentvolumeclaim", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "persistentvolumeclaim": { + "access_mode": "ReadWriteOnce", + "name": "task-pv-claim", + "phase": "Bound", + "request_storage": { + "bytes": 1024 + }, + "storage_class": "generic", + "volume_name": "task-pv-volume" + } + }, + "metricset": { + "name": "state_persistentvolumeclaim", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_persistentvolumeclaim/state_persistentvolumeclaim_test.go b/metricbeat/module/kubernetes/state_persistentvolumeclaim/state_persistentvolumeclaim_test.go index 9273e1d63e1..2cc3326261c 100644 --- a/metricbeat/module/kubernetes/state_persistentvolumeclaim/state_persistentvolumeclaim_test.go +++ b/metricbeat/module/kubernetes/state_persistentvolumeclaim/state_persistentvolumeclaim_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_persistentvolumeclaim" @@ -46,5 +45,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_pod/_meta/data.json b/metricbeat/module/kubernetes/state_pod/_meta/data.json index 08743f87f83..cea25ae8692 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/data.json +++ b/metricbeat/module/kubernetes/state_pod/_meta/data.json @@ -6,17 +6,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-6xfvl", + "ip": "10.244.0.22", + "name": "hello-28192809-jbn5z", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } } diff --git a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index b454746eda5..00000000000 --- a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,489 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.68", - "name": "hello-cronjob-27899498-q8cl7", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-h24sg", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.59", - "name": "pi-m88dn", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.72", - "name": "kube-state-metrics-5897f6cf77-jq242", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.73", - "name": "hello-cronjob-27899501-t2lnn", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.71", - "name": "hello-cronjob-27899500-skmng", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-scheduler-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.70", - "name": "hello-cronjob-27899499-k5d56", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kindnet-4tnzw", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "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_pod/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.7.0.plain.expected index 748c5f1c34a..87989fff856 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.7.0.plain.expected @@ -234,15 +234,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.3", + "name": "local-path-provisioner-684f458cdd-wvdbd", "status": { "phase": "running", "ready": "true", @@ -263,15 +263,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "172.18.0.2", + "name": "kube-proxy-flrd6", "status": { "phase": "running", "ready": "true", @@ -329,7 +329,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "metricbeat-6xfvl", + "name": "kindnet-4tnzw", "status": { "phase": "running", "ready": "true", @@ -358,7 +358,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kindnet-4tnzw", + "name": "metricbeat-6xfvl", "status": { "phase": "running", "ready": "true", @@ -379,19 +379,13 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } + "namespace": "default" }, "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.125", - "name": "hello-cronjob-27900587-r7g6w", + "name": "web-0", "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" + "phase": "pending", + "scheduled": "false" } }, "Index": "", @@ -437,13 +431,19 @@ { "RootFields": null, "ModuleFields": { - "namespace": "default" + "namespace": "kube-system", + "node": { + "name": "kind-control-plane" + } }, "MetricSetFields": { - "name": "web-0", + "host_ip": "172.18.0.2", + "ip": "10.244.0.125", + "name": "hello-cronjob-27900587-r7g6w", "status": { - "phase": "pending", - "scheduled": "false" + "phase": "succeeded", + "ready": "false", + "scheduled": "true" } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.8.2.plain.expected similarity index 82% rename from metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.4.2.plain.expected rename to metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.8.2.plain.expected index 51e209351c9..c597f3d986c 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.4.2.plain.expected +++ b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.8.2.plain.expected @@ -2,15 +2,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-h24sg", + "ip": "10.244.0.15", + "name": "web-0", "status": { "phase": "running", "ready": "true", @@ -38,8 +38,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", + "ip": "172.18.0.2", + "name": "kindnet-7l48v", "status": { "phase": "running", "ready": "true", @@ -67,37 +67,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.55", - "name": "hello-cronjob-27899487-6vx8l", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-scheduler-kind-control-plane", + "ip": "10.244.0.3", + "name": "coredns-787d4945fb-kx4f4", "status": { "phase": "running", "ready": "true", @@ -118,18 +89,18 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", + "ip": "10.244.0.13", + "name": "hello-7dfgp", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } }, @@ -155,7 +126,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", + "name": "kube-scheduler-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -183,11 +154,11 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.56", - "name": "hello-cronjob-27899488-mctvl", + "ip": "10.244.0.14", + "name": "kube-state-metrics-fb945547c-zdncb", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } }, @@ -205,15 +176,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.4", + "name": "local-path-provisioner-75f5b54ffd-bm5sx", "status": { "phase": "running", "ready": "true", @@ -234,15 +205,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "10.244.0.12", + "name": "fluentd-elasticsearch-qrlkt", "status": { "phase": "running", "ready": "true", @@ -271,7 +242,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", + "name": "kube-controller-manager-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -300,7 +271,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kindnet-4tnzw", + "name": "kube-apiserver-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -328,11 +299,11 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.57", - "name": "hello-cronjob-27899489-sl9hn", + "ip": "172.18.0.2", + "name": "etcd-kind-control-plane", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } }, @@ -357,10 +328,11 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "name": "pi-m88dn", + "ip": "10.244.0.2", + "name": "coredns-787d4945fb-rb564", "status": { - "phase": "pending", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } }, @@ -385,8 +357,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", + "ip": "172.18.0.2", + "name": "kube-proxy-nw7gg", "status": { "phase": "running", "ready": "true", @@ -407,41 +379,18 @@ { "RootFields": null, "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.58", - "name": "kube-state-metrics-77bcd445dd-tnbvx", + "ip": "10.244.0.16", + "name": "hello-28192807-p6f5s", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } }, diff --git a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.9.2.plain.expected similarity index 81% rename from metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.9.2.plain.expected index 5c09db8238e..6b8947a1b8b 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_pod/_meta/test/ksm.v2.9.2.plain.expected @@ -2,18 +2,18 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.68", - "name": "hello-cronjob-27899498-q8cl7", + "ip": "10.244.0.19", + "name": "web-0", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } }, @@ -39,7 +39,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "metricbeat-h24sg", + "name": "kindnet-7l48v", "status": { "phase": "running", "ready": "true", @@ -67,11 +67,11 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.59", - "name": "pi-m88dn", + "ip": "10.244.0.3", + "name": "coredns-787d4945fb-kx4f4", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } }, @@ -89,18 +89,18 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", + "ip": "10.244.0.20", + "name": "hello-fddcc", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } }, @@ -125,8 +125,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-scheduler-kind-control-plane", + "ip": "10.244.0.21", + "name": "fluentd-elasticsearch-fwg46", "status": { "phase": "running", "ready": "true", @@ -147,15 +147,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.70", - "name": "hello-cronjob-27899499-k5d56", + "ip": "10.244.0.22", + "name": "hello-28192809-jbn5z", "status": { "phase": "succeeded", "ready": "false", @@ -184,7 +184,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", + "name": "kube-scheduler-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -205,15 +205,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", + "ip": "10.244.0.4", + "name": "local-path-provisioner-75f5b54ffd-bm5sx", "status": { "phase": "running", "ready": "true", @@ -241,8 +241,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.18", + "name": "kube-state-metrics-7bc9d484b6-79ph2", "status": { "phase": "running", "ready": "true", @@ -263,15 +263,15 @@ { "RootFields": null, "ModuleFields": { - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" } }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "172.18.0.2", + "name": "kube-controller-manager-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -300,7 +300,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", + "name": "kube-apiserver-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -329,7 +329,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kindnet-4tnzw", + "name": "etcd-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -358,7 +358,7 @@ "MetricSetFields": { "host_ip": "172.18.0.2", "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", + "name": "coredns-787d4945fb-rb564", "status": { "phase": "running", "ready": "true", @@ -376,58 +376,6 @@ "Period": 0, "DisableTimeSeries": false }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - } - }, - "MetricSetFields": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.67", - "name": "hello-cronjob-27899497-ffm4g", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.pod", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, { "RootFields": null, "ModuleFields": { @@ -438,8 +386,8 @@ }, "MetricSetFields": { "host_ip": "172.18.0.2", - "ip": "10.244.0.69", - "name": "kube-state-metrics-8595684f78-ppcnj", + "ip": "172.18.0.2", + "name": "kube-proxy-nw7gg", "status": { "phase": "running", "ready": "true", diff --git a/metricbeat/module/kubernetes/state_pod/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_pod/_meta/testdata/docs.plain-expected.json index 2883e5baf8a..c518f38109b 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_pod/_meta/testdata/docs.plain-expected.json @@ -6,17 +6,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-6xfvl", + "ip": "10.244.0.22", + "name": "hello-28192809-jbn5z", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } } @@ -43,8 +43,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.124", - "name": "kube-state-metrics-548546fc89-qrkzb", + "ip": "10.244.0.18", + "name": "kube-state-metrics-7bc9d484b6-79ph2", "status": { "phase": "running", "ready": "true", @@ -75,7 +75,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kindnet-4tnzw", + "name": "kindnet-7l48v", "status": { "phase": "running", "ready": "true", @@ -105,11 +105,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.122", - "name": "hello-cronjob-27900585-6zngl", + "ip": "172.18.0.2", + "name": "kube-apiserver-kind-control-plane", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -136,39 +136,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.123", - "name": "hello-cronjob-27900586-psw5h", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "10.244.0.21", + "name": "fluentd-elasticsearch-fwg46", "status": { "phase": "running", "ready": "true", @@ -199,7 +168,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", + "name": "kube-controller-manager-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -229,8 +198,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", + "ip": "172.18.0.2", + "name": "etcd-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -254,14 +223,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", + "ip": "10.244.0.19", + "name": "web-0", "status": { "phase": "running", "ready": "true", @@ -278,31 +247,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "pod": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.pod", @@ -317,7 +261,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", + "name": "kube-proxy-nw7gg", "status": { "phase": "running", "ready": "true", @@ -341,17 +285,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.59", - "name": "pi-m88dn", + "ip": "10.244.0.4", + "name": "local-path-provisioner-75f5b54ffd-bm5sx", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -378,11 +322,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.125", - "name": "hello-cronjob-27900587-r7g6w", + "ip": "10.244.0.2", + "name": "coredns-787d4945fb-rb564", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -440,8 +384,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", + "ip": "10.244.0.3", + "name": "coredns-787d4945fb-kx4f4", "status": { "phase": "running", "ready": "true", @@ -465,17 +409,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.20", + "name": "hello-fddcc", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } } diff --git a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index 983f67bbae3..00000000000 --- a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,523 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.71", - "name": "hello-cronjob-27899500-skmng", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.70", - "name": "hello-cronjob-27899499-k5d56", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kindnet-4tnzw", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.72", - "name": "kube-state-metrics-5897f6cf77-jq242", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "local-path-storage", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-h24sg", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.73", - "name": "hello-cronjob-27899501-t2lnn", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.68", - "name": "hello-cronjob-27899498-q8cl7", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "pod": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.59", - "name": "pi-m88dn", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-scheduler-kind-control-plane", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 82% rename from metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.4.2.plain-expected.json rename to metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.8.2.plain-expected.json index a8e257b39b9..230d3854f75 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ b/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -6,46 +6,16 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kindnet-4tnzw", - "status": { - "phase": "running", - "ready": "true", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "name": "pi-m88dn", + "ip": "10.244.0.13", + "name": "hello-7dfgp", "status": { - "phase": "pending", + "phase": "succeeded", "ready": "false", "scheduled": "true" } @@ -67,14 +37,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.58", - "name": "kube-state-metrics-77bcd445dd-tnbvx", + "ip": "10.244.0.15", + "name": "web-0", "status": { "phase": "running", "ready": "true", @@ -98,17 +68,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "local-path-storage", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "10.244.0.16", + "name": "hello-28192807-p6f5s", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } } @@ -136,7 +106,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "metricbeat-h24sg", + "name": "kindnet-7l48v", "status": { "phase": "running", "ready": "true", @@ -197,8 +167,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", + "ip": "10.244.0.12", + "name": "fluentd-elasticsearch-qrlkt", "status": { "phase": "running", "ready": "true", @@ -246,31 +216,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "pod": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.pod", @@ -316,7 +261,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kube-scheduler-kind-control-plane", + "name": "kube-proxy-nw7gg", "status": { "phase": "running", "ready": "true", @@ -340,17 +285,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.56", - "name": "hello-cronjob-27899488-mctvl", + "ip": "10.244.0.4", + "name": "local-path-provisioner-75f5b54ffd-bm5sx", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -377,8 +322,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", + "ip": "10.244.0.2", + "name": "coredns-787d4945fb-rb564", "status": { "phase": "running", "ready": "true", @@ -408,11 +353,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.55", - "name": "hello-cronjob-27899487-6vx8l", + "ip": "172.18.0.2", + "name": "kube-scheduler-kind-control-plane", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -439,8 +384,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.3", + "name": "coredns-787d4945fb-kx4f4", "status": { "phase": "running", "ready": "true", @@ -470,11 +415,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.57", - "name": "hello-cronjob-27899489-sl9hn", + "ip": "10.244.0.14", + "name": "kube-state-metrics-fb945547c-zdncb", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } diff --git a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 82% rename from metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.9.2.plain-expected.json index bddf3964889..c518f38109b 100644 --- a/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_pod/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -6,14 +6,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.70", - "name": "hello-cronjob-27899499-k5d56", + "ip": "10.244.0.22", + "name": "hello-28192809-jbn5z", "status": { "phase": "succeeded", "ready": "false", @@ -43,11 +43,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.67", - "name": "hello-cronjob-27899497-ffm4g", + "ip": "10.244.0.18", + "name": "kube-state-metrics-7bc9d484b6-79ph2", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -75,7 +75,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kindnet-4tnzw", + "name": "kindnet-7l48v", "status": { "phase": "running", "ready": "true", @@ -99,14 +99,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "local-path-storage", + "namespace": "kube-system", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.3", - "name": "local-path-provisioner-684f458cdd-wvdbd", + "ip": "172.18.0.2", + "name": "kube-apiserver-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -136,8 +136,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "metricbeat-h24sg", + "ip": "10.244.0.21", + "name": "fluentd-elasticsearch-fwg46", "status": { "phase": "running", "ready": "true", @@ -168,7 +168,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "kube-apiserver-kind-control-plane", + "name": "kube-controller-manager-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -198,8 +198,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.2", - "name": "coredns-565d847f94-dgwk8", + "ip": "172.18.0.2", + "name": "etcd-kind-control-plane", "status": { "phase": "running", "ready": "true", @@ -223,45 +223,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", - "node": { - "name": "kind-control-plane" - }, - "pod": { - "host_ip": "172.18.0.2", - "ip": "10.244.0.68", - "name": "hello-cronjob-27899498-q8cl7", - "status": { - "phase": "succeeded", - "ready": "false", - "scheduled": "true" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-controller-manager-kind-control-plane", + "ip": "10.244.0.19", + "name": "web-0", "status": { "phase": "running", "ready": "true", @@ -278,31 +247,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.pod", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "pod": { - "name": "web-0", - "status": { - "phase": "pending", - "scheduled": "false" - } - } - }, - "metricset": { - "name": "state_pod", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.pod", @@ -317,7 +261,7 @@ "pod": { "host_ip": "172.18.0.2", "ip": "172.18.0.2", - "name": "etcd-kind-control-plane", + "name": "kube-proxy-nw7gg", "status": { "phase": "running", "ready": "true", @@ -341,14 +285,14 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "local-path-storage", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.69", - "name": "kube-state-metrics-8595684f78-ppcnj", + "ip": "10.244.0.4", + "name": "local-path-provisioner-75f5b54ffd-bm5sx", "status": { "phase": "running", "ready": "true", @@ -378,11 +322,11 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.59", - "name": "pi-m88dn", + "ip": "10.244.0.2", + "name": "coredns-787d4945fb-rb564", "status": { - "phase": "succeeded", - "ready": "false", + "phase": "running", + "ready": "true", "scheduled": "true" } } @@ -440,8 +384,8 @@ }, "pod": { "host_ip": "172.18.0.2", - "ip": "10.244.0.4", - "name": "coredns-565d847f94-q2mmv", + "ip": "10.244.0.3", + "name": "coredns-787d4945fb-kx4f4", "status": { "phase": "running", "ready": "true", @@ -465,17 +409,17 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "default", "node": { "name": "kind-control-plane" }, "pod": { "host_ip": "172.18.0.2", - "ip": "172.18.0.2", - "name": "kube-proxy-flrd6", + "ip": "10.244.0.20", + "name": "hello-fddcc", "status": { - "phase": "running", - "ready": "true", + "phase": "succeeded", + "ready": "false", "scheduled": "true" } } diff --git a/metricbeat/module/kubernetes/state_pod/state_pod_test.go b/metricbeat/module/kubernetes/state_pod/state_pod_test.go index d3ff6378715..817c9e7f8d7 100644 --- a/metricbeat/module/kubernetes/state_pod/state_pod_test.go +++ b/metricbeat/module/kubernetes/state_pod/state_pod_test.go @@ -31,10 +31,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_pod" @@ -48,5 +47,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/data.json b/metricbeat/module/kubernetes/state_replicaset/_meta/data.json index 060f792e3ec..6e8a16b6979 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/data.json +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/data.json @@ -8,13 +8,13 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "kube-state-metrics-548546fc89", + "name": "coredns-787d4945fb", "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, + "available": 2, + "desired": 2, + "labeled": 2, "observed": 1, - "ready": 1 + "ready": 2 } } }, diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index c4a04977967..00000000000 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "kube-state-metrics-77bcd445dd", - "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, - "observed": 1, - "ready": 1 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.replicaset", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "kube-system" - }, - "MetricSetFields": { - "name": "coredns-565d847f94", - "replicas": { - "available": 2, - "desired": 2, - "labeled": 2, - "observed": 1, - "ready": 2 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.replicaset", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "namespace": "local-path-storage" - }, - "MetricSetFields": { - "name": "local-path-provisioner-684f458cdd", - "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, - "observed": 1, - "ready": 1 - } - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.replicaset", - "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_replicaset/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.8.2.plain.expected similarity index 91% rename from metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.8.2.plain.expected index a78f338f92c..a12b5016a74 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.8.2.plain.expected @@ -5,7 +5,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "coredns-565d847f94", + "name": "coredns-787d4945fb", "replicas": { "available": 2, "desired": 2, @@ -31,7 +31,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "kube-state-metrics-8595684f78", + "name": "kube-state-metrics-fb945547c", "replicas": { "available": 1, "desired": 1, @@ -57,7 +57,7 @@ "namespace": "local-path-storage" }, "MetricSetFields": { - "name": "local-path-provisioner-684f458cdd", + "name": "local-path-provisioner-75f5b54ffd", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.9.2.plain.expected similarity index 91% rename from metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.6.0.plain.expected rename to metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.9.2.plain.expected index e88bb9d49bc..4d975713974 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.6.0.plain.expected +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/test/ksm.v2.9.2.plain.expected @@ -5,7 +5,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "coredns-565d847f94", + "name": "coredns-787d4945fb", "replicas": { "available": 2, "desired": 2, @@ -31,7 +31,7 @@ "namespace": "kube-system" }, "MetricSetFields": { - "name": "kube-state-metrics-5897f6cf77", + "name": "kube-state-metrics-7bc9d484b6", "replicas": { "available": 1, "desired": 1, @@ -57,7 +57,7 @@ "namespace": "local-path-storage" }, "MetricSetFields": { - "name": "local-path-provisioner-684f458cdd", + "name": "local-path-provisioner-75f5b54ffd", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/docs.plain-expected.json index 2394b951881..ba066638e79 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/docs.plain-expected.json @@ -8,13 +8,13 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "kube-state-metrics-548546fc89", + "name": "coredns-787d4945fb", "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, + "available": 2, + "desired": 2, + "labeled": 2, "observed": 1, - "ready": 1 + "ready": 2 } } }, @@ -36,13 +36,13 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "coredns-565d847f94", + "name": "kube-state-metrics-7bc9d484b6", "replicas": { - "available": 2, - "desired": 2, - "labeled": 2, + "available": 1, + "desired": 1, + "labeled": 1, "observed": 1, - "ready": 2 + "ready": 1 } } }, @@ -64,7 +64,7 @@ "kubernetes": { "namespace": "local-path-storage", "replicaset": { - "name": "local-path-provisioner-684f458cdd", + "name": "local-path-provisioner-75f5b54ffd", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 597b86d4112..00000000000 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,86 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.replicaset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "replicaset": { - "name": "coredns-565d847f94", - "replicas": { - "available": 2, - "desired": 2, - "labeled": 2, - "observed": 1, - "ready": 2 - } - } - }, - "metricset": { - "name": "state_replicaset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.replicaset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "kube-system", - "replicaset": { - "name": "kube-state-metrics-77bcd445dd", - "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, - "observed": 1, - "ready": 1 - } - } - }, - "metricset": { - "name": "state_replicaset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.replicaset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "local-path-storage", - "replicaset": { - "name": "local-path-provisioner-684f458cdd", - "replicas": { - "available": 1, - "desired": 1, - "labeled": 1, - "observed": 1, - "ready": 1 - } - } - }, - "metricset": { - "name": "state_replicaset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 92% rename from metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.8.2.plain-expected.json index 564798c7ee5..30c287f7a8d 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -8,7 +8,7 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "kube-state-metrics-8595684f78", + "name": "kube-state-metrics-fb945547c", "replicas": { "available": 1, "desired": 1, @@ -36,7 +36,7 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "coredns-565d847f94", + "name": "coredns-787d4945fb", "replicas": { "available": 2, "desired": 2, @@ -64,7 +64,7 @@ "kubernetes": { "namespace": "local-path-storage", "replicaset": { - "name": "local-path-provisioner-684f458cdd", + "name": "local-path-provisioner-75f5b54ffd", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 92% rename from metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.6.0.plain-expected.json rename to metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.9.2.plain-expected.json index 7e669ec1b53..ba066638e79 100644 --- a/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_replicaset/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -8,7 +8,7 @@ "kubernetes": { "namespace": "kube-system", "replicaset": { - "name": "coredns-565d847f94", + "name": "coredns-787d4945fb", "replicas": { "available": 2, "desired": 2, @@ -34,9 +34,9 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "local-path-storage", + "namespace": "kube-system", "replicaset": { - "name": "local-path-provisioner-684f458cdd", + "name": "kube-state-metrics-7bc9d484b6", "replicas": { "available": 1, "desired": 1, @@ -62,9 +62,9 @@ "module": "kubernetes" }, "kubernetes": { - "namespace": "kube-system", + "namespace": "local-path-storage", "replicaset": { - "name": "kube-state-metrics-5897f6cf77", + "name": "local-path-provisioner-75f5b54ffd", "replicas": { "available": 1, "desired": 1, diff --git a/metricbeat/module/kubernetes/state_replicaset/state_replicaset_test.go b/metricbeat/module/kubernetes/state_replicaset/state_replicaset_test.go index b00aaed6936..38e59cad464 100644 --- a/metricbeat/module/kubernetes/state_replicaset/state_replicaset_test.go +++ b/metricbeat/module/kubernetes/state_replicaset/state_replicaset_test.go @@ -31,10 +31,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_replicaset" @@ -48,5 +47,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index 6ebc94e6d2f..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,464 +0,0 @@ -[ - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "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_resourcequota/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.5.0.plain.expected deleted file mode 100644 index 6ebc94e6d2f..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.5.0.plain.expected +++ /dev/null @@ -1,464 +0,0 @@ -[ - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "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_resourcequota/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.6.0.plain.expected deleted file mode 100644 index 6ebc94e6d2f..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.6.0.plain.expected +++ /dev/null @@ -1,464 +0,0 @@ -[ - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": {}, - "ModuleFields": { - "namespace": "default" - }, - "MetricSetFields": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.resourcequota", - "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_resourcequota/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.7.0.plain.expected index 6ebc94e6d2f..a0d32a3f308 100644 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.7.0.plain.expected +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.7.0.plain.expected @@ -93,10 +93,10 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-low", - "quota": 0, + "name": "pods-medium", + "quota": 10, "resource": "pods", - "type": "used" + "type": "hard" }, "Index": "", "ID": "", @@ -115,10 +115,10 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-medium", - "quota": 10, + "name": "pods-low", + "quota": 0, "resource": "pods", - "type": "hard" + "type": "used" }, "Index": "", "ID": "", @@ -203,10 +203,10 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" + "name": "pods-medium", + "quota": 0, + "resource": "pods", + "type": "used" }, "Index": "", "ID": "", @@ -247,10 +247,10 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" + "name": "pods-low", + "quota": 10737418240, + "resource": "memory", + "type": "hard" }, "Index": "", "ID": "", @@ -270,9 +270,9 @@ }, "MetricSetFields": { "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" + "quota": 10, + "resource": "pods", + "type": "hard" }, "Index": "", "ID": "", @@ -292,9 +292,9 @@ }, "MetricSetFields": { "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" + "quota": 0, + "resource": "memory", + "type": "used" }, "Index": "", "ID": "", @@ -335,9 +335,9 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-low", + "name": "pods-medium", "quota": 0, - "resource": "cpu", + "resource": "memory", "type": "used" }, "Index": "", @@ -357,9 +357,9 @@ "namespace": "default" }, "MetricSetFields": { - "name": "pods-medium", + "name": "pods-low", "quota": 0, - "resource": "memory", + "resource": "cpu", "type": "used" }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.8.2.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.8.2.plain.expected new file mode 100644 index 00000000000..bcec2c1e188 --- /dev/null +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.8.2.plain.expected @@ -0,0 +1,156 @@ +[ + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 204800, + "resource": "memory", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691568402 + }, + "name": "pods-high" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "pods", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 10, + "resource": "pods", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "memory", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "cpu", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 1000, + "resource": "cpu", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "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_resourcequota/_meta/test/ksm.v2.9.2.plain.expected b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.9.2.plain.expected new file mode 100644 index 00000000000..b5cc344f668 --- /dev/null +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/test/ksm.v2.9.2.plain.expected @@ -0,0 +1,156 @@ +[ + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 204800, + "resource": "memory", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691568526 + }, + "name": "pods-high" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "pods", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 10, + "resource": "pods", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "memory", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 0, + "resource": "cpu", + "type": "used" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": {}, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "name": "pods-high", + "quota": 1000, + "resource": "cpu", + "type": "hard" + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.resourcequota", + "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_resourcequota/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/docs.plain-expected.json index 7b701c79c40..34231f391f4 100644 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/docs.plain-expected.json @@ -23,30 +23,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.resourcequota", @@ -71,54 +47,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.resourcequota", @@ -152,58 +80,10 @@ "kubernetes": { "namespace": "default", "resourcequota": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" + "created": { + "sec": 1691568526 + }, + "name": "pods-high" } }, "metricset": { @@ -225,30 +105,6 @@ "namespace": "default", "resourcequota": { "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", "quota": 0, "resource": "cpu", "type": "used" @@ -273,79 +129,7 @@ "namespace": "default", "resourcequota": { "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10737418240, + "quota": 204800, "resource": "memory", "type": "hard" } @@ -359,30 +143,6 @@ "type": "kubernetes" } }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, { "event": { "dataset": "kubernetes.resourcequota", @@ -406,101 +166,5 @@ "address": "127.0.0.1:55555", "type": "kubernetes" } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } } ] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 7b701c79c40..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,506 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.5.0.plain-expected.json deleted file mode 100644 index 7b701c79c40..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ /dev/null @@ -1,506 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.6.0.plain-expected.json deleted file mode 100644 index 7b701c79c40..00000000000 --- a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ /dev/null @@ -1,506 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 1000, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 21474836480, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "memory", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "pods", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 214748364800, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 5, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 10, - "resource": "cpu", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-low", - "quota": 10737418240, - "resource": "memory", - "type": "hard" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969356 - }, - "name": "pods-low" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-high", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-high" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "pods", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "created": { - "sec": 1673969355 - }, - "name": "pods-medium" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.resourcequota", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "resourcequota": { - "name": "pods-medium", - "quota": 0, - "resource": "cpu", - "type": "used" - } - }, - "metricset": { - "name": "state_resourcequota", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.8.2.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.8.2.plain-expected.json new file mode 100644 index 00000000000..8faed75025b --- /dev/null +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -0,0 +1,170 @@ +[ + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "created": { + "sec": 1691568402 + }, + "name": "pods-high" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 1000, + "resource": "cpu", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "memory", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 10, + "resource": "pods", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "cpu", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 204800, + "resource": "memory", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "pods", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.9.2.plain-expected.json b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.9.2.plain-expected.json new file mode 100644 index 00000000000..34231f391f4 --- /dev/null +++ b/metricbeat/module/kubernetes/state_resourcequota/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -0,0 +1,170 @@ +[ + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 1000, + "resource": "cpu", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "memory", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 10, + "resource": "pods", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "created": { + "sec": 1691568526 + }, + "name": "pods-high" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "cpu", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 204800, + "resource": "memory", + "type": "hard" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.resourcequota", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "resourcequota": { + "name": "pods-high", + "quota": 0, + "resource": "pods", + "type": "used" + } + }, + "metricset": { + "name": "state_resourcequota", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_resourcequota/state_resourcequota_test.go b/metricbeat/module/kubernetes/state_resourcequota/state_resourcequota_test.go index d10d9f519de..fbbe3c5bece 100644 --- a/metricbeat/module/kubernetes/state_resourcequota/state_resourcequota_test.go +++ b/metricbeat/module/kubernetes/state_resourcequota/state_resourcequota_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_resourcequota" @@ -46,5 +45,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_service/_meta/data.json b/metricbeat/module/kubernetes/state_service/_meta/data.json index 05823bb2f55..94fd3288aad 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/data.json +++ b/metricbeat/module/kubernetes/state_service/_meta/data.json @@ -7,12 +7,12 @@ }, "kubernetes": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, "namespace": "kube-system", "service": { "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", + "created": "2023-08-09T07:32:20.000Z", "name": "kube-dns", "type": "ClusterIP" } diff --git a/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index 9d166cffadc..00000000000 --- a/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,102 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" - }, - "namespace": "kube-system" - }, - "MetricSetFields": { - "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", - "name": "kube-dns", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" - }, - "namespace": "default" - }, - "MetricSetFields": { - "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", - "name": "kubernetes", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" - }, - "namespace": "default" - }, - "MetricSetFields": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "435df169-ec4f-4a7c-9d06-04d12a89c9d0" - }, - "namespace": "kube-system" - }, - "MetricSetFields": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:01.000Z", - "name": "kube-state-metrics", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "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_service/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.8.2.plain.expected similarity index 61% rename from metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.8.2.plain.expected index 53e927e9d21..9cc0293310e 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.8.2.plain.expected @@ -3,13 +3,13 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "dab0635c-ed37-441e-bb0c-57f0c6f6c939" + "uid": "47c4b57d-96b5-482c-9da0-c543cd1589fb" }, "namespace": "kube-system" }, "MetricSetFields": { "cluster_ip": "None", - "created": "2023-01-17T15:38:41.000Z", + "created": "2023-08-09T08:06:42.000Z", "name": "kube-state-metrics", "type": "ClusterIP" }, @@ -28,38 +28,13 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" - }, - "namespace": "kube-system" - }, - "MetricSetFields": { - "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", - "name": "kube-dns", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" + "uid": "d402e60c-e633-4ef1-919e-08bfd4fe1c5c" }, "namespace": "default" }, "MetricSetFields": { "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", + "created": "2023-08-09T07:32:18.000Z", "name": "kubernetes", "type": "ClusterIP" }, @@ -78,14 +53,14 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, - "namespace": "default" + "namespace": "kube-system" }, "MetricSetFields": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", + "cluster_ip": "10.96.0.10", + "created": "2023-08-09T07:32:20.000Z", + "name": "kube-dns", "type": "ClusterIP" }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.9.2.plain.expected similarity index 61% rename from metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.6.0.plain.expected rename to metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.9.2.plain.expected index 33eb253cfd8..1abb6c85fec 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.6.0.plain.expected +++ b/metricbeat/module/kubernetes/state_service/_meta/test/ksm.v2.9.2.plain.expected @@ -3,14 +3,14 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" + "uid": "d402e60c-e633-4ef1-919e-08bfd4fe1c5c" }, - "namespace": "kube-system" + "namespace": "default" }, "MetricSetFields": { - "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", - "name": "kube-dns", + "cluster_ip": "10.96.0.1", + "created": "2023-08-09T07:32:18.000Z", + "name": "kubernetes", "type": "ClusterIP" }, "Index": "", @@ -28,13 +28,13 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "8a71b06b-befb-4f38-bb65-d71ec45bf6d2" + "uid": "15b6cf52-6e65-4081-ab05-e2dba135ecfc" }, "namespace": "kube-system" }, "MetricSetFields": { "cluster_ip": "None", - "created": "2023-01-17T15:40:29.000Z", + "created": "2023-08-09T08:08:46.000Z", "name": "kube-state-metrics", "type": "ClusterIP" }, @@ -53,39 +53,14 @@ "RootFields": null, "ModuleFields": { "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" - }, - "namespace": "default" - }, - "MetricSetFields": { - "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", - "name": "kubernetes", - "type": "ClusterIP" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.service", - "Timestamp": "0001-01-01T00:00:00Z", - "Error": null, - "Host": "", - "Service": "", - "Took": 0, - "Period": 0, - "DisableTimeSeries": false - }, - { - "RootFields": null, - "ModuleFields": { - "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, - "namespace": "default" + "namespace": "kube-system" }, "MetricSetFields": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", + "cluster_ip": "10.96.0.10", + "created": "2023-08-09T07:32:20.000Z", + "name": "kube-dns", "type": "ClusterIP" }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_service/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_service/_meta/testdata/docs.plain-expected.json index 879cbc9dfb7..36591f3ea23 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_service/_meta/testdata/docs.plain-expected.json @@ -7,12 +7,12 @@ }, "kubernetes": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, "namespace": "kube-system", "service": { "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", + "created": "2023-08-09T07:32:20.000Z", "name": "kube-dns", "type": "ClusterIP" } @@ -34,12 +34,12 @@ }, "kubernetes": { "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" + "uid": "d402e60c-e633-4ef1-919e-08bfd4fe1c5c" }, "namespace": "default", "service": { "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", + "created": "2023-08-09T07:32:18.000Z", "name": "kubernetes", "type": "ClusterIP" } @@ -61,39 +61,12 @@ }, "kubernetes": { "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" - }, - "namespace": "default", - "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "af9d889d-579d-4367-ac53-fb10fcb40274" + "uid": "15b6cf52-6e65-4081-ab05-e2dba135ecfc" }, "namespace": "kube-system", "service": { "cluster_ip": "None", - "created": "2023-01-18T09:46:19.000Z", + "created": "2023-08-09T08:08:46.000Z", "name": "kube-state-metrics", "type": "ClusterIP" } diff --git a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 6b2d1a1d070..00000000000 --- a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,110 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" - }, - "namespace": "kube-system", - "service": { - "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", - "name": "kube-dns", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" - }, - "namespace": "default", - "service": { - "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", - "name": "kubernetes", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "435df169-ec4f-4a7c-9d06-04d12a89c9d0" - }, - "namespace": "kube-system", - "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:01.000Z", - "name": "kube-state-metrics", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" - }, - "namespace": "default", - "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 63% rename from metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.8.2.plain-expected.json index f9e45c2edcc..e14cd20dc41 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -7,13 +7,13 @@ }, "kubernetes": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" + "uid": "47c4b57d-96b5-482c-9da0-c543cd1589fb" }, "namespace": "kube-system", "service": { - "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", - "name": "kube-dns", + "cluster_ip": "None", + "created": "2023-08-09T08:06:42.000Z", + "name": "kube-state-metrics", "type": "ClusterIP" } }, @@ -34,13 +34,13 @@ }, "kubernetes": { "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, - "namespace": "default", + "namespace": "kube-system", "service": { - "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", - "name": "kubernetes", + "cluster_ip": "10.96.0.10", + "created": "2023-08-09T07:32:20.000Z", + "name": "kube-dns", "type": "ClusterIP" } }, @@ -61,40 +61,13 @@ }, "kubernetes": { "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" + "uid": "d402e60c-e633-4ef1-919e-08bfd4fe1c5c" }, "namespace": "default", "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "dab0635c-ed37-441e-bb0c-57f0c6f6c939" - }, - "namespace": "kube-system", - "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:38:41.000Z", - "name": "kube-state-metrics", + "cluster_ip": "10.96.0.1", + "created": "2023-08-09T07:32:18.000Z", + "name": "kubernetes", "type": "ClusterIP" } }, diff --git a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 63% rename from metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.6.0.plain-expected.json rename to metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.9.2.plain-expected.json index eb778909965..36591f3ea23 100644 --- a/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_service/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -7,12 +7,12 @@ }, "kubernetes": { "labels": { - "uid": "e9b08fcb-fb13-463f-8a59-6a1236a666a8" + "uid": "057e71cd-9a20-4382-85d1-04e087a20354" }, "namespace": "kube-system", "service": { "cluster_ip": "10.96.0.10", - "created": "2023-01-16T14:32:42.000Z", + "created": "2023-08-09T07:32:20.000Z", "name": "kube-dns", "type": "ClusterIP" } @@ -34,12 +34,12 @@ }, "kubernetes": { "labels": { - "uid": "907c42ab-acde-4ff5-83d5-04be77203b28" + "uid": "d402e60c-e633-4ef1-919e-08bfd4fe1c5c" }, "namespace": "default", "service": { "cluster_ip": "10.96.0.1", - "created": "2023-01-16T14:32:41.000Z", + "created": "2023-08-09T07:32:18.000Z", "name": "kubernetes", "type": "ClusterIP" } @@ -61,12 +61,12 @@ }, "kubernetes": { "labels": { - "uid": "8a71b06b-befb-4f38-bb65-d71ec45bf6d2" + "uid": "15b6cf52-6e65-4081-ab05-e2dba135ecfc" }, "namespace": "kube-system", "service": { "cluster_ip": "None", - "created": "2023-01-17T15:40:29.000Z", + "created": "2023-08-09T08:08:46.000Z", "name": "kube-state-metrics", "type": "ClusterIP" } @@ -79,32 +79,5 @@ "address": "127.0.0.1:55555", "type": "kubernetes" } - }, - { - "event": { - "dataset": "kubernetes.service", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "labels": { - "uid": "8380ed3c-d057-4a95-8870-2dae63be27c4" - }, - "namespace": "default", - "service": { - "cluster_ip": "None", - "created": "2023-01-17T15:29:16.000Z", - "name": "nginx", - "type": "ClusterIP" - } - }, - "metricset": { - "name": "state_service", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } } ] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_service/state_service_test.go b/metricbeat/module/kubernetes/state_service/state_service_test.go index ece39ed5715..07d250a9903 100644 --- a/metricbeat/module/kubernetes/state_service/state_service_test.go +++ b/metricbeat/module/kubernetes/state_service/state_service_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_service" @@ -47,5 +46,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/data.json b/metricbeat/module/kubernetes/state_statefulset/_meta/data.json index 509aaf29803..0e838dace1c 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/data.json +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/data.json @@ -8,16 +8,16 @@ "kubernetes": { "namespace": "default", "statefulset": { - "created": 1673969356, + "created": 1691568526, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } } }, diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.8.2.plain.expected similarity index 88% rename from metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.8.2.plain.expected index 619c1663f19..ec098e9472d 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.8.2.plain.expected @@ -5,16 +5,16 @@ "namespace": "default" }, "MetricSetFields": { - "created": 1673969356, + "created": 1691568402, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.9.2.plain.expected similarity index 88% rename from metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.6.0.plain.expected rename to metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.9.2.plain.expected index 619c1663f19..5c19772e660 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.6.0.plain.expected +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/test/ksm.v2.9.2.plain.expected @@ -5,16 +5,16 @@ "namespace": "default" }, "MetricSetFields": { - "created": 1673969356, + "created": 1691568526, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } }, "Index": "", diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/docs.plain-expected.json index 98749f799db..850bef3d3d0 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/docs.plain-expected.json @@ -8,16 +8,16 @@ "kubernetes": { "namespace": "default", "statefulset": { - "created": 1673969356, + "created": 1691568526, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } } }, diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 98749f799db..00000000000 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.statefulset", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "namespace": "default", - "statefulset": { - "created": 1673969356, - "generation": { - "desired": 1, - "observed": 1 - }, - "name": "web", - "replicas": { - "desired": 3, - "observed": 1, - "ready": 0 - } - } - }, - "metricset": { - "name": "state_statefulset", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 87% rename from metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.8.2.plain-expected.json index 98749f799db..30682a72a63 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -8,16 +8,16 @@ "kubernetes": { "namespace": "default", "statefulset": { - "created": 1673969356, + "created": 1691568402, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } } }, diff --git a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 87% rename from metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.6.0.plain-expected.json rename to metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.9.2.plain-expected.json index 98749f799db..850bef3d3d0 100644 --- a/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_statefulset/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -8,16 +8,16 @@ "kubernetes": { "namespace": "default", "statefulset": { - "created": 1673969356, + "created": 1691568526, "generation": { "desired": 1, "observed": 1 }, "name": "web", "replicas": { - "desired": 3, + "desired": 1, "observed": 1, - "ready": 0 + "ready": 1 } } }, diff --git a/metricbeat/module/kubernetes/state_statefulset/state_statefulset_test.go b/metricbeat/module/kubernetes/state_statefulset/state_statefulset_test.go index ff54c2f521c..165d9cbbf9e 100644 --- a/metricbeat/module/kubernetes/state_statefulset/state_statefulset_test.go +++ b/metricbeat/module/kubernetes/state_statefulset/state_statefulset_test.go @@ -32,10 +32,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_statefulset" @@ -49,5 +48,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/data.json b/metricbeat/module/kubernetes/state_storageclass/_meta/data.json index 52754aba13e..4f91e23391a 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/data.json +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/data.json @@ -7,7 +7,7 @@ }, "kubernetes": { "storageclass": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.4.2.plain.expected b/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.4.2.plain.expected deleted file mode 100644 index 606c5e2234c..00000000000 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.4.2.plain.expected +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "RootFields": null, - "ModuleFields": null, - "MetricSetFields": { - "created": "2023-01-16T14:32:47.000Z", - "name": "standard", - "provisioner": "rancher.io/local-path", - "reclaim_policy": "Delete", - "volume_binding_mode": "WaitForFirstConsumer" - }, - "Index": "", - "ID": "", - "Namespace": "kubernetes.storageclass", - "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_storageclass/_meta/test/ksm.v2.5.0.plain.expected b/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.8.2.plain.expected similarity index 91% rename from metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.5.0.plain.expected rename to metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.8.2.plain.expected index 606c5e2234c..c32aa738be4 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.5.0.plain.expected +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.8.2.plain.expected @@ -3,7 +3,7 @@ "RootFields": null, "ModuleFields": null, "MetricSetFields": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.6.0.plain.expected b/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.9.2.plain.expected similarity index 91% rename from metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.6.0.plain.expected rename to metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.9.2.plain.expected index 606c5e2234c..c32aa738be4 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.6.0.plain.expected +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/test/ksm.v2.9.2.plain.expected @@ -3,7 +3,7 @@ "RootFields": null, "ModuleFields": null, "MetricSetFields": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/docs.plain-expected.json index 658fd915c84..e02ae9f2f5f 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/docs.plain-expected.json +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/docs.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "storageclass": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.4.2.plain-expected.json b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.4.2.plain-expected.json deleted file mode 100644 index 658fd915c84..00000000000 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.4.2.plain-expected.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "event": { - "dataset": "kubernetes.storageclass", - "duration": 115000, - "module": "kubernetes" - }, - "kubernetes": { - "storageclass": { - "created": "2023-01-16T14:32:47.000Z", - "name": "standard", - "provisioner": "rancher.io/local-path", - "reclaim_policy": "Delete", - "volume_binding_mode": "WaitForFirstConsumer" - } - }, - "metricset": { - "name": "state_storageclass", - "period": 10000 - }, - "service": { - "address": "127.0.0.1:55555", - "type": "kubernetes" - } - } -] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.5.0.plain-expected.json b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.8.2.plain-expected.json similarity index 92% rename from metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.5.0.plain-expected.json rename to metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.8.2.plain-expected.json index 658fd915c84..e02ae9f2f5f 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.5.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "storageclass": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.6.0.plain-expected.json b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.9.2.plain-expected.json similarity index 92% rename from metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.6.0.plain-expected.json rename to metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.9.2.plain-expected.json index 658fd915c84..e02ae9f2f5f 100644 --- a/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.6.0.plain-expected.json +++ b/metricbeat/module/kubernetes/state_storageclass/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -7,7 +7,7 @@ }, "kubernetes": { "storageclass": { - "created": "2023-01-16T14:32:47.000Z", + "created": "2023-08-09T07:32:22.000Z", "name": "standard", "provisioner": "rancher.io/local-path", "reclaim_policy": "Delete", diff --git a/metricbeat/module/kubernetes/state_storageclass/state_storageclass_test.go b/metricbeat/module/kubernetes/state_storageclass/state_storageclass_test.go index fcd459305d1..1297b59c67b 100644 --- a/metricbeat/module/kubernetes/state_storageclass/state_storageclass_test.go +++ b/metricbeat/module/kubernetes/state_storageclass/state_storageclass_test.go @@ -29,10 +29,9 @@ import ( ) var files = []string{ - "../_meta/test/ksm.v2.4.2.plain", - "../_meta/test/ksm.v2.5.0.plain", - "../_meta/test/ksm.v2.6.0.plain", "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", } const name = "state_storageclass" @@ -46,5 +45,5 @@ func TestData(t *testing.T) { } func TestMetricsFamily(t *testing.T) { - k.TestStateMetricsFamily(t, files, mapping) + k.TestMetricsFamily(t, files, mapping) } diff --git a/metricbeat/module/kvm/dommemstat/dommemstat.go b/metricbeat/module/kvm/dommemstat/dommemstat.go index 2714204d0af..f8585deb533 100644 --- a/metricbeat/module/kvm/dommemstat/dommemstat.go +++ b/metricbeat/module/kvm/dommemstat/dommemstat.go @@ -18,6 +18,8 @@ package dommemstat import ( + "errors" + "fmt" "net" "net/url" "time" @@ -25,8 +27,6 @@ import ( "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/pkg/errors" - "github.com/digitalocean/go-libvirt" "github.com/digitalocean/go-libvirt/libvirttest" @@ -101,7 +101,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { c, err = net.DialTimeout(u.Scheme, address, m.Timeout) if err != nil { - return errors.Wrapf(err, "cannot connect to %v", u) + return fmt.Errorf("cannot connect to %v: %w", u, err) } } @@ -109,11 +109,11 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { l := libvirt.New(c) if err = l.Connect(); err != nil { - return errors.Wrap(err, "error connecting to libvirtd") + return fmt.Errorf("error connecting to libvirtd: %w", err) } defer func() { if err = l.Disconnect(); err != nil { - msg := errors.Wrap(err, "failed to disconnect") + msg := fmt.Errorf("failed to disconnect: %w", err) report.Error(msg) m.Logger().Error(msg) } @@ -121,20 +121,20 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { domains, err := l.Domains() if err != nil { - return errors.Wrap(err, "error listing domains") + return fmt.Errorf("error listing domains: %w", err) } for _, d := range domains { gotDomainMemoryStats, err := l.DomainMemoryStats(d, maximumStats, flags) if err != nil { - msg := errors.Wrapf(err, "error fetching memory stats for domain %s", d.Name) + msg := fmt.Errorf("error fetching memory stats for domain %s: %w", d.Name, err) report.Error(msg) m.Logger().Error(msg) continue } if len(gotDomainMemoryStats) == 0 { - msg := errors.Errorf("no memory stats for domain %s", d.Name) + msg := fmt.Errorf("no memory stats for domain %s", d.Name) report.Error(msg) m.Logger().Error(msg) continue diff --git a/metricbeat/module/kvm/status/status.go b/metricbeat/module/kvm/status/status.go index fdbb7a22b7a..320fe4a5df0 100644 --- a/metricbeat/module/kvm/status/status.go +++ b/metricbeat/module/kvm/status/status.go @@ -18,12 +18,11 @@ package status import ( + "fmt" "net" "net/url" "time" - "github.com/pkg/errors" - "github.com/digitalocean/go-libvirt" "github.com/digitalocean/go-libvirt/libvirttest" @@ -90,7 +89,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { c, err = net.DialTimeout(u.Scheme, address, m.Timeout) if err != nil { - return errors.Wrapf(err, "cannot connect to %v", u) + return fmt.Errorf("cannot connect to %v: %w", u, err) } } @@ -98,11 +97,11 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { l := libvirt.New(c) if err = l.Connect(); err != nil { - return errors.Wrap(err, "error connecting to libvirtd") + return fmt.Errorf("error connecting to libvirtd: %w", err) } defer func() { if err = l.Disconnect(); err != nil { - msg := errors.Wrap(err, "failed to disconnect") + msg := fmt.Errorf("failed to disconnect: %w", err) report.Error(msg) m.Logger().Error(msg) } @@ -110,7 +109,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { domains, err := l.Domains() if err != nil { - return errors.Wrap(err, "error listing domains") + return fmt.Errorf("error listing domains: %w", err) } for _, d := range domains { diff --git a/metricbeat/module/linux/conntrack/conntrack.go b/metricbeat/module/linux/conntrack/conntrack.go index 3970ff689c8..602a786b574 100644 --- a/metricbeat/module/linux/conntrack/conntrack.go +++ b/metricbeat/module/linux/conntrack/conntrack.go @@ -18,7 +18,8 @@ package conntrack import ( - "github.com/pkg/errors" + "fmt" + "github.com/prometheus/procfs" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" @@ -63,11 +64,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { newFS, err := procfs.NewFS(m.mod.ResolveHostFS("/proc")) if err != nil { - return errors.Wrapf(err, "error creating new Host FS at %s", m.mod.ResolveHostFS("/proc")) + return fmt.Errorf("error creating new Host FS at %s: %w", m.mod.ResolveHostFS("/proc"), err) } conntrackStats, err := newFS.ConntrackStat() if err != nil { - return errors.Wrap(err, "error fetching conntrack stats") + return fmt.Errorf("error fetching conntrack stats: %w", err) } summedEvents := procfs.ConntrackStatEntry{} diff --git a/metricbeat/module/linux/iostat/iostat.go b/metricbeat/module/linux/iostat/iostat.go index f7143a37243..14604f8aea4 100644 --- a/metricbeat/module/linux/iostat/iostat.go +++ b/metricbeat/module/linux/iostat/iostat.go @@ -20,7 +20,7 @@ package iostat import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -71,7 +71,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { IOstats, err := diskio.IOCounters(m.includeDevices...) if err != nil { - return errors.Wrap(err, "disk io counters") + return fmt.Errorf("disk io counters: %w", err) } // Sample the current cpu counter @@ -89,7 +89,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { } result, err := m.stats.CalcIOStatistics(counters) if err != nil { - return errors.Wrap(err, "error calculating iostat") + return fmt.Errorf("error calculating iostat: %w", err) } IOstats := AddLinuxIOStat(result) event.DeepUpdate(IOstats) diff --git a/metricbeat/module/linux/ksm/data.go b/metricbeat/module/linux/ksm/data.go index 3ceb42c5231..94055224ca0 100644 --- a/metricbeat/module/linux/ksm/data.go +++ b/metricbeat/module/linux/ksm/data.go @@ -18,10 +18,9 @@ package ksm import ( + "fmt" "path/filepath" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/module/linux" ) @@ -40,37 +39,37 @@ func fetchKSMStats(ksmPath string) (ksmData, error) { // ReadIntFromFile returns pretty verbose error strings, so omit errors.Wrap here pshared, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "pages_shared"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from pages_shared") + return ksmData{}, fmt.Errorf("error reading from pages_shared: %w", err) } pSharing, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "pages_sharing"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from pages_sharing") + return ksmData{}, fmt.Errorf("error reading from pages_sharing: %w", err) } pUnshared, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "pages_unshared"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from pages_unshared") + return ksmData{}, fmt.Errorf("error reading from pages_unshared: %w", err) } pVolatile, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "pages_volatile"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from pages_volatile") + return ksmData{}, fmt.Errorf("error reading from pages_volatile: %w", err) } fScans, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "full_scans"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from full_scans") + return ksmData{}, fmt.Errorf("error reading from full_scans: %w", err) } stableChains, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "stable_node_chains"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from stable_node_chains") + return ksmData{}, fmt.Errorf("error reading from stable_node_chains: %w", err) } stableDups, err := linux.ReadIntFromFile(filepath.Join(ksmPath, "stable_node_dups"), 10) if err != nil { - return ksmData{}, errors.Wrap(err, "error reading from stable_node_dups ") + return ksmData{}, fmt.Errorf("error reading from stable_node_dups : %w", err) } return ksmData{PagesShared: pshared, PagesSharing: pSharing, PagesUnshared: pUnshared, diff --git a/metricbeat/module/linux/ksm/ksm.go b/metricbeat/module/linux/ksm/ksm.go index abbd899cd8a..1bf344be184 100644 --- a/metricbeat/module/linux/ksm/ksm.go +++ b/metricbeat/module/linux/ksm/ksm.go @@ -18,7 +18,7 @@ package ksm import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -62,7 +62,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { ksmData, err := fetchKSMStats(m.mod.ResolveHostFS("/sys/kernel/mm/ksm")) if err != nil { - return errors.Wrap(err, "error fetching KSM stats") + return fmt.Errorf("error fetching KSM stats: %w", err) } report.Event(mb.Event{ diff --git a/metricbeat/module/linux/memory/data.go b/metricbeat/module/linux/memory/data.go index de41ed5df00..dfc5f3276ae 100644 --- a/metricbeat/module/linux/memory/data.go +++ b/metricbeat/module/linux/memory/data.go @@ -23,8 +23,6 @@ import ( "strconv" "strings" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/transform/typeconv" util "github.com/elastic/elastic-agent-system-metrics/metric" @@ -37,7 +35,7 @@ import ( func FetchLinuxMemStats(baseMap mapstr.M, hostfs resolve.Resolver) error { vmstat, err := GetVMStat(hostfs) if err != nil { - return errors.Wrap(err, "error fetching VMStats") + return fmt.Errorf("error fetching VMStats: %w", err) } pageStats := mapstr.M{} @@ -55,7 +53,7 @@ func FetchLinuxMemStats(baseMap mapstr.M, hostfs resolve.Resolver) error { thp, err := getHugePages(hostfs) if err != nil { - return errors.Wrap(err, "error getting huge pages") + return fmt.Errorf("error getting huge pages: %w", err) } baseMap["hugepages"] = thp @@ -71,12 +69,12 @@ func FetchLinuxMemStats(baseMap mapstr.M, hostfs resolve.Resolver) error { // This way very similar metrics aren't split across different modules, even though Linux reports them in different places. eventRaw, err := metrics.Get(hostfs) if err != nil { - return errors.Wrap(err, "error fetching memory metrics") + return fmt.Errorf("error fetching memory metrics: %w", err) } swap := mapstr.M{} err = typeconv.Convert(&swap, &eventRaw.Swap) if err != nil { - return errors.Wrap(err, "error converting raw event") + return fmt.Errorf("error converting raw event: %w", err) } baseMap["swap"] = swap @@ -122,7 +120,7 @@ func getHugePages(hostfs resolve.Resolver) (mapstr.M, error) { // see https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt table, err := memory.ParseMeminfo(hostfs) if err != nil { - return nil, errors.Wrap(err, "error parsing meminfo") + return nil, fmt.Errorf("error parsing meminfo: %w", err) } thp := mapstr.M{} @@ -168,7 +166,7 @@ func GetVMStat(hostfs resolve.Resolver) (map[string]uint64, error) { vmstatFile := hostfs.ResolveHostFS("proc/vmstat") content, err := os.ReadFile(vmstatFile) if err != nil { - return nil, errors.Wrapf(err, "error reading vmstat from %s", vmstatFile) + return nil, fmt.Errorf("error reading vmstat from %s: %w", vmstatFile, err) } // I'm not a fan of throwing stuff directly to maps, but this is a huge amount of kernel/config specific metrics, and we're the only consumer of this for now. @@ -181,7 +179,7 @@ func GetVMStat(hostfs resolve.Resolver) (map[string]uint64, error) { num, err := strconv.ParseUint(string(parts[1]), 10, 64) if err != nil { - return nil, errors.Wrapf(err, "failed to parse value %s", parts[1]) + return nil, fmt.Errorf("failed to parse value %s: %w", parts[1], err) } vmstat[parts[0]] = num diff --git a/metricbeat/module/linux/memory/memory.go b/metricbeat/module/linux/memory/memory.go index e74b8b36e60..01eef01cb4b 100644 --- a/metricbeat/module/linux/memory/memory.go +++ b/metricbeat/module/linux/memory/memory.go @@ -18,7 +18,7 @@ package memory import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -61,7 +61,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { rootEvent := mapstr.M{} err := FetchLinuxMemStats(rootEvent, m.mod) if err != nil { - return errors.Wrap(err, "error fetching memory stats") + return fmt.Errorf("error fetching memory stats: %w", err) } report.Event(mb.Event{ MetricSetFields: rootEvent, diff --git a/metricbeat/module/linux/pageinfo/pageinfo.go b/metricbeat/module/linux/pageinfo/pageinfo.go index d32243812f2..fc1be3fca35 100644 --- a/metricbeat/module/linux/pageinfo/pageinfo.go +++ b/metricbeat/module/linux/pageinfo/pageinfo.go @@ -19,10 +19,9 @@ package pageinfo import ( "bufio" + "fmt" "os" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/mapstr" @@ -67,7 +66,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { fd, err := os.Open(pagePath) if err != nil { - return errors.Wrap(err, "error opening file") + return fmt.Errorf("error opening file: %w", err) } defer fd.Close() @@ -75,7 +74,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { zones, err := readPageFile(reader) if err != nil { - return errors.Wrap(err, "error reading pagetypeinfo") + return fmt.Errorf("error reading pagetypeinfo: %w", err) } report.Event(mb.Event{ diff --git a/metricbeat/module/linux/pageinfo/reader.go b/metricbeat/module/linux/pageinfo/reader.go index 9af65dfb1f7..39a5062f6d0 100644 --- a/metricbeat/module/linux/pageinfo/reader.go +++ b/metricbeat/module/linux/pageinfo/reader.go @@ -19,11 +19,10 @@ package pageinfo import ( "bufio" + "fmt" "io" "regexp" "strconv" - - "github.com/pkg/errors" ) // zones represents raw pagetypeinfo data @@ -83,7 +82,7 @@ func readPageFile(reader *bufio.Reader) (pageInfo, error) { match := matches[0] nodeLevel, err = strconv.ParseInt(string(match[1]), 10, 64) if err != nil { - return pageInfo{}, errors.Wrapf(err, "error parsing node number: %s", string(match[1])) + return pageInfo{}, fmt.Errorf("error parsing node number: %s: %w", string(match[1]), err) } if nodes[nodeLevel].DMA == nil { nodes[nodeLevel] = zones{ @@ -100,7 +99,7 @@ func readPageFile(reader *bufio.Reader) (pageInfo, error) { for order, count := range match[4:] { zoneOrders[order], err = strconv.ParseInt(string(count), 10, 64) if err != nil { - return pageInfo{}, errors.Wrapf(err, "error parsing zone: %s", string(count)) + return pageInfo{}, fmt.Errorf("error parsing zone: %s: %w", string(count), err) } nodes[nodeLevel].OrderSummary[order] += zoneOrders[order] if zoneType == "DMA" { diff --git a/metricbeat/module/linux/pressure/pressure.go b/metricbeat/module/linux/pressure/pressure.go index 529fb69ed33..292dcd194a7 100644 --- a/metricbeat/module/linux/pressure/pressure.go +++ b/metricbeat/module/linux/pressure/pressure.go @@ -21,7 +21,6 @@ import ( "fmt" "runtime" - "github.com/pkg/errors" "github.com/prometheus/procfs" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" @@ -75,7 +74,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { events, err := fetchLinuxPSIStats(m) if err != nil { - return errors.Wrap(err, "error fetching PSI stats") + return fmt.Errorf("error fetching PSI stats: %w", err) } for _, event := range events { @@ -92,13 +91,13 @@ func fetchLinuxPSIStats(m *MetricSet) ([]mapstr.M, error) { procfs, err := procfs.NewFS(m.mod.ResolveHostFS("/proc")) if err != nil { - return nil, errors.Wrapf(err, "error creating new Host FS at %s", m.mod.ResolveHostFS("/proc")) + return nil, fmt.Errorf("error creating new Host FS at %s: %w", m.mod.ResolveHostFS("/proc"), err) } for _, resource := range resources { psiMetric, err := procfs.PSIStatsForResource(resource) if err != nil { - return nil, errors.Wrap(err, "check that /proc/pressure is available, and/or enabled") + return nil, fmt.Errorf("check that /proc/pressure is available, and/or enabled: %w", err) } event := mapstr.M{ diff --git a/metricbeat/module/linux/rapl/rapl.go b/metricbeat/module/linux/rapl/rapl.go index b0181f399bd..5dd823efc54 100644 --- a/metricbeat/module/linux/rapl/rapl.go +++ b/metricbeat/module/linux/rapl/rapl.go @@ -20,6 +20,7 @@ package rapl import ( + "errors" "fmt" "io/ioutil" "os" @@ -31,7 +32,6 @@ import ( "time" "github.com/fearful-symmetry/gorapl/rapl" - "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" @@ -86,7 +86,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { sys := base.Module().(resolve.Resolver) CPUList, err := getMSRCPUs(sys) if err != nil { - return nil, errors.Wrap(err, "error getting list of CPUs to query") + return nil, fmt.Errorf("error getting list of CPUs to query: %w", err) } // check to see if msr-safe is installed @@ -97,12 +97,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return nil, errors.New("no msr_safe device found. Is the kernel module loaded?") } if err != nil { - return nil, errors.Wrapf(err, "could not check msr_safe device at %s", queryPath) + return nil, fmt.Errorf("could not check msr_safe device at %s: %w", queryPath, err) } } else { user, err := user.Current() if err != nil { - return nil, errors.Wrap(err, "error fetching user list") + return nil, fmt.Errorf("error fetching user list: %w", err) } if user.Uid != "0" { return nil, errors.New("linux/rapl must run as root if not using msr-safe") @@ -119,7 +119,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } handler, err := rapl.CreateNewHandler(cpu, formatPath) if err != nil { - return nil, errors.Wrapf(err, "error creating handler at path %s for CPU %d", formatPath, cpu) + return nil, fmt.Errorf("error creating handler at path %s for CPU %d: %w", formatPath, cpu, err) } handlers[cpu] = handler @@ -207,7 +207,7 @@ func (m *MetricSet) updatePower() map[int]map[rapl.RAPLDomain]energyUsage { func getMSRCPUs(hostfs resolve.Resolver) ([]int, error) { CPUs, err := topoPkgCPUMap(hostfs) if err != nil { - return nil, errors.Wrap(err, "error fetching CPU topology") + return nil, fmt.Errorf("error fetching CPU topology: %w", err) } coreList := []int{} for _, cores := range CPUs { @@ -244,16 +244,16 @@ func topoPkgCPUMap(hostfs resolve.Resolver) (map[int][]int, error) { fullPkg := hostfs.ResolveHostFS(filepath.Join(sysdir, file.Name(), "/topology/physical_package_id")) dat, err := ioutil.ReadFile(fullPkg) if err != nil { - return nil, errors.Wrapf(err, "error reading file %s", fullPkg) + return nil, fmt.Errorf("error reading file %s: %w", fullPkg, err) } phys, err := strconv.ParseInt(strings.TrimSpace(string(dat)), 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error parsing value from %s", fullPkg) + return nil, fmt.Errorf("error parsing value from %s: %w", fullPkg, err) } var cpuCore int _, err = fmt.Sscanf(file.Name(), "cpu%d", &cpuCore) if err != nil { - return nil, errors.Wrapf(err, "error fetching CPU core value from string %s", file.Name()) + return nil, fmt.Errorf("error fetching CPU core value from string %s: %w", file.Name(), err) } pkgList, ok := cpuMap[int(phys)] if !ok { diff --git a/metricbeat/module/linux/util.go b/metricbeat/module/linux/util.go index 87b9bcd0512..def4603c816 100644 --- a/metricbeat/module/linux/util.go +++ b/metricbeat/module/linux/util.go @@ -18,11 +18,10 @@ package linux import ( + "fmt" "io/ioutil" "strconv" "strings" - - "github.com/pkg/errors" ) // ReadIntFromFile reads a single int value from a path and returns an int64. @@ -31,14 +30,14 @@ func ReadIntFromFile(path string, base int) (int64, error) { raw, err := ioutil.ReadFile(path) if err != nil { - return 0, errors.Wrapf(err, "error reading file %s", path) + return 0, fmt.Errorf("error reading file %s: %w", path, err) } clean := strings.TrimSpace(string(raw)) intval, err := strconv.ParseInt(clean, 10, 64) if err != nil { - return 0, errors.Wrapf(err, "error converting string: %s", clean) + return 0, fmt.Errorf("error converting string: %s: %w", clean, err) } return intval, nil diff --git a/metricbeat/module/logstash/logstash.go b/metricbeat/module/logstash/logstash.go index 8623bcd9a80..6e796633612 100644 --- a/metricbeat/module/logstash/logstash.go +++ b/metricbeat/module/logstash/logstash.go @@ -22,8 +22,6 @@ import ( "fmt" "net/url" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/helper/elastic" "github.com/elastic/beats/v7/metricbeat/mb" @@ -109,7 +107,7 @@ func NewMetricSet(base mb.BaseMetricSet) (*MetricSet, error) { func GetPipelines(m *MetricSet) ([]PipelineState, string, error) { content, err := fetchPath(m.HTTP, "_node/pipelines", "graph=true") if err != nil { - return nil, "", errors.Wrap(err, "could not fetch node pipelines") + return nil, "", fmt.Errorf("could not fetch node pipelines: %w", err) } pipelinesResponse := struct { @@ -121,7 +119,7 @@ func GetPipelines(m *MetricSet) ([]PipelineState, string, error) { err = json.Unmarshal(content, &pipelinesResponse) if err != nil { - return nil, "", errors.Wrap(err, "could not parse node pipelines response") + return nil, "", fmt.Errorf("could not parse node pipelines response: %w", err) } var pipelines []PipelineState diff --git a/metricbeat/module/logstash/node/data.go b/metricbeat/module/logstash/node/data.go index 0ccc42ef7df..49c17b73275 100644 --- a/metricbeat/module/logstash/node/data.go +++ b/metricbeat/module/logstash/node/data.go @@ -19,8 +19,7 @@ package node import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common" s "github.com/elastic/beats/v7/libbeat/common/schema" @@ -86,7 +85,7 @@ func eventMapping(r mb.ReporterV2, content []byte, pipelines []logstash.Pipeline var data map[string]interface{} err := json.Unmarshal(content, &data) if err != nil { - return errors.Wrap(err, "failure parsing Logstash Node API response") + return fmt.Errorf("failure parsing Logstash Node API response: %w", err) } pipelines = getUserDefinedPipelines(pipelines) @@ -96,7 +95,7 @@ func eventMapping(r mb.ReporterV2, content []byte, pipelines []logstash.Pipeline for _, pipeline := range pipelines { fields, err := schema.Apply(data) if err != nil { - return errors.Wrap(err, "failure applying node schema") + return fmt.Errorf("failure applying node schema: %w", err) } removeClusterUUIDsFromPipeline(pipeline) diff --git a/metricbeat/module/memcached/stats/stats.go b/metricbeat/module/memcached/stats/stats.go index 6e9ebb66d3f..890a8c701f7 100644 --- a/metricbeat/module/memcached/stats/stats.go +++ b/metricbeat/module/memcached/stats/stats.go @@ -19,12 +19,11 @@ package stats import ( "bufio" + "fmt" "net" "net/url" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" ) @@ -54,18 +53,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { network, address, err := getNetworkAndAddress(m.HostData()) if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } conn, err := net.DialTimeout(network, address, m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } defer conn.Close() _, err = conn.Write([]byte("stats\n")) if err != nil { - return errors.Wrap(err, "error in connection") + return fmt.Errorf("error in connection: %w", err) } scanner := bufio.NewScanner(conn) @@ -95,7 +94,7 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { func getNetworkAndAddress(hostData mb.HostData) (network string, address string, err error) { u, err := url.Parse(hostData.URI) if err != nil { - err = errors.Wrap(err, "invalid URL") + err = fmt.Errorf("invalid URL: %w", err) return } diff --git a/metricbeat/module/munin/munin.go b/metricbeat/module/munin/munin.go index fe2b981d6ba..4438f510d4c 100644 --- a/metricbeat/module/munin/munin.go +++ b/metricbeat/module/munin/munin.go @@ -19,6 +19,8 @@ package munin import ( "bufio" + "errors" + "fmt" "io" "net" "regexp" @@ -26,8 +28,6 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -88,7 +88,7 @@ func (n *Node) List() ([]string, error) { func (n *Node) Fetch(plugin string, sanitize bool) (mapstr.M, error) { _, err := io.WriteString(n.writer, "fetch "+plugin+"\n") if err != nil { - return nil, errors.Wrapf(err, "failed to fetch metrics for plugin '%s'", plugin) + return nil, fmt.Errorf("failed to fetch metrics for plugin '%s': %w", plugin, err) } event := mapstr.M{} diff --git a/metricbeat/module/nats/_meta/Dockerfile b/metricbeat/module/nats/_meta/Dockerfile index bbc62eaa888..85751dda114 100644 --- a/metricbeat/module/nats/_meta/Dockerfile +++ b/metricbeat/module/nats/_meta/Dockerfile @@ -2,7 +2,7 @@ ARG NATS_VERSION=2.0.4 FROM nats:$NATS_VERSION # build stage -FROM golang:1.19.10 AS build-env +FROM golang:1.20.7 AS build-env RUN apt-get install git mercurial gcc RUN git clone https://github.com/nats-io/nats.go.git /nats-go RUN cd /nats-go/examples/nats-bench && git checkout tags/v1.10.0 && go build . diff --git a/metricbeat/module/nats/connection/connection.go b/metricbeat/module/nats/connection/connection.go index b491d35ef30..0fc8cff2b60 100644 --- a/metricbeat/module/nats/connection/connection.go +++ b/metricbeat/module/nats/connection/connection.go @@ -18,7 +18,7 @@ package connection import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -84,11 +84,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventsMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil } diff --git a/metricbeat/module/nats/connection/data.go b/metricbeat/module/nats/connection/data.go index cc2b26dfbb5..c385ddcdc1d 100644 --- a/metricbeat/module/nats/connection/data.go +++ b/metricbeat/module/nats/connection/data.go @@ -19,10 +19,9 @@ package connection import ( "encoding/json" + "fmt" "time" - "github.com/pkg/errors" - s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" "github.com/elastic/beats/v7/metricbeat/mb" @@ -63,26 +62,26 @@ type Connections struct { func eventMapping(content map[string]interface{}, fieldsSchema s.Schema) (mb.Event, error) { fields, err := fieldsSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying connection schema") + return mb.Event{}, fmt.Errorf("error applying connection schema: %w", err) } err = util.UpdateDuration(fields, "uptime") if err != nil { - return mb.Event{}, errors.Wrap(err, "failure updating uptime key") + return mb.Event{}, fmt.Errorf("failure updating uptime key: %w", err) } err = util.UpdateDuration(fields, "idle_time") if err != nil { - return mb.Event{}, errors.Wrap(err, "failure updating idle_time key") + return mb.Event{}, fmt.Errorf("failure updating idle_time key: %w", err) } moduleFields, err := moduleSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying module schema") + return mb.Event{}, fmt.Errorf("error applying module schema: %w", err) } if err != nil { - return mb.Event{}, errors.Wrap(err, "failure parsing server timestamp") + return mb.Event{}, fmt.Errorf("failure parsing server timestamp: %w", err) } event := mb.Event{ MetricSetFields: fields, @@ -96,7 +95,7 @@ func eventsMapping(r mb.ReporterV2, content []byte) error { var err error connections := Connections{} if err = json.Unmarshal(content, &connections); err != nil { - return errors.Wrap(err, "failure parsing NATS connections API response") + return fmt.Errorf("failure parsing NATS connections API response: %w", err) } for _, con := range connections.Connections { @@ -104,7 +103,7 @@ func eventsMapping(r mb.ReporterV2, content []byte) error { con["server_id"] = connections.ServerID evt, err = eventMapping(con, connectionsSchema) if err != nil { - r.Error(errors.Wrap(err, "error mapping connection event")) + r.Error(fmt.Errorf("error mapping connection event: %w", err)) continue } evt.Timestamp = connections.Now diff --git a/metricbeat/module/nats/connections/connections.go b/metricbeat/module/nats/connections/connections.go index 8fcfb652e9f..3fb41cc5e2f 100644 --- a/metricbeat/module/nats/connections/connections.go +++ b/metricbeat/module/nats/connections/connections.go @@ -18,7 +18,7 @@ package connections import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -85,11 +85,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil } diff --git a/metricbeat/module/nats/connections/data.go b/metricbeat/module/nats/connections/data.go index 241f46f77d2..200bb32c8ad 100644 --- a/metricbeat/module/nats/connections/data.go +++ b/metricbeat/module/nats/connections/data.go @@ -19,8 +19,7 @@ package connections import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -45,21 +44,21 @@ func eventMapping(r mb.ReporterV2, content []byte) error { err := json.Unmarshal(content, &inInterface) if err != nil { - return errors.Wrap(err, "failure parsing NATS connections API response") + return fmt.Errorf("failure parsing NATS connections API response: %w", err) } metricSetFields, err := connectionsSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying connections schema") + return fmt.Errorf("failure applying connections schema: %w", err) } moduleFields, err := moduleSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying module schema") + return fmt.Errorf("failure applying module schema: %w", err) } timestamp, err := util.GetNatsTimestamp(moduleFields) if err != nil { - return errors.Wrap(err, "failure parsing server timestamp") + return fmt.Errorf("failure parsing server timestamp: %w", err) } event := mb.Event{ MetricSetFields: metricSetFields, diff --git a/metricbeat/module/nats/route/data.go b/metricbeat/module/nats/route/data.go index 932933f9d9d..853c7a9cb83 100644 --- a/metricbeat/module/nats/route/data.go +++ b/metricbeat/module/nats/route/data.go @@ -19,10 +19,9 @@ package route import ( "encoding/json" + "fmt" "time" - "github.com/pkg/errors" - s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" "github.com/elastic/beats/v7/metricbeat/mb" @@ -62,16 +61,16 @@ type Routes struct { func eventMapping(content map[string]interface{}, fieldsSchema s.Schema) (mb.Event, error) { fields, err := fieldsSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying routes schema") + return mb.Event{}, fmt.Errorf("error applying routes schema: %w", err) } moduleFields, err := moduleSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying module schema") + return mb.Event{}, fmt.Errorf("error applying module schema: %w", err) } if err != nil { - return mb.Event{}, errors.Wrap(err, "failure parsing server timestamp") + return mb.Event{}, fmt.Errorf("failure parsing server timestamp: %w", err) } event := mb.Event{ MetricSetFields: fields, @@ -85,7 +84,7 @@ func eventsMapping(r mb.ReporterV2, content []byte) error { var err error connections := Routes{} if err = json.Unmarshal(content, &connections); err != nil { - return errors.Wrap(err, "failure parsing NATS connections API response") + return fmt.Errorf("failure parsing NATS connections API response: %w", err) } for _, con := range connections.Routes { @@ -93,7 +92,7 @@ func eventsMapping(r mb.ReporterV2, content []byte) error { con["server_id"] = connections.ServerID evt, err = eventMapping(con, routesSchema) if err != nil { - r.Error(errors.Wrap(err, "error mapping connection event")) + r.Error(fmt.Errorf("error mapping connection event: %w", err)) continue } evt.Timestamp = connections.Now diff --git a/metricbeat/module/nats/route/route.go b/metricbeat/module/nats/route/route.go index bf5814157f2..a2c1cb20f3d 100644 --- a/metricbeat/module/nats/route/route.go +++ b/metricbeat/module/nats/route/route.go @@ -18,7 +18,7 @@ package route import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -84,11 +84,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventsMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/metricbeat/module/nats/routes/data.go b/metricbeat/module/nats/routes/data.go index 02eb686e709..78c7cb10c30 100644 --- a/metricbeat/module/nats/routes/data.go +++ b/metricbeat/module/nats/routes/data.go @@ -19,8 +19,7 @@ package routes import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -45,20 +44,20 @@ func eventMapping(r mb.ReporterV2, content []byte) error { err := json.Unmarshal(content, &inInterface) if err != nil { - return errors.Wrap(err, "failure parsing Nats routes API response") + return fmt.Errorf("failure parsing Nats routes API response: %w", err) } metricSetFields, err := routesSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying routes schema") + return fmt.Errorf("failure applying routes schema: %w", err) } moduleFields, err := moduleSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying module schema") + return fmt.Errorf("failure applying module schema: %w", err) } timestamp, err := util.GetNatsTimestamp(moduleFields) if err != nil { - errors.Wrap(err, "failure parsing server timestamp") + return fmt.Errorf("failure parsing server timestamp: %w", err) } event := mb.Event{ MetricSetFields: metricSetFields, diff --git a/metricbeat/module/nats/routes/routes.go b/metricbeat/module/nats/routes/routes.go index 88eeebab41a..b3db4c4f7f7 100644 --- a/metricbeat/module/nats/routes/routes.go +++ b/metricbeat/module/nats/routes/routes.go @@ -18,7 +18,7 @@ package routes import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -85,11 +85,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/metricbeat/module/nats/stats/data.go b/metricbeat/module/nats/stats/data.go index 7bc72177a54..c7f2ca719ef 100644 --- a/metricbeat/module/nats/stats/data.go +++ b/metricbeat/module/nats/stats/data.go @@ -19,8 +19,7 @@ package stats import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -71,30 +70,29 @@ func eventMapping(r mb.ReporterV2, content []byte) error { err := json.Unmarshal(content, &inInterface) if err != nil { - return errors.Wrap(err, "failure parsing Nats stats API response") + return fmt.Errorf("failure parsing Nats stats API response: %w", err) } metricsetMetrics, err = statsSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying stats schema") + return fmt.Errorf("failure applying stats schema: %w", err) } err = util.UpdateDuration(metricsetMetrics, "uptime") if err != nil { - return errors.Wrap(err, "failure updating uptime key") + return fmt.Errorf("failure updating uptime key: %w", err) } d, err := metricsetMetrics.GetValue("http_req_stats") if err != nil { - return errors.Wrap(err, "failure retrieving http_req_stats key") + return fmt.Errorf("failure retrieving http_req_stats key: %w", err) } httpStats, ok := d.(mapstr.M) if !ok { - return errors.Wrap(err, "failure casting http_req_stats to common.Mapstr") - + return fmt.Errorf("failure casting http_req_stats to common.Mapstr") } err = metricsetMetrics.Delete("http_req_stats") if err != nil { - return errors.Wrap(err, "failure deleting http_req_stats key") + return fmt.Errorf("failure deleting http_req_stats key: %w", err) } metricsetMetrics["http"] = mapstr.M{ @@ -110,23 +108,23 @@ func eventMapping(r mb.ReporterV2, content []byte) error { } cpu, err := metricsetMetrics.GetValue("cpu") if err != nil { - return errors.Wrap(err, "failure retrieving cpu key") + return fmt.Errorf("failure retrieving cpu key: %w", err) } cpuUtil, ok := cpu.(float64) if !ok { - return errors.Wrap(err, "failure casting cpu to float64") + return fmt.Errorf("failure casting cpu to float64") } _, err = metricsetMetrics.Put("cpu", cpuUtil/100.0) if err != nil { - return errors.Wrap(err, "failure updating cpu key") + return fmt.Errorf("failure updating cpu key: %w", err) } moduleMetrics, err := moduleSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying module schema") + return fmt.Errorf("failure applying module schema: %w", err) } timestamp, err := util.GetNatsTimestamp(moduleMetrics) if err != nil { - return errors.Wrap(err, "failure parsing server timestamp") + return fmt.Errorf("failure parsing server timestamp: %w", err) } evt := mb.Event{ MetricSetFields: metricsetMetrics, diff --git a/metricbeat/module/nats/stats/stats.go b/metricbeat/module/nats/stats/stats.go index fe1cfbdd975..5d5d69ff584 100644 --- a/metricbeat/module/nats/stats/stats.go +++ b/metricbeat/module/nats/stats/stats.go @@ -18,7 +18,7 @@ package stats import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -85,11 +85,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/metricbeat/module/nats/subscriptions/data.go b/metricbeat/module/nats/subscriptions/data.go index a92bcae4b14..e06a39e913b 100644 --- a/metricbeat/module/nats/subscriptions/data.go +++ b/metricbeat/module/nats/subscriptions/data.go @@ -19,8 +19,7 @@ package subscriptions import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -50,12 +49,12 @@ func eventMapping(r mb.ReporterV2, content []byte) error { err := json.Unmarshal(content, &inInterface) if err != nil { - return errors.Wrap(err, "failure parsing Nats subscriptions API response") + return fmt.Errorf("failure parsing Nats subscriptions API response: %w", err) } event.MetricSetFields, err = subscriptionsSchema.Apply(inInterface) if err != nil { - return errors.Wrap(err, "failure applying subscriptions schema") + return fmt.Errorf("failure applying subscriptions schema: %w", err) } r.Event(event) diff --git a/metricbeat/module/nats/subscriptions/subscriptions.go b/metricbeat/module/nats/subscriptions/subscriptions.go index e9183f214c7..903606a3721 100644 --- a/metricbeat/module/nats/subscriptions/subscriptions.go +++ b/metricbeat/module/nats/subscriptions/subscriptions.go @@ -18,7 +18,7 @@ package subscriptions import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -85,11 +85,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(r, content) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/metricbeat/module/nats/util/util.go b/metricbeat/module/nats/util/util.go index 1decbf0bb9f..ada2e12ef01 100644 --- a/metricbeat/module/nats/util/util.go +++ b/metricbeat/module/nats/util/util.go @@ -23,8 +23,6 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -39,7 +37,7 @@ func convertUptimeToSeconds(uptime string) (seconds int64, err error) { uptime = split[1] years, err = strconv.ParseInt(split[0], 10, 64) if err != nil { - err = errors.Wrap(err, "invalid years format in json data") + err = fmt.Errorf("invalid years format in json data: %w", err) return } seconds += years * 31536000 @@ -50,7 +48,7 @@ func convertUptimeToSeconds(uptime string) (seconds int64, err error) { uptime = split[1] days, err = strconv.ParseInt(split[0], 10, 64) if err != nil { - err = errors.Wrap(err, "invalid days format in json data") + err = fmt.Errorf("invalid days format in json data: %w", err) return } seconds += days * 86400 @@ -61,7 +59,7 @@ func convertUptimeToSeconds(uptime string) (seconds int64, err error) { uptime = split[1] hours, err = strconv.ParseInt(split[0], 10, 64) if err != nil { - err = errors.Wrap(err, "invalid hours format in json data") + err = fmt.Errorf("invalid hours format in json data: %w", err) return } seconds += hours * 3600 @@ -72,7 +70,7 @@ func convertUptimeToSeconds(uptime string) (seconds int64, err error) { uptime = split[1] minutes, err = strconv.ParseInt(split[0], 10, 64) if err != nil { - err = errors.Wrap(err, "invalid minutes format in json data") + err = fmt.Errorf("invalid minutes format in json data: %w", err) return } seconds += minutes * 60 @@ -83,7 +81,7 @@ func convertUptimeToSeconds(uptime string) (seconds int64, err error) { uptime = split[1] secs, err = strconv.ParseInt(split[0], 10, 64) if err != nil { - err = errors.Wrap(err, "invalid seconds format in json data") + err = fmt.Errorf("invalid seconds format in json data: %w", err) return } seconds += secs @@ -99,11 +97,11 @@ func UpdateDuration(event mapstr.M, key string) error { } itemConverted, err := convertUptimeToSeconds(item.(string)) if err != nil { - return errors.Wrap(err, fmt.Sprintf("failure converting %v key from string to integer", key)) + return fmt.Errorf(fmt.Sprintf("failure converting %v key from string to integer", key)+": %w", err) } _, err = event.Put(key, itemConverted) if err != nil { - return errors.Wrap(err, fmt.Sprintf("failure updating %v key", key)) + return fmt.Errorf(fmt.Sprintf("failure updating %v key", key)+": %w", err) } return nil } diff --git a/metricbeat/module/nginx/stubstatus/stubstatus.go b/metricbeat/module/nginx/stubstatus/stubstatus.go index 7df0acf5336..5c28a82f464 100644 --- a/metricbeat/module/nginx/stubstatus/stubstatus.go +++ b/metricbeat/module/nginx/stubstatus/stubstatus.go @@ -19,7 +19,7 @@ package stubstatus import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -78,7 +78,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { scanner, err := m.http.FetchScanner() if err != nil { - return errors.Wrap(err, "error fetching status") + return fmt.Errorf("error fetching status: %w", err) } event, _ := eventMapping(scanner, m) reporter.Event(mb.Event{MetricSetFields: event}) diff --git a/metricbeat/module/php_fpm/pool/pool.go b/metricbeat/module/php_fpm/pool/pool.go index ec15fb46915..cc322529863 100644 --- a/metricbeat/module/php_fpm/pool/pool.go +++ b/metricbeat/module/php_fpm/pool/pool.go @@ -19,8 +19,7 @@ package pool import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -58,16 +57,16 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { content, err := m.HTTP.FetchContent() if err != nil { - return errors.Wrap(err, "error in http fetch") + return fmt.Errorf("error in http fetch: %w", err) } var stats map[string]interface{} err = json.Unmarshal(content, &stats) if err != nil { - return errors.Wrap(err, "error unmarshalling json") + return fmt.Errorf("error unmarshalling json: %w", err) } event, err := schema.Apply(stats) if err != nil { - return errors.Wrap(err, "error in event mapping") + return fmt.Errorf("error in event mapping: %w", err) } reporter.Event(mb.Event{ MetricSetFields: event, diff --git a/metricbeat/module/postgresql/activity/activity.go b/metricbeat/module/postgresql/activity/activity.go index ac2748cd582..b97830c8edc 100644 --- a/metricbeat/module/postgresql/activity/activity.go +++ b/metricbeat/module/postgresql/activity/activity.go @@ -19,8 +19,7 @@ package activity import ( "context" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/postgresql" @@ -60,7 +59,7 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { results, err := m.QueryStats(ctx, "SELECT * FROM pg_stat_activity") if err != nil { - return errors.Wrap(err, "error in QueryStats") + return fmt.Errorf("error in QueryStats: %w", err) } for _, result := range results { diff --git a/metricbeat/module/postgresql/database/database.go b/metricbeat/module/postgresql/database/database.go index 0b23a25d27b..48fc032ad81 100644 --- a/metricbeat/module/postgresql/database/database.go +++ b/metricbeat/module/postgresql/database/database.go @@ -19,8 +19,7 @@ package database import ( "context" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/postgresql" @@ -59,7 +58,7 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { ctx := context.Background() results, err := m.QueryStats(ctx, "SELECT * FROM pg_stat_database") if err != nil { - return errors.Wrap(err, "error in QueryStats") + return fmt.Errorf("error in QueryStats: %w", err) } for _, result := range results { diff --git a/metricbeat/module/postgresql/docker-compose.yml b/metricbeat/module/postgresql/docker-compose.yml index acb591bfbfc..d29c19350a9 100644 --- a/metricbeat/module/postgresql/docker-compose.yml +++ b/metricbeat/module/postgresql/docker-compose.yml @@ -2,17 +2,18 @@ version: '2.3' services: postgresql: - image: docker.elastic.co/integrations-ci/beats-postgresql:${POSTGRESQL_VERSION:-13.2}-2 + image: docker.elastic.co/integrations-ci/beats-postgresql:${POSTGRESQL_VERSION:-13.11}-2 build: context: ./_meta args: - POSTGRESQL_VERSION: ${POSTGRESQL_VERSION:-13.2} + POSTGRESQL_VERSION: ${POSTGRESQL_VERSION:-13.11} environment: POSTGRES_PASSWORD: postgres ports: - 5432 healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres -p 5432"] - interval: 5s - timeout: 5s + test: ['CMD-SHELL', 'psql -h localhost -p 5432 -U postgres -c select 1 -d postgres'] + interval: 15s + timeout: 30s retries: 5 + start_period: 15s \ No newline at end of file diff --git a/metricbeat/module/postgresql/metricset.go b/metricbeat/module/postgresql/metricset.go index ca0a4e4a4d0..3ebcff4dafe 100644 --- a/metricbeat/module/postgresql/metricset.go +++ b/metricbeat/module/postgresql/metricset.go @@ -20,8 +20,7 @@ package postgresql import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/logp" @@ -46,7 +45,7 @@ func (ms *MetricSet) DB(ctx context.Context) (*sql.Conn, error) { if ms.db == nil { db, err := sql.Open("postgres", ms.HostData().URI) if err != nil { - return nil, errors.Wrap(err, "failed to open connection") + return nil, fmt.Errorf("failed to open connection: %w", err) } ms.db = db } @@ -57,18 +56,18 @@ func (ms *MetricSet) DB(ctx context.Context) (*sql.Conn, error) { func (ms *MetricSet) QueryStats(ctx context.Context, query string) ([]map[string]interface{}, error) { db, err := ms.DB(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to obtain a connection with the database") + return nil, fmt.Errorf("failed to obtain a connection with the database: %w", err) } defer db.Close() rows, err := db.QueryContext(ctx, query) if err != nil { - return nil, errors.Wrap(err, "failed to query database") + return nil, fmt.Errorf("failed to query database: %w", err) } columns, err := rows.Columns() if err != nil { - return nil, errors.Wrap(err, "scanning columns") + return nil, fmt.Errorf("scanning columns: %w", err) } vals := make([][]byte, len(columns)) valPointers := make([]interface{}, len(columns)) @@ -81,7 +80,7 @@ func (ms *MetricSet) QueryStats(ctx context.Context, query string) ([]map[string for rows.Next() { err = rows.Scan(valPointers...) if err != nil { - return nil, errors.Wrap(err, "scanning row") + return nil, fmt.Errorf("scanning row: %w", err) } result := map[string]interface{}{} @@ -100,5 +99,9 @@ func (ms *MetricSet) Close() error { if ms.db == nil { return nil } - return errors.Wrap(ms.db.Close(), "failed to close connection") + + if err := ms.db.Close(); err != nil { + return fmt.Errorf("failed to close connection: %w", err) + } + return nil } diff --git a/metricbeat/module/prometheus/collector/_meta/data.json b/metricbeat/module/prometheus/collector/_meta/data.json index a46b63c74fe..dba9f7771c4 100644 --- a/metricbeat/module/prometheus/collector/_meta/data.json +++ b/metricbeat/module/prometheus/collector/_meta/data.json @@ -11,10 +11,12 @@ }, "prometheus": { "labels": { - "job": "prometheus" + "job": "prometheus", + "listener_name": "http" }, "metrics": { - "up": 1 + "net_conntrack_listener_conn_accepted_total": 3, + "net_conntrack_listener_conn_closed_total": 0 } }, "service": { diff --git a/metricbeat/module/redis/info/info.go b/metricbeat/module/redis/info/info.go index f292e10e852..bef98dd9f1a 100644 --- a/metricbeat/module/redis/info/info.go +++ b/metricbeat/module/redis/info/info.go @@ -18,10 +18,9 @@ package info import ( + "fmt" "strconv" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" "github.com/elastic/beats/v7/metricbeat/module/redis" @@ -45,7 +44,7 @@ type MetricSet struct { func New(base mb.BaseMetricSet) (mb.MetricSet, error) { ms, err := redis.NewMetricSet(base) if err != nil { - return nil, errors.Wrap(err, "failed to create 'info' metricset") + return nil, fmt.Errorf("failed to create 'info' metricset: %w", err) } return &MetricSet{ms}, nil } @@ -55,14 +54,14 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { conn := m.Connection() defer func() { if err := conn.Close(); err != nil { - m.Logger().Debug(errors.Wrapf(err, "failed to release connection")) + m.Logger().Debug(fmt.Errorf("failed to release connection: %w", err)) } }() // Fetch all INFO. info, err := redis.FetchRedisInfo("all", conn) if err != nil { - return errors.Wrap(err, "failed to fetch redis info") + return fmt.Errorf("failed to fetch redis info: %w", err) } // In 5.0 some fields are renamed, maintain both names, old ones will be deprecated @@ -81,7 +80,7 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { slowLogLength, err := redis.FetchSlowLogLength(conn) if err != nil { - return errors.Wrap(err, "failed to fetch slow log length") + return fmt.Errorf("failed to fetch slow log length: %w", err) } info["slowlog_len"] = strconv.FormatInt(slowLogLength, 10) diff --git a/metricbeat/module/redis/keyspace/keyspace.go b/metricbeat/module/redis/keyspace/keyspace.go index a9710fa67f9..afa6a485fc3 100644 --- a/metricbeat/module/redis/keyspace/keyspace.go +++ b/metricbeat/module/redis/keyspace/keyspace.go @@ -18,7 +18,7 @@ package keyspace import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -43,7 +43,7 @@ type MetricSet struct { func New(base mb.BaseMetricSet) (mb.MetricSet, error) { ms, err := redis.NewMetricSet(base) if err != nil { - return nil, errors.Wrap(err, "failed to create 'keyspace' metricset") + return nil, fmt.Errorf("failed to create 'keyspace' metricset: %w", err) } return &MetricSet{ms}, nil } @@ -53,14 +53,14 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { conn := m.Connection() defer func() { if err := conn.Close(); err != nil { - m.Logger().Debug(errors.Wrapf(err, "failed to release connection")) + m.Logger().Debug(fmt.Errorf("failed to release connection: %w", err)) } }() // Fetch default INFO. info, err := redis.FetchRedisInfo("keyspace", conn) if err != nil { - return errors.Wrap(err, "Failed to fetch redis info for keyspaces") + return fmt.Errorf("Failed to fetch redis info for keyspaces: %w", err) } m.Logger().Debugf("Redis INFO from %s: %+v", m.Host(), info) diff --git a/metricbeat/module/system/core/config.go b/metricbeat/module/system/core/config.go index 09b1b25f7ed..8ac1d2f9575 100644 --- a/metricbeat/module/system/core/config.go +++ b/metricbeat/module/system/core/config.go @@ -18,10 +18,10 @@ package core import ( + "errors" + "fmt" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" metrics "github.com/elastic/elastic-agent-system-metrics/metric/cpu" ) @@ -56,7 +56,7 @@ func (c Config) Validate() (metrics.MetricOpts, error) { case ticks: opts.Ticks = true default: - return opts, errors.Errorf("invalid core.metrics value '%v' (valid "+ + return opts, fmt.Errorf("invalid core.metrics value '%v' (valid "+ "options are %v and %v)", metric, percentages, ticks) } } diff --git a/metricbeat/module/system/cpu/config.go b/metricbeat/module/system/cpu/config.go index 9533bf7b296..ef9d78fe0ce 100644 --- a/metricbeat/module/system/cpu/config.go +++ b/metricbeat/module/system/cpu/config.go @@ -18,10 +18,10 @@ package cpu import ( + "errors" + "fmt" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" metrics "github.com/elastic/elastic-agent-system-metrics/metric/cpu" ) @@ -59,7 +59,7 @@ func (c Config) Validate() (metrics.MetricOpts, error) { case ticks: opts.Ticks = true default: - return opts, errors.Errorf("invalid cpu.metrics value '%v' (valid "+ + return opts, fmt.Errorf("invalid cpu.metrics value '%v' (valid "+ "options are %v, %v, and %v)", metric, percentages, normalizedPercentages, ticks) } diff --git a/metricbeat/module/system/entropy/entropy.go b/metricbeat/module/system/entropy/entropy.go index 5bc83210eab..a9ea007af69 100644 --- a/metricbeat/module/system/entropy/entropy.go +++ b/metricbeat/module/system/entropy/entropy.go @@ -20,12 +20,11 @@ package entropy import ( + "fmt" "io/ioutil" "strconv" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/mapstr" @@ -68,11 +67,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { entropy, err := getEntropyData(m.mod.ResolveHostFS("/proc/sys/kernel/random/entropy_avail")) if err != nil { - return errors.Wrap(err, "error getting entropy") + return fmt.Errorf("error getting entropy: %w", err) } poolsize, err := getEntropyData(m.mod.ResolveHostFS("/proc/sys/kernel/random/poolsize")) if err != nil { - return errors.Wrap(err, "error getting poolsize") + return fmt.Errorf("error getting poolsize: %w", err) } report.Event(mb.Event{ MetricSetFields: mapstr.M{ @@ -88,12 +87,12 @@ func getEntropyData(path string) (int, error) { //This will be a number in the range 0 to 4096. raw, err := ioutil.ReadFile(path) if err != nil { - return 0, errors.Wrap(err, "error reading from random") + return 0, fmt.Errorf("error reading from random: %w", err) } intval, err := strconv.ParseInt(strings.TrimSpace(string(raw)), 10, 64) if err != nil { - return 0, errors.Wrap(err, "error parsing from random") + return 0, fmt.Errorf("error parsing from random: %w", err) } return int(intval), nil diff --git a/metricbeat/module/system/filesystem/_meta/docs.asciidoc b/metricbeat/module/system/filesystem/_meta/docs.asciidoc index 94e97806448..691f9943e31 100644 --- a/metricbeat/module/system/filesystem/_meta/docs.asciidoc +++ b/metricbeat/module/system/filesystem/_meta/docs.asciidoc @@ -17,7 +17,7 @@ not be collected from filesystems matching these types. This setting also affects the `fsstats` metricset. If this option is not set, metricbeat ignores all types for virtual devices in systems where this information is available (e.g. all types marked as `nodev` in `/proc/filesystems` in Linux systems). This can be set to an empty list (`[]`) -to make filebeat report all filesystems, regardless of type. +to make metricbeat report all filesystems, regardless of type. [float] === Filtering diff --git a/metricbeat/module/system/load/load.go b/metricbeat/module/system/load/load.go index c674a5dc819..a28571124f1 100644 --- a/metricbeat/module/system/load/load.go +++ b/metricbeat/module/system/load/load.go @@ -20,7 +20,7 @@ package load import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -52,7 +52,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { load, err := cpu.Load() if err != nil { - return errors.Wrap(err, "failed to get CPU load values") + return fmt.Errorf("failed to get CPU load values: %w", err) } avgs := load.Averages() diff --git a/metricbeat/module/system/network/network.go b/metricbeat/module/system/network/network.go index 1e153d082a5..97700ba66f5 100644 --- a/metricbeat/module/system/network/network.go +++ b/metricbeat/module/system/network/network.go @@ -20,6 +20,8 @@ package network import ( + "fmt" + "math" "strings" "github.com/elastic/beats/v7/metricbeat/mb" @@ -27,7 +29,6 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/pkg/errors" "github.com/shirou/gopsutil/v3/net" ) @@ -43,16 +44,17 @@ func init() { // MetricSet for fetching system network IO metrics. type MetricSet struct { mb.BaseMetricSet - interfaces map[string]struct{} - prevCounters networkCounter + interfaces map[string]struct{} + prevInterfaceCounter map[string]networkCounter + currentGaugeCounter map[string]networkCounter } // networkCounter stores previous network counter values for calculating gauges in next collection type networkCounter struct { - prevNetworkInBytes uint64 - prevNetworkInPackets uint64 - prevNetworkOutBytes uint64 - prevNetworkOutPackets uint64 + NetworkInBytes uint64 + NetworkInPackets uint64 + NetworkOutBytes uint64 + NetworkOutPackets uint64 } // New is a mb.MetricSetFactory that returns a new MetricSet. @@ -76,9 +78,10 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } return &MetricSet{ - BaseMetricSet: base, - interfaces: interfaceSet, - prevCounters: networkCounter{}, + BaseMetricSet: base, + interfaces: interfaceSet, + prevInterfaceCounter: map[string]networkCounter{}, + currentGaugeCounter: map[string]networkCounter{}, }, nil } @@ -86,11 +89,9 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { stats, err := net.IOCounters(true) if err != nil { - return errors.Wrap(err, "network io counters") + return fmt.Errorf("network io counters: %w", err) } - var networkInBytes, networkOutBytes, networkInPackets, networkOutPackets uint64 - for _, counters := range stats { if m.interfaces != nil { // Select stats by interface name. @@ -104,30 +105,60 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { MetricSetFields: ioCountersToMapStr(counters), }) - // accumulate values from all interfaces - networkInBytes += counters.BytesRecv - networkOutBytes += counters.BytesSent - networkInPackets += counters.PacketsRecv - networkOutPackets += counters.PacketsSent + // sum the values at a per-interface level + // Makes us less likely to overload a value somewhere. + prevCounters, ok := m.prevInterfaceCounter[counters.Name] + if !ok { + m.prevInterfaceCounter[counters.Name] = networkCounter{ + NetworkInBytes: counters.BytesRecv, + NetworkInPackets: counters.PacketsRecv, + NetworkOutBytes: counters.BytesSent, + NetworkOutPackets: counters.PacketsSent, + } + continue + } + // create current set of gauges + currentDiff := networkCounter{ + NetworkInBytes: createGaugeWithRollover(counters.BytesRecv, prevCounters.NetworkInBytes), + NetworkInPackets: createGaugeWithRollover(counters.PacketsRecv, prevCounters.NetworkInPackets), + NetworkOutBytes: createGaugeWithRollover(counters.BytesSent, prevCounters.NetworkOutBytes), + NetworkOutPackets: createGaugeWithRollover(counters.PacketsSent, prevCounters.NetworkOutPackets), + } + + m.currentGaugeCounter[counters.Name] = currentDiff + + m.prevInterfaceCounter[counters.Name] = networkCounter{ + NetworkInBytes: counters.BytesRecv, + NetworkInPackets: counters.PacketsRecv, + NetworkOutBytes: counters.BytesSent, + NetworkOutPackets: counters.PacketsSent, + } if !isOpen { return nil } } - if m.prevCounters != (networkCounter{}) { - // convert network metrics from counters to gauges + if len(m.currentGaugeCounter) != 0 { + + var totalNetworkInBytes, totalNetworkInPackets, totalNetworkOutBytes, totalNetworkOutPackets uint64 + for _, iface := range m.currentGaugeCounter { + totalNetworkInBytes += iface.NetworkInBytes + totalNetworkInPackets += iface.NetworkInPackets + totalNetworkOutBytes += iface.NetworkOutBytes + totalNetworkOutPackets += iface.NetworkOutPackets + } r.Event(mb.Event{ RootFields: mapstr.M{ "host": mapstr.M{ "network": mapstr.M{ "ingress": mapstr.M{ - "bytes": networkInBytes - m.prevCounters.prevNetworkInBytes, - "packets": networkInPackets - m.prevCounters.prevNetworkInPackets, + "bytes": totalNetworkInBytes, + "packets": totalNetworkInPackets, }, "egress": mapstr.M{ - "bytes": networkOutBytes - m.prevCounters.prevNetworkOutBytes, - "packets": networkOutPackets - m.prevCounters.prevNetworkOutPackets, + "bytes": totalNetworkOutBytes, + "packets": totalNetworkOutPackets, }, }, }, @@ -135,15 +166,43 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { }) } - // update prevCounters - m.prevCounters.prevNetworkInBytes = networkInBytes - m.prevCounters.prevNetworkInPackets = networkInPackets - m.prevCounters.prevNetworkOutBytes = networkOutBytes - m.prevCounters.prevNetworkOutPackets = networkOutPackets - return nil } +// Create a gauged difference between two numbers, taking into account rollover that might happen, and the current number might be lower. +// The /proc/net/dev interface is defined in net/core/net-procfs.c, +// where it prints the data from rtnl_link_stats64 defined in uapi/linux/if_link.h. +// There's an extra bit of logic here: the underlying network device object in the kernel, net_device, +// can define either ndo_get_stats64() or ndo_get_stats() as a metrics callback, with the latter returning an unsigned long (32 bit) set of metrics. +// See dev_get_stats() in net/core/dev.c for context. The exact implementation depends upon the network driver. +// For example, the tg3 network driver used by the broadcom network controller on my dev machine +// uses 64 bit metrics, defined in the drivers/net/ethernet/broadcom/tg3.h, +// with the ndo_get_stats64() callback defined in net/ethernet/broadcom/tg3.c. +// Long story short, we can't be completely sure if we're rolling over at max_u32 or max_u64. +// if the previous value was > max_u32, do math assuming we've rolled over at max_u64. +// On windows: This uses GetIfEntry: https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_if_row2 which uses ulong64. +// On Darwin we just call netstat. +// I'm assuming rollover behavior is similar. +func createGaugeWithRollover(current uint64, prev uint64) uint64 { + // base case: no rollover + if current >= prev { + return current - prev + } + + // case: rollover + // case: we rolled over at 64 bits + if prev > math.MaxUint32 { + debugf("Warning: Rollover 64 bit gauge detected. Current value: %d, previous: %d", current, prev) + remaining := math.MaxUint64 - prev + return current + remaining + 1 // the +1 counts the actual "rollover" increment. + } + // case: we rolled over at 32 bits + debugf("Warning: Rollover 32 bit gauge detected. Current value: %d, previous: %d", current, prev) + remaining := math.MaxUint32 - prev + return current + remaining + 1 + +} + func ioCountersToMapStr(counters net.IOCountersStat) mapstr.M { return mapstr.M{ "name": counters.Name, diff --git a/metricbeat/module/system/network/network_test.go b/metricbeat/module/system/network/network_test.go index 9337ff36d0c..a986d989e2e 100644 --- a/metricbeat/module/system/network/network_test.go +++ b/metricbeat/module/system/network/network_test.go @@ -20,10 +20,16 @@ package network import ( + "math" + "os" + "path/filepath" + "runtime" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/elastic/beats/v7/metricbeat/mb" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" _ "github.com/elastic/beats/v7/metricbeat/module/system" ) @@ -40,6 +46,162 @@ func TestFetch(t *testing.T) { events[0].BeatEvent("system", "network").Fields.StringToPrint()) } +func TestNormalHostMetrics(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("test requires linux") + } + basePath, err := os.Getwd() + require.NoError(t, err) + + reporter := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + + firstProc := filepath.Join(basePath, "/tests/testdata/proc/") + err = os.Setenv("HOST_PROC", firstProc) + require.NoError(t, err) + + // get initial metrics + _, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + + // second event + secondProc := filepath.Join(basePath, "/tests/testdata2/proc/") + err = os.Setenv("HOST_PROC", secondProc) + require.NoError(t, err) + + events, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + found, evt := findRootEvent(events) + require.True(t, found) + + t.Logf("second event: %+v", evt.RootFields.StringToPrint()) + + // check second values + ingressBytes, err := evt.RootFields.GetValue("host.network.ingress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(110), ingressBytes) + + ingressPackets, err := evt.RootFields.GetValue("host.network.ingress.packets") + require.NoError(t, err) + require.Equal(t, uint64(200000), ingressPackets) + + egressPackets, err := evt.RootFields.GetValue("host.network.egress.packets") + require.NoError(t, err) + require.Equal(t, uint64(200001), egressPackets) + + egressBytes, err := evt.RootFields.GetValue("host.network.egress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(30100), egressBytes) +} + +func TestRollover(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("test requires linux") + } + basePath, err := os.Getwd() + require.NoError(t, err) + + reporter := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + + firstProc := filepath.Join(basePath, "/tests/rollover/proc/") + err = os.Setenv("HOST_PROC", firstProc) + require.NoError(t, err) + + _, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + + secondProc := filepath.Join(basePath, "/tests/rollover2/proc/") + err = os.Setenv("HOST_PROC", secondProc) + require.NoError(t, err) + + events, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + found, evt := findRootEvent(events) + require.True(t, found) + + t.Logf("second event: %+v", evt.RootFields.StringToPrint()) + + ingressBytes, err := evt.RootFields.GetValue("host.network.ingress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(601), ingressBytes) + + egressBytes, err := evt.RootFields.GetValue("host.network.egress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(902), egressBytes) +} + +func TestRollover32(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("test requires linux") + } + basePath, err := os.Getwd() + require.NoError(t, err) + + reporter := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + + firstProc := filepath.Join(basePath, "/tests/rollover32/proc/") + err = os.Setenv("HOST_PROC", firstProc) + require.NoError(t, err) + + _, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + + secondProc := filepath.Join(basePath, "/tests/rollover32_2/proc/") + err = os.Setenv("HOST_PROC", secondProc) + require.NoError(t, err) + + events, errs := mbtest.ReportingFetchV2Error(reporter) + require.Empty(t, errs) + found, evt := findRootEvent(events) + require.True(t, found) + + t.Logf("second event: %+v", evt.RootFields.StringToPrint()) + + egressBytes, err := evt.RootFields.GetValue("host.network.egress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(3037888886), egressBytes) + + ingressBytes, err := evt.RootFields.GetValue("host.network.ingress.bytes") + require.NoError(t, err) + require.Equal(t, uint64(1101), ingressBytes) +} + +func TestGauge(t *testing.T) { + var prevu32 uint64 = math.MaxUint32 - 10 + var currentu32 uint64 = 10 + + resultu32 := createGaugeWithRollover(currentu32, prevu32) + require.Equal(t, uint64(21), resultu32) + + var prevNoRollover uint64 = 347458374592 + var currentNoRollover = prevNoRollover + 3452 + resultNoRollover := createGaugeWithRollover(currentNoRollover, prevNoRollover) + require.Equal(t, uint64(3452), resultNoRollover) + + var prevu64 uint64 = math.MaxUint64 - 5000 + var currentu64 uint64 = 32 + resultu64 := createGaugeWithRollover(currentu64, prevu64) + require.Equal(t, uint64(5033), resultu64) +} + +func TestGaugeRolloverIncrement(t *testing.T) { + // test to see if we're properly incrementing when we rollover + // i.e do we count the increment from MAX_INT to 0? + var prevU64 uint64 = math.MaxUint64 + current := uint64(0) + + resultu32 := createGaugeWithRollover(current, prevU64) + require.Equal(t, uint64(1), resultu32) +} + +func findRootEvent(events []mb.Event) (bool, mb.Event) { + for _, evt := range events { + if len(evt.RootFields) > 0 { + return true, evt + } + } + return false, mb.Event{} +} + func TestData(t *testing.T) { f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) err := mbtest.WriteEventsReporterV2Error(f, t, ".") diff --git a/metricbeat/module/system/network/tests/rollover/proc/net/dev b/metricbeat/module/system/network/tests/rollover/proc/net/dev new file mode 100644 index 00000000000..9615d2be029 --- /dev/null +++ b/metricbeat/module/system/network/tests/rollover/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060487 7078052 0 0 0 0 0 0 1755090578 7178052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 18446744073709550915 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 334556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 18446744073709551115 2681033 0 0 0 0 0 0 1257078810 2119145 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network/tests/rollover2/proc/net/dev b/metricbeat/module/system/network/tests/rollover2/proc/net/dev new file mode 100644 index 00000000000..096271c2c55 --- /dev/null +++ b/metricbeat/module/system/network/tests/rollover2/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060487 7078052 0 0 0 0 0 0 1755090579 7178052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 200 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 334556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 100 2681033 0 0 0 0 0 0 1257078810 2119145 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network/tests/rollover32/proc/net/dev b/metricbeat/module/system/network/tests/rollover32/proc/net/dev new file mode 100644 index 00000000000..9527149e7e6 --- /dev/null +++ b/metricbeat/module/system/network/tests/rollover32/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060487 7078052 0 0 0 0 0 0 1755090578 7178052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 18446744073709550915 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 334556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 4294966595 2681033 0 0 0 0 0 0 1257078810 2119145 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network/tests/rollover32_2/proc/net/dev b/metricbeat/module/system/network/tests/rollover32_2/proc/net/dev new file mode 100644 index 00000000000..2dd56e0f092 --- /dev/null +++ b/metricbeat/module/system/network/tests/rollover32_2/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060487 7078052 0 0 0 0 0 0 1755090578 7178052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 18446744073709550915 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 334556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 400 2681033 0 0 0 0 0 0 400 2119145 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network/tests/testdata/proc/net/dev b/metricbeat/module/system/network/tests/testdata/proc/net/dev new file mode 100644 index 00000000000..0134ed8b80f --- /dev/null +++ b/metricbeat/module/system/network/tests/testdata/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060477 7078052 0 0 0 0 0 0 1755060477 7078052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 23923097145 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 134556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 7610217646 2681033 0 0 0 0 0 0 1257078810 2019144 0 0 0 0 0 0 diff --git a/metricbeat/module/system/network/tests/testdata2/proc/net/dev b/metricbeat/module/system/network/tests/testdata2/proc/net/dev new file mode 100644 index 00000000000..069d2f08756 --- /dev/null +++ b/metricbeat/module/system/network/tests/testdata2/proc/net/dev @@ -0,0 +1,19 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1755060487 7078052 0 0 0 0 0 0 1755090577 7178052 0 0 0 0 0 0 + eno1: 19784529479 34542897 0 10 0 0 0 8323480 23923097145 22626696 0 0 0 0 0 0 + eno2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eno4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-b47241fe51cb: 5120 82 0 0 0 0 0 13 2740 26 0 0 0 0 0 0 +docker0: 12103120 25910 0 0 0 0 0 0 22016528 36782 0 0 0 0 0 0 +veth9b054b1: 0 0 0 0 0 0 0 0 39236 509 0 0 0 0 0 0 +vboxnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +vboxnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +br-35e03ac12f61: 89956121 334556 0 0 0 0 0 0 52243734 140194 0 0 0 0 0 0 +vethb4fe756: 936385 1467 0 0 0 0 0 0 434283 1377 0 0 0 0 0 0 +vethdb936ec: 6617151565 13069604 0 0 0 0 0 0 21159216788 17045495 0 0 0 0 0 0 +vethad845c5: 11372445599 12688613 0 0 0 0 0 0 3863963160 9807427 0 0 0 0 0 0 +veth1bb2863: 2309909319 2277661 0 0 0 0 0 0 1590377742 1850698 0 0 0 0 0 0 +vethf0ccf73: 7610217746 2681033 0 0 0 0 0 0 1257078810 2119145 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network/tests/testdata3/proc/net/dev b/metricbeat/module/system/network/tests/testdata3/proc/net/dev new file mode 100644 index 00000000000..2fd838117be --- /dev/null +++ b/metricbeat/module/system/network/tests/testdata3/proc/net/dev @@ -0,0 +1,31 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 7963008922 5463536 0 0 0 0 0 0 7963008922 5463536 0 0 0 0 0 0 + eth0: 398444176031 113433103 0 0 0 0 0 0 101889838567 106565184 0 0 0 0 0 0 +docker0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +veth6670df22: 514618373 1547898 0 0 0 0 0 0 528358917 1539922 0 0 0 0 0 0 +veth46fce54b: 1372847132 13810810 0 0 0 0 0 0 68795908814 15049988 0 0 0 0 0 0 +veth80b394bf: 381102744 4399867 0 0 0 0 0 0 3323567373 4212968 0 0 0 0 0 0 +veth3fac0d3a: 1069716043 3369370 0 0 0 0 0 0 11282617637 3689656 0 0 0 0 0 0 +veth3b200419: 308 4 0 0 0 0 0 0 446 5 0 0 0 0 0 0 +veth44b2ac6c: 36323 457 0 0 0 0 0 0 2815590 505 0 0 0 0 0 0 +vethc4bb14c8: 35702 429 0 0 0 0 0 0 2827840 464 0 0 0 0 0 0 +veth93f91757: 18808 200 0 0 0 0 0 0 2646887 251 0 0 0 0 0 0 +vetha7cff99a: 20128 195 0 0 0 0 0 0 2641971 249 0 0 0 0 0 0 +veth2c664383: 21595 231 0 0 0 0 0 0 2703706 262 0 0 0 0 0 0 +veth1305edb0: 16621 195 0 0 0 0 0 0 2627343 226 0 0 0 0 0 0 +veth23fc0f56: 628 8 0 0 0 0 0 0 446 5 0 0 0 0 0 0 +veth65891994: 308 4 0 0 0 0 0 0 446 5 0 0 0 0 0 0 +vethdc791306: 389968462 723281 0 0 0 0 0 0 350535082 731321 0 0 0 0 0 0 +vethdbb1e8cc: 966415949 3412980 0 0 0 0 0 0 3786100854 3417295 0 0 0 0 0 0 +veth08cafe8e: 1488277219 959331 0 0 0 0 0 0 151128472 610027 0 0 0 0 0 0 +vethc48fd2d7: 7901294175 2354094 0 0 0 0 0 0 2915337605 2345844 0 0 0 0 0 0 +veth2bf4c62f: 547312101 1007781 0 0 0 0 0 0 150262077 1166200 0 0 0 0 0 0 +veth93d9e375: 5800146319 4086288 0 0 0 0 0 0 2372657603 3670868 0 0 0 0 0 0 +veth0228c277: 4522851970 1217721 0 0 0 0 0 0 92417022 876822 0 0 0 0 0 0 +veth2f280795: 3026042574 2295286 0 0 0 0 0 0 14061850234 2758346 0 0 0 0 0 0 +vetha9cf24aa: 6695686090 2813131 0 0 0 0 0 0 2402989575 2645630 0 0 0 0 0 0 +veth613a14c9: 3158414047 2131687 0 0 0 0 0 0 1973949394 1925351 0 0 0 0 0 0 +vethe584bff8: 3499555388 2158277 0 0 0 0 0 0 854125987 2034534 0 0 0 0 0 0 +veth9d517f8c: 7897675838 9099992 0 0 0 0 0 0 3335685281 7343157 0 0 0 0 0 0 +veth8e6b8c88: 7869425980 2383121 0 0 0 0 0 0 2933011516 2376166 0 0 0 0 0 0 \ No newline at end of file diff --git a/metricbeat/module/system/network_summary/network_summary.go b/metricbeat/module/system/network_summary/network_summary.go index 92a48d23b61..757ed56b267 100644 --- a/metricbeat/module/system/network_summary/network_summary.go +++ b/metricbeat/module/system/network_summary/network_summary.go @@ -18,7 +18,8 @@ package network_summary import ( - "github.com/pkg/errors" + "errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -64,7 +65,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { counterInfo, err := fetchNetStats() if err != nil { - return errors.Wrap(err, "Error fetching stats") + return fmt.Errorf("Error fetching stats: %w", err) } if counterInfo == nil { return errors.New("NetworkCounters not available on this platform") @@ -81,13 +82,13 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { func fetchNetStats() (*sysinfotypes.NetworkCountersInfo, error) { h, err := sysinfo.Host() if err != nil { - return nil, errors.Wrap(err, "failed to read self process information") + return nil, fmt.Errorf("failed to read self process information: %w", err) } if vmstatHandle, ok := h.(sysinfotypes.NetworkCounters); ok { info, err := vmstatHandle.NetworkCounters() if err != nil { - return nil, errors.Wrap(err, "error getting network counters") + return nil, fmt.Errorf("error getting network counters: %w", err) } return info, nil } diff --git a/metricbeat/module/system/process/process.go b/metricbeat/module/system/process/process.go index 6256f90f742..2274f1846d6 100644 --- a/metricbeat/module/system/process/process.go +++ b/metricbeat/module/system/process/process.go @@ -20,11 +20,10 @@ package process import ( + "fmt" "os" "runtime" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" "github.com/elastic/elastic-agent-libs/logp" @@ -104,7 +103,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { procs, roots, err := m.stats.Get() if err != nil { - return errors.Wrap(err, "process stats") + return fmt.Errorf("process stats: %w", err) } for evtI := range procs { diff --git a/metricbeat/module/system/raid/blockinfo/getdev.go b/metricbeat/module/system/raid/blockinfo/getdev.go index bb2bae080ee..02527c80636 100644 --- a/metricbeat/module/system/raid/blockinfo/getdev.go +++ b/metricbeat/module/system/raid/blockinfo/getdev.go @@ -22,15 +22,13 @@ import ( "io/ioutil" "os" "path/filepath" - - "github.com/pkg/errors" ) // ListAll lists all the multi-disk devices in a RAID array func ListAll(path string) ([]MDDevice, error) { dir, err := ioutil.ReadDir(path) if err != nil { - return nil, errors.Wrap(err, "could not read directory") + return nil, fmt.Errorf("could not read directory: %w", err) } var mds []MDDevice for _, item := range dir { @@ -40,7 +38,7 @@ func ListAll(path string) ([]MDDevice, error) { } dev, err := getMDDevice(testpath) if err != nil { - return nil, errors.Wrap(err, "could not get device info") + return nil, fmt.Errorf("could not get device info: %w", err) } mds = append(mds, dev) } @@ -56,7 +54,7 @@ func ListAll(path string) ([]MDDevice, error) { func getMDDevice(path string) (MDDevice, error) { _, err := os.Stat(path) if err != nil { - return MDDevice{}, errors.Wrap(err, "path does not exist") + return MDDevice{}, fmt.Errorf("path does not exist: %w", err) } //This is the best heuristic I've found so far for identifying an md device. diff --git a/metricbeat/module/system/raid/blockinfo/parser.go b/metricbeat/module/system/raid/blockinfo/parser.go index 7c517b6f534..3763ed28ab6 100644 --- a/metricbeat/module/system/raid/blockinfo/parser.go +++ b/metricbeat/module/system/raid/blockinfo/parser.go @@ -24,8 +24,6 @@ import ( "strconv" "strings" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" ) @@ -65,7 +63,7 @@ func parseIntVal(path string) (int64, error) { func getSyncStatus(path string, size int64) (SyncStatus, error) { raw, err := ioutil.ReadFile(filepath.Join(path, "md", "sync_completed")) if err != nil { - return SyncStatus{}, errors.Wrap(err, "could not open sync_completed") + return SyncStatus{}, fmt.Errorf("could not open sync_completed: %w", err) } completedState := strings.TrimSpace(string(raw)) if completedState == "none" { @@ -80,12 +78,12 @@ func getSyncStatus(path string, size int64) (SyncStatus, error) { current, err := strconv.ParseInt(matches[0], 10, 64) if err != nil { - return SyncStatus{}, errors.Wrap(err, "could not parse data sync_completed") + return SyncStatus{}, fmt.Errorf("could not parse data sync_completed: %w", err) } total, err := strconv.ParseInt(matches[1], 10, 64) if err != nil { - return SyncStatus{}, errors.Wrap(err, "could not parse data sync_completed") + return SyncStatus{}, fmt.Errorf("could not parse data sync_completed: %w", err) } return SyncStatus{Complete: current, Total: total}, nil @@ -99,27 +97,27 @@ func newMD(path string) (MDDevice, error) { dev.Name = filepath.Base(path) size, err := parseIntVal(filepath.Join(path, "size")) if err != nil { - return dev, errors.Wrap(err, "could not get device size") + return dev, fmt.Errorf("could not get device size: %w", err) } dev.Size = size //RAID array state state, err := ioutil.ReadFile(filepath.Join(path, "md", "array_state")) if err != nil { - return dev, errors.Wrap(err, "could not open array_state") + return dev, fmt.Errorf("could not open array_state: %w", err) } dev.ArrayState = strings.TrimSpace(string(state)) //get total disks disks, err := getDisks(path) if err != nil { - return dev, errors.Wrap(err, "could not get disk data") + return dev, fmt.Errorf("could not get disk data: %w", err) } dev.DiskStates = disks level, err := ioutil.ReadFile(filepath.Join(path, "md", "level")) if err != nil { - return dev, errors.Wrap(err, "could not get raid level") + return dev, fmt.Errorf("could not get raid level: %w", err) } dev.Level = strings.TrimSpace(string(level)) @@ -130,14 +128,14 @@ func newMD(path string) (MDDevice, error) { //Will be idle if nothing is going on syncAction, err := ioutil.ReadFile(filepath.Join(path, "md", "sync_action")) if err != nil { - return dev, errors.Wrap(err, "could not open sync_action") + return dev, fmt.Errorf("could not open sync_action: %w", err) } dev.SyncAction = strings.TrimSpace(string(syncAction)) //sync status syncStats, err := getSyncStatus(path, dev.Size) if err != nil { - return dev, errors.Wrap(err, "error getting sync data") + return dev, fmt.Errorf("error getting sync data: %w", err) } dev.SyncStatus = syncStats @@ -151,7 +149,7 @@ func getDisks(path string) (DiskStates, error) { //so far, haven't found a less hacky way to do this. devices, err := filepath.Glob(filepath.Join(path, "md", "dev-*")) if err != nil { - return DiskStates{}, errors.Wrap(err, "could not get device list") + return DiskStates{}, fmt.Errorf("could not get device list: %w", err) } var disks DiskStates @@ -191,7 +189,7 @@ func getDisks(path string) (DiskStates, error) { func getDisk(path string) (string, error) { state, err := ioutil.ReadFile(filepath.Join(path, "state")) if err != nil { - return "", errors.Wrap(err, "error getting disk state") + return "", fmt.Errorf("error getting disk state: %w", err) } return strings.TrimSpace(string(state)), nil diff --git a/metricbeat/module/system/raid/raid.go b/metricbeat/module/system/raid/raid.go index 238b067fd6f..191027657d7 100644 --- a/metricbeat/module/system/raid/raid.go +++ b/metricbeat/module/system/raid/raid.go @@ -18,7 +18,7 @@ package raid import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -62,7 +62,7 @@ func blockto1024(b int64) int64 { func (m *MetricSet) Fetch(r mb.ReporterV2) error { devices, err := blockinfo.ListAll(m.mod.ResolveHostFS("/sys/block")) if err != nil { - return errors.Wrap(err, "failed to parse sysfs") + return fmt.Errorf("failed to parse sysfs: %w", err) } for _, blockDev := range devices { diff --git a/metricbeat/module/system/service/data.go b/metricbeat/module/system/service/data.go index 1597beb6052..cb2329a7307 100644 --- a/metricbeat/module/system/service/data.go +++ b/metricbeat/module/system/service/data.go @@ -20,10 +20,10 @@ package service import ( + "fmt" "time" "github.com/coreos/go-systemd/v22/dbus" - "github.com/pkg/errors" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/mapstr" @@ -63,7 +63,7 @@ type Properties struct { func formProperties(unit dbus.UnitStatus, props Properties) (mb.Event, error) { timeSince, err := timeSince(props, unit.ActiveState) if err != nil { - return mb.Event{}, errors.Wrap(err, "error getting timestamp") + return mb.Event{}, fmt.Errorf("error getting timestamp: %w", err) } event := mb.Event{ diff --git a/metricbeat/module/system/service/service.go b/metricbeat/module/system/service/service.go index 6a19c8b828c..f46e8c0287a 100644 --- a/metricbeat/module/system/service/service.go +++ b/metricbeat/module/system/service/service.go @@ -20,11 +20,11 @@ package service import ( + "fmt" "path/filepath" "github.com/coreos/go-systemd/v22/dbus" "github.com/mitchellh/mapstructure" - "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/mb" @@ -67,12 +67,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { conn, err := dbus.New() if err != nil { - return nil, errors.Wrap(err, "error connecting to dbus") + return nil, fmt.Errorf("error connecting to dbus: %w", err) } unitFunction, err := instrospectForUnitMethods() if err != nil { - return nil, errors.Wrap(err, "error finding ListUnits Method") + return nil, fmt.Errorf("error finding ListUnits Method: %w", err) } return &MetricSet{ @@ -90,7 +90,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { units, err := m.unitList(m.conn, m.cfg.StateFilter, m.cfg.PatternFilter) if err != nil { - return errors.Wrap(err, "error getting list of running units") + return fmt.Errorf("error getting list of running units: %w", err) } for _, unit := range units { @@ -134,11 +134,11 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { func getProps(conn *dbus.Conn, unit string) (Properties, error) { rawProps, err := conn.GetAllProperties(unit) if err != nil { - return Properties{}, errors.Wrap(err, "error getting list of running units") + return Properties{}, fmt.Errorf("error getting list of running units: %w", err) } parsed := Properties{} if err := mapstructure.Decode(rawProps, &parsed); err != nil { - return parsed, errors.Wrap(err, "error decoding properties") + return parsed, fmt.Errorf("error decoding properties: %w", err) } return parsed, nil } diff --git a/metricbeat/module/system/socket/socket.go b/metricbeat/module/system/socket/socket.go index 1d6b1dc65f1..a0828d69b4f 100644 --- a/metricbeat/module/system/socket/socket.go +++ b/metricbeat/module/system/socket/socket.go @@ -27,8 +27,6 @@ import ( "strconv" "syscall" - "github.com/pkg/errors" - sock "github.com/elastic/beats/v7/metricbeat/helper/socket" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -119,7 +117,7 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { sockets, err := m.netlink.GetSocketList() if err != nil { - return errors.Wrap(err, "failed requesting socket dump") + return fmt.Errorf("failed requesting socket dump: %w", err) } debugf("netlink returned %d sockets", len(sockets)) diff --git a/metricbeat/module/system/socket/socket_test.go b/metricbeat/module/system/socket/socket_test.go index 63b8712550b..3d27844f022 100644 --- a/metricbeat/module/system/socket/socket_test.go +++ b/metricbeat/module/system/socket/socket_test.go @@ -27,7 +27,6 @@ import ( "strings" "testing" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -153,7 +152,7 @@ func TestFetch(t *testing.T) { func getRequiredValue(t testing.TB, key string, m mapstr.M) interface{} { v, err := m.GetValue(key) if err != nil { - t.Fatal(errors.Wrapf(err, "failed to get value for key '%s'", key)) + t.Fatal(fmt.Errorf("failed to get value for key '%s': %w", key, err)) } if v == nil { t.Fatalf("key %v not found in %v", key, m) diff --git a/metricbeat/module/system/socket_summary/socket_summary.go b/metricbeat/module/system/socket_summary/socket_summary.go index 57d4312fad9..5301887413a 100644 --- a/metricbeat/module/system/socket_summary/socket_summary.go +++ b/metricbeat/module/system/socket_summary/socket_summary.go @@ -18,9 +18,9 @@ package socket_summary import ( + "fmt" "syscall" - "github.com/pkg/errors" "github.com/shirou/gopsutil/v3/net" "github.com/elastic/beats/v7/metricbeat/mb" @@ -155,7 +155,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { conns, err := connections("inet") if err != nil { - return errors.Wrap(err, "error getting connections") + return fmt.Errorf("error getting connections: %w", err) } stats := calculateConnStats(conns) diff --git a/metricbeat/module/system/socket_summary/sockstat_linux.go b/metricbeat/module/system/socket_summary/sockstat_linux.go index b198f322ff3..965cea3bd14 100644 --- a/metricbeat/module/system/socket_summary/sockstat_linux.go +++ b/metricbeat/module/system/socket_summary/sockstat_linux.go @@ -24,7 +24,6 @@ import ( "fmt" "os" - "github.com/pkg/errors" "github.com/shirou/gopsutil/v3/net" "github.com/elastic/elastic-agent-libs/mapstr" @@ -66,7 +65,7 @@ func applyEnhancements(data mapstr.M, sys resolve.Resolver) (mapstr.M, error) { stat, err := parseSockstat(dir) if err != nil { - return nil, errors.Wrap(err, "error getting sockstat data") + return nil, fmt.Errorf("error getting sockstat data: %w", err) } data.Put("tcp.all.orphan", stat.TCPOrphan) data.Put("tcp.memory", pageSize*stat.TCPMem) @@ -113,7 +112,7 @@ func parseSockstat(path string) (SockStat, error) { txt := scanner.Text() count, err := fmt.Sscanf(txt, scanfLines[iter], scanfOut[iter]...) if err != nil { - return ss, errors.Wrap(err, "error reading sockstat") + return ss, fmt.Errorf("error reading sockstat: %w", err) } if count != len(scanfOut[iter]) { return ss, fmt.Errorf("did not match fields in line %s", scanfLines[iter]) @@ -123,7 +122,7 @@ func parseSockstat(path string) (SockStat, error) { } if err = scanner.Err(); err != nil { - return ss, errors.Wrap(err, "error in scan") + return ss, fmt.Errorf("error in scan: %w", err) } return ss, nil diff --git a/metricbeat/module/system/uptime/uptime.go b/metricbeat/module/system/uptime/uptime.go index fa5640b92c0..20a03bdc13c 100644 --- a/metricbeat/module/system/uptime/uptime.go +++ b/metricbeat/module/system/uptime/uptime.go @@ -20,7 +20,7 @@ package uptime import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -49,7 +49,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { var uptime sigar.Uptime if err := uptime.Get(); err != nil { - return errors.Wrap(err, "failed to get uptime") + return fmt.Errorf("failed to get uptime: %w", err) } r.Event(mb.Event{ diff --git a/metricbeat/module/traefik/health/health.go b/metricbeat/module/traefik/health/health.go index ec528d83a98..26861d7b32a 100644 --- a/metricbeat/module/traefik/health/health.go +++ b/metricbeat/module/traefik/health/health.go @@ -18,7 +18,7 @@ package health import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -66,7 +66,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { data, err := m.http.FetchJSON() if err != nil { - return errors.Wrap(err, "failed to sample health") + return fmt.Errorf("failed to sample health: %w", err) } metricSetFields, _ := eventMapping(data) diff --git a/metricbeat/module/uwsgi/status/data.go b/metricbeat/module/uwsgi/status/data.go index 6c690db50f9..23dd353290e 100644 --- a/metricbeat/module/uwsgi/status/data.go +++ b/metricbeat/module/uwsgi/status/data.go @@ -19,8 +19,7 @@ package status import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/mapstr" @@ -81,7 +80,7 @@ func eventsMapping(content []byte, reporter mb.ReporterV2) error { var stats uwsgiStat err := json.Unmarshal(content, &stats) if err != nil { - return errors.Wrap(err, "uwsgi statistics parsing failed") + return fmt.Errorf("uwsgi statistics parsing failed: %w", err) } totalRequests := 0 diff --git a/metricbeat/module/uwsgi/status/status.go b/metricbeat/module/uwsgi/status/status.go index e343ada60c6..8ade1df3a8d 100644 --- a/metricbeat/module/uwsgi/status/status.go +++ b/metricbeat/module/uwsgi/status/status.go @@ -18,6 +18,7 @@ package status import ( + "errors" "fmt" "io" "io/ioutil" @@ -26,8 +27,6 @@ import ( "net/url" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/uwsgi" "github.com/elastic/elastic-agent-libs/mapstr" @@ -55,8 +54,7 @@ func fetchStatData(URL string) ([]byte, error) { u, err := url.Parse(URL) if err != nil { - - return nil, errors.Wrap(err, "parsing uwsgi stats url failed") + return nil, fmt.Errorf("parsing uwsgi stats url failed: %w", err) } switch u.Scheme { @@ -93,7 +91,7 @@ func fetchStatData(URL string) ([]byte, error) { data, err := ioutil.ReadAll(reader) if err != nil { - return nil, errors.Wrap(err, "uwsgi data read failed") + return nil, fmt.Errorf("uwsgi data read failed: %w", err) } return data, nil diff --git a/metricbeat/module/vsphere/_meta/Dockerfile b/metricbeat/module/vsphere/_meta/Dockerfile index c2a157cab08..f54e001b936 100644 --- a/metricbeat/module/vsphere/_meta/Dockerfile +++ b/metricbeat/module/vsphere/_meta/Dockerfile @@ -1,5 +1,5 @@ ARG VSPHERE_GOLANG_VERSION -FROM golang:${VSPHERE_GOLANG_VERSION} +FROM golang:1.20.7 RUN apt-get install curl git RUN go install github.com/vmware/govmomi/vcsim@v0.30.4 diff --git a/metricbeat/module/vsphere/datastore/datastore.go b/metricbeat/module/vsphere/datastore/datastore.go index 0afba2c7ca8..4ec84b4b74e 100644 --- a/metricbeat/module/vsphere/datastore/datastore.go +++ b/metricbeat/module/vsphere/datastore/datastore.go @@ -19,8 +19,7 @@ package datastore import ( "context" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/vsphere" @@ -61,12 +60,12 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { client, err := govmomi.NewClient(ctx, m.HostURL, m.Insecure) if err != nil { - return errors.Wrap(err, "error in NewClient") + return fmt.Errorf("error in NewClient: %w", err) } defer func() { if err := client.Logout(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to logout from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to logout from vshphere: %w", err)) } }() @@ -77,19 +76,19 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { v, err := mgr.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"Datastore"}, true) if err != nil { - return errors.Wrap(err, "error in CreateContainerView") + return fmt.Errorf("error in CreateContainerView: %w", err) } defer func() { if err := v.Destroy(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to destroy view from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to destroy view from vshphere: %w", err)) } }() // Retrieve summary property for all datastores var dst []mo.Datastore if err = v.Retrieve(ctx, []string{"Datastore"}, []string{"summary"}, &dst); err != nil { - return errors.Wrap(err, "error in Retrieve") + return fmt.Errorf("error in Retrieve: %w", err) } for _, ds := range dst { diff --git a/metricbeat/module/vsphere/host/host.go b/metricbeat/module/vsphere/host/host.go index b299d6b83b0..457d4a65452 100644 --- a/metricbeat/module/vsphere/host/host.go +++ b/metricbeat/module/vsphere/host/host.go @@ -19,11 +19,10 @@ package host import ( "context" + "errors" "fmt" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/vsphere" "github.com/elastic/elastic-agent-libs/mapstr" @@ -66,12 +65,12 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { client, err := govmomi.NewClient(ctx, m.HostURL, m.Insecure) if err != nil { - return errors.Wrap(err, "error in NewClient") + return fmt.Errorf("error in NewClient: %w", err) } defer func() { if err := client.Logout(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to logout from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to logout from vshphere: %w", err)) } }() @@ -82,12 +81,12 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { v, err := mgr.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"HostSystem"}, true) if err != nil { - return errors.Wrap(err, "error in CreateContainerView") + return fmt.Errorf("error in CreateContainerView: %w", err) } defer func() { if err := v.Destroy(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to destroy view from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to destroy view from vshphere: %w", err)) } }() @@ -95,7 +94,7 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { var hst []mo.HostSystem err = v.Retrieve(ctx, []string{"HostSystem"}, []string{"summary"}, &hst) if err != nil { - return errors.Wrap(err, "error in Retrieve") + return fmt.Errorf("error in Retrieve: %w", err) } for _, hs := range hst { diff --git a/metricbeat/module/vsphere/virtualmachine/virtualmachine.go b/metricbeat/module/vsphere/virtualmachine/virtualmachine.go index 546a40fdbfb..fd1a20ee3a7 100644 --- a/metricbeat/module/vsphere/virtualmachine/virtualmachine.go +++ b/metricbeat/module/vsphere/virtualmachine/virtualmachine.go @@ -19,6 +19,7 @@ package virtualmachine import ( "context" + "errors" "fmt" "strings" @@ -26,7 +27,6 @@ import ( "github.com/elastic/beats/v7/metricbeat/module/vsphere" "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/pkg/errors" "github.com/vmware/govmomi" "github.com/vmware/govmomi/object" "github.com/vmware/govmomi/property" @@ -80,12 +80,12 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { client, err := govmomi.NewClient(ctx, m.HostURL, m.Insecure) if err != nil { - return errors.Wrap(err, "error in NewClient") + return fmt.Errorf("error in NewClient: %w", err) } defer func() { if err := client.Logout(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to logout from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to logout from vshphere: %w", err)) } }() @@ -97,7 +97,7 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { var err error customFieldsMap, err = setCustomFieldsMap(ctx, c) if err != nil { - return errors.Wrap(err, "error in setCustomFieldsMap") + return fmt.Errorf("error in setCustomFieldsMap: %w", err) } } @@ -106,12 +106,12 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { v, err := mgr.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"VirtualMachine"}, true) if err != nil { - return errors.Wrap(err, "error in CreateContainerView") + return fmt.Errorf("error in CreateContainerView: %w", err) } defer func() { if err := v.Destroy(ctx); err != nil { - m.Logger().Debug(errors.Wrap(err, "error trying to destroy view from vshphere")) + m.Logger().Debug(fmt.Errorf("error trying to destroy view from vshphere: %w", err)) } }() @@ -119,7 +119,7 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { var vmt []mo.VirtualMachine err = v.Retrieve(ctx, []string{"VirtualMachine"}, []string{"summary"}, &vmt) if err != nil { - return errors.Wrap(err, "error in Retrieve") + return fmt.Errorf("error in Retrieve: %w", err) } for _, vm := range vmt { @@ -278,11 +278,11 @@ func setCustomFieldsMap(ctx context.Context, client *vim25.Client) (map[int32]st customFieldsManager, err := object.GetCustomFieldsManager(client) if err != nil { - return nil, errors.Wrap(err, "failed to get custom fields manager") + return nil, fmt.Errorf("failed to get custom fields manager: %w", err) } field, err := customFieldsManager.Field(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get custom fields") + return nil, fmt.Errorf("failed to get custom fields: %w", err) } for _, def := range field { diff --git a/metricbeat/module/windows/perfmon/config.go b/metricbeat/module/windows/perfmon/config.go index 3544b88683f..f16c9c3b324 100644 --- a/metricbeat/module/windows/perfmon/config.go +++ b/metricbeat/module/windows/perfmon/config.go @@ -20,9 +20,9 @@ package perfmon import ( + "errors" + "fmt" "time" - - "github.com/pkg/errors" ) var allowedFormats = []string{"float", "large", "long"} @@ -63,7 +63,7 @@ func (counter *QueryCounter) InitDefaults() { func (counter *QueryCounter) Validate() error { if !isValidFormat(counter.Format) { - return errors.Errorf("initialization failed: format '%s' "+ + return fmt.Errorf("initialization failed: format '%s' "+ "for counter '%s' is invalid (must be float, large or long)", counter.Format, counter.Name) } diff --git a/metricbeat/module/windows/perfmon/data.go b/metricbeat/module/windows/perfmon/data.go index 2565ab11604..9add5c03896 100644 --- a/metricbeat/module/windows/perfmon/data.go +++ b/metricbeat/module/windows/perfmon/data.go @@ -25,8 +25,6 @@ import ( "strconv" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/helper/windows/pdh" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/logp" @@ -71,7 +69,7 @@ func (re *Reader) groupToEvents(counters map[string][]pdh.CounterValue) []mb.Eve if _, ok := eventMap[eventKey]; !ok { eventMap[eventKey] = &mb.Event{ MetricSetFields: mapstr.M{}, - Error: errors.Wrapf(val.Err.Error, "failed on query=%v", counterPath), + Error: fmt.Errorf("failed on query=%v: %w", counterPath, val.Err.Error), } if val.Instance != "" { // will ignore instance index diff --git a/metricbeat/module/windows/perfmon/perfmon.go b/metricbeat/module/windows/perfmon/perfmon.go index 084d9a7cc91..19f231383f1 100644 --- a/metricbeat/module/windows/perfmon/perfmon.go +++ b/metricbeat/module/windows/perfmon/perfmon.go @@ -20,7 +20,7 @@ package perfmon import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -48,7 +48,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } reader, err := NewReader(config) if err != nil { - return nil, errors.Wrap(err, "initialization of reader failed") + return nil, fmt.Errorf("initialization of reader failed: %w", err) } return &MetricSet{ BaseMetricSet: base, @@ -69,12 +69,12 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { if m.reader.config.RefreshWildcardCounters { err := m.reader.RefreshCounterPaths() if err != nil { - return errors.Wrap(err, "failed retrieving counters") + return fmt.Errorf("failed retrieving counters: %w", err) } } events, err := m.reader.Read() if err != nil { - return errors.Wrap(err, "failed reading counters") + return fmt.Errorf("failed reading counters: %w", err) } for _, event := range events { @@ -91,7 +91,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { func (m *MetricSet) Close() error { err := m.reader.Close() if err != nil { - return errors.Wrap(err, "failed to close pdh query") + return fmt.Errorf("failed to close pdh query: %w", err) } return nil } diff --git a/metricbeat/module/windows/service/reader.go b/metricbeat/module/windows/service/reader.go index 11e5c901f17..379d4cb738f 100644 --- a/metricbeat/module/windows/service/reader.go +++ b/metricbeat/module/windows/service/reader.go @@ -22,10 +22,10 @@ package service import ( "crypto/sha256" "encoding/base64" + "fmt" "strconv" "syscall" - "github.com/pkg/errors" "golang.org/x/sys/windows/registry" "github.com/elastic/elastic-agent-libs/mapstr" @@ -53,7 +53,7 @@ type Reader struct { func NewReader() (*Reader, error) { handle, err := openSCManager("", "", ScManagerEnumerateService|ScManagerConnect) if err != nil { - return nil, errors.Wrap(err, "initialization failed") + return nil, fmt.Errorf("initialization failed: %w", err) } guid, err := getMachineGUID() @@ -151,12 +151,12 @@ func getMachineGUID() (string, error) { k, err := registry.OpenKey(key, path, registry.READ|registry.WOW64_64KEY) if err != nil { - return "", errors.Wrapf(err, `failed to open HKLM\%v`, path) + return "", fmt.Errorf(`failed to open HKLM\%v: %w`, path, err) } guid, _, err := k.GetStringValue(name) if err != nil { - return "", errors.Wrapf(err, `failed to get value of HKLM\%v\%v`, path, name) + return "", fmt.Errorf(`failed to get value of HKLM\%v\%v: %w`, path, name, err) } return guid, nil diff --git a/metricbeat/module/windows/service/service_status.go b/metricbeat/module/windows/service/service_status.go index f2a9ed853b1..571d324cb59 100644 --- a/metricbeat/module/windows/service/service_status.go +++ b/metricbeat/module/windows/service/service_status.go @@ -21,6 +21,7 @@ package service import ( "bytes" + "fmt" "os" "strconv" "syscall" @@ -30,7 +31,8 @@ import ( "github.com/elastic/beats/v7/libbeat/common" - "github.com/pkg/errors" + "errors" + "golang.org/x/sys/windows" "github.com/elastic/elastic-agent-libs/logp" @@ -146,7 +148,7 @@ func GetServiceStates(handle Handle, state ServiceEnumState, protectedServices m servicesBuffer = make([]byte, len(servicesBuffer)+int(bytesNeeded)) continue } - return nil, errors.Wrap(ServiceErrno(err.(syscall.Errno)), "error while calling the _EnumServicesStatusEx api") + return nil, fmt.Errorf("error while calling the _EnumServicesStatusEx api: %w", ServiceErrno(err.(syscall.Errno))) } break @@ -213,7 +215,7 @@ func getServiceInformation(rawService *EnumServiceStatusProcess, servicesBuffer serviceHandle, err := openServiceHandle(handle, service.ServiceName, ServiceQueryConfig) if err != nil { - return service, errors.Wrapf(err, "error while opening service %s", service.ServiceName) + return service, fmt.Errorf("error while opening service %s: %w", service.ServiceName, err) } defer closeHandle(serviceHandle) @@ -279,7 +281,7 @@ func getAdditionalServiceInfo(serviceHandle Handle, service *Status) error { buffer = make([]byte, len(buffer)+int(bytesNeeded)) continue } - return errors.Wrapf(ServiceErrno(err.(syscall.Errno)), "error while querying the service configuration %s", service.ServiceName) + return fmt.Errorf("error while querying the service configuration %s: %w", service.ServiceName, ServiceErrno(err.(syscall.Errno))) } serviceQueryConfig := (*QueryServiceConfig)(unsafe.Pointer(&buffer[0])) service.StartType = ServiceStartType(serviceQueryConfig.DwStartType) @@ -311,7 +313,7 @@ func getOptionalServiceInfo(serviceHandle Handle, service *Status) error { if service.StartType == StartTypeAutomatic { delayedInfoBuffer, err := queryServiceConfig2(serviceHandle, ConfigDelayedAutoStartInfo) if err != nil { - return errors.Wrapf(err, "error while querying rhe service configuration %s", service.ServiceName) + return fmt.Errorf("error while querying rhe service configuration %s: %w", service.ServiceName, err) } delayedInfo = (*serviceDelayedAutoStartInfo)(unsafe.Pointer(&delayedInfoBuffer[0])) diff --git a/metricbeat/module/zookeeper/mntr/mntr.go b/metricbeat/module/zookeeper/mntr/mntr.go index cd4e1000352..f08c7d36287 100644 --- a/metricbeat/module/zookeeper/mntr/mntr.go +++ b/metricbeat/module/zookeeper/mntr/mntr.go @@ -44,11 +44,11 @@ ZooKeeper mntr Command Output package mntr import ( + "fmt" + "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" "github.com/elastic/beats/v7/metricbeat/module/zookeeper" - - "github.com/pkg/errors" ) func init() { @@ -75,12 +75,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { outputReader, err := zookeeper.RunCommand("mntr", m.Host(), m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "mntr command failed") + return fmt.Errorf("mntr command failed: %w", err) } serverID, err := zookeeper.ServerID(m.Host(), m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "error obtaining server id") + return fmt.Errorf("error obtaining server id: %w", err) } eventMapping(serverID, outputReader, r, m.Logger()) diff --git a/metricbeat/module/zookeeper/server/data.go b/metricbeat/module/zookeeper/server/data.go index 3619d018119..9d389abf5bf 100644 --- a/metricbeat/module/zookeeper/server/data.go +++ b/metricbeat/module/zookeeper/server/data.go @@ -20,13 +20,14 @@ package server import ( "bufio" "encoding/binary" + "fmt" "io" "regexp" "strconv" "strings" "time" - "github.com/pkg/errors" + "errors" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" @@ -69,7 +70,7 @@ func parseSrvr(i io.Reader, logger *logp.Logger) (mapstr.M, string, error) { if strings.Contains(line, "Zxid") { xid, err := parseZxid(line) if err != nil { - err = errors.Wrapf(err, "error parsing 'zxid' line '%s'", line) + err = fmt.Errorf("error parsing 'zxid' line '%s': %w", line, err) logger.Debug(err.Error()) continue } @@ -82,7 +83,7 @@ func parseSrvr(i io.Reader, logger *logp.Logger) (mapstr.M, string, error) { if strings.Contains(line, "Latency") { latency, err := parseLatencyLine(line) if err != nil { - err = errors.Wrapf(err, "error parsing 'latency values' line '%s'", line) + err = fmt.Errorf("error parsing 'latency values' line '%s': %w", line, err) logger.Debug(err.Error()) continue } @@ -95,7 +96,7 @@ func parseSrvr(i io.Reader, logger *logp.Logger) (mapstr.M, string, error) { if strings.Contains(line, "Proposal sizes") { proposalSizes, err := parseProposalSizes(line) if err != nil { - err = errors.Wrapf(err, "error parsing 'proposal sizes' line '%s'", line) + err = fmt.Errorf("error parsing 'proposal sizes' line '%s': %w", line, err) logger.Debug(err.Error()) continue } @@ -138,7 +139,7 @@ func parseSrvr(i io.Reader, logger *logp.Logger) (mapstr.M, string, error) { val, err := strconv.ParseInt(result[2], 10, 64) if err != nil { - err = errors.Wrapf(err, "error trying to parse value '%s' as int", result[2]) + err = fmt.Errorf("error trying to parse value '%s' as int: %w", result[2], err) logger.Debug(err.Error()) continue } @@ -155,16 +156,16 @@ func parseZxid(line string) (mapstr.M, error) { zxidSplit := strings.Split(line, " ") if len(zxidSplit) < 2 { - return nil, errors.Errorf("less than 2 tokens (%v) after splitting", zxidSplit) + return nil, fmt.Errorf("less than 2 tokens (%v) after splitting", zxidSplit) } zxidString := zxidSplit[1] if len(zxidString) < 3 { - return nil, errors.Errorf("less than 3 characters on '%s'", zxidString) + return nil, fmt.Errorf("less than 3 characters on '%s'", zxidString) } zxid, err := strconv.ParseInt(zxidString[2:], 16, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse value '%s' to int", zxidString[2:]) + return nil, fmt.Errorf("error trying to parse value '%s' to int: %w", zxidString[2:], err) } bs := make([]byte, 8) @@ -185,28 +186,28 @@ func parseProposalSizes(line string) (mapstr.M, error) { initialSplit := strings.Split(line, " ") if len(initialSplit) < 4 { - return nil, errors.Errorf("less than 4 tokens (%v) after splitting", initialSplit) + return nil, fmt.Errorf("less than 4 tokens (%v) after splitting", initialSplit) } values := strings.Split(initialSplit[3], "/") if len(values) < 3 { - return nil, errors.Errorf("less than 3 tokens (%v) after splitting", values) + return nil, fmt.Errorf("less than 3 tokens (%v) after splitting", values) } last, err := strconv.ParseInt(values[0], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'last' value as int from '%s'", values[0]) + return nil, fmt.Errorf("error trying to parse 'last' value as int from '%s': %w", values[0], err) } output.Put("last", last) min, err := strconv.ParseInt(values[1], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'min' value as int from '%s'", values[1]) + return nil, fmt.Errorf("error trying to parse 'min' value as int from '%s': %w", values[1], err) } output.Put("min", min) max, err := strconv.ParseInt(values[2], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'max' value as int from '%s'", values[2]) + return nil, fmt.Errorf("error trying to parse 'max' value as int from '%s': %w", values[2], err) } output.Put("max", max) @@ -218,24 +219,24 @@ func parseLatencyLine(line string) (mapstr.M, error) { values := latencyCapturer.FindStringSubmatch(line) if len(values) < 4 { - return nil, errors.Errorf("less than 4 fields (%v) after splitting", values) + return nil, fmt.Errorf("less than 4 fields (%v) after splitting", values) } min, err := strconv.ParseInt(values[1], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'min' value '%s' as int", values[1]) + return nil, fmt.Errorf("error trying to parse 'min' value '%s' as int: %w", values[1], err) } output.Put("min", min) avg, err := strconv.ParseInt(values[2], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'avg' value '%s' as int", values[2]) + return nil, fmt.Errorf("error trying to parse 'avg' value '%s' as int: %w", values[2], err) } output.Put("avg", avg) max, err := strconv.ParseInt(values[3], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "error trying to parse 'max' value '%s' as int", values[3]) + return nil, fmt.Errorf("error trying to parse 'max' value '%s' as int: %w", values[3], err) } output.Put("max", max) diff --git a/metricbeat/module/zookeeper/server/server.go b/metricbeat/module/zookeeper/server/server.go index 141556a5fb3..86dde3df443 100644 --- a/metricbeat/module/zookeeper/server/server.go +++ b/metricbeat/module/zookeeper/server/server.go @@ -39,7 +39,7 @@ Proposal sizes last/min/max: -3/-999/-1 package server import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -71,18 +71,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { outputReader, err := zookeeper.RunCommand("srvr", m.Host(), m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "srvr command failed") + return fmt.Errorf("srvr command failed: %w", err) } metricsetFields, version, err := parseSrvr(outputReader, m.Logger()) if err != nil { - return errors.Wrap(err, "error parsing srvr output") + return fmt.Errorf("error parsing srvr output: %w", err) } serverID, err := zookeeper.ServerID(m.Host(), m.Module().Config().Timeout) if err != nil { - return errors.Wrap(err, "error obtaining server id") + return fmt.Errorf("error obtaining server id: %w", err) } event := mb.Event{ diff --git a/metricbeat/module/zookeeper/zookeeper.go b/metricbeat/module/zookeeper/zookeeper.go index 745080d7435..3c8c4573177 100644 --- a/metricbeat/module/zookeeper/zookeeper.go +++ b/metricbeat/module/zookeeper/zookeeper.go @@ -23,13 +23,13 @@ package zookeeper import ( "bufio" "bytes" + "errors" + "fmt" "io" "io/ioutil" "net" "strings" "time" - - "github.com/pkg/errors" ) // RunCommand establishes a TCP connection the ZooKeeper command port that @@ -39,7 +39,7 @@ import ( func RunCommand(command, address string, timeout time.Duration) (io.Reader, error) { conn, err := net.DialTimeout("tcp", address, timeout) if err != nil { - return nil, errors.Wrapf(err, "connection to host '%s' failed", address) + return nil, fmt.Errorf("connection to host '%s' failed: %w", address, err) } defer conn.Close() @@ -52,12 +52,12 @@ func RunCommand(command, address string, timeout time.Duration) (io.Reader, erro // Write four-letter command. _, err = conn.Write([]byte(command)) if err != nil { - return nil, errors.Wrapf(err, "writing command '%s' failed", command) + return nil, fmt.Errorf("writing command '%s' failed: %w", command, err) } result, err := ioutil.ReadAll(conn) if err != nil { - return nil, errors.Wrap(err, "read failed") + return nil, fmt.Errorf("read failed: %w", err) } return bytes.NewReader(result), nil @@ -67,7 +67,7 @@ func RunCommand(command, address string, timeout time.Duration) (io.Reader, erro func ServerID(address string, timeout time.Duration) (string, error) { response, err := RunCommand("conf", address, timeout) if err != nil { - return "", errors.Wrap(err, "execution of 'conf' command failed") + return "", fmt.Errorf("execution of 'conf' command failed: %w", err) } scanner := bufio.NewScanner(response) diff --git a/metricbeat/modules.d/aerospike.yml.disabled b/metricbeat/modules.d/aerospike.yml.disabled index a2fbdf83d2c..5294b90301e 100644 --- a/metricbeat/modules.d/aerospike.yml.disabled +++ b/metricbeat/modules.d/aerospike.yml.disabled @@ -1,5 +1,5 @@ # Module: aerospike -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-aerospike.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-aerospike.html - module: aerospike #metricsets: diff --git a/metricbeat/modules.d/apache.yml.disabled b/metricbeat/modules.d/apache.yml.disabled index 28e34fe429a..9c3adaa97d8 100644 --- a/metricbeat/modules.d/apache.yml.disabled +++ b/metricbeat/modules.d/apache.yml.disabled @@ -1,5 +1,5 @@ # Module: apache -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-apache.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-apache.html - module: apache #metricsets: diff --git a/metricbeat/modules.d/beat-xpack.yml.disabled b/metricbeat/modules.d/beat-xpack.yml.disabled index 0d254a465a1..98cd8c7edef 100644 --- a/metricbeat/modules.d/beat-xpack.yml.disabled +++ b/metricbeat/modules.d/beat-xpack.yml.disabled @@ -1,5 +1,5 @@ # Module: beat -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-beat.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-beat.html - module: beat xpack.enabled: true diff --git a/metricbeat/modules.d/beat.yml.disabled b/metricbeat/modules.d/beat.yml.disabled index af2907f77b4..cb26d83a5cf 100644 --- a/metricbeat/modules.d/beat.yml.disabled +++ b/metricbeat/modules.d/beat.yml.disabled @@ -1,5 +1,5 @@ # Module: beat -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-beat.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-beat.html - module: beat metricsets: diff --git a/metricbeat/modules.d/ceph-mgr.yml.disabled b/metricbeat/modules.d/ceph-mgr.yml.disabled index 84932d3f4c0..9d06114f79f 100644 --- a/metricbeat/modules.d/ceph-mgr.yml.disabled +++ b/metricbeat/modules.d/ceph-mgr.yml.disabled @@ -1,5 +1,5 @@ # Module: ceph -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-ceph.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-ceph.html - module: ceph metricsets: diff --git a/metricbeat/modules.d/ceph.yml.disabled b/metricbeat/modules.d/ceph.yml.disabled index 7e875b274bd..550ea8fe6ea 100644 --- a/metricbeat/modules.d/ceph.yml.disabled +++ b/metricbeat/modules.d/ceph.yml.disabled @@ -1,5 +1,5 @@ # Module: ceph -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-ceph.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-ceph.html - module: ceph #metricsets: diff --git a/metricbeat/modules.d/consul.yml.disabled b/metricbeat/modules.d/consul.yml.disabled index d9b9dc5085d..9344dd8c999 100644 --- a/metricbeat/modules.d/consul.yml.disabled +++ b/metricbeat/modules.d/consul.yml.disabled @@ -1,5 +1,5 @@ # Module: consul -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-consul.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-consul.html - module: consul metricsets: diff --git a/metricbeat/modules.d/couchbase.yml.disabled b/metricbeat/modules.d/couchbase.yml.disabled index fbb8a53b4ca..088f98b45c5 100644 --- a/metricbeat/modules.d/couchbase.yml.disabled +++ b/metricbeat/modules.d/couchbase.yml.disabled @@ -1,5 +1,5 @@ # Module: couchbase -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-couchbase.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-couchbase.html - module: couchbase #metricsets: diff --git a/metricbeat/modules.d/couchdb.yml.disabled b/metricbeat/modules.d/couchdb.yml.disabled index 265878fc9db..2a2eb9a5613 100644 --- a/metricbeat/modules.d/couchdb.yml.disabled +++ b/metricbeat/modules.d/couchdb.yml.disabled @@ -1,5 +1,5 @@ # Module: couchdb -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-couchdb.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-couchdb.html - module: couchdb metricsets: ["server"] diff --git a/metricbeat/modules.d/docker.yml.disabled b/metricbeat/modules.d/docker.yml.disabled index bf5950eb6e7..88af5d21288 100644 --- a/metricbeat/modules.d/docker.yml.disabled +++ b/metricbeat/modules.d/docker.yml.disabled @@ -1,5 +1,5 @@ # Module: docker -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-docker.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-docker.html - module: docker #metricsets: diff --git a/metricbeat/modules.d/dropwizard.yml.disabled b/metricbeat/modules.d/dropwizard.yml.disabled index 5baa6349452..1103a314d1d 100644 --- a/metricbeat/modules.d/dropwizard.yml.disabled +++ b/metricbeat/modules.d/dropwizard.yml.disabled @@ -1,5 +1,5 @@ # Module: dropwizard -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-dropwizard.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-dropwizard.html - module: dropwizard #metricsets: diff --git a/metricbeat/modules.d/elasticsearch-xpack.yml.disabled b/metricbeat/modules.d/elasticsearch-xpack.yml.disabled index c7f57b84f54..b69fe6b87f9 100644 --- a/metricbeat/modules.d/elasticsearch-xpack.yml.disabled +++ b/metricbeat/modules.d/elasticsearch-xpack.yml.disabled @@ -1,5 +1,5 @@ # Module: elasticsearch -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-elasticsearch.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-elasticsearch.html - module: elasticsearch xpack.enabled: true @@ -7,4 +7,5 @@ hosts: ["http://localhost:9200"] #username: "user" #password: "secret" + #api_key: "foo:bar" diff --git a/metricbeat/modules.d/elasticsearch.yml.disabled b/metricbeat/modules.d/elasticsearch.yml.disabled index 271f927e301..33983e4ac14 100644 --- a/metricbeat/modules.d/elasticsearch.yml.disabled +++ b/metricbeat/modules.d/elasticsearch.yml.disabled @@ -1,5 +1,5 @@ # Module: elasticsearch -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-elasticsearch.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-elasticsearch.html - module: elasticsearch #metricsets: @@ -9,3 +9,4 @@ hosts: ["http://localhost:9200"] #username: "user" #password: "secret" + #api_key: "foo:bar" diff --git a/metricbeat/modules.d/envoyproxy.yml.disabled b/metricbeat/modules.d/envoyproxy.yml.disabled index 67d638f0b48..ca75daff085 100644 --- a/metricbeat/modules.d/envoyproxy.yml.disabled +++ b/metricbeat/modules.d/envoyproxy.yml.disabled @@ -1,5 +1,5 @@ # Module: envoyproxy -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-envoyproxy.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-envoyproxy.html - module: envoyproxy #metricsets: diff --git a/metricbeat/modules.d/etcd.yml.disabled b/metricbeat/modules.d/etcd.yml.disabled index 5a6fa8cd179..5aa30fb86e7 100644 --- a/metricbeat/modules.d/etcd.yml.disabled +++ b/metricbeat/modules.d/etcd.yml.disabled @@ -1,5 +1,5 @@ # Module: etcd -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-etcd.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-etcd.html - module: etcd #metricsets: diff --git a/metricbeat/modules.d/golang.yml.disabled b/metricbeat/modules.d/golang.yml.disabled index 8bb65e090e1..9f9e5624fa3 100644 --- a/metricbeat/modules.d/golang.yml.disabled +++ b/metricbeat/modules.d/golang.yml.disabled @@ -1,5 +1,5 @@ # Module: golang -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-golang.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-golang.html - module: golang #metricsets: diff --git a/metricbeat/modules.d/graphite.yml.disabled b/metricbeat/modules.d/graphite.yml.disabled index 78f7c32b304..3354715923c 100644 --- a/metricbeat/modules.d/graphite.yml.disabled +++ b/metricbeat/modules.d/graphite.yml.disabled @@ -1,5 +1,5 @@ # Module: graphite -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-graphite.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-graphite.html - module: graphite #metricsets: diff --git a/metricbeat/modules.d/haproxy.yml.disabled b/metricbeat/modules.d/haproxy.yml.disabled index 2c61ee0c55d..e95f687253d 100644 --- a/metricbeat/modules.d/haproxy.yml.disabled +++ b/metricbeat/modules.d/haproxy.yml.disabled @@ -1,5 +1,5 @@ # Module: haproxy -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-haproxy.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-haproxy.html - module: haproxy #metricsets: diff --git a/metricbeat/modules.d/http.yml.disabled b/metricbeat/modules.d/http.yml.disabled index 0ce5b5c0f85..63ebd2ee093 100644 --- a/metricbeat/modules.d/http.yml.disabled +++ b/metricbeat/modules.d/http.yml.disabled @@ -1,5 +1,5 @@ # Module: http -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-http.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-http.html - module: http #metricsets: diff --git a/metricbeat/modules.d/jolokia.yml.disabled b/metricbeat/modules.d/jolokia.yml.disabled index 2190273485f..b58782353ec 100644 --- a/metricbeat/modules.d/jolokia.yml.disabled +++ b/metricbeat/modules.d/jolokia.yml.disabled @@ -1,5 +1,5 @@ # Module: jolokia -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-jolokia.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-jolokia.html - module: jolokia #metricsets: ["jmx"] diff --git a/metricbeat/modules.d/kafka.yml.disabled b/metricbeat/modules.d/kafka.yml.disabled index 1e0db5d517b..afafa7e5a4c 100644 --- a/metricbeat/modules.d/kafka.yml.disabled +++ b/metricbeat/modules.d/kafka.yml.disabled @@ -1,5 +1,5 @@ # Module: kafka -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-kafka.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-kafka.html # Kafka metrics collected using the Kafka protocol - module: kafka diff --git a/metricbeat/modules.d/kibana-xpack.yml.disabled b/metricbeat/modules.d/kibana-xpack.yml.disabled index dd6b4d939a2..91471a7c212 100644 --- a/metricbeat/modules.d/kibana-xpack.yml.disabled +++ b/metricbeat/modules.d/kibana-xpack.yml.disabled @@ -1,5 +1,5 @@ # Module: kibana -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-kibana.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-kibana.html - module: kibana xpack.enabled: true diff --git a/metricbeat/modules.d/kibana.yml.disabled b/metricbeat/modules.d/kibana.yml.disabled index 78f769cd65e..27ca4b1a05f 100644 --- a/metricbeat/modules.d/kibana.yml.disabled +++ b/metricbeat/modules.d/kibana.yml.disabled @@ -1,5 +1,5 @@ # Module: kibana -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-kibana.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-kibana.html - module: kibana #metricsets: diff --git a/metricbeat/modules.d/kubernetes.yml.disabled b/metricbeat/modules.d/kubernetes.yml.disabled index 02baebb8bb7..23bd210a835 100644 --- a/metricbeat/modules.d/kubernetes.yml.disabled +++ b/metricbeat/modules.d/kubernetes.yml.disabled @@ -1,5 +1,5 @@ # Module: kubernetes -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-kubernetes.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-kubernetes.html # Node metrics, from kubelet: - module: kubernetes diff --git a/metricbeat/modules.d/kvm.yml.disabled b/metricbeat/modules.d/kvm.yml.disabled index 8450e1afc6d..00e06354b0b 100644 --- a/metricbeat/modules.d/kvm.yml.disabled +++ b/metricbeat/modules.d/kvm.yml.disabled @@ -1,5 +1,5 @@ # Module: kvm -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-kvm.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-kvm.html - module: kvm #metricsets: diff --git a/metricbeat/modules.d/linux.yml.disabled b/metricbeat/modules.d/linux.yml.disabled index df7311017bf..2c28e8bcbd0 100644 --- a/metricbeat/modules.d/linux.yml.disabled +++ b/metricbeat/modules.d/linux.yml.disabled @@ -1,5 +1,5 @@ # Module: linux -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-linux.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-linux.html - module: linux period: 10s diff --git a/metricbeat/modules.d/logstash-xpack.yml.disabled b/metricbeat/modules.d/logstash-xpack.yml.disabled index db78289f2a8..b00f4479919 100644 --- a/metricbeat/modules.d/logstash-xpack.yml.disabled +++ b/metricbeat/modules.d/logstash-xpack.yml.disabled @@ -1,5 +1,5 @@ # Module: logstash -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-logstash.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-logstash.html - module: logstash xpack.enabled: true diff --git a/metricbeat/modules.d/logstash.yml.disabled b/metricbeat/modules.d/logstash.yml.disabled index 72ea8231ff4..90274a3c728 100644 --- a/metricbeat/modules.d/logstash.yml.disabled +++ b/metricbeat/modules.d/logstash.yml.disabled @@ -1,5 +1,5 @@ # Module: logstash -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-logstash.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-logstash.html - module: logstash #metricsets: diff --git a/metricbeat/modules.d/memcached.yml.disabled b/metricbeat/modules.d/memcached.yml.disabled index 7037988cc35..0df976bb0bf 100644 --- a/metricbeat/modules.d/memcached.yml.disabled +++ b/metricbeat/modules.d/memcached.yml.disabled @@ -1,5 +1,5 @@ # Module: memcached -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-memcached.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-memcached.html - module: memcached # metricsets: ["stats"] diff --git a/metricbeat/modules.d/mongodb.yml.disabled b/metricbeat/modules.d/mongodb.yml.disabled index 0d4c26be4a5..48705eae39f 100644 --- a/metricbeat/modules.d/mongodb.yml.disabled +++ b/metricbeat/modules.d/mongodb.yml.disabled @@ -1,5 +1,5 @@ # Module: mongodb -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-mongodb.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-mongodb.html - module: mongodb #metricsets: diff --git a/metricbeat/modules.d/munin.yml.disabled b/metricbeat/modules.d/munin.yml.disabled index d42b1d9919e..803d200561b 100644 --- a/metricbeat/modules.d/munin.yml.disabled +++ b/metricbeat/modules.d/munin.yml.disabled @@ -1,5 +1,5 @@ # Module: munin -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-munin.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-munin.html - module: munin #metricsets: diff --git a/metricbeat/modules.d/mysql.yml.disabled b/metricbeat/modules.d/mysql.yml.disabled index 2b3371b1890..2913f5af8bc 100644 --- a/metricbeat/modules.d/mysql.yml.disabled +++ b/metricbeat/modules.d/mysql.yml.disabled @@ -1,5 +1,5 @@ # Module: mysql -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-mysql.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-mysql.html - module: mysql #metricsets: diff --git a/metricbeat/modules.d/nats.yml.disabled b/metricbeat/modules.d/nats.yml.disabled index d398ac0be43..e1e751cdb49 100644 --- a/metricbeat/modules.d/nats.yml.disabled +++ b/metricbeat/modules.d/nats.yml.disabled @@ -1,5 +1,5 @@ # Module: nats -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-nats.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-nats.html - module: nats metricsets: diff --git a/metricbeat/modules.d/nginx.yml.disabled b/metricbeat/modules.d/nginx.yml.disabled index 786cc90edd6..40c3bea92e5 100644 --- a/metricbeat/modules.d/nginx.yml.disabled +++ b/metricbeat/modules.d/nginx.yml.disabled @@ -1,5 +1,5 @@ # Module: nginx -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-nginx.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-nginx.html - module: nginx #metricsets: diff --git a/metricbeat/modules.d/openmetrics.yml.disabled b/metricbeat/modules.d/openmetrics.yml.disabled index ad933acedad..bebd339a1a2 100644 --- a/metricbeat/modules.d/openmetrics.yml.disabled +++ b/metricbeat/modules.d/openmetrics.yml.disabled @@ -1,5 +1,5 @@ # Module: openmetrics -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-openmetrics.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-openmetrics.html - module: openmetrics metricsets: ['collector'] diff --git a/metricbeat/modules.d/php_fpm.yml.disabled b/metricbeat/modules.d/php_fpm.yml.disabled index 08aaa3cc957..0ca2ac5c1df 100644 --- a/metricbeat/modules.d/php_fpm.yml.disabled +++ b/metricbeat/modules.d/php_fpm.yml.disabled @@ -1,5 +1,5 @@ # Module: php_fpm -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-php_fpm.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-php_fpm.html - module: php_fpm #metricsets: diff --git a/metricbeat/modules.d/postgresql.yml.disabled b/metricbeat/modules.d/postgresql.yml.disabled index 14ee2fc7aca..fe2e5858dfb 100644 --- a/metricbeat/modules.d/postgresql.yml.disabled +++ b/metricbeat/modules.d/postgresql.yml.disabled @@ -1,5 +1,5 @@ # Module: postgresql -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-postgresql.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-postgresql.html - module: postgresql #metricsets: diff --git a/metricbeat/modules.d/prometheus.yml.disabled b/metricbeat/modules.d/prometheus.yml.disabled index 82f45573931..f829e3d89da 100644 --- a/metricbeat/modules.d/prometheus.yml.disabled +++ b/metricbeat/modules.d/prometheus.yml.disabled @@ -1,5 +1,5 @@ # Module: prometheus -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-prometheus.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-prometheus.html # Metrics collected from a Prometheus endpoint - module: prometheus diff --git a/metricbeat/modules.d/rabbitmq.yml.disabled b/metricbeat/modules.d/rabbitmq.yml.disabled index ed0d8159571..b6967556f83 100644 --- a/metricbeat/modules.d/rabbitmq.yml.disabled +++ b/metricbeat/modules.d/rabbitmq.yml.disabled @@ -1,5 +1,5 @@ # Module: rabbitmq -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-rabbitmq.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-rabbitmq.html - module: rabbitmq #metricsets: diff --git a/metricbeat/modules.d/redis.yml.disabled b/metricbeat/modules.d/redis.yml.disabled index 303ede6f47d..99a7288e5ee 100644 --- a/metricbeat/modules.d/redis.yml.disabled +++ b/metricbeat/modules.d/redis.yml.disabled @@ -1,5 +1,5 @@ # Module: redis -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-redis.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-redis.html - module: redis #metricsets: diff --git a/metricbeat/modules.d/system.yml b/metricbeat/modules.d/system.yml index 3c511e77439..4123ea00f33 100644 --- a/metricbeat/modules.d/system.yml +++ b/metricbeat/modules.d/system.yml @@ -1,5 +1,5 @@ # Module: system -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-system.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-system.html - module: system period: 10s diff --git a/metricbeat/modules.d/traefik.yml.disabled b/metricbeat/modules.d/traefik.yml.disabled index 35326a4ec4a..b186538f4e1 100644 --- a/metricbeat/modules.d/traefik.yml.disabled +++ b/metricbeat/modules.d/traefik.yml.disabled @@ -1,5 +1,5 @@ # Module: traefik -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-traefik.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-traefik.html - module: traefik metricsets: ["health"] diff --git a/metricbeat/modules.d/uwsgi.yml.disabled b/metricbeat/modules.d/uwsgi.yml.disabled index f758061b65a..7ac6322064c 100644 --- a/metricbeat/modules.d/uwsgi.yml.disabled +++ b/metricbeat/modules.d/uwsgi.yml.disabled @@ -1,5 +1,5 @@ # Module: uwsgi -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-uwsgi.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-uwsgi.html - module: uwsgi #metricsets: diff --git a/metricbeat/modules.d/vsphere.yml.disabled b/metricbeat/modules.d/vsphere.yml.disabled index c56a9b1ac33..874b3b5b2e8 100644 --- a/metricbeat/modules.d/vsphere.yml.disabled +++ b/metricbeat/modules.d/vsphere.yml.disabled @@ -1,5 +1,5 @@ # Module: vsphere -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-vsphere.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-vsphere.html - module: vsphere #metricsets: diff --git a/metricbeat/modules.d/windows.yml.disabled b/metricbeat/modules.d/windows.yml.disabled index 717e52655a2..afe1af59311 100644 --- a/metricbeat/modules.d/windows.yml.disabled +++ b/metricbeat/modules.d/windows.yml.disabled @@ -1,5 +1,5 @@ # Module: windows -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-windows.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-windows.html - module: windows metricsets: diff --git a/metricbeat/modules.d/zookeeper.yml.disabled b/metricbeat/modules.d/zookeeper.yml.disabled index 7d44efb938e..f8d16c527a6 100644 --- a/metricbeat/modules.d/zookeeper.yml.disabled +++ b/metricbeat/modules.d/zookeeper.yml.disabled @@ -1,5 +1,5 @@ # Module: zookeeper -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-zookeeper.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-zookeeper.html - module: zookeeper #metricsets: diff --git a/metricbeat/scripts/mage/docs_collector.go b/metricbeat/scripts/mage/docs_collector.go index b505db79a69..9d270905e6c 100644 --- a/metricbeat/scripts/mage/docs_collector.go +++ b/metricbeat/scripts/mage/docs_collector.go @@ -29,7 +29,6 @@ import ( "text/template" "github.com/magefile/mage/sh" - "github.com/pkg/errors" "gopkg.in/yaml.v2" "github.com/elastic/beats/v7/dev-tools/mage" @@ -61,12 +60,12 @@ type metricsetData struct { func writeTemplate(filename string, t *template.Template, args interface{}) error { fd, err := os.Create(filename) if err != nil { - return errors.Wrapf(err, "error opening file at %s", filename) + return fmt.Errorf("error opening file at %s: %w", filename, err) } defer fd.Close() err = t.Execute(fd, args) if err != nil { - return errors.Wrap(err, "error executing template") + return fmt.Errorf("error executing template: %w", err) } return nil } @@ -150,7 +149,7 @@ func getDefaultMetricsets() (map[string][]string, error) { for _, dir := range runpaths { rawMap, err := sh.OutCmd("go", append(cmd, dir)...)() if err != nil { - return nil, errors.Wrap(err, "Error running subcommand to get metricsets") + return nil, fmt.Errorf("Error running subcommand to get metricsets: %w", err) } var msetMap = make(map[string][]string) err = json.Unmarshal([]byte(rawMap), &msetMap) @@ -169,7 +168,7 @@ func getDefaultMetricsets() (map[string][]string, error) { func loadModuleFields(file string) (moduleData, error) { fd, err := ioutil.ReadFile(file) if err != nil { - return moduleData{}, errors.Wrap(err, "failed to read from spec file") + return moduleData{}, fmt.Errorf("failed to read from spec file: %w", err) } // Cheat and use the same struct. var mod []moduleData @@ -180,7 +179,7 @@ func loadModuleFields(file string) (moduleData, error) { rel, err := getRelease(module.Release) if err != nil { - return mod[0], errors.Wrapf(err, "file %s is missing a release string", file) + return mod[0], fmt.Errorf("file %s is missing a release string: %w", file, err) } module.Release = rel @@ -191,7 +190,7 @@ func loadModuleFields(file string) (moduleData, error) { func getReleaseState(metricsetPath string) (string, error) { raw, err := ioutil.ReadFile(metricsetPath) if err != nil { - return "", errors.Wrap(err, "failed to read from spec file") + return "", fmt.Errorf("failed to read from spec file: %w", err) } type metricset struct { @@ -204,7 +203,7 @@ func getReleaseState(metricsetPath string) (string, error) { relString, err := getRelease(rel[0].Release) if err != nil { - return "", errors.Wrapf(err, "metricset %s is missing a release tag", metricsetPath) + return "", fmt.Errorf("metricset %s is missing a release tag: %w", metricsetPath, err) } return relString, nil } @@ -298,7 +297,7 @@ func gatherMetricsets(modulePath string, moduleName string, defaultMetricSets [] func gatherData(modules []string) ([]moduleData, error) { defmset, err := getDefaultMetricsets() if err != nil { - return nil, errors.Wrap(err, "error getting default metricsets") + return nil, fmt.Errorf("error getting default metricsets: %w", err) } moduleList := make([]moduleData, 0) //iterate over all the modules, checking to make sure we have an asciidoc file @@ -377,7 +376,7 @@ func writeMetricsetDocs(modules []moduleData, t *template.Template) error { filename := mage.OSSBeatDir("docs", "modules", mod.Base, fmt.Sprintf("%s.asciidoc", metricset.Title)) err := writeTemplate(filename, t.Lookup("metricsetDoc.tmpl"), modData) if err != nil { - return errors.Wrapf(err, "error opening file at %s", filename) + return fmt.Errorf("error opening file at %s: %w", filename, err) } } // end metricset loop } // end module loop @@ -403,25 +402,25 @@ func writeDocs(modules []moduleData) error { tmplList := template.New("moduleList").Option("missingkey=error").Funcs(funcMap) beatPath, err := mage.ElasticBeatsDir() if err != nil { - return errors.Wrap(err, "error finding beats dir") + return fmt.Errorf("error finding beats dir: %w", err) } tmplList, err = tmplList.ParseGlob(path.Join(beatPath, "metricbeat/scripts/mage/template/*.tmpl")) if err != nil { - return errors.Wrap(err, "error parsing template files") + return fmt.Errorf("error parsing template files: %w", err) } err = writeModuleDocs(modules, tmplList) if err != nil { - return errors.Wrap(err, "error writing module docs") + return fmt.Errorf("error writing module docs: %w", err) } err = writeMetricsetDocs(modules, tmplList) if err != nil { - return errors.Wrap(err, "error writing metricset docs") + return fmt.Errorf("error writing metricset docs: %w", err) } err = writeModuleList(modules, tmplList) if err != nil { - return errors.Wrap(err, "error writing module list") + return fmt.Errorf("error writing module list: %w", err) } return nil diff --git a/metricbeat/scripts/mage/package.go b/metricbeat/scripts/mage/package.go index 6ba347bf6f8..e206881dd3c 100644 --- a/metricbeat/scripts/mage/package.go +++ b/metricbeat/scripts/mage/package.go @@ -26,7 +26,6 @@ import ( "strings" "github.com/magefile/mage/mg" - "github.com/pkg/errors" devtools "github.com/elastic/beats/v7/dev-tools/mage" ) @@ -58,7 +57,7 @@ func CustomizePackaging() { Modules: true, Dep: func(spec devtools.PackageSpec) error { if err := devtools.Copy(dirModulesDGenerated, spec.MustExpand("{{.PackageDir}}/modules.d")); err != nil { - return errors.Wrap(err, "failed to copy modules.d dir") + return fmt.Errorf("failed to copy modules.d dir: %w", err) } return devtools.FindReplace( @@ -73,7 +72,7 @@ func CustomizePackaging() { err := devtools.Copy("metricbeat.reference.yml", spec.MustExpand("{{.PackageDir}}/metricbeat.reference.yml")) if err != nil { - return errors.Wrap(err, "failed to copy reference config") + return fmt.Errorf("failed to copy reference config: %w", err) } return devtools.FindReplace( @@ -96,7 +95,7 @@ func CustomizePackaging() { case devtools.Deb, devtools.RPM: args.Spec.Files["/etc/{{.BeatName}}/"+modulesDTarget] = modulesD default: - panic(errors.Errorf("unhandled package type: %v", pkgType)) + panic(fmt.Errorf("unhandled package type: %v", pkgType)) } } } @@ -171,7 +170,7 @@ func GenerateDirModulesD() error { docBranch, err := devtools.BeatDocBranch() if err != nil { - errors.Wrap(err, "failed to get doc branch") + return fmt.Errorf("failed to get doc branch: %w", err) } mode := 0644 @@ -297,21 +296,24 @@ func moduleConfigParts(f string) (moduleName string, configName string, ok bool) func copyWithHeader(header, src, dst string, mode os.FileMode) error { dstFile, err := os.OpenFile(devtools.CreateDir(dst), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, mode&os.ModePerm) if err != nil { - return errors.Wrap(err, "failed to open copy destination") + return fmt.Errorf("failed to open copy destination: %w", err) } defer dstFile.Close() _, err = io.WriteString(dstFile, header+"\n\n") if err != nil { - return errors.Wrap(err, "failed to write header") + return fmt.Errorf("failed to write header: %w", err) } srcFile, err := os.Open(src) if err != nil { - return errors.Wrap(err, "failed to open copy source") + return fmt.Errorf("failed to open copy source: %w", err) } defer srcFile.Close() _, err = io.Copy(dstFile, srcFile) - return errors.Wrap(err, "failed to copy file") + if err != nil { + return fmt.Errorf("failed to copy file: %w", err) + } + return nil } diff --git a/packetbeat/Dockerfile b/packetbeat/Dockerfile index 4d6e1f522e0..9a522cbc230 100644 --- a/packetbeat/Dockerfile +++ b/packetbeat/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 RUN \ apt-get update \ @@ -12,7 +12,7 @@ RUN \ && rm -rf /var/lib/apt/lists/* # Use a virtualenv to avoid the PEP668 "externally managed environment" error caused by conflicts -# with the system Python installation. golang:1.19.10 uses Debian 12 which now enforces PEP668. +# with the system Python installation. golang:1.20.6 uses Debian 12 which now enforces PEP668. ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" diff --git a/packetbeat/_meta/config/windows_npcap.yml.tmpl b/packetbeat/_meta/config/windows_npcap.yml.tmpl index 62605c20250..23647cc6d01 100644 --- a/packetbeat/_meta/config/windows_npcap.yml.tmpl +++ b/packetbeat/_meta/config/windows_npcap.yml.tmpl @@ -8,6 +8,6 @@ #packetbeat.npcap: # # If a specific local version of Npcap is required, installation by packetbeat # # can be blocked by setting never_install to true. No action is taken if this -# # option is set to true. +# # option is set to true unless no Npcap is already installed. # never_install: false {{- end -}} diff --git a/packetbeat/beater/install_npcap.go b/packetbeat/beater/install_npcap.go index 370f7712e97..c1413fdb6d9 100644 --- a/packetbeat/beater/install_npcap.go +++ b/packetbeat/beater/install_npcap.go @@ -23,16 +23,23 @@ import ( "os" "path/filepath" "runtime" + "strings" + "sync" "time" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/packetbeat/npcap" + conf "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/logp" ) const installTimeout = 120 * time.Second -func installNpcap(b *beat.Beat) error { +// muInstall protects use of npcap.Installer. The only writes to npcap.Installer +// are here and during init in x-pack/packetbeat/npcap/npcap_windows.go +var muInstall sync.Mutex + +func installNpcap(b *beat.Beat, cfg *conf.C) error { if !b.Info.ElasticLicensed { return nil } @@ -54,19 +61,29 @@ func installNpcap(b *beat.Beat) error { return nil } - canInstall, err := canInstallNpcap(b) - if err != nil { - return err - } log := logp.NewLogger("npcap_install") - if !canInstall { - log.Warn("npcap installation/upgrade disabled by user") - return nil + // Only check whether we have been requested to never_install if there + // is already an Npcap installation present. This should not be necessary, + // but the start-up logic of packetbeat is tightly coupled to the presence + // of a backing sniffer. This should really not be necessary, but the changes + // to modify this behaviour are non-trivial, so just avoid the issue. + isInstalled := strings.HasPrefix(npcap.Version(), "Npcap version") + if isInstalled { + canInstall, err := canInstallNpcap(b, cfg, log) + if err != nil { + return err + } + if !canInstall { + log.Warn("npcap installation/upgrade disabled by user") + return nil + } } ctx, cancel := context.WithTimeout(context.Background(), installTimeout) defer cancel() + muInstall.Lock() + defer muInstall.Unlock() if npcap.Installer == nil { return nil } @@ -95,9 +112,10 @@ func installNpcap(b *beat.Beat) error { // configurations from agent normalised to the internal packetbeat format by this point. // In the case that the beat is managed, any data stream that has npcap.never_install // set to true will result in a block on the installation. -func canInstallNpcap(b *beat.Beat) (bool, error) { +func canInstallNpcap(b *beat.Beat, rawcfg *conf.C, log *logp.Logger) (bool, error) { type npcapInstallCfg struct { - NeverInstall bool `config:"npcap.never_install"` + Type string `config:"type"` + NeverInstall bool `config:"npcap.never_install"` } // Agent managed case. @@ -105,12 +123,19 @@ func canInstallNpcap(b *beat.Beat) (bool, error) { var cfg struct { Streams []npcapInstallCfg `config:"streams"` } - err := b.BeatConfig.Unpack(&cfg) + err := rawcfg.Unpack(&cfg) if err != nil { return false, fmt.Errorf("failed to unpack npcap config from agent configuration: %w", err) } + if len(cfg.Streams) == 0 { + // We have no stream to monitor, so we don't need to install + // anything. We may be in the middle of a config check. + log.Debug("cannot install because no configured stream") + return false, nil + } for _, c := range cfg.Streams { if c.NeverInstall { + log.Debugf("cannot install because %s has never_install set to true", c.Type) return false, nil } } @@ -119,9 +144,12 @@ func canInstallNpcap(b *beat.Beat) (bool, error) { // Packetbeat case. var cfg npcapInstallCfg - err := b.BeatConfig.Unpack(&cfg) + err := rawcfg.Unpack(&cfg) if err != nil { return false, fmt.Errorf("failed to unpack npcap config from packetbeat configuration: %w", err) } + if cfg.NeverInstall { + log.Debugf("cannot install because %s has never_install set to true", cfg.Type) + } return !cfg.NeverInstall, err } diff --git a/packetbeat/beater/install_npcap_test.go b/packetbeat/beater/install_npcap_test.go index 7a888b4e0c8..3d8c678edaf 100644 --- a/packetbeat/beater/install_npcap_test.go +++ b/packetbeat/beater/install_npcap_test.go @@ -23,6 +23,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/management" "github.com/elastic/elastic-agent-libs/config" + "github.com/elastic/elastic-agent-libs/logp" ) var canInstallNpcapTests = []struct { @@ -210,10 +211,9 @@ func TestCanInstallNpcap(t *testing.T) { t.Fatalf("unexpected error: %v", err) } b := &beat.Beat{ - BeatConfig: cfg, - Manager: boolManager{managed: test.managed}, + Manager: boolManager{managed: test.managed}, } - got, err := canInstallNpcap(b) + got, err := canInstallNpcap(b, cfg, logp.NewLogger("npcap_install_test")) if err != nil { t.Errorf("unexpected error from canInstallNpcap: %v", err) } diff --git a/packetbeat/beater/packetbeat.go b/packetbeat/beater/packetbeat.go index fbc0e1c1fb9..725f3eebc33 100644 --- a/packetbeat/beater/packetbeat.go +++ b/packetbeat/beater/packetbeat.go @@ -93,14 +93,6 @@ func New(b *beat.Beat, rawConfig *conf.C) (beat.Beater, error) { configurator = initialConfig().FromStatic } - // Install Npcap if needed. This need to happen before any other - // work on Windows, including config checking, because that involves - // probing interfaces. - err := installNpcap(b) - if err != nil { - return nil, err - } - factory := newProcessorFactory(b.Info.Name, make(chan error, maxSniffers), b, configurator) if err := factory.CheckConfig(rawConfig); err != nil { return nil, err @@ -133,6 +125,18 @@ func (pb *packetbeat) Run(b *beat.Beat) error { } } + if b.Manager != nil { + b.Manager.RegisterDiagnosticHook("input_metrics", "Metrics from active inputs.", + "input_metrics.json", "application/json", func() []byte { + data, err := inputmon.MetricSnapshotJSON() + if err != nil { + logp.L().Warnw("Failed to collect input metric snapshot for Agent diagnostics.", "error", err) + return []byte(err.Error()) + } + return data + }) + } + if !b.Manager.Enabled() { return pb.runStatic(b, pb.factory) } diff --git a/packetbeat/beater/processor.go b/packetbeat/beater/processor.go index 494b8f890b6..513dbe2871c 100644 --- a/packetbeat/beater/processor.go +++ b/packetbeat/beater/processor.go @@ -123,6 +123,24 @@ func (p *processorFactory) Create(pipeline beat.PipelineConnector, cfg *conf.C) logp.Err("Failed to generate ID from config: %v, %v", err, config) return nil, err } + if len(config.Interfaces) != 0 { + // Install Npcap if needed. This needs to happen before any other + // work on Windows, including config checking, because that involves + // probing interfaces. + // + // Users may block installation of Npcap, so we defer the install + // until we have a configuration that will tell us if it has been + // blocked. To do this we must have a valid config. + // + // When Packetbeat is managed by fleet we will only have this if + // Create has been called via the agent Reload process. We take + // the opportunity to not install the DLL if there is no configured + // interface. + err := installNpcap(p.beat, cfg) + if err != nil { + return nil, err + } + } publisher, err := publish.NewTransactionPublisher( p.beat.Info.Name, diff --git a/packetbeat/docs/packetbeat-options.asciidoc b/packetbeat/docs/packetbeat-options.asciidoc index 5266dac8d33..4a74dd5593e 100644 --- a/packetbeat/docs/packetbeat-options.asciidoc +++ b/packetbeat/docs/packetbeat-options.asciidoc @@ -61,7 +61,7 @@ On Windows {beatname} requires an Npcap DLL installation. This is provided by {b for users of the Elastic Licenced version. In some cases users may wish to use their own installed version. In order to do this the `packetbeat.npcap.never_install` option can be used. Setting this option to `true` will not attempt to install the -bundled Npcap library on start-up. +bundled Npcap library on start-up unless no Npcap is already installed. [source,yaml] ------------------------------------------------------------------------------ diff --git a/packetbeat/docs/troubleshooting.asciidoc b/packetbeat/docs/troubleshooting.asciidoc index f6a3fb23be3..ef210371ad0 100644 --- a/packetbeat/docs/troubleshooting.asciidoc +++ b/packetbeat/docs/troubleshooting.asciidoc @@ -8,6 +8,7 @@ following tips: * <> * <> +* <> * <> * <> @@ -29,6 +30,18 @@ include::{libbeat-dir}/debugging.asciidoc[] //sets block macro for recording-trace content included in next section +//sets block macro for metrics-in-logs.asciidoc included in next section + +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] + [[recording-trace]] == Record a trace diff --git a/packetbeat/pb/event.go b/packetbeat/pb/event.go index 3c38f98729b..44cb7c81d92 100644 --- a/packetbeat/pb/event.go +++ b/packetbeat/pb/event.go @@ -24,8 +24,6 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/flowhash" @@ -112,7 +110,7 @@ func GetFields(m mapstr.M) (*Fields, error) { fields, ok := v.(*Fields) if !ok { - return nil, errors.Errorf("%v must be a *types.Fields, but is %T", FieldsKey, fields) + return nil, fmt.Errorf("%v must be a *types.Fields, but is %T", FieldsKey, fields) } return fields, nil } diff --git a/packetbeat/protos/http/decode.go b/packetbeat/protos/http/decode.go index 34301955e9b..dc113f53de9 100644 --- a/packetbeat/protos/http/decode.go +++ b/packetbeat/protos/http/decode.go @@ -23,7 +23,7 @@ import ( "compress/gzip" "io" - "github.com/pkg/errors" + "errors" ) var ( diff --git a/packetbeat/protos/http/http.go b/packetbeat/protos/http/http.go index 91706a5e30d..6c291e8e83a 100644 --- a/packetbeat/protos/http/http.go +++ b/packetbeat/protos/http/http.go @@ -27,8 +27,6 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/ecs" @@ -708,7 +706,7 @@ func decodeBody(body []byte, encodings []string, maxSize int) (result []byte, er if idx != 0 { body = nil } - return body, errors.Wrapf(err, "unable to decode body using %s encoding", format) + return body, fmt.Errorf("unable to decode body using %s encoding: %w", format, err) } } return body, nil diff --git a/packetbeat/publish/publish.go b/packetbeat/publish/publish.go index 9c64727de35..257ad027a70 100644 --- a/packetbeat/publish/publish.go +++ b/packetbeat/publish/publish.go @@ -18,10 +18,9 @@ package publish import ( + "errors" "net" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/processors" diff --git a/packetbeat/scripts/mage/package.go b/packetbeat/scripts/mage/package.go index fdbb2b69bb5..76373df2b73 100644 --- a/packetbeat/scripts/mage/package.go +++ b/packetbeat/scripts/mage/package.go @@ -18,11 +18,10 @@ package mage import ( + "fmt" "os" "path/filepath" - "github.com/pkg/errors" - devtools "github.com/elastic/beats/v7/dev-tools/mage" ) @@ -93,7 +92,7 @@ func CustomizePackaging() { case devtools.Docker: args.Spec.ExtraVar("linux_capabilities", "cap_net_raw,cap_net_admin+eip") default: - panic(errors.Errorf("unhandled package type: %v", pkgType)) + panic(fmt.Errorf("unhandled package type: %v", pkgType)) } } } diff --git a/testing/environments/latest.yml b/testing/environments/latest.yml index d0d62c5cab6..8b21daa6fe8 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.8.1 + image: docker.elastic.co/elasticsearch/elasticsearch:8.9.1 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.8.1 + image: docker.elastic.co/logstash/logstash:8.9.1 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.8.1 + image: docker.elastic.co/kibana/kibana:8.9.1 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5601"] retries: 300 diff --git a/testing/environments/snapshot.yml b/testing/environments/snapshot.yml index 4595b6fc1b0..c677b79ee8a 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.9.0-9ee1e6fb-SNAPSHOT + image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0-16180d4a-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.9.0-9ee1e6fb-SNAPSHOT + image: docker.elastic.co/logstash/logstash:8.11.0-16180d4a-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.9.0-9ee1e6fb-SNAPSHOT + image: docker.elastic.co/kibana/kibana:8.11.0-16180d4a-SNAPSHOT environment: - "ELASTICSEARCH_USERNAME=kibana_system_user" - "ELASTICSEARCH_PASSWORD=testing" diff --git a/winlogbeat/beater/winlogbeat.go b/winlogbeat/beater/winlogbeat.go index 89e2144d4c3..78e7f24ff0b 100644 --- a/winlogbeat/beater/winlogbeat.go +++ b/winlogbeat/beater/winlogbeat.go @@ -162,6 +162,18 @@ func (eb *Winlogbeat) Run(b *beat.Beat) error { } } + if b.Manager != nil { + b.Manager.RegisterDiagnosticHook("input_metrics", "Metrics from active inputs.", + "input_metrics.json", "application/json", func() []byte { + data, err := inputmon.MetricSnapshotJSON() + if err != nil { + logp.L().Warnw("Failed to collect input metric snapshot for Agent diagnostics.", "error", err) + return []byte(err.Error()) + } + return data + }) + } + var wg sync.WaitGroup for _, log := range eb.eventLogs { state := persistedState[log.source.Name()] diff --git a/winlogbeat/docs/troubleshooting.asciidoc b/winlogbeat/docs/troubleshooting.asciidoc index bc9f7dddacc..e14d6802c2a 100644 --- a/winlogbeat/docs/troubleshooting.asciidoc +++ b/winlogbeat/docs/troubleshooting.asciidoc @@ -7,6 +7,7 @@ If you have issues installing or running Winlogbeat, read the following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -25,3 +26,15 @@ include::{libbeat-dir}/getting-help.asciidoc[] == Debug include::{libbeat-dir}/debugging.asciidoc[] + +//sets block macro for metrics-in-logs.asciidoc included in next section + +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ + +include::{libbeat-dir}/metrics-in-logs.asciidoc[] \ No newline at end of file diff --git a/winlogbeat/eventlog/wineventlog.go b/winlogbeat/eventlog/wineventlog.go index 4f1cb38b171..a69774fa52f 100644 --- a/winlogbeat/eventlog/wineventlog.go +++ b/winlogbeat/eventlog/wineventlog.go @@ -277,8 +277,7 @@ func newWinEventLog(options *conf.C) (EventLog, error) { // efficient and does not attempt to use local message files for rendering // the event's message. switch { - case c.Forwarded == nil && c.Name == "ForwardedEvents", - c.Forwarded != nil && *c.Forwarded: + case l.isForwarded(): l.render = func(event win.EvtHandle, out io.Writer) error { return win.RenderEventXML(event, l.renderBuf, out) } @@ -294,6 +293,11 @@ func newWinEventLog(options *conf.C) (EventLog, error) { return l, nil } +func (l *winEventLog) isForwarded() bool { + c := l.config + return (c.Forwarded != nil && *c.Forwarded) || (c.Forwarded == nil && c.Name == "ForwardedEvents") +} + // Name returns the name of the event log (i.e. Application, Security, etc.). func (l *winEventLog) Name() string { return l.id @@ -332,7 +336,7 @@ func (l *winEventLog) Open(state checkpoint.EventLogState) error { func (l *winEventLog) openFile(state checkpoint.EventLogState, bookmark win.EvtHandle) error { path := l.channelName - h, err := win.EvtQuery(0, path, "", win.EvtQueryFilePath|win.EvtQueryForwardDirection) + h, err := win.EvtQuery(0, path, l.query, win.EvtQueryFilePath|win.EvtQueryForwardDirection) if err != nil { l.metrics.logError(err) return fmt.Errorf("failed to get handle to event log file %v: %w", path, err) @@ -382,9 +386,12 @@ func (l *winEventLog) openChannel(bookmark win.EvtHandle) error { var flags win.EvtSubscribeFlag if bookmark > 0 { - // Use EvtSubscribeStrict to detect when the bookmark is missing and be able to - // subscribe again from the beginning. - flags = win.EvtSubscribeStartAfterBookmark | win.EvtSubscribeStrict + flags = win.EvtSubscribeStartAfterBookmark + if !l.isForwarded() { + // Use EvtSubscribeStrict to detect when the bookmark is missing and be able to + // subscribe again from the beginning. + flags |= win.EvtSubscribeStrict + } } else { flags = win.EvtSubscribeStartAtOldestRecord } @@ -424,6 +431,7 @@ func (l *winEventLog) Read() ([]Record, error) { return nil, err } + //nolint:prealloc // Avoid unnecessary preallocation for each reader every second when event log is inactive. var records []Record defer func() { l.metrics.log(records) diff --git a/winlogbeat/eventlog/wineventlog_experimental.go b/winlogbeat/eventlog/wineventlog_experimental.go index f035f76b66e..dc1d8997109 100644 --- a/winlogbeat/eventlog/wineventlog_experimental.go +++ b/winlogbeat/eventlog/wineventlog_experimental.go @@ -135,6 +135,11 @@ func newWinEventLogExp(options *conf.C) (EventLog, error) { return l, nil } +func (l *winEventLogExp) isForwarded() bool { + c := l.config + return (c.Forwarded != nil && *c.Forwarded) || (c.Forwarded == nil && c.Name == "ForwardedEvents") +} + // Name returns the name of the event log (i.e. Application, Security, etc.). func (l *winEventLogExp) Name() string { return l.id @@ -182,7 +187,7 @@ func (l *winEventLogExp) open(state checkpoint.EventLogState) (win.EvtHandle, er func (l *winEventLogExp) openFile(state checkpoint.EventLogState, bookmark win.Bookmark) (win.EvtHandle, error) { path := l.channelName - h, err := win.EvtQuery(0, path, "", win.EvtQueryFilePath|win.EvtQueryForwardDirection) + h, err := win.EvtQuery(0, path, l.query, win.EvtQueryFilePath|win.EvtQueryForwardDirection) if err != nil { return win.NilHandle, fmt.Errorf("failed to get handle to event log file %v: %w", path, err) } @@ -227,9 +232,12 @@ func (l *winEventLogExp) openChannel(bookmark win.Bookmark) (win.EvtHandle, erro var flags win.EvtSubscribeFlag if bookmark > 0 { - // Use EvtSubscribeStrict to detect when the bookmark is missing and be able to - // subscribe again from the beginning. - flags = win.EvtSubscribeStartAfterBookmark | win.EvtSubscribeStrict + flags = win.EvtSubscribeStartAfterBookmark + if !l.isForwarded() { + // Use EvtSubscribeStrict to detect when the bookmark is missing and be able to + // subscribe again from the beginning. + flags |= win.EvtSubscribeStrict + } } else { flags = win.EvtSubscribeStartAtOldestRecord } @@ -256,6 +264,7 @@ func (l *winEventLogExp) openChannel(bookmark win.Bookmark) (win.EvtHandle, erro } func (l *winEventLogExp) Read() ([]Record, error) { + //nolint:prealloc // Avoid unnecessary preallocation for each reader every second when event log is inactive. var records []Record defer func() { l.metrics.log(records) diff --git a/winlogbeat/eventlog/wineventlog_test.go b/winlogbeat/eventlog/wineventlog_test.go index cd3eee71170..c0616021d22 100644 --- a/winlogbeat/eventlog/wineventlog_test.go +++ b/winlogbeat/eventlog/wineventlog_test.go @@ -270,6 +270,7 @@ func testWindowsEventLog(t *testing.T, api string) { assert.Equal(t, totalEvents, eventCount) }) + // Test reading .evtx file without any query filters t.Run("evtx_file", func(t *testing.T) { path, err := filepath.Abs("../sys/wineventlog/testdata/sysmon-9.01.evtx") if err != nil { @@ -295,6 +296,34 @@ func testWindowsEventLog(t *testing.T, api string) { assert.Len(t, records, 32) }) + + // Test reading .evtx file with event_id filter + t.Run("evtx_file_with_query", func(t *testing.T) { + path, err := filepath.Abs("../sys/wineventlog/testdata/sysmon-9.01.evtx") + if err != nil { + t.Fatal(err) + } + + log := openLog(t, map[string]interface{}{ + "name": path, + "no_more_events": "stop", + "event_id": "3, 5", + }) + defer log.Close() + + records, err := log.Read() + + // This implementation returns the EOF on the next call. + if err == nil && api == winEventLogAPIName { + _, err = log.Read() + } + + if assert.Error(t, err, "no_more_events=stop requires io.EOF to be returned") { + assert.Equal(t, io.EOF, err) + } + + assert.Len(t, records, 21) + }) } // ---- Utility Functions ----- diff --git a/winlogbeat/scripts/mage/docs.go b/winlogbeat/scripts/mage/docs.go index 0b59d3e79b1..510ae7558ec 100644 --- a/winlogbeat/scripts/mage/docs.go +++ b/winlogbeat/scripts/mage/docs.go @@ -25,8 +25,6 @@ import ( "regexp" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/dev-tools/mage" ) @@ -58,7 +56,7 @@ func moduleDocs() error { return err } if len(files) == 0 { - return errors.Errorf("No modules found matching %v", searchPath) + return fmt.Errorf("No modules found matching %v", searchPath) } // Clean existing files. @@ -71,7 +69,7 @@ func moduleDocs() error { for _, f := range files { matches := moduleNameRegex.FindStringSubmatch(filepath.ToSlash(f)) if len(matches) != 2 { - return errors.Errorf("module path %v does not match regexp", f) + return fmt.Errorf("module path %v does not match regexp", f) } name := matches[1] names = append(names, name) diff --git a/winlogbeat/scripts/mage/package.go b/winlogbeat/scripts/mage/package.go index 81e090092bd..20cde9f551b 100644 --- a/winlogbeat/scripts/mage/package.go +++ b/winlogbeat/scripts/mage/package.go @@ -23,7 +23,6 @@ import ( "time" "github.com/magefile/mage/mg" - "github.com/pkg/errors" devtools "github.com/elastic/beats/v7/dev-tools/mage" "github.com/elastic/beats/v7/dev-tools/mage/target/build" @@ -86,7 +85,7 @@ func customizePackaging() { case devtools.Deb, devtools.RPM: args.Spec.Files["/etc/{{.BeatName}}/module"] = moduleDir default: - panic(errors.Errorf("unhandled package type: %v", pkgType)) + panic(fmt.Errorf("unhandled package type: %v", pkgType)) } } } diff --git a/x-pack/dockerlogbeat/handlers.go b/x-pack/dockerlogbeat/handlers.go index 8b3a771a741..31466d44b65 100644 --- a/x-pack/dockerlogbeat/handlers.go +++ b/x-pack/dockerlogbeat/handlers.go @@ -6,6 +6,7 @@ package main import ( "encoding/json" + "fmt" "io" "net/http" @@ -14,7 +15,6 @@ import ( "github.com/elastic/beats/v7/x-pack/dockerlogbeat/pipelinemanager" "github.com/docker/docker/pkg/ioutils" - "github.com/pkg/errors" ) // StartLoggingRequest represents the request object we get on a call to //LogDriver.StartLogging @@ -54,7 +54,7 @@ func startLoggingHandler(pm *pipelinemanager.PipelineManager) func(w http.Respon var startReq StartLoggingRequest err := json.NewDecoder(r.Body).Decode(&startReq) if err != nil { - http.Error(w, errors.Wrap(err, "error decoding json request").Error(), http.StatusBadRequest) + http.Error(w, fmt.Sprintf("error decoding json request: %v", err), http.StatusBadRequest) return } @@ -64,13 +64,13 @@ func startLoggingHandler(pm *pipelinemanager.PipelineManager) func(w http.Respon cfg, err := pipelinemanager.NewCfgFromRaw(startReq.Info.Config) if err != nil { - http.Error(w, errors.Wrap(err, "error creating client config").Error(), http.StatusBadRequest) + http.Error(w, fmt.Errorf("error creating client config: %w", err).Error(), http.StatusBadRequest) return } pm.Logger.Debugf("Got config: %#v", cfg) cl, err := pm.CreateClientWithConfig(cfg, startReq.Info, startReq.File) if err != nil { - http.Error(w, errors.Wrap(err, "error creating client").Error(), http.StatusBadRequest) + http.Error(w, fmt.Errorf("error creating client: %w", err).Error(), http.StatusBadRequest) return } @@ -86,7 +86,7 @@ func stopLoggingHandler(pm *pipelinemanager.PipelineManager) func(w http.Respons var stopReq StopLoggingRequest err := json.NewDecoder(r.Body).Decode(&stopReq) if err != nil { - http.Error(w, errors.Wrap(err, "error decoding json request").Error(), http.StatusBadRequest) + http.Error(w, fmt.Errorf("error decoding json request: %w", err).Error(), http.StatusBadRequest) return } pm.Logger.Debugf("Got stop request object %#v\n", stopReq) @@ -108,14 +108,14 @@ func readLogHandler(pm *pipelinemanager.PipelineManager) func(w http.ResponseWri var logReq logsRequest err := json.NewDecoder(r.Body).Decode(&logReq) if err != nil { - http.Error(w, errors.Wrap(err, "error decoding json request").Error(), http.StatusBadRequest) + http.Error(w, fmt.Errorf("error decoding json request: %w", err).Error(), http.StatusBadRequest) return } pm.Logger.Debugf("Got logging request for container %s\n", logReq.Info.ContainerName) stream, err := pm.CreateReaderForContainer(logReq.Info, logReq.Config) if err != nil { - http.Error(w, errors.Wrap(err, "error creating log reader").Error(), http.StatusBadRequest) + http.Error(w, fmt.Errorf("error creating log reader: %w", err).Error(), http.StatusBadRequest) return } defer stream.Close() diff --git a/x-pack/dockerlogbeat/magefile.go b/x-pack/dockerlogbeat/magefile.go index 3b848ce92c0..73da67186d7 100644 --- a/x-pack/dockerlogbeat/magefile.go +++ b/x-pack/dockerlogbeat/magefile.go @@ -24,7 +24,6 @@ import ( "github.com/docker/docker/client" "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" - "github.com/pkg/errors" devtools "github.com/elastic/beats/v7/dev-tools/mage" // mage:import @@ -71,7 +70,7 @@ func init() { func getPluginName() (string, error) { version, err := devtools.BeatQualifiedVersion() if err != nil { - return "", errors.Wrap(err, "error getting beats version") + return "", fmt.Errorf("error getting beats version: %w", err) } return dockerPluginName + ":" + version, nil } @@ -80,35 +79,35 @@ func getPluginName() (string, error) { func createContainer(ctx context.Context, cli *client.Client, arch string) error { dockerLogBeatDir, err := os.Getwd() if err != nil { - return errors.Wrap(err, "error getting work dir") + return fmt.Errorf("error getting work dir: %w", err) } if !strings.Contains(dockerLogBeatDir, "dockerlogbeat") { - return errors.Errorf("not in dockerlogbeat directory: %s", dockerLogBeatDir) + return fmt.Errorf("not in dockerlogbeat directory: %s", dockerLogBeatDir) } dockerfile := filepath.Join(packageStagingDir, "Dockerfile") err = devtools.ExpandFile(dockerfileTmpl, dockerfile, platformMap[arch]) if err != nil { - return errors.Wrap(err, "error while expanding Dockerfile template") + return fmt.Errorf("error while expanding Dockerfile template: %w", err) } // start to build the root container that'll be used to build the plugin tmpDir, err := ioutil.TempDir("", "dockerBuildTar") if err != nil { - return errors.Wrap(err, "error locating temp dir") + return fmt.Errorf("error locating temp dir: %w", err) } defer sh.Rm(tmpDir) tarPath := filepath.Join(tmpDir, "tarRoot.tar") err = sh.RunV("tar", "cf", tarPath, "./") if err != nil { - return errors.Wrap(err, "error creating tar") + return fmt.Errorf("error creating tar: %w", err) } buildContext, err := os.Open(tarPath) if err != nil { - return errors.Wrap(err, "error opening temp dur") + return fmt.Errorf("error opening temp dur: %w", err) } defer buildContext.Close() @@ -119,13 +118,13 @@ func createContainer(ctx context.Context, cli *client.Client, arch string) error // build, wait for output buildResp, err := cli.ImageBuild(ctx, buildContext, buildOpts) if err != nil { - return errors.Wrap(err, "error building final container image") + return fmt.Errorf("error building final container image: %w", err) } defer buildResp.Body.Close() // This blocks until the build operation completes buildStr, errBufRead := ioutil.ReadAll(buildResp.Body) if errBufRead != nil { - return errors.Wrap(err, "error reading from docker output") + return fmt.Errorf("error reading from docker output: %w", errBufRead) } fmt.Printf("%s\n", string(buildStr)) @@ -143,14 +142,14 @@ func BuildContainer(ctx context.Context) error { // setup cli, err := newDockerClient(ctx) if err != nil { - return errors.Wrap(err, "error creating docker client") + return fmt.Errorf("error creating docker client: %w", err) } devtools.CreateDir(packageStagingDir) devtools.CreateDir(packageEndDir) err = os.MkdirAll(filepath.Join(buildDir, "rootfs"), 0755) if err != nil { - return errors.Wrap(err, "error creating build dir") + return fmt.Errorf("error creating build dir: %w", err) } for _, plat := range devtools.Platforms { @@ -162,13 +161,13 @@ func BuildContainer(ctx context.Context) error { err = createContainer(ctx, cli, arch) if err != nil { - return errors.Wrap(err, "error creating base container") + return fmt.Errorf("error creating base container: %w", err) } // create the container that will become our rootfs CreatedContainerBody, err := cli.ContainerCreate(ctx, &container.Config{Image: rootImageName}, nil, nil, nil, "") if err != nil { - return errors.Wrap(err, "error creating container") + return fmt.Errorf("error creating container: %w", err) } defer func() { @@ -185,31 +184,31 @@ func BuildContainer(ctx context.Context) error { file, err := os.Create(dockerExportPath) if err != nil { - return errors.Wrap(err, "error creating tar archive") + return fmt.Errorf("error creating tar archive: %w", err) } // export the container to a tar file exportReader, err := cli.ContainerExport(ctx, CreatedContainerBody.ID) if err != nil { - return errors.Wrap(err, "error exporting container") + return fmt.Errorf("error exporting container: %w", err) } _, err = io.Copy(file, exportReader) if err != nil { - return errors.Wrap(err, "error writing exported container") + return fmt.Errorf("error writing exported container: %w", err) } // misc prepare operations err = devtools.Copy("config.json", filepath.Join(buildDir, "config.json")) if err != nil { - return errors.Wrap(err, "error copying config.json") + return fmt.Errorf("error copying config.json: %w", err) } // unpack the tar file into a root directory, which is the format needed for the docker plugin create tool err = sh.RunV("tar", "-xf", dockerExportPath, "-C", filepath.Join(buildDir, "rootfs")) if err != nil { - return errors.Wrap(err, "error unpacking exported container") + return fmt.Errorf("error unpacking exported container: %w", err) } } @@ -220,12 +219,12 @@ func cleanDockerArtifacts(ctx context.Context, containerID string, cli *client.C fmt.Printf("Removing container %s\n", containerID) err := cli.ContainerRemove(ctx, containerID, types.ContainerRemoveOptions{RemoveVolumes: true, Force: true}) if err != nil { - return errors.Wrap(err, "error removing container") + return fmt.Errorf("error removing container: %w", err) } resp, err := cli.ImageRemove(ctx, rootImageName, types.ImageRemoveOptions{Force: true}) if err != nil { - return errors.Wrap(err, "error removing image") + return fmt.Errorf("error removing image: %w", err) } fmt.Printf("Removed image: %#v\n", resp) return nil @@ -235,13 +234,13 @@ func cleanDockerArtifacts(ctx context.Context, containerID string, cli *client.C func Uninstall(ctx context.Context) error { cli, err := newDockerClient(ctx) if err != nil { - return errors.Wrap(err, "error creating docker client") + return fmt.Errorf("error creating docker client: %w", err) } // check to see if we have a plugin we need to remove plugins, err := cli.PluginList(ctx, filters.Args{}) if err != nil { - return errors.Wrap(err, "error getting list of plugins") + return fmt.Errorf("error getting list of plugins: %w", err) } toRemoveName := "" @@ -257,11 +256,11 @@ func Uninstall(ctx context.Context) error { err = cli.PluginDisable(ctx, toRemoveName, types.PluginDisableOptions{Force: true}) if err != nil { - return errors.Wrap(err, "error disabling plugin") + return fmt.Errorf("error disabling plugin: %w", err) } err = cli.PluginRemove(ctx, toRemoveName, types.PluginRemoveOptions{Force: true}) if err != nil { - return errors.Wrap(err, "error removing plugin") + return fmt.Errorf("error removing plugin: %w", err) } return nil @@ -281,22 +280,22 @@ func Install(ctx context.Context) error { cli, err := newDockerClient(ctx) if err != nil { - return errors.Wrap(err, "error creating docker client") + return fmt.Errorf("error creating docker client: %w", err) } archive, err := tar(buildDir, "rootfs", "config.json") if err != nil { - return errors.Wrap(err, "error creating archive of work dir") + return fmt.Errorf("error creating archive of work dir: %w", err) } err = cli.PluginCreate(ctx, archive, types.PluginCreateOptions{RepoName: name}) if err != nil { - return errors.Wrap(err, "error creating plugin") + return fmt.Errorf("error creating plugin: %w", err) } err = cli.PluginEnable(ctx, name, types.PluginEnableOptions{}) if err != nil { - return errors.Wrap(err, "error enabling plugin") + return fmt.Errorf("error enabling plugin: %w", err) } return nil @@ -308,7 +307,7 @@ func tar(dir string, files ...string) (io.Reader, error) { args := append([]string{"-C", dir, "-cf", "-"}, files...) _, err := sh.Exec(nil, &archive, &stdErr, "tar", args...) if err != nil { - return nil, errors.Wrap(err, stdErr.String()) + return nil, fmt.Errorf(stdErr.String()+": %w", err) } return &archive, nil @@ -318,7 +317,7 @@ func tar(dir string, files ...string) (io.Reader, error) { func Export() error { version, err := devtools.BeatQualifiedVersion() if err != nil { - return errors.Wrap(err, "error getting beats version") + return fmt.Errorf("error getting beats version: %w", err) } if devtools.Snapshot { @@ -333,16 +332,20 @@ func Export() error { err = os.Chdir(packageStagingDir) if err != nil { - return errors.Wrap(err, "error changing directory") + return fmt.Errorf("error changing directory: %w", err) } err = sh.RunV("tar", "zcf", outpath, filepath.Join(logDriverName, "rootfs"), filepath.Join(logDriverName, "config.json")) if err != nil { - return errors.Wrap(err, "error creating release tarball") + return fmt.Errorf("error creating release tarball: %w", err) } - return errors.Wrap(devtools.CreateSHA512File(outpath), "failed to create .sha512 file") + + if err = devtools.CreateSHA512File(outpath); err != nil { + return fmt.Errorf("failed to create .sha512 file: %w", err) + } + return nil } return nil diff --git a/x-pack/dockerlogbeat/pipelinemanager/config.go b/x-pack/dockerlogbeat/pipelinemanager/config.go index 46a10a7fe6b..b6bbf3a26fe 100644 --- a/x-pack/dockerlogbeat/pipelinemanager/config.go +++ b/x-pack/dockerlogbeat/pipelinemanager/config.go @@ -5,10 +5,10 @@ package pipelinemanager import ( + "errors" + "fmt" "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common/transform/typeconv" "github.com/elastic/elastic-agent-libs/config" ) @@ -66,11 +66,11 @@ func (cfg ContainerOutputConfig) CreateConfig() (*config.C, error) { var tmp map[string]interface{} err := typeconv.Convert(&tmp, cfg) if err != nil { - return nil, errors.Wrap(err, "error converting config struct to interface") + return nil, fmt.Errorf("error converting config struct to interface: %w", err) } cfgFinal, err := config.NewConfigFrom(tmp) if err != nil { - return nil, errors.Wrap(err, "error creating config object") + return nil, fmt.Errorf("error creating config object: %w", err) } return cfgFinal, nil diff --git a/x-pack/dockerlogbeat/pipelinemanager/pipelineManager.go b/x-pack/dockerlogbeat/pipelinemanager/pipelineManager.go index 9115027e110..1e0179d2fa3 100644 --- a/x-pack/dockerlogbeat/pipelinemanager/pipelineManager.go +++ b/x-pack/dockerlogbeat/pipelinemanager/pipelineManager.go @@ -17,8 +17,6 @@ import ( "github.com/elastic/beats/v7/x-pack/dockerlogbeat/pipereader" "github.com/elastic/elastic-agent-libs/config" - "github.com/pkg/errors" - "github.com/docker/docker/api/types/plugins/logdriver" "github.com/docker/docker/daemon/logger" "github.com/docker/docker/daemon/logger/jsonfilelog" @@ -77,7 +75,7 @@ func (pm *PipelineManager) CloseClientWithFile(file string) error { cl, err := pm.removeClient(file) if err != nil { - return errors.Wrap(err, "Error removing client") + return fmt.Errorf("Error removing client: %w", err) } hash := cl.pipelineHash @@ -88,7 +86,7 @@ func (pm *PipelineManager) CloseClientWithFile(file string) error { pm.Logger.Debugf("Closing Client first from pipelineManager") err = cl.Close() if err != nil { - return errors.Wrap(err, "error closing client") + return fmt.Errorf("error closing client: %w", err) } // if the pipeline is no longer in use, clean up @@ -103,16 +101,16 @@ func (pm *PipelineManager) CreateClientWithConfig(containerConfig ContainerOutpu hashstring, err := hashstructure.Hash(containerConfig, nil) if err != nil { - return nil, errors.Wrap(err, "error creating config hash") + return nil, fmt.Errorf("error creating config hash: %w", err) } pipeline, err := pm.getOrCreatePipeline(containerConfig, hashstring) if err != nil { - return nil, errors.Wrap(err, "error getting pipeline") + return nil, fmt.Errorf("error getting pipeline: %w", err) } reader, err := pipereader.NewReaderFromPath(file) if err != nil { - return nil, errors.Wrap(err, "error creating reader for docker log stream") + return nil, fmt.Errorf("error creating reader for docker log stream: %w", err) } // Why is this empty by default? What should be here? Who knows! @@ -121,7 +119,7 @@ func (pm *PipelineManager) CreateClientWithConfig(containerConfig ContainerOutpu } err = os.MkdirAll(filepath.Dir(info.LogPath), 0755) if err != nil { - return nil, errors.Wrap(err, "error creating directory for local logs") + return nil, fmt.Errorf("error creating directory for local logs: %w", err) } // set a default log size if _, ok := info.Config["max-size"]; !ok { @@ -134,13 +132,13 @@ func (pm *PipelineManager) CreateClientWithConfig(containerConfig ContainerOutpu localLog, err := jsonfilelog.New(info) if err != nil { - return nil, errors.Wrap(err, "error creating local log") + return nil, fmt.Errorf("error creating local log: %w", err) } //actually get to crafting the new client. cl, err := newClientFromPipeline(pipeline.pipeline, reader, hashstring, info, localLog, pm.hostname) if err != nil { - return nil, errors.Wrap(err, "error creating client") + return nil, fmt.Errorf("error creating client: %w", err) } pm.registerClient(cl, hashstring, file) @@ -211,7 +209,7 @@ func (pm *PipelineManager) getOrCreatePipeline(logOptsConfig ContainerOutputConf if !test { pipeline, err = loadNewPipeline(logOptsConfig, pm.hostname, pm.Logger) if err != nil { - return nil, errors.Wrap(err, "error loading pipeline") + return nil, fmt.Errorf("error loading pipeline: %w", err) } pm.pipelines[hash] = pipeline } diff --git a/x-pack/dockerlogbeat/pipelinemanager/selector.go b/x-pack/dockerlogbeat/pipelinemanager/selector.go index 624e8528b09..637837a35b1 100644 --- a/x-pack/dockerlogbeat/pipelinemanager/selector.go +++ b/x-pack/dockerlogbeat/pipelinemanager/selector.go @@ -7,8 +7,6 @@ package pipelinemanager import ( "fmt" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/outputs" "github.com/elastic/beats/v7/libbeat/outputs/outil" @@ -36,7 +34,7 @@ func (s *IdxSupport) BuildSelector(cfg *config.C) (outputs.IndexSelector, error) if cfg.HasField("indicies") { sub, err := cfg.Child("indices", -1) if err != nil { - return nil, errors.Wrap(err, "error getting indicies field") + return nil, fmt.Errorf("error getting indicies field: %w", err) } bsCfg.SetChild("indices", -1, sub) } @@ -64,7 +62,7 @@ func (s *IdxSupport) BuildSelector(cfg *config.C) (outputs.IndexSelector, error) indexSel, err := outil.BuildSelectorFromConfig(bsCfg, buildSettings) if err != nil { - return nil, errors.Wrap(err, "error creating build Selector") + return nil, fmt.Errorf("error creating build Selector: %w", err) } return indexSel, nil diff --git a/x-pack/dockerlogbeat/pipereader/reader.go b/x-pack/dockerlogbeat/pipereader/reader.go index d1f8eb05c21..6ca20f301b3 100644 --- a/x-pack/dockerlogbeat/pipereader/reader.go +++ b/x-pack/dockerlogbeat/pipereader/reader.go @@ -7,6 +7,7 @@ package pipereader import ( "context" "encoding/binary" + "fmt" "io" "io/ioutil" "syscall" @@ -14,7 +15,6 @@ import ( "github.com/containerd/fifo" "github.com/docker/docker/api/types/plugins/logdriver" "github.com/gogo/protobuf/proto" - "github.com/pkg/errors" ) // PipeReader reads from the FIFO pipe we get from the docker container @@ -30,7 +30,7 @@ type PipeReader struct { func NewReaderFromPath(file string) (*PipeReader, error) { inputFile, err := fifo.OpenFifo(context.Background(), file, syscall.O_RDONLY, 0700) if err != nil { - return nil, errors.Wrapf(err, "error opening logger fifo: %q", file) + return nil, fmt.Errorf("error opening logger fifo: %q: %w", file, err) } return &PipeReader{fifoPipe: inputFile, byteOrder: binary.BigEndian, lenFrameBuf: make([]byte, 4), bodyBuf: nil, maxSize: 2e6}, nil @@ -63,7 +63,7 @@ func (reader *PipeReader) ReadMessage(log *logdriver.LogEntry) error { // 2) we have a too-large message. Disregard length bytes _, err = io.CopyBuffer(ioutil.Discard, io.LimitReader(reader.fifoPipe, int64(lenFrame)), reader.bodyBuf) if err != nil { - return errors.Wrap(err, "error emptying buffer") + return fmt.Errorf("error emptying buffer: %w", err) } } @@ -71,7 +71,7 @@ func (reader *PipeReader) ReadMessage(log *logdriver.LogEntry) error { readBuf := reader.setBuffer(lenFrame) _, err = io.ReadFull(reader.fifoPipe, readBuf[:lenFrame]) if err != nil { - return errors.Wrap(err, "error reading buffer") + return fmt.Errorf("error reading buffer: %w", err) } return proto.Unmarshal(readBuf[:lenFrame], log) diff --git a/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc b/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc index 1df7f4bb341..794a51de081 100644 --- a/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc @@ -797,7 +797,7 @@ observe the activity of the input. | `sqs_messages_inflight_gauge` | Number of SQS messages inflight (gauge). | `sqs_messages_returned_total` | Number of SQS message returned to queue (happens on errors implicitly after visibility timeout passes). | `sqs_messages_deleted_total` | Number of SQS messages deleted. -| `sqs_messages_waiting_gauge` | Number of SQS messages waiting in the SQS queue (gauge). The value is refreshed every minute via data from GetQueueAttributes. +| `sqs_messages_waiting_gauge` | Number of SQS messages waiting in the SQS queue (gauge). The value is refreshed every minute via data from https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html. A value of `-1` indicates the metric is uninitialized or could not be collected due to an error. | `sqs_worker_utilization` | Rate of SQS worker utilization over previous 5 seconds. 0 indicates idle, 1 indicates all workers utilized. | `sqs_message_processing_time` | Histogram of the elapsed SQS processing times in nanoseconds (time of receipt to time of delete/return). | `sqs_lag_time` | Histogram of the difference between the SQS SentTimestamp attribute and the time when the SQS message was received expressed in nanoseconds. diff --git a/x-pack/filebeat/docs/inputs/input-azure-eventhub.asciidoc b/x-pack/filebeat/docs/inputs/input-azure-eventhub.asciidoc index 8bf489d0833..81cfdc66d52 100644 --- a/x-pack/filebeat/docs/inputs/input-azure-eventhub.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-azure-eventhub.asciidoc @@ -72,3 +72,22 @@ https://management.azure.com/ for azure PublicCloud https://management.usgovcloudapi.net/ for azure USGovernmentCloud Users can also use this in case of a Hybrid Cloud model, where one may define their own endpoints. +[float] +=== Metrics + +This input exposes metrics under the <>. +These metrics are exposed under the `/inputs` path. They can be used to +observe the activity of the input. + +[options="header"] +|======= +| Metric | Description +| `received_messages_total` | Number of messages received from the event hub. +| `received_bytes_total` | Number of bytes received from the event hub. +| `sanitized_messages_total` | Number of messages that were sanitized successfully. +| `processed_messages_total` | Number of messages that were processed successfully. +| `received_events_total` | Number of events received decoding messages. +| `sent_events_total` | Number of events that were sent successfully. +| `processing_time` | Histogram of the elapsed processing times in nanoseconds. +| `decode_errors_total` | Number of errors that occurred while decoding a message. +|======= diff --git a/x-pack/filebeat/docs/inputs/input-cel.asciidoc b/x-pack/filebeat/docs/inputs/input-cel.asciidoc index b4772fe3681..2643714ef7d 100644 --- a/x-pack/filebeat/docs/inputs/input-cel.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-cel.asciidoc @@ -1,6 +1,8 @@ [role="xpack"] :type: cel +:mito_version: v1.5.0 +:mito_docs: https://pkg.go.dev/github.com/elastic/mito@{mito_version} [id="{beatname_lc}-input-{type}"] === Common Expression Language input @@ -42,6 +44,21 @@ filebeat.inputs: }) ---- +or equivalently using the text format from ipify.org + +["source","yaml",subs="attributes"] +---- +filebeat.inputs: +# Fetch your public IP every minute. +- type: cel + interval: 1m + resource.url: https://api.ipify.org/?format=text + program: | + { + "events": [{"ip": string(get(state.url).Body)}] + } +---- + ["source","yaml",subs="attributes"] ---- filebeat.inputs: @@ -68,7 +85,7 @@ filebeat.inputs: ==== Execution -The execution environment provided for the input includes includes the function, macros and global variables provided by the mito and ext.Strings libraries. +The execution environment provided for the input includes includes the functions, macros, and global variables provided by the mito library. A single JSON object is provided as an input accessible through a `state` variable. `state` contains a string `url` field and may contain arbitrary other fields configured via the input's `state` configuration. If the CEL program saves cursor states between executions of the program, the configured `state.cursor` value will be replaced by the saved cursor prior to execution. @@ -120,7 +137,7 @@ The field should be an array, but in the case of an error condition in the CEL p <2> If `cursor` is present it must be either be a single object or an array with the same length as events; each element _i_ of the `cursor` will be the details for obtaining the events at and beyond event _i_ in the `events` array. If the `cursor` is a single object it is will be the details for obtaining events after the last event in the `events` array and will only be retained on successful publication of all the events in the `events` array. -<3> If `rate_limit` is present it must be a map with numeric fields `rate` and `burst`. The `rate_limit` field may also have a string `error` field and other fields which will be logged. If it has an `error` field, the `rate` and `burst` will not be used to set rate limit behavior. The https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Limit[Limit], and https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#OktaRateLimit[Okta Rate Limit policy] and https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#DraftRateLimit[Draft Rate Limit policy] documentation show how to construct this field. +<3> If `rate_limit` is present it must be a map with numeric fields `rate` and `burst`. The `rate_limit` field may also have a string `error` field and other fields which will be logged. If it has an `error` field, the `rate` and `burst` will not be used to set rate limit behavior. The {mito_docs}/lib#Limit[Limit], and {mito_docs}/lib#OktaRateLimit[Okta Rate Limit policy] and {mito_docs}/lib#DraftRateLimit[Draft Rate Limit policy] documentation show how to construct this field. <4> The evaluation is repeated with the new state, after removing the events field, if the "want_more" field is present and true, and a non-zero events array is returned. @@ -130,90 +147,92 @@ The `status_code`, `header` and `rate_limit` values may be omitted if the progra The CEL input will log the complete state after evaluation when logging at the DEBUG level. This will include any sensitive or secret information kept in the `state` object, and so DEBUG level logging should not be used in production when sensitive information is retained in the `state` object. +See <> configuration parameters for settings to exclude sensitive fields from DEBUG logs. ==== CEL extension libraries -As noted above the `cel` input provides function, macro and global variables to extend the language. - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Collections[Collections] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Collate[Collate] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Drop[Drop] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Drop_Empty[Drop Empty] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Flatten[Flatten] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Max[Max] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Min[Min] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-With[With] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-With_Replace[With Replace] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-With_Update[With Update] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Crypto[Crypto] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Base64[Base64] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Base64_Raw[Base64 Raw] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Hex[Hex] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-MD5[MD5] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-SHA_1[SHA-1] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-SHA_256[SHA-256] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-HMAC[HMAC] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-UUID[UUID] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#File[File] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Dir[Dir] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-File[File] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#HTTP[HTTP] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-HEAD[HEAD] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-GET[GET] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-GET_Request[GET Request] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-POST[POST] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-POST_Request[POST Request] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Request[Request] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Basic_Authentication[Basic Authentication] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Do_Request[Do Request] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Parse_URL[Parse URL] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Format_URL[Format URL] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Parse_Query[Parse Query] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Format_Query[Format Query] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#File[File] — the file extension is initialized with MIME handlers for "application/gzip", https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#NDJSON["application/x-ndjson"], https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Zip["application/zip"], https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#CSVNoHeader["text/csv; header=absent"], and https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#CSVHeader["text/csv; header=present"]. -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Dir[Dir] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-File[File] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#JSON[JSON] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Encode_JSON[Encode JSON] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Decode_JSON[Decode JSON] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Decode_JSON_Stream[Decode JSON Stream] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#XML[XML] — the XML extension is initialized with XML schema definitions provided via the `xsd` configuration option. -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Decode_XML[Decode JSON] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Limit[Limit] — the rate limit extension is initialized with https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#OktaRateLimit[Okta (as "okta")] and the https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#DraftRateLimit[Draft Rate Limit (as "draft")] policies. -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Rate_Limit[Rate Limit] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#MIME[MIME] — the MIME extension is initialized with MIME handlers for "application/gzip", https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#NDJSON["application/x-ndjson"], https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Zip["application/zip"], https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#CSVNoHeader["text/csv; header=absent"], and https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#CSVHeader["text/csv; header=present"]. -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-MIME[MIME] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Regexp[Regexp] — the regular expression extension is initialized with the patterns specified in the user input configuration via the `regexp` field. -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Match[RE Match] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Find[RE Find] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Find_All[RE Find All] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Find_Submatch[RE Find Submatch] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Find_All_Submatch[RE Find All Submatch] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-RE_Replace_All[RE Replace All] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Strings[Strings] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-String_Methods[String Methods] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-String_List_Methods[String List Methods] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Bytes_Methods[Bytes Methods] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Time[Time] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Format[Format] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Parse_Time[Parse Time] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Global_Variables[Global Variables] - -* https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#Try[Try] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Try[Try] -** https://pkg.go.dev/github.com/elastic/mito@v1.4.0/lib#hdr-Is_Error[Is Error] +As noted above the `cel` input provides functions, macros, and global variables to extend the language. + +* {mito_docs}/lib#Collections[Collections] +** {mito_docs}/lib#hdr-Collate[Collate] +** {mito_docs}/lib#hdr-Drop[Drop] +** {mito_docs}/lib#hdr-Drop_Empty[Drop Empty] +** {mito_docs}/lib#hdr-Flatten[Flatten] +** {mito_docs}/lib#hdr-Max[Max] +** {mito_docs}/lib#hdr-Min[Min] +** {mito_docs}/lib#hdr-With[With] +** {mito_docs}/lib#hdr-With_Replace[With Replace] +** {mito_docs}/lib#hdr-With_Update[With Update] +** {mito_docs}/lib#hdr-Zip[Zip] + +* {mito_docs}/lib#Crypto[Crypto] +** {mito_docs}/lib#hdr-Base64[Base64] +** {mito_docs}/lib#hdr-Base64_Raw[Base64 Raw] +** {mito_docs}/lib#hdr-Hex[Hex] +** {mito_docs}/lib#hdr-MD5[MD5] +** {mito_docs}/lib#hdr-SHA_1[SHA-1] +** {mito_docs}/lib#hdr-SHA_256[SHA-256] +** {mito_docs}/lib#hdr-HMAC[HMAC] +** {mito_docs}/lib#hdr-UUID[UUID] + +* {mito_docs}/lib#File[File] +** {mito_docs}/lib#hdr-Dir[Dir] +** {mito_docs}/lib#hdr-File[File] + +* {mito_docs}/lib#HTTP[HTTP] +** {mito_docs}/lib#hdr-HEAD[HEAD] +** {mito_docs}/lib#hdr-GET[GET] +** {mito_docs}/lib#hdr-GET_Request[GET Request] +** {mito_docs}/lib#hdr-POST[POST] +** {mito_docs}/lib#hdr-POST_Request[POST Request] +** {mito_docs}/lib#hdr-Request[Request] +** {mito_docs}/lib#hdr-Basic_Authentication[Basic Authentication] +** {mito_docs}/lib#hdr-Do_Request[Do Request] +** {mito_docs}/lib#hdr-Parse_URL[Parse URL] +** {mito_docs}/lib#hdr-Format_URL[Format URL] +** {mito_docs}/lib#hdr-Parse_Query[Parse Query] +** {mito_docs}/lib#hdr-Format_Query[Format Query] + +* {mito_docs}/lib#File[File] — the file extension is initialized with MIME handlers for "application/gzip", {mito_docs}/lib#NDJSON["application/x-ndjson"], {mito_docs}/lib#Zip["application/zip"], {mito_docs}/lib#CSVNoHeader["text/csv; header=absent"], and {mito_docs}/lib#CSVHeader["text/csv; header=present"]. +** {mito_docs}/lib#hdr-Dir[Dir] +** {mito_docs}/lib#hdr-File[File] + +* {mito_docs}/lib#JSON[JSON] +** {mito_docs}/lib#hdr-Encode_JSON[Encode JSON] +** {mito_docs}/lib#hdr-Decode_JSON[Decode JSON] +** {mito_docs}/lib#hdr-Decode_JSON_Stream[Decode JSON Stream] + +* {mito_docs}/lib#XML[XML] — the XML extension is initialized with XML schema definitions provided via the `xsd` configuration option. +** {mito_docs}/lib#hdr-Decode_XML[Decode XML] + +* {mito_docs}/lib#Limit[Limit] — the rate limit extension is initialized with {mito_docs}/lib#OktaRateLimit[Okta (as "okta")] and the {mito_docs}/lib#DraftRateLimit[Draft Rate Limit (as "draft")] policies. +** {mito_docs}/lib#hdr-Rate_Limit[Rate Limit] + +* {mito_docs}/lib#MIME[MIME] — the MIME extension is initialized with MIME handlers for "application/gzip", {mito_docs}/lib#NDJSON["application/x-ndjson"], {mito_docs}/lib#Zip["application/zip"], {mito_docs}/lib#CSVNoHeader["text/csv; header=absent"], and {mito_docs}/lib#CSVHeader["text/csv; header=present"]. +** {mito_docs}/lib#hdr-MIME[MIME] + +* {mito_docs}/lib#Regexp[Regexp] — the regular expression extension is initialized with the patterns specified in the user input configuration via the `regexp` field. +** {mito_docs}/lib#hdr-RE_Match[RE Match] +** {mito_docs}/lib#hdr-RE_Find[RE Find] +** {mito_docs}/lib#hdr-RE_Find_All[RE Find All] +** {mito_docs}/lib#hdr-RE_Find_Submatch[RE Find Submatch] +** {mito_docs}/lib#hdr-RE_Find_All_Submatch[RE Find All Submatch] +** {mito_docs}/lib#hdr-RE_Replace_All[RE Replace All] + +* {mito_docs}/lib#Strings[Strings] +** {mito_docs}/lib#hdr-String_Methods[String Methods] +** {mito_docs}/lib#hdr-String_List_Methods[String List Methods] +** {mito_docs}/lib#hdr-Bytes_Methods[Bytes Methods] + +* {mito_docs}/lib#Time[Time] +** {mito_docs}/lib#hdr-Format[Format] +** {mito_docs}/lib#hdr-Parse_Time[Parse Time] +** {mito_docs}/lib#hdr-Global_Variables[Global Variables] + +* {mito_docs}/lib#Try[Try] +** {mito_docs}/lib#hdr-Try[Try] +** {mito_docs}/lib#hdr-Is_Error[Is Error] 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. @@ -345,7 +364,7 @@ XML documents may require additional type information to enable correct parsing filebeat.inputs: - type: cel # Provide an XSD, 'order', for use during CEL execution (truncated for example). - regexp: + xsd: order: | @@ -631,6 +650,38 @@ Whether to use the host's local time rather that UTC for timestamping rotated lo This determines whether rotated logs should be gzip compressed. +[[cel-state-redact]] +[float] +==== `redact` + +During debug level logging, the `state` object and the resulting evaluation result are included in logs. This may result in leaking of secrets. In order to prevent this, fields may be redacted or deleted from the logged `state`. The `redact` configuration allows users to configure this field redaction behaviour. For safety reasons if the `redact` configuration is missing a warning is logged. + +In the case of no-required redaction an empty `redact.fields` configuration should be used to silence the logged warning. + +["source","yaml",subs="attributes"] +---- +- type: cel + redact: + fields: ~ +---- + +As an example, if a user-constructed Basic Authentication request is used in a CEL program the password can be redacted like so + +["source","yaml",subs="attributes"] +---- +filebeat.inputs: +- type: cel + resource.url: http://localhost:9200/_search + state: + user: user@domain.tld + password: P@$$W0₹D + redact: + fields: password + delete: true +---- + +Note that fields under the `auth` configuration hierarchy are not exposed to the `state` and so do not need to be redacted. For this reason it is preferable to use these for authentication over the request construction shown above where possible. + [float] ==== `redact.fields` diff --git a/x-pack/filebeat/docs/inputs/input-entity-analytics.asciidoc b/x-pack/filebeat/docs/inputs/input-entity-analytics.asciidoc index e186787d8e5..2957b5b7b43 100644 --- a/x-pack/filebeat/docs/inputs/input-entity-analytics.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-entity-analytics.asciidoc @@ -185,6 +185,7 @@ Example device document: }, "azure_ad": { "accountEnabled": true, + "deviceId": "2fbbb8f9-ff67-4a21-b867-a344d18a4198", "displayName": "DESKTOP-LETW452G", "operatingSystem": "Windows", "operatingSystemVersion": "10.0.19043.1337", @@ -202,13 +203,39 @@ Example device document: ] }, "device": { - "id": "2fbbb8f9-ff67-4a21-b867-a344d18a4198", + "id": "adbbe40a-0627-4328-89f1-88cac84dbc7f", "group": [ { "id": "331676df-b8fd-4492-82ed-02b927f8dd80", "name": "group1" } ] + "registered_owners": [ + { + "id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc", + "userPrincipalName": "example.user@example.com", + "mail": "example.user@example.com", + "displayName": "Example User", + "givenName": "Example", + "surname": "User", + "jobTitle": "Software Engineer", + "mobilePhone": "123-555-1000", + "businessPhones": ["123-555-0122"] + }, + ], + "registered_users": [ + { + "id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc", + "userPrincipalName": "example.user@example.com", + "mail": "example.user@example.com", + "displayName": "Example User", + "givenName": "Example", + "surname": "User", + "jobTitle": "Software Engineer", + "mobilePhone": "123-555-1000", + "businessPhones": ["123-555-0122"] + }, + ], }, "labels": { "identity_source": "azure-1" @@ -281,8 +308,8 @@ Override the default authentication scopes. Only change if directed to do so. [id="provider-okta"] ==== Okta User Identities (`okta`) -The `okta` provider allows the input to retrieve users from the Okta user -API. +The `okta` provider allows the input to retrieve users and devices from the +Okta user API. [float] ==== Setup @@ -295,6 +322,8 @@ this to configure the provider. Note that the token will not be presented again, so it must be copied now. This value will use given to the provider via the `okta_token` configuration field. +Devices API access needs to be activated by Okta support. + [float] ==== How It Works @@ -302,23 +331,25 @@ via the `okta_token` configuration field. ===== Overview The Okta provider periodically contacts the Okta API, retrieving updates for -users, updates its internal cache of user metadata, and ships updated user -metadata to Elasticsearch. +users and devices, updates its internal cache of user metadata, and ships +updated user/device metadata to Elasticsearch. Fetching and shipping updates occurs in one of two processes: **full -synchronizations** and *incremental updates*. Full synchronizations will send the -entire list of users in state, along with write markers to indicate the start -and end of the synchronization event. Incremental updates will only send data -for changed users during that event. Changes on a user can come in many forms, -whether it be a change to the user's metadata, or a user was added or deleted. +synchronizations** and *incremental updates*. Full synchronizations will send +the entire list of users and devices in state, along with write markers to +indicate the start and end of the synchronization event. Incremental updates +will only send data for changed users and devices during that event. Changes +on a user or device can come in many forms, whether it be a change to the +user's metadata, or a user was added or deleted. [float] ===== API Interactions -The provider periodically retrieves changes to user metadata from the -Okta User API. This is done through calls to: +The provider periodically retrieves changes to user/device metadata from the +Okta User and Device APIs. This is done through calls to: - https://developer.okta.com/docs/reference/api/users/#list-users[/api/v1/users] +- https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices[/api/v1/devices] Updates are tracked by the provider by retaining a record of the time of the last noted update in the returned user list. During provider updates the Okta provider @@ -328,10 +359,10 @@ since the provider's recorded last update. [float] ===== Sending User Metadata to Elasticsearch -During a full synchronization, all users stored in state will be sent to the -output, while incremental updates will only send users which have been updated. -Full synchronizations will be bounded on either side by write marker documents, -which will look something like this: +During a full synchronization, all users/devices stored in state will be sent +to the output, while incremental updates will only send users and devices +that have been updated. Full synchronizations will be bounded on either side +by write marker documents, which will look something like this: ["source","json",subs="attributes"] ---- @@ -398,6 +429,110 @@ Example user document: } ---- +Device documents will show the current state of the device, including any +associated users. + +Example device document: + +["source","json",subs="attributes"] +---- +{ + "@timestamp": "2023-07-04T09:57:19.786056-05:00", + "event": { + "action": "device-discovered", + }, + "okta": { + "created": "2019-10-02T18:03:07Z", + "id": "deviceid", + "lastUpdated": "2019-10-02T18:03:07Z", + "profile": { + "diskEncryptionType": "ALL_INTERNAL_VOLUMES", + "displayName": "Example Device name 1", + "platform": "WINDOWS", + "registered": true, + "secureHardwarePresent": false, + "serialNumber": "XXDDRFCFRGF3M8MD6D", + "sid": "S-1-11-111" + }, + "resourceAlternateID": "", + "resourceDisplayName": { + "sensitive": false, + "value": "Example Device name 1" + }, + "resourceID": "deviceid", + "resourceType": "UDDevice", + "status": "ACTIVE", + "_links": { + "activate": { + "hints": { + "allow": [ + "POST" + ] + }, + "href": "https://localhost/api/v1/devices/deviceid/lifecycle/activate" + }, + "self": { + "hints": { + "allow": [ + "GET", + "PATCH", + "PUT" + ] + }, + "href": "https://localhost/api/v1/devices/deviceid" + }, + "users": { + "hints": { + "allow": [ + "GET" + ] + }, + "href": "https://localhost/api/v1/devices/deviceid/users" + } + }, + "users": [ + { + "id": "userid", + "status": "RECOVERY", + "created": "2023-05-14T13:37:20Z", + "activated": "0001-01-01T00:00:00Z", + "statusChanged": "2023-05-15T01:50:30Z", + "lastLogin": "2023-05-15T01:59:20Z", + "lastUpdated": "2023-05-15T01:50:32Z", + "passwordChanged": "2023-05-15T01:50:32Z", + "type": { + "id": "typeid" + }, + "profile": { + "login": "name.surname@example.com", + "email": "name.surname@example.com", + "firstName": "name", + "lastName": "surname" + }, + "credentials": { + "password": {}, + "provider": { + "type": "OKTA", + "name": "OKTA" + } + }, + "_links": { + "self": { + "href": "https://localhost/api/v1/users/userid" + } + } + } + ] + }, + "device": { + "id": "deviceid", + }, + "labels": { + "identity_source": "okta-1" + } +} +---- + [float] ==== Configuration @@ -410,6 +545,7 @@ Example configuration: enabled: true id: okta-1 provider: okta + dataset: "all" sync_interval: "12h" update_interval: "30m" okta_domain: "OKTA_DOMAIN" @@ -428,6 +564,21 @@ The Okta domain. Field is required. The Okta secret token, used for authentication. Field is required. +[float] +===== `collect_device_details` + +Whether the input should collect device and device-associated user details +from the Okta API. Device details must be activated on the Okta account for +this option. + +[float] +===== `dataset` + +The datasets to collect from the API. This can be one of "all", "users" or "devices", +or may be left empty for the default behavior which is to collect all entities. +When the `dataset` is set to "devices", some user entity data is collected in order +to populate the registered users and registered owner fields for each device. + [float] ===== `sync_interval` diff --git a/x-pack/filebeat/docs/inputs/input-httpjson.asciidoc b/x-pack/filebeat/docs/inputs/input-httpjson.asciidoc index 34bcc3b1a7e..8ab2e23ffe8 100644 --- a/x-pack/filebeat/docs/inputs/input-httpjson.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-httpjson.asciidoc @@ -214,6 +214,8 @@ Some built-in helper functions are provided to work with the input state inside - `hmacBase64`: calculates the hmac signature of a list of strings concatenated together. Returns a base64 encoded signature. Supports sha1 or sha256. Example `[[hmac "sha256" "secret" "string1" "string2" (formatDate (now) "RFC1123")]]` - `hmac`: calculates the hmac signature of a list of strings concatenated together. Returns a hex encoded signature. Supports sha1 or sha256. Example `[[hmac "sha256" "secret" "string1" "string2" (formatDate (now) "RFC1123")]]` - `join`: joins a list using the specified separator. Example: `[[join .body.arr ","]]` +- `max`: returns the maximum of two values. +- `min`: returns the minimum of two values. - `mul`: multiplies two integers. - `now`: returns the current `time.Time` object in UTC. Optionally, it can receive a `time.Duration` as a parameter. Example: `[[now (parseDuration "-1h")]]` returns the time at 1 hour before now. - `parseDate`: parses a date string and returns a `time.Time` in UTC. By default the expected layout is `RFC3339` but optionally can accept any of the Golang predefined layouts or a custom one. Example: `[[ parseDate "2020-11-05T12:25:32Z" ]]`, `[[ parseDate "2020-11-05T12:25:32.1234567Z" "RFC3339Nano" ]]`, `[[ (parseDate "Thu Nov 5 12:25:32 +0000 2020" "Mon Jan _2 15:04:05 -0700 2006").UTC ]]`. @@ -272,19 +274,19 @@ the `auth.oauth2` section is missing. Used to configure supported oauth2 providers. Each supported provider will require specific settings. It is not set by default. -Supported providers are: `azure`, `google`. +Supported providers are: `azure`, `google`, `okta`. [float] ==== `auth.oauth2.client.id` The client ID used as part of the authentication flow. It is always required -except if using `google` as provider. Required for providers: `default`, `azure`. +except if using `google` as provider. Required for providers: `default`, `azure`, `okta`. [float] ==== `auth.oauth2.client.secret` The client secret used as part of the authentication flow. It is always required -except if using `google` as provider. Required for providers: `default`, `azure`. +except if using `google` or `okta` as provider. Required for providers: `default`, `azure`. [float] ==== `auth.oauth2.user` @@ -385,6 +387,21 @@ NOTE: Only one of the credentials settings can be set at once. If none is provid default credentials from the environment will be attempted via ADC. For more information about how to provide Google credentials, please refer to https://cloud.google.com/docs/authentication. +[float] +==== `auth.oauth2.okta.jwk_file` + +The RSA JWK Private Key file for your Okta Service App which is used for interacting with Okta Org Auth Server to mint tokens with okta.* scopes. + +NOTE: Only one of the credentials settings can be set at once. For more information please refer to https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/ + +[float] +==== `auth.oauth2.okta.jwk_json` + +The RSA JWK Private Key JSON for your Okta Service App which is used for interacting with Okta Org Auth Server to mint tokens with okta.* scopes. + +NOTE: Only one of the credentials settings can be set at once. For more information please refer to https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/ + + [float] ==== `auth.oauth2.google.delegated_account` @@ -1560,7 +1577,7 @@ observe the activity of the input. | `httpjson_interval_total` | Total number of intervals executed. | `httpjson_interval_errors_total` | Total number of interval errors. | `httpjson_interval_execution_time` | Histogram of the interval execution time. -| `httpjson_interval_pages_total` | Histogram of the total number of pages per interval. +| `httpjson_interval_pages` | Histogram of the total number of pages per interval. | `httpjson_interval_pages_execution_time` | Histogram of the interval pages execution time. |======= diff --git a/x-pack/filebeat/filebeat.reference.yml b/x-pack/filebeat/filebeat.reference.yml index 9c9481ed37a..9ea0dabfb0b 100644 --- a/x-pack/filebeat/filebeat.reference.yml +++ b/x-pack/filebeat/filebeat.reference.yml @@ -1999,7 +1999,9 @@ filebeat.modules: # URL, should include the instance_url #var.url: "https://instance_id.my.salesforce.com" - + + # Interval, should include the time interval + #var.interval: 1h #----------------------------- Google Santa Module ----------------------------- - module: santa log: @@ -2892,6 +2894,19 @@ filebeat.inputs: # original for harvesting but will report the symlink name as the source. #prospector.scanner.symlinks: false + # If enabled, instead of relying on the device ID and inode values when comparing files, + # compare hashes of the given byte ranges in files. A file becomes an ingest target + # when its size grows larger than offset+length (see below). Until then it's ignored. + #prospector.scanner.fingerprint.enabled: false + + # If fingerprint mode is enabled, sets the offset from the beginning of the file + # for the byte range used for computing the fingerprint value. + #prospector.scanner.fingerprint.offset: 0 + + # If fingerprint mode is enabled, sets the length of the byte range used for + # computing the fingerprint value. Cannot be less than 64 bytes. + #prospector.scanner.fingerprint.length: 1024 + ### Parsers configuration #### JSON configuration diff --git a/x-pack/filebeat/input/awss3/_meta/terraform/.gitignore b/x-pack/filebeat/input/awss3/_meta/terraform/.gitignore index 0825744a776..1af7b09a151 100644 --- a/x-pack/filebeat/input/awss3/_meta/terraform/.gitignore +++ b/x-pack/filebeat/input/awss3/_meta/terraform/.gitignore @@ -1,3 +1,3 @@ terraform/ -outputs.yml +outputs*.yml *.tfstate* diff --git a/x-pack/filebeat/input/awss3/_meta/terraform/README.md b/x-pack/filebeat/input/awss3/_meta/terraform/README.md index d5614b99a92..41100d98dad 100644 --- a/x-pack/filebeat/input/awss3/_meta/terraform/README.md +++ b/x-pack/filebeat/input/awss3/_meta/terraform/README.md @@ -5,6 +5,8 @@ for executing the integration tests for the `aws-s3` Filebeat input. It creates an S3 bucket and SQS queue and configures S3 `ObjectCreated:*` notifications to be delivered to SQS. It also creates a second S3 bucket, SNS topic, SQS queue and configures S3 `ObjectCreated:*` notifications to be delivered to SNS and also creates a subscription for this SNS topic to SQS queue to automatically place messages sent to SNS topic in SQS queue. +## Cloud AWS environment + It outputs configuration information that is consumed by the tests to `outputs.yml`. The AWS resources are randomly named to prevent name collisions between multiple users. @@ -42,4 +44,40 @@ the S3 bucket and its contents. `terraform destroy` +## Emulated cloud Localstack environment + +It outputs configuration information that is consumed by the tests to +`outputs-localstack.yml`. The AWS resources are randomly named to prevent name collisions +between multiple users. + +### Usage + +You must have the appropriate Localstack environment up and running in docker. +You can use `.ci/jobs/docker-compose.yml` to spin up localstack environment. + +1. Execute terraform in this directory to create the resources. This will also +write the `outputs-localstack.yml`. You can use `export TF_VAR_aws_region=NNNNN` in order +to match the AWS region of the profile you are using. + + `terraform apply` + + +2. (Optional) View the output configuration. + + ```yaml + "aws_region": "us-east-1" + "bucket_name": "filebeat-s3-integtest-8iok1h" + "queue_url": "https://localhost:4566/000000000000/filebeat-s3-integtest-8iok1h" + ``` + +4. Execute the integration test. + + ``` + cd x-pack/filebeat/input/awss3 + go test -tags aws,integration -run TestInputRun*Localstack* -v . + ``` + +5. Cleanup AWS resources. Execute terraform to remove the SQS queue and delete +the S3 bucket and its contents. + `terraform destroy` \ No newline at end of file diff --git a/x-pack/filebeat/input/awss3/_meta/terraform/localstack.tf b/x-pack/filebeat/input/awss3/_meta/terraform/localstack.tf new file mode 100644 index 00000000000..2d2fcbe09ec --- /dev/null +++ b/x-pack/filebeat/input/awss3/_meta/terraform/localstack.tf @@ -0,0 +1,89 @@ +provider "aws" { + alias = "localstack" + access_key = "bharat" + secret_key = "bharat" + region = "us-east-1" + s3_use_path_style = true + skip_credentials_validation = true + skip_metadata_api_check = true + skip_requesting_account_id = true + + endpoints { + apigateway = "http://localhost:4566" + apigatewayv2 = "http://localhost:4566" + cloudformation = "http://localhost:4566" + cloudwatch = "http://localhost:4566" + dynamodb = "http://localhost:4566" + ec2 = "http://localhost:4566" + es = "http://localhost:4566" + elasticache = "http://localhost:4566" + firehose = "http://localhost:4566" + iam = "http://localhost:4566" + kinesis = "http://localhost:4566" + lambda = "http://localhost:4566" + rds = "http://localhost:4566" + redshift = "http://localhost:4566" + route53 = "http://localhost:4566" + s3 = "http://localhost:4566" + secretsmanager = "http://localhost:4566" + ses = "http://localhost:4566" + sns = "http://localhost:4566" + sqs = "http://localhost:4566" + ssm = "http://localhost:4566" + stepfunctions = "http://localhost:4566" + sts = "http://localhost:4566" + } +} + +resource "random_string" "random_localstack" { + length = 6 + special = false + upper = false +} + +resource "aws_s3_bucket" "filebeat-integtest-localstack" { + provider = aws.localstack + bucket = "filebeat-s3-integtest-localstack-${random_string.random_localstack.result}" + force_destroy = true +} + +resource "aws_sqs_queue" "filebeat-integtest-localstack" { + provider = aws.localstack + name = "filebeat-sqs-integtest-localstack-${random_string.random_localstack.result}" + policy = <= expectedLen { + cancel() + } + }, + } + st := newState() + var g errgroup.Group + g.Go(func() error { + return input.run(v2Ctx, src, st, &client) + }) + timeout := time.NewTimer(100 * time.Second) + t.Cleanup(func() { timeout.Stop() }) + select { + case <-timeout.C: + t.Errorf("timed out waiting for %d events", expectedLen) + cancel() + case <-v2Ctx.Cancelation.Done(): + } + //nolint:errcheck // We can ignore as the error will always be context canceled, which is expected in this case + g.Wait() + if len(client.events) < expectedLen { + t.Errorf("failed to get all events: got:%d want:%d", len(client.events), expectedLen) + } + }) + } +} + +type publisher struct { + stop func([]beat.Event) + events []beat.Event + mu sync.Mutex + cursors []map[string]interface{} +} + +func (p *publisher) Publish(e beat.Event, cursor interface{}) error { + p.mu.Lock() + p.events = append(p.events, e) + if cursor != nil { + var c map[string]interface{} + chkpt, ok := cursor.(*Checkpoint) + if !ok { + return fmt.Errorf("invalid cursor type for testing: %T", cursor) + } + cursorBytes, err := json.Marshal(chkpt) + if err != nil { + return fmt.Errorf("error marshaling cursor data: %w", err) + } + err = json.Unmarshal(cursorBytes, &c) + if err != nil { + return fmt.Errorf("error converting checkpoint struct to cursor map: %w", err) + } + + p.cursors = append(p.cursors, c) + } + p.stop(p.events) + p.mu.Unlock() + return nil +} + func newV2Context() (v2.Context, func()) { ctx, cancel := context.WithCancel(context.Background()) return v2.Context{ Logger: logp.NewLogger("azure-blob-storage_test"), - ID: "test_id", + ID: "test_id:", Cancelation: ctx, }, cancel } diff --git a/x-pack/filebeat/input/azureblobstorage/job.go b/x-pack/filebeat/input/azureblobstorage/job.go index d44da42abfb..07698a6b0cf 100644 --- a/x-pack/filebeat/input/azureblobstorage/job.go +++ b/x-pack/filebeat/input/azureblobstorage/job.go @@ -17,6 +17,8 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" + azcontainer "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" "github.com/elastic/beats/v7/libbeat/beat" @@ -27,8 +29,8 @@ import ( const jobErrString = "job with jobId %s encountered an error: %w" type job struct { - client *azblob.BlobClient - blob *azblob.BlobItemInternal + client *blob.Client + blob *azcontainer.BlobItem blobURL string hash string offset int64 @@ -40,7 +42,7 @@ type job struct { } // newJob, returns an instance of a job, which is a unit of work that can be assigned to a go routine -func newJob(client *azblob.BlobClient, blob *azblob.BlobItemInternal, blobURL string, +func newJob(client *blob.Client, blob *azcontainer.BlobItem, blobURL string, state *state, src *Source, publisher cursor.Publisher, log *logp.Logger, ) *job { return &job{ @@ -56,7 +58,7 @@ func newJob(client *azblob.BlobClient, blob *azblob.BlobItemInternal, blobURL st } // azureObjectHash returns a short sha256 hash of the container name + blob name. -func azureObjectHash(src *Source, blob *azblob.BlobItemInternal) string { +func azureObjectHash(src *Source, blob *azcontainer.BlobItem) string { h := sha256.New() h.Write([]byte(src.ContainerName)) h.Write([]byte((*blob.Name))) @@ -86,10 +88,13 @@ func (j *job) do(ctx context.Context, id string) { Fields: fields, } event.SetID(objectID(j.hash, 0)) - j.state.save(*j.blob.Name, *j.blob.Properties.LastModified) - if err := j.publisher.Publish(event, j.state.checkpoint()); err != nil { + // locks while data is being saved to avoid concurrent map read/writes + cp, done := j.state.saveForTx(*j.blob.Name, *j.blob.Properties.LastModified) + if err := j.publisher.Publish(event, cp); err != nil { j.log.Errorf(jobErrString, id, err) } + // unlocks after data is saved + done() } } @@ -103,17 +108,17 @@ func (j *job) timestamp() *time.Time { func (j *job) processAndPublishData(ctx context.Context, id string) error { var err error - downloadOptions := &azblob.BlobDownloadOptions{} + downloadOptions := &blob.DownloadStreamOptions{} if !j.isCompressed { - downloadOptions.Offset = &j.offset + downloadOptions.Range.Offset = j.offset } - get, err := j.client.Download(ctx, downloadOptions) + get, err := j.client.DownloadStream(ctx, downloadOptions) if err != nil { return fmt.Errorf("failed to download data from blob with error: %w", err) } - reader := get.Body(&azblob.RetryReaderOptions{}) + reader := get.NewRetryReader(context.Background(), &azblob.RetryReaderOptions{}) defer func() { err = reader.Close() if err != nil { @@ -186,16 +191,21 @@ func (j *job) readJsonAndPublish(ctx context.Context, r io.Reader, id string) er // 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 - j.state.save(*j.blob.Name, *j.blob.Properties.LastModified) + cp, done = j.state.saveForTx(*j.blob.Name, *j.blob.Properties.LastModified) } else { // partially saves read state using offset - j.state.savePartial(*j.blob.Name, offset+relativeOffset, j.blob.Properties.LastModified) + cp, done = j.state.savePartialForTx(*j.blob.Name, offset+relativeOffset) } - if err := j.publisher.Publish(evt, j.state.checkpoint()); err != nil { + if err := j.publisher.Publish(evt, cp); err != nil { j.log.Errorf(jobErrString, id, err) } + done() } return nil } diff --git a/x-pack/filebeat/input/azureblobstorage/mock/data_random.go b/x-pack/filebeat/input/azureblobstorage/mock/data_random.go new file mode 100644 index 00000000000..f52fe2fdbdb --- /dev/null +++ b/x-pack/filebeat/input/azureblobstorage/mock/data_random.go @@ -0,0 +1,124 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package mock + +import ( + "encoding/json" + "encoding/xml" + "fmt" + "math/rand" + "time" +) + +const ( + TotalRandomDataSets = 10000 + ConcurrencyContainer = "concurrency_container" +) + +// Generates random Azure blob storage container metadata in XML format +type EnumerationResults struct { + XMLName xml.Name `xml:"EnumerationResults"` + ServiceEndpoint string `xml:"ServiceEndpoint,attr"` + ContainerName string `xml:"ContainerName,attr"` + Blobs []Blob `xml:"Blobs>Blob"` + NextMarker string `xml:"NextMarker"` +} + +type Blob struct { + Name string `xml:"Name"` + Properties Properties `xml:"Properties"` + Metadata string `xml:"Metadata"` +} + +type Properties struct { + LastModified string `xml:"Last-Modified"` + Etag string `xml:"Etag"` + ContentLength int `xml:"Content-Length"` + ContentType string `xml:"Content-Type"` +} + +func generateMetadata() []byte { + // Generate random data for x data sets defined by TotalRandomDataSets + const numDataSets = TotalRandomDataSets + dataSets := make([]Blob, numDataSets) + + for i := 0; i < numDataSets; i++ { + dataSets[i] = createRandomBlob(i) + } + + // Fill in the root XML structure + xmlData := EnumerationResults{ + ServiceEndpoint: "https://127.0.0.1/", + ContainerName: "concurrency_container", + Blobs: dataSets, + NextMarker: "", + } + + // Marshal the data into XML format + xmlBytes, err := xml.MarshalIndent(xmlData, "", "\t") + if err != nil { + panic(fmt.Sprintf("Error marshaling data: %v", err)) + } + return []byte(xml.Header + string(xmlBytes)) +} + +// Helper function to create a random Blob +func createRandomBlob(i int) Blob { + rand.Seed(time.Now().UnixNano()) + + return Blob{ + Name: fmt.Sprintf("data_%d.json", i), + Properties: Properties{ + LastModified: time.Now().Format(time.RFC1123), + Etag: fmt.Sprintf("0x%X", rand.Int63()), + ContentType: "application/json", + }, + Metadata: "", + } +} + +// Generate Random Blob data in JSON format +type MyData struct { + ID int `json:"id"` + Name string `json:"name"` + Age int `json:"age"` + Email string `json:"email"` + Description string `json:"description"` +} + +func generateRandomBlob() []byte { + const numObjects = 10 + dataObjects := make([]MyData, numObjects) + + for i := 0; i < numObjects; i++ { + dataObjects[i] = createRandomData() + } + + jsonBytes, err := json.MarshalIndent(dataObjects, "", "\t") + if err != nil { + panic(fmt.Sprintf("Error marshaling data: %v", err)) + } + return jsonBytes +} + +func createRandomData() MyData { + rand.Seed(time.Now().UnixNano()) + + return MyData{ + ID: rand.Intn(1000) + 1, + Name: getRandomString([]string{"John", "Alice", "Bob", "Eve"}), + Age: rand.Intn(80) + 18, + Email: getRandomString([]string{"john@example.com", "alice@example.com", "bob@example.com"}), + Description: getRandomString([]string{"Student", "Engineer", "Artist", "Doctor"}), + } +} + +func getRandomString(options []string) string { + if len(options) == 0 { + return "" + } + rand.Seed(time.Now().UnixNano()) + return options[rand.Intn(len(options))] +} diff --git a/x-pack/filebeat/input/azureblobstorage/mock/mock.go b/x-pack/filebeat/input/azureblobstorage/mock/mock.go index aadbf4ffd28..32d65cdb2e3 100644 --- a/x-pack/filebeat/input/azureblobstorage/mock/mock.go +++ b/x-pack/filebeat/input/azureblobstorage/mock/mock.go @@ -92,3 +92,29 @@ func AzureStorageFileServer() http.Handler { w.Write([]byte("resource not found")) }) } + +//nolint:errcheck // We can ignore as response writer errors cannot be handled in this scenario +func AzureConcurrencyServer() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + path := strings.Split(strings.TrimLeft(r.URL.Path, "/"), "/") + w.Header().Set(contentType, jsonType) + if r.Method == http.MethodGet { + switch len(path) { + case 1: + if path[0] == ConcurrencyContainer { + w.Header().Set(contentType, xmlType) + w.Write(generateMetadata()) + return + } + case 2: + w.Write(generateRandomBlob()) + return + default: + w.WriteHeader(http.StatusNotFound) + return + } + } + w.WriteHeader(http.StatusNotFound) + w.Write([]byte("resource not found")) + }) +} diff --git a/x-pack/filebeat/input/azureblobstorage/scheduler.go b/x-pack/filebeat/input/azureblobstorage/scheduler.go index a235be406b0..b796a6f15b4 100644 --- a/x-pack/filebeat/input/azureblobstorage/scheduler.go +++ b/x-pack/filebeat/input/azureblobstorage/scheduler.go @@ -9,7 +9,9 @@ import ( "fmt" "sync" + azruntime "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + azcontainer "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" "github.com/elastic/elastic-agent-libs/logp" @@ -42,7 +44,7 @@ func (l *limiter) release() { type scheduler struct { publisher cursor.Publisher - client *azblob.ContainerClient + client *azcontainer.Client credential *serviceCredentials src *Source cfg *config @@ -53,7 +55,7 @@ type scheduler struct { } // newScheduler, returns a new scheduler instance -func newScheduler(publisher cursor.Publisher, client *azblob.ContainerClient, +func newScheduler(publisher cursor.Publisher, client *azcontainer.Client, credential *serviceCredentials, src *Source, cfg *config, state *state, serviceURL string, log *logp.Logger, ) *scheduler { @@ -92,13 +94,32 @@ func (s *scheduler) schedule(ctx context.Context) error { func (s *scheduler) scheduleOnce(ctx context.Context) error { pager := s.fetchBlobPager(int32(s.src.MaxWorkers)) - for pager.NextPage(ctx) { - jobs, err := s.createJobs(pager) + for pager.More() { + resp, err := pager.NextPage(ctx) if err != nil { - s.log.Errorf("Job creation failed for container %s with error %v", s.src.ContainerName, err) return err } + var jobs []*job + for _, v := range resp.Segment.BlobItems { + + blobURL := s.serviceURL + s.src.ContainerName + "/" + *v.Name + blobCreds := &blobCredentials{ + serviceCreds: s.credential, + blobName: *v.Name, + containerName: s.src.ContainerName, + } + + blobClient, err := fetchBlobClient(blobURL, blobCreds, s.log) + if err != nil { + s.log.Errorf("Job creation failed for container %s with error %v", s.src.ContainerName, err) + return err + } + + job := newJob(blobClient, v, blobURL, s.state, s.src, s.publisher, s.log) + jobs = append(jobs, job) + } + // If previous checkpoint was saved then look up starting point for new jobs if !s.state.checkpoint().LatestEntryTime.IsZero() { jobs = s.moveToLastSeenJob(jobs) @@ -116,7 +137,7 @@ func (s *scheduler) scheduleOnce(ctx context.Context) error { } } - return pager.Err() + return nil } // fetchJobID returns a job id which is a combination of worker id, container name and blob name @@ -126,29 +147,6 @@ func fetchJobID(workerId int, containerName string, blobName string) string { return jobID } -func (s *scheduler) createJobs(pager *azblob.ContainerListBlobFlatPager) ([]*job, error) { - var jobs []*job - - for _, v := range pager.PageResponse().Segment.BlobItems { - blobURL := s.serviceURL + s.src.ContainerName + "/" + *v.Name - blobCreds := &blobCredentials{ - serviceCreds: s.credential, - blobName: *v.Name, - containerName: s.src.ContainerName, - } - - blobClient, err := fetchBlobClient(blobURL, blobCreds, s.log) - if err != nil { - return nil, err - } - - job := newJob(blobClient, v, blobURL, s.state, s.src, s.publisher, s.log) - jobs = append(jobs, job) - } - - return jobs, nil -} - // fetchBlobPager fetches the current blob page object given a batch size & a page marker. // The page marker has been disabled since it was found that it operates on the basis of // lexicographical order, and not on the basis of the latest file uploaded, meaning if a blob with a name @@ -157,11 +155,11 @@ func (s *scheduler) createJobs(pager *azblob.ContainerListBlobFlatPager) ([]*job // hence disabling it for now, until more feedback is given. Disabling this how ever makes the sheduler loop // through all the blobs on every poll action to arrive at the latest checkpoint. // [NOTE] : There are no api's / sdk functions that list blobs via timestamp/latest entry, it's always lexicographical order -func (s *scheduler) fetchBlobPager(batchSize int32) *azblob.ContainerListBlobFlatPager { - pager := s.client.ListBlobsFlat(&azblob.ContainerListBlobsFlatOptions{ - Include: []azblob.ListBlobsIncludeItem{ - azblob.ListBlobsIncludeItemMetadata, - azblob.ListBlobsIncludeItemTags, +func (s *scheduler) fetchBlobPager(batchSize int32) *azruntime.Pager[azblob.ListBlobsFlatResponse] { + pager := s.client.NewListBlobsFlatPager(&azcontainer.ListBlobsFlatOptions{ + Include: azcontainer.ListBlobsInclude{ + Metadata: true, + Tags: true, }, MaxResults: &batchSize, }) diff --git a/x-pack/filebeat/input/azureblobstorage/state.go b/x-pack/filebeat/input/azureblobstorage/state.go index f0a6e6cbce9..de1873e9042 100644 --- a/x-pack/filebeat/input/azureblobstorage/state.go +++ b/x-pack/filebeat/input/azureblobstorage/state.go @@ -37,8 +37,11 @@ func newState() *state { } } -// Save, saves/updates the current state for cursor checkpoint -func (s *state) save(name string, lastModifiedOn time.Time) { +// saveForTx 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) saveForTx(name string, lastModifiedOn time.Time) (cp *Checkpoint, done func()) { s.mu.Lock() delete(s.cp.PartiallyProcessed, name) if len(s.cp.BlobName) == 0 { @@ -51,17 +54,20 @@ func (s *state) save(name string, lastModifiedOn time.Time) { } else if lastModifiedOn.After(s.cp.LatestEntryTime) { s.cp.LatestEntryTime = lastModifiedOn } - s.mu.Unlock() + return s.cp, func() { s.mu.Unlock() } } -// savePartial, partially saves/updates the current state for cursor checkpoint -func (s *state) savePartial(name string, offset int64, lastModifiedOn *time.Time) { +// 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 - s.mu.Unlock() + return s.cp, func() { s.mu.Unlock() } } -// setCheckpoint, sets checkpoint from source to current state instance +// 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) @@ -69,7 +75,7 @@ func (s *state) setCheckpoint(chkpt *Checkpoint) { s.cp = chkpt } -// checkpoint, returns the current state checkpoint +// checkpoint returns the current state checkpoint func (s *state) checkpoint() *Checkpoint { return s.cp } diff --git a/x-pack/filebeat/input/azureeventhub/eph.go b/x-pack/filebeat/input/azureeventhub/eph.go index d384be39077..f6981b4882e 100644 --- a/x-pack/filebeat/input/azureeventhub/eph.go +++ b/x-pack/filebeat/input/azureeventhub/eph.go @@ -78,7 +78,7 @@ func (a *azureInput) runWithEPH() error { ok := a.processEvents(e, "") if !ok { onEventErr = errors.New("OnEvent function returned false. Stopping input worker") - a.log.Debug(onEventErr.Error()) + a.log.Error(onEventErr.Error()) a.Stop() } return onEventErr diff --git a/x-pack/filebeat/input/azureeventhub/input.go b/x-pack/filebeat/input/azureeventhub/input.go index 6254e7698b1..bc2244925e6 100644 --- a/x-pack/filebeat/input/azureeventhub/input.go +++ b/x-pack/filebeat/input/azureeventhub/input.go @@ -14,22 +14,59 @@ import ( "sync" "time" + eventhub "github.com/Azure/azure-event-hubs-go/v3" + "github.com/Azure/azure-event-hubs-go/v3/eph" + "github.com/mitchellh/hashstructure" + "github.com/elastic/beats/v7/filebeat/channel" "github.com/elastic/beats/v7/filebeat/input" "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" - - eventhub "github.com/Azure/azure-event-hubs-go/v3" - "github.com/Azure/azure-event-hubs-go/v3/eph" ) const ( eventHubConnector = ";EntityPath=" expandEventListFromField = "records" + inputName = "azure-eventhub" ) +func init() { + err := input.Register(inputName, NewInput) + if err != nil { + panic(fmt.Errorf("failed to register %v input: %w", inputName, err)) + } +} + +// configID computes a unique ID for the input configuration. +// +// It is used to identify the input in the registry and to detect +// changes in the configuration. +// +// We will remove this function as we upgrade the input to the +// v2 API (there is an ID in the v2 context). +func configID(config *conf.C) (string, error) { + var tmp struct { + ID string `config:"id"` + } + if err := config.Unpack(&tmp); err != nil { + return "", fmt.Errorf("error extracting ID: %w", err) + } + if tmp.ID != "" { + return tmp.ID, nil + } + + var h map[string]interface{} + _ = config.Unpack(&h) + id, err := hashstructure.Hash(h, nil) + if err != nil { + return "", fmt.Errorf("can not compute ID from configuration: %w", err) + } + + return fmt.Sprintf("%16X", id), nil +} + // azureInput struct for the azure-eventhub input type azureInput struct { config azureInputConfig // azure-eventhub configuration @@ -40,17 +77,8 @@ type azureInput struct { workerCancel context.CancelFunc // used to signal that the worker should stop. workerOnce sync.Once // guarantees that the worker goroutine is only started once. processor *eph.EventProcessorHost // eph will be assigned if users have enabled the option -} - -const ( - inputName = "azure-eventhub" -) - -func init() { - err := input.Register(inputName, NewInput) - if err != nil { - panic(fmt.Errorf("failed to register %v input: %w", inputName, err)) - } + id string // ID of the input; used to identify the input in the input metrics registry only, and will be removed once the input is migrated to v2. + metrics *inputMetrics // Metrics for the input. } // NewInput creates a new azure-eventhub input @@ -64,6 +92,17 @@ func NewInput( return nil, fmt.Errorf("reading %s input config: %w", inputName, err) } + // Since this is a v1 input, we need to set the ID manually. + // + // We need an ID to identify the input in the input metrics + // registry. + // + // This is a temporary workaround until we migrate the input to v2. + inputId, err := configID(cfg) + if err != nil { + return nil, err + } + inputCtx, cancelInputCtx := context.WithCancel(context.Background()) go func() { defer cancelInputCtx() @@ -77,7 +116,8 @@ func NewInput( // to be recreated with each restart. workerCtx, workerCancel := context.WithCancel(inputCtx) - in := &azureInput{ + in := azureInput{ + id: inputId, config: config, log: logp.NewLogger(fmt.Sprintf("%s input", inputName)).With("connection string", stripConnectionString(config.ConnectionString)), context: inputContext, @@ -90,7 +130,8 @@ func NewInput( } in.outlet = out in.log.Infof("Initialized %s input.", inputName) - return in, nil + + return &in, nil } // Run starts the `azure-eventhub` input and then returns. @@ -106,6 +147,16 @@ func (a *azureInput) Run() { // invocation. a.workerOnce.Do(func() { a.log.Infof("%s input worker is starting.", inputName) + + // We set up the metrics in the `Run()` method and tear them down + // in the `Stop()` method. + // + // The factory method `NewInput` is not a viable solution because + // the Runner invokes it during the configuration check without + // calling the `Stop()` function; this causes panics + // due to multiple metrics registrations. + a.metrics = newInputMetrics(a.id, nil) + err := a.runWithEPH() if err != nil { a.log.Errorw("error starting the input worker", "error", err) @@ -117,6 +168,7 @@ func (a *azureInput) Run() { // Stop stops `azure-eventhub` input. func (a *azureInput) Stop() { + a.log.Infof("%s input worker is stopping.", inputName) if a.processor != nil { // Tells the processor to stop processing events and release all // resources (like scheduler, leaser, checkpointer, and client). @@ -126,7 +178,12 @@ func (a *azureInput) Stop() { } } + if a.metrics != nil { + a.metrics.Close() + } + a.workerCancel() + a.log.Infof("%s input worker has stopped.", inputName) } // Wait stop the current server @@ -135,35 +192,50 @@ func (a *azureInput) Wait() { } func (a *azureInput) processEvents(event *eventhub.Event, partitionID string) bool { - timestamp := time.Now() + processingStartTime := time.Now() azure := mapstr.M{ // partitionID is only mapped in the non-eph option which is not available yet, this field will be temporary unavailable //"partition_id": partitionID, "eventhub": a.config.EventHubName, "consumer_group": a.config.ConsumerGroup, } - messages := a.parseMultipleMessages(event.Data) - for _, msg := range messages { + + // update the input metrics + a.metrics.receivedMessages.Inc() + a.metrics.receivedBytes.Add(uint64(len(event.Data))) + + records := a.parseMultipleRecords(event.Data) + + for _, record := range records { _, _ = azure.Put("offset", event.SystemProperties.Offset) _, _ = azure.Put("sequence_number", event.SystemProperties.SequenceNumber) _, _ = azure.Put("enqueued_time", event.SystemProperties.EnqueuedTime) ok := a.outlet.OnEvent(beat.Event{ - Timestamp: timestamp, + // this is the default value for the @timestamp field; usually the ingest + // pipeline replaces it with a value in the payload. + Timestamp: processingStartTime, Fields: mapstr.M{ - "message": msg, + "message": record, "azure": azure, }, Private: event.Data, }) if !ok { + a.metrics.processingTime.Update(time.Since(processingStartTime).Nanoseconds()) return ok } + + a.metrics.sentEvents.Inc() } + + a.metrics.processedMessages.Inc() + a.metrics.processingTime.Update(time.Since(processingStartTime).Nanoseconds()) + return true } -// parseMultipleMessages will try to split the message into multiple ones based on the group field provided by the configuration -func (a *azureInput) parseMultipleMessages(bMessage []byte) []string { +// parseMultipleRecords will try to split the message into multiple ones based on the group field provided by the configuration +func (a *azureInput) parseMultipleRecords(bMessage []byte) []string { var mapObject map[string][]interface{} var messages []string @@ -173,6 +245,7 @@ func (a *azureInput) parseMultipleMessages(bMessage []byte) []string { // [1]: https://learn.microsoft.com/en-us/answers/questions/1001797/invalid-json-logs-produced-for-function-apps if len(a.config.SanitizeOptions) != 0 && !json.Valid(bMessage) { bMessage = sanitize(bMessage, a.config.SanitizeOptions...) + a.metrics.sanitizedMessages.Inc() } // check if the message is a "records" object containing a list of events @@ -183,6 +256,7 @@ func (a *azureInput) parseMultipleMessages(bMessage []byte) []string { js, err := json.Marshal(ms) if err == nil { messages = append(messages, string(js)) + a.metrics.receivedEvents.Inc() } else { a.log.Errorw(fmt.Sprintf("serializing message %s", ms), "error", err) } @@ -196,17 +270,21 @@ func (a *azureInput) parseMultipleMessages(bMessage []byte) []string { if err != nil { // return entire message a.log.Debugf("deserializing multiple messages to an array returning error: %s", err) + a.metrics.decodeErrors.Inc() return []string{string(bMessage)} } + for _, ms := range arrayObject { js, err := json.Marshal(ms) if err == nil { messages = append(messages, string(js)) + a.metrics.receivedEvents.Inc() } else { a.log.Errorw(fmt.Sprintf("serializing message %s", ms), "error", err) } } } + return messages } diff --git a/x-pack/filebeat/input/azureeventhub/input_test.go b/x-pack/filebeat/input/azureeventhub/input_test.go index 9a0060fab42..a5fab488dfc 100644 --- a/x-pack/filebeat/input/azureeventhub/input_test.go +++ b/x-pack/filebeat/input/azureeventhub/input_test.go @@ -14,6 +14,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" + "github.com/elastic/elastic-agent-libs/monitoring" eventhub "github.com/Azure/azure-event-hubs-go/v3" "github.com/stretchr/testify/assert" @@ -39,9 +40,14 @@ func TestProcessEvents(t *testing.T) { if err != nil { t.Fatal(err) } + reg := monitoring.NewRegistry() + metrics := newInputMetrics("test", reg) + defer metrics.Close() + input := azureInput{ - config: config, - outlet: out, + config: config, + metrics: metrics, + outlet: out, } var sn int64 = 12 now := time.Now() @@ -73,7 +79,7 @@ func TestProcessEvents(t *testing.T) { assert.Equal(t, message, single) } -func TestParseMultipleMessages(t *testing.T) { +func TestParseMultipleRecords(t *testing.T) { // records object msg := "{\"records\":[{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + "{\"test\":\"this is 2nd message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + @@ -83,8 +89,17 @@ func TestParseMultipleMessages(t *testing.T) { "{\"test\":\"this is 2nd message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}", "{\"test\":\"this is 3rd message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}", } - input := azureInput{log: logp.NewLogger(fmt.Sprintf("%s test for input", inputName))} - messages := input.parseMultipleMessages([]byte(msg)) + + reg := monitoring.NewRegistry() + metrics := newInputMetrics("test", reg) + defer metrics.Close() + + input := azureInput{ + metrics: metrics, + log: logp.NewLogger(fmt.Sprintf("%s test for input", inputName)), + } + + messages := input.parseMultipleRecords([]byte(msg)) assert.NotNil(t, messages) assert.Equal(t, len(messages), 3) for _, ms := range messages { @@ -95,7 +110,7 @@ func TestParseMultipleMessages(t *testing.T) { msg1 := "[{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + "{\"test\":\"this is 2nd message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + "{\"test\":\"this is 3rd message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}]" - messages = input.parseMultipleMessages([]byte(msg1)) + messages = input.parseMultipleRecords([]byte(msg1)) assert.NotNil(t, messages) assert.Equal(t, len(messages), 3) for _, ms := range messages { @@ -104,7 +119,7 @@ func TestParseMultipleMessages(t *testing.T) { // one event only msg2 := "{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}" - messages = input.parseMultipleMessages([]byte(msg2)) + messages = input.parseMultipleRecords([]byte(msg2)) assert.NotNil(t, messages) assert.Equal(t, len(messages), 1) for _, ms := range messages { diff --git a/x-pack/filebeat/input/azureeventhub/metrics.go b/x-pack/filebeat/input/azureeventhub/metrics.go new file mode 100644 index 00000000000..8aeabc57265 --- /dev/null +++ b/x-pack/filebeat/input/azureeventhub/metrics.go @@ -0,0 +1,93 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +//go:build !aix +// +build !aix + +package azureeventhub + +import ( + "github.com/rcrowley/go-metrics" + + "github.com/elastic/beats/v7/libbeat/monitoring/inputmon" + "github.com/elastic/elastic-agent-libs/monitoring" + "github.com/elastic/elastic-agent-libs/monitoring/adapter" +) + +// newInputMetrics creates a new `*inputMetrics` to track metrics. +func newInputMetrics(id string, parentRegistry *monitoring.Registry) *inputMetrics { + reg, unregister := inputmon.NewInputRegistry(inputName, id, parentRegistry) + inputMetrics := inputMetrics{ + unregister: unregister, + + // Messages + receivedMessages: monitoring.NewUint(reg, "received_messages_total"), + receivedBytes: monitoring.NewUint(reg, "received_bytes_total"), + sanitizedMessages: monitoring.NewUint(reg, "sanitized_messages_total"), + processedMessages: monitoring.NewUint(reg, "processed_messages_total"), + + // Events + receivedEvents: monitoring.NewUint(reg, "received_events_total"), + sentEvents: monitoring.NewUint(reg, "sent_events_total"), + + // General + processingTime: metrics.NewUniformSample(1024), // TODO: set a reasonable value for the sample size. + decodeErrors: monitoring.NewUint(reg, "decode_errors_total"), + } + _ = adapter. + NewGoMetrics(reg, "processing_time", adapter.Accept). + Register("histogram", metrics.NewHistogram(inputMetrics.processingTime)) + + return &inputMetrics +} + +// inputMetrics tracks metrics for this input. +// +// # Messages vs Events +// +// Messages are the raw data received from the eventhub. Here's an example of a +// message: +// +// { +// "records": [ +// { +// "time": "2019-12-17T13:43:44.4946995Z", +// "test": "this is some message" +// } +// ] +// } +// +// Events are the objects inside the `records` array. Here's an example of an event +// from the above message: +// +// { +// "time": "2019-12-17T13:43:44.4946995Z", +// "test": "this is some message" +// } +type inputMetrics struct { + // unregister is the cancel function to call when the input is + // stopping. + unregister func() + + // Messages + receivedMessages *monitoring.Uint // receivedMessages tracks the number of messages received from eventhub. + receivedBytes *monitoring.Uint // receivedBytes tracks the number of bytes received from eventhub. + sanitizedMessages *monitoring.Uint // sanitizedMessages tracks the number of messages that were sanitized successfully. + processedMessages *monitoring.Uint // processedMessages tracks the number of messages that were processed successfully. + + // Events + receivedEvents *monitoring.Uint // receivedEvents tracks the number of events received decoding messages. + sentEvents *monitoring.Uint // sentEvents tracks the number of events that were sent successfully. + + // General + processingTime metrics.Sample // processingTime tracks the time it takes to process a message. + decodeErrors *monitoring.Uint // decodeErrors tracks the number of errors that occurred while decoding a message. +} + +// Close unregisters the metrics from the registry. +func (m *inputMetrics) Close() { + if m.unregister != nil { + m.unregister() + } +} diff --git a/x-pack/filebeat/input/azureeventhub/metrics_test.go b/x-pack/filebeat/input/azureeventhub/metrics_test.go new file mode 100644 index 00000000000..b6730c34956 --- /dev/null +++ b/x-pack/filebeat/input/azureeventhub/metrics_test.go @@ -0,0 +1,171 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +//go:build !aix +// +build !aix + +package azureeventhub + +import ( + "fmt" + "testing" + "time" + + eventhub "github.com/Azure/azure-event-hubs-go/v3" + "github.com/stretchr/testify/assert" + + "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/monitoring" +) + +func TestInputMetricsEventsReceived(t *testing.T) { + + var sn int64 = 12 + now := time.Now() + var off int64 = 1234 + var pID int16 = 1 + + properties := eventhub.SystemProperties{ + SequenceNumber: &sn, + EnqueuedTime: &now, + Offset: &off, + PartitionID: &pID, + PartitionKey: nil, + } + + log := logp.NewLogger(fmt.Sprintf("%s test for input", inputName)) + + // + + cases := []struct { + // Use case definition + event []byte + expectedRecords []string + sanitizationOption []string + // Expected results + receivedMessages uint64 + sanitizedMessages uint64 + processedMessages uint64 + receivedEvents uint64 + sentEvents uint64 + processingTime uint64 + decodeErrors uint64 + }{ + { + event: []byte("{\"records\": [{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}]}"), + expectedRecords: []string{"{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}"}, + receivedMessages: 1, + sanitizedMessages: 0, + processedMessages: 1, + receivedEvents: 1, + sentEvents: 1, + decodeErrors: 0, + }, + { + event: []byte("{\"records\": [{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}, {\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}]}"), + expectedRecords: []string{ + "{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}", + "{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}", + }, + receivedMessages: 1, + sanitizedMessages: 0, + processedMessages: 1, + receivedEvents: 2, + sentEvents: 2, + decodeErrors: 0, + }, + { + event: []byte("{\"records\": [{'test':'this is some message','time':'2019-12-17T13:43:44.4946995Z'}]}"), // Thank you, Azure Functions logs. + expectedRecords: []string{ + "{\"test\":\"this is some message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}", + }, + sanitizationOption: []string{"SINGLE_QUOTES"}, + receivedMessages: 1, + sanitizedMessages: 1, + processedMessages: 1, + receivedEvents: 1, + sentEvents: 1, + decodeErrors: 0, + }, + { + event: []byte("{\"records\": [{'test':'this is some message','time':'2019-12-17T13:43:44.4946995Z'}]}"), + expectedRecords: []string{ + "{\"records\": [{'test':'this is some message','time':'2019-12-17T13:43:44.4946995Z'}]}", + }, + sanitizationOption: []string{}, // no sanitization options + receivedMessages: 1, + sanitizedMessages: 0, // Since we have no sanitization options, we don't try to sanitize. + processedMessages: 1, + decodeErrors: 1, + receivedEvents: 0, // If we can't decode the message, we can't count the events in it. + sentEvents: 1, // The input sends the unmodified message as a string to the outlet. + }, + } + + for _, tc := range cases { + + inputConfig := azureInputConfig{ + SAKey: "", + SAName: "", + SAContainer: ephContainerName, + ConnectionString: "", + ConsumerGroup: "", + SanitizeOptions: tc.sanitizationOption, + } + + reg := monitoring.NewRegistry() + metrics := newInputMetrics("test", reg) + + // Stub outlet for receiving events generated by the input. + o := &stubOutleter{} + out, err := newStubOutlet(o) + if err != nil { + t.Fatal(err) + } + + input := azureInput{ + config: inputConfig, + metrics: metrics, + outlet: out, + log: log, + } + + ev := eventhub.Event{ + Data: tc.event, + SystemProperties: &properties, + } + + ok := input.processEvents(&ev, "0") + if !ok { + t.Fatal("OnEvent function returned false") + } + + if ok := assert.Equal(t, len(tc.expectedRecords), len(o.Events)); ok { + for i, e := range o.Events { + msg, err := e.Fields.GetValue("message") + if err != nil { + t.Fatal(err) + } + assert.Equal(t, msg, tc.expectedRecords[i]) + } + } + + assert.True(t, metrics.processingTime.Size() > 0) // TODO: is this the right way of checking if we collected some processing time? + + // Messages + assert.Equal(t, tc.receivedMessages, metrics.receivedMessages.Get()) + assert.Equal(t, uint64(len(tc.event)), metrics.receivedBytes.Get()) + assert.Equal(t, tc.sanitizedMessages, metrics.sanitizedMessages.Get()) + assert.Equal(t, tc.processedMessages, metrics.processedMessages.Get()) + + // General + assert.Equal(t, tc.decodeErrors, metrics.decodeErrors.Get()) + + // Events + assert.Equal(t, tc.receivedEvents, metrics.receivedEvents.Get()) + assert.Equal(t, tc.sentEvents, metrics.sentEvents.Get()) + + metrics.Close() // Stop the metrics collection. + } +} diff --git a/x-pack/filebeat/input/azureeventhub/sanitization_test.go b/x-pack/filebeat/input/azureeventhub/sanitization_test.go index cee113f7385..f4d072f5036 100644 --- a/x-pack/filebeat/input/azureeventhub/sanitization_test.go +++ b/x-pack/filebeat/input/azureeventhub/sanitization_test.go @@ -14,9 +14,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/elastic-agent-libs/monitoring" ) -func TestParseMultipleMessagesSanitization(t *testing.T) { +func TestParseMultipleRecordsSanitization(t *testing.T) { msg := "{\"records\":[{'test':\"this is some message\",\n\n\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + "{\"test\":\"this is '2nd' message\",\"time\":\"2019-12-17T13:43:44.4946995Z\"}," + "{\"time\": \"2023-04-11T13:35:20Z\", \"resourceId\": \"/SUBSCRIPTIONS/REDACTED/RESOURCEGROUPS/ELASTIC-FUNCTION-TEST/PROVIDERS/MICROSOFT.WEB/SITES/REDACTED\", \"category\": \"FunctionAppLogs\", \"operationName\": \"Microsoft.Web/sites/functions/log\", \"level\": \"Informational\", \"location\": \"West Europe\", \"properties\": {'appName':'REDACTED','roleInstance':'REDACTED','message':'Elastic Test Function Trigger. ---- West Europe West Europe West Europe West Europe West Europe ','category':'Function.HttpTriggerJava.User','hostVersion':'4.16.5.5','functionInvocationId':'REDACTED','functionName':'HttpTriggerJava','hostInstanceId':'REDACTED','level':'Information','levelId':2,'processId':62}}]}" @@ -26,14 +27,19 @@ func TestParseMultipleMessagesSanitization(t *testing.T) { "{\"category\":\"FunctionAppLogs\",\"level\":\"Informational\",\"location\":\"West Europe\",\"operationName\":\"Microsoft.Web/sites/functions/log\",\"properties\":{\"appName\":\"REDACTED\",\"category\":\"Function.HttpTriggerJava.User\",\"functionInvocationId\":\"REDACTED\",\"functionName\":\"HttpTriggerJava\",\"hostInstanceId\":\"REDACTED\",\"hostVersion\":\"4.16.5.5\",\"level\":\"Information\",\"levelId\":2,\"message\":\"Elastic Test Function Trigger. ---- West Europe West Europe West Europe West Europe West Europe \",\"processId\":62,\"roleInstance\":\"REDACTED\"},\"resourceId\":\"/SUBSCRIPTIONS/REDACTED/RESOURCEGROUPS/ELASTIC-FUNCTION-TEST/PROVIDERS/MICROSOFT.WEB/SITES/REDACTED\",\"time\":\"2023-04-11T13:35:20Z\"}", } + reg := monitoring.NewRegistry() + metrics := newInputMetrics("test", reg) + defer metrics.Close() + input := azureInput{ - log: logp.NewLogger(fmt.Sprintf("%s test for input", inputName)), config: azureInputConfig{ SanitizeOptions: []string{"SINGLE_QUOTES", "NEW_LINES"}, }, + metrics: metrics, + log: logp.NewLogger(fmt.Sprintf("%s test for input", inputName)), } - messages := input.parseMultipleMessages([]byte(msg)) + messages := input.parseMultipleRecords([]byte(msg)) assert.NotNil(t, messages) assert.Equal(t, len(messages), 3) for _, ms := range messages { diff --git a/x-pack/filebeat/input/cel/config.go b/x-pack/filebeat/input/cel/config.go index 616300ae471..e37fe81eeec 100644 --- a/x-pack/filebeat/input/cel/config.go +++ b/x-pack/filebeat/input/cel/config.go @@ -15,6 +15,7 @@ import ( "gopkg.in/natefinch/lumberjack.v2" + "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/transport/httpcommon" ) @@ -44,7 +45,7 @@ type config struct { // available if no stored cursor exists. State map[string]interface{} `config:"state"` // Redact is the debug log state redaction configuration. - Redact redact `config:"redact"` + Redact *redact `config:"redact"` // Auth is the authentication config for connection to an HTTP // API endpoint. @@ -65,6 +66,10 @@ type redact struct { } func (c config) Validate() error { + if c.Redact == nil { + logp.L().Named("input.cel").Warn("missing recommended 'redact' configuration: " + + "see documentation for details: https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-cel.html#_redact") + } if c.Interval <= 0 { return errors.New("interval must be greater than 0") } diff --git a/x-pack/filebeat/input/cel/config_test.go b/x-pack/filebeat/input/cel/config_test.go index c4fcd82c999..fd895671b98 100644 --- a/x-pack/filebeat/input/cel/config_test.go +++ b/x-pack/filebeat/input/cel/config_test.go @@ -112,7 +112,8 @@ func TestConfigMustFailWithInvalidResource(t *testing.T) { } cfg := conf.MustNewConfigFrom(m) conf := defaultConfig() - conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Redact = &redact{} // Make sure we pass the redact requirement. err := cfg.Unpack(&conf) if fmt.Sprint(err) != fmt.Sprint(test.want) { t.Errorf("unexpected error return from Unpack: got:%v want:%v", err, test.want) @@ -458,7 +459,8 @@ func TestConfigOauth2Validation(t *testing.T) { test.input["resource.url"] = "localhost" cfg := conf.MustNewConfigFrom(test.input) conf := defaultConfig() - conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Redact = &redact{} // Make sure we pass the redact requirement. err := cfg.Unpack(&conf) if fmt.Sprint(err) != fmt.Sprint(test.wantErr) { @@ -509,7 +511,8 @@ func TestKeepAliveSetting(t *testing.T) { test.input["resource.url"] = "localhost" cfg := conf.MustNewConfigFrom(test.input) conf := defaultConfig() - conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Program = "{}" // Provide an empty program to avoid validation error from that. + conf.Redact = &redact{} // Make sure we pass the redact requirement. err := cfg.Unpack(&conf) if fmt.Sprint(err) != fmt.Sprint(test.wantErr) { t.Errorf("unexpected error return from Unpack: got: %v want: %v", err, test.wantErr) diff --git a/x-pack/filebeat/input/cel/input.go b/x-pack/filebeat/input/cel/input.go index 24c9684def1..557ad5422e9 100644 --- a/x-pack/filebeat/input/cel/input.go +++ b/x-pack/filebeat/input/cel/input.go @@ -10,7 +10,6 @@ package cel import ( "compress/gzip" "context" - "encoding/json" "errors" "fmt" "io" @@ -33,8 +32,6 @@ import ( "github.com/google/cel-go/cel" "github.com/google/cel-go/checker/decls" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" v2 "github.com/elastic/beats/v7/filebeat/input/v2" @@ -76,7 +73,17 @@ func Plugin(log *logp.Logger, store inputcursor.StateStore) v2.Plugin { } } -type input struct{} +type input struct { + time func() time.Time +} + +// now is time.Now with a modifiable time source. +func (i input) now() time.Time { + if i.time == nil { + return time.Now() + } + return i.time() +} func (input) Name() string { return inputName } @@ -110,7 +117,7 @@ func sanitizeFileName(name string) string { return strings.ReplaceAll(name, string(filepath.Separator), "_") } -func (input) run(env v2.Context, src *source, cursor map[string]interface{}, pub inputcursor.Publisher) error { +func (i input) run(env v2.Context, src *source, cursor map[string]interface{}, pub inputcursor.Publisher) error { cfg := src.cfg log := env.Logger.With("input_url", cfg.Resource.URL) @@ -219,11 +226,11 @@ func (input) run(env v2.Context, src *source, cursor map[string]interface{}, pub } // Process a set of event requests. - log.Debugw("request state", logp.Namespace("cel"), "state", redactor{state: state, mask: cfg.Redact.Fields, delete: cfg.Redact.Delete}) + log.Debugw("request state", logp.Namespace("cel"), "state", redactor{state: state, cfg: cfg.Redact}) metrics.executions.Add(1) - start := time.Now() - state, err = evalWith(ctx, prg, state) - log.Debugw("response state", logp.Namespace("cel"), "state", redactor{state: state, mask: cfg.Redact.Fields, delete: cfg.Redact.Delete}) + start := i.now() + state, err = evalWith(ctx, prg, state, start) + log.Debugw("response state", logp.Namespace("cel"), "state", redactor{state: state, cfg: cfg.Redact}) if err != nil { switch { case errors.Is(err, context.Canceled), errors.Is(err, context.DeadlineExceeded): @@ -899,8 +906,20 @@ func newProgram(ctx context.Context, src, root string, client *http.Client, limi return prg, nil } -func evalWith(ctx context.Context, prg cel.Program, state map[string]interface{}) (map[string]interface{}, error) { - out, _, err := prg.ContextEval(ctx, map[string]interface{}{root: state}) +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 + // as the lib.Time now global is static at program instantiation time + // which will persist over multiple evaluations. The lib.Time behaviour + // is correct for mito where CEL program instances live for only a + // single evaluation. Rather than incurring the cost of creating a new + // cel.Program for each evaluation, shadow lib.Time's now with a new + // value for each eval. We retain the lib.Time now global for + // compatibility between CEL programs developed in mito with programs + // run in the input. + "now": now, + root: state, + }) if e := ctx.Err(); e != nil { err = e } @@ -909,23 +928,20 @@ func evalWith(ctx context.Context, prg cel.Program, state map[string]interface{} return state, fmt.Errorf("failed eval: %w", err) } - v, err := out.ConvertToNative(reflect.TypeOf(&structpb.Value{})) + v, err := out.ConvertToNative(reflect.TypeOf((*structpb.Struct)(nil))) if err != nil { state["events"] = errorMessage(fmt.Sprintf("failed proto conversion: %v", err)) return state, fmt.Errorf("failed proto conversion: %w", err) } - b, err := protojson.MarshalOptions{Indent: ""}.Marshal(v.(proto.Message)) - if err != nil { - state["events"] = errorMessage(fmt.Sprintf("failed native conversion: %v", err)) - return state, fmt.Errorf("failed native conversion: %w", err) - } - var res map[string]interface{} - err = json.Unmarshal(b, &res) - if err != nil { - state["events"] = errorMessage(fmt.Sprintf("failed json conversion: %v", err)) - return state, fmt.Errorf("failed json conversion: %w", err) + switch v := v.(type) { + case *structpb.Struct: + return v.AsMap(), nil + default: + // This should never happen. + errMsg := fmt.Sprintf("unexpected native conversion type: %T", v) + state["events"] = errorMessage(errMsg) + return state, errors.New(errMsg) } - return res, nil } func errorMessage(msg string) map[string]interface{} { @@ -958,7 +974,7 @@ func test(url *url.URL) error { _, err := net.DialTimeout("tcp", net.JoinHostPort(url.Hostname(), port), time.Second) if err != nil { - return fmt.Errorf("url %q is unreachable", url) + return fmt.Errorf("url %q is unreachable: %w", url, err) } return nil @@ -1005,21 +1021,20 @@ func (m *inputMetrics) Close() { // redactor implements lazy field redaction of sets of a mapstr.M. type redactor struct { - state mapstr.M - mask []string // mask is the set of dotted paths to redact from state. - delete bool // if delete is true, delete redacted fields instead of showing a redaction. + state mapstr.M + cfg *redact } // String renders the JSON corresponding to r.state after applying redaction // operations. func (r redactor) String() string { - if len(r.mask) == 0 { + if r.cfg == nil || len(r.cfg.Fields) == 0 { return r.state.String() } c := make(mapstr.M, len(r.state)) cloneMap(c, r.state) - for _, mask := range r.mask { - if r.delete { + for _, mask := range r.cfg.Fields { + if r.cfg.Delete { walkMap(c, mask, func(parent mapstr.M, key string) { delete(parent, key) }) diff --git a/x-pack/filebeat/input/cel/input_test.go b/x-pack/filebeat/input/cel/input_test.go index a9140cb0c20..d9f87f103d4 100644 --- a/x-pack/filebeat/input/cel/input_test.go +++ b/x-pack/filebeat/input/cel/input_test.go @@ -36,6 +36,7 @@ var inputTests = []struct { server func(*testing.T, http.HandlerFunc, map[string]interface{}) handler http.HandlerFunc config map[string]interface{} + time func() time.Time persistCursor map[string]interface{} want []map[string]interface{} wantCursor []map[string]interface{} @@ -57,6 +58,23 @@ var inputTests = []struct { {"message": "Hello, World!"}, }, }, + { + name: "hello_world_time", + config: map[string]interface{}{ + "interval": 1, + "program": `{"events":[{"message":{"Hello, World!": now}}]}`, + "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{}{ + "Hello, World!": "2010-02-08T00:00:00Z", + }, + }}, + }, { name: "bad_events_type", config: map[string]interface{}{ @@ -1202,6 +1220,7 @@ func TestInput(t *testing.T) { cfg := conf.MustNewConfigFrom(test.config) conf := defaultConfig() + conf.Redact = &redact{} // Make sure we pass the redact requirement. err := cfg.Unpack(&conf) if err != nil { t.Fatalf("unexpected error unpacking config: %v", err) @@ -1237,7 +1256,7 @@ func TestInput(t *testing.T) { cancel() } } - err = input{}.run(v2Ctx, src, test.persistCursor, &client) + err = input{test.time}.run(v2Ctx, src, test.persistCursor, &client) if fmt.Sprint(err) != fmt.Sprint(test.wantErr) { t.Errorf("unexpected error from running input: got:%v want:%v", err, test.wantErr) } @@ -1552,14 +1571,26 @@ func paginationArrayHandler() http.HandlerFunc { } var redactorTests = []struct { - name string - state mapstr.M - mask []string - delete bool + name string + state mapstr.M + cfg *redact wantOrig string wantRedact string }{ + { + name: "nil_redact", + state: mapstr.M{ + "auth": mapstr.M{ + "user": "fred", + "pass": "top_secret", + }, + "other": "data", + }, + cfg: nil, + wantOrig: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, + wantRedact: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, + }, { name: "auth_no_delete", state: mapstr.M{ @@ -1569,8 +1600,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"auth"}, - delete: false, + cfg: &redact{ + Fields: []string{"auth"}, + Delete: false, + }, wantOrig: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, wantRedact: `{"auth":"*","other":"data"}`, }, @@ -1583,8 +1616,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"auth"}, - delete: true, + cfg: &redact{ + Fields: []string{"auth"}, + Delete: true, + }, wantOrig: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, wantRedact: `{"other":"data"}`, }, @@ -1597,8 +1632,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"auth.pass"}, - delete: false, + cfg: &redact{ + Fields: []string{"auth.pass"}, + Delete: false, + }, wantOrig: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, wantRedact: `{"auth":{"pass":"*","user":"fred"},"other":"data"}`, }, @@ -1611,8 +1648,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"auth.pass"}, - delete: true, + cfg: &redact{ + Fields: []string{"auth.pass"}, + Delete: true, + }, wantOrig: `{"auth":{"pass":"top_secret","user":"fred"},"other":"data"}`, wantRedact: `{"auth":{"user":"fred"},"other":"data"}`, }, @@ -1625,8 +1664,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"cursor.key"}, - delete: false, + cfg: &redact{ + Fields: []string{"cursor.key"}, + Delete: false, + }, wantOrig: `{"cursor":[{"key":"val_one","other":"data"},{"key":"val_two","other":"data"}],"other":"data"}`, wantRedact: `{"cursor":[{"key":"*","other":"data"},{"key":"*","other":"data"}],"other":"data"}`, }, @@ -1639,8 +1680,10 @@ var redactorTests = []struct { }, "other": "data", }, - mask: []string{"cursor.key"}, - delete: true, + cfg: &redact{ + Fields: []string{"cursor.key"}, + Delete: true, + }, wantOrig: `{"cursor":[{"key":"val_one","other":"data"},{"key":"val_two","other":"data"}],"other":"data"}`, wantRedact: `{"cursor":[{"other":"data"},{"other":"data"}],"other":"data"}`, }, @@ -1649,7 +1692,7 @@ var redactorTests = []struct { func TestRedactor(t *testing.T) { for _, test := range redactorTests { t.Run(test.name, func(t *testing.T) { - got := fmt.Sprint(redactor{state: test.state, mask: test.mask, delete: test.delete}) + got := fmt.Sprint(redactor{state: test.state, cfg: test.cfg}) orig := fmt.Sprint(test.state) if orig != test.wantOrig { t.Errorf("unexpected original state after redaction:\n--- got\n--- want\n%s", cmp.Diff(orig, test.wantOrig)) diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go index b4e12e05227..73b641c3949 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/azure.go @@ -491,6 +491,36 @@ func (p *azure) publishDevice(d *fetcher.Device, state *stateStore, inputID stri _, _ = deviceDoc.Put("device.group", groups) } + owners := make([]mapstr.M, 0, d.RegisteredOwners.Len()) + d.RegisteredOwners.ForEach(func(userID uuid.UUID) { + u, ok := state.users[userID] + if !ok { + p.logger.Warnf("Unable to lookup registered owner %q for device %q", userID, d.ID) + return + } + m := u.Fields.Clone() + _, _ = m.Put("user.id", u.ID.String()) + owners = append(owners, m) + }) + if len(owners) != 0 { + _, _ = deviceDoc.Put("device.registered_owners", owners) + } + + users := make([]mapstr.M, 0, d.RegisteredUsers.Len()) + d.RegisteredUsers.ForEach(func(userID uuid.UUID) { + u, ok := state.users[userID] + if !ok { + p.logger.Warnf("Unable to lookup registered user %q for device %q", userID, d.ID) + return + } + m := u.Fields.Clone() + _, _ = m.Put("user.id", u.ID.String()) + users = append(users, m) + }) + if len(users) != 0 { + _, _ = deviceDoc.Put("device.registered_users", users) + } + event := beat.Event{ Timestamp: time.Now(), Fields: deviceDoc, diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device.go index c609403a959..46139d27820 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device.go @@ -11,26 +11,6 @@ import ( "github.com/elastic/elastic-agent-libs/mapstr" ) -// TODO: Implement fetchers for the registered owners and users -// for devices. These will then be retained in the following fields -// of Device. -// -// // A set of UUIDs for registered owners of this device. -// RegisteredOwners collections.UUIDSet `json:"registeredOwners"` -// // A set of UUIDs for registered users of this device. -// RegisteredUsers collections.UUIDSet `json:"registeredUsers"` -// -// and the addition of the following lines to Merge -// -// other.RegisteredOwners.ForEach(func(elem uuid.UUID) { -// d.RegisteredOwners.Add(elem) -// }) -// other.RegisteredUsers.ForEach(func(elem uuid.UUID) { -// d.RegisteredUsers.Add(elem) -// }) -// -// with associated test extensions. - // Device represents a device identity asset. type Device struct { // The ID (UUIDv4) of the device. @@ -41,6 +21,10 @@ type Device struct { MemberOf collections.UUIDSet `json:"memberOf"` // A set of UUIDs which are groups this device is a transitive member of. TransitiveMemberOf collections.UUIDSet `json:"transitiveMemberOf"` + // A set of UUIDs for registered owners of this device. + RegisteredOwners collections.UUIDSet `json:"registeredOwners"` + // A set of UUIDs for registered users of this device. + RegisteredUsers collections.UUIDSet `json:"registeredUsers"` // Discovered indicates that this device was newly discovered. This does not // necessarily imply the device was recently added in Azure Active Directory, // but it does indicate that it's the first time the device has been seen by @@ -68,5 +52,11 @@ func (d *Device) Merge(other *Device) { other.TransitiveMemberOf.ForEach(func(elem uuid.UUID) { d.TransitiveMemberOf.Add(elem) }) + other.RegisteredOwners.ForEach(func(elem uuid.UUID) { + d.RegisteredOwners.Add(elem) + }) + other.RegisteredUsers.ForEach(func(elem uuid.UUID) { + d.RegisteredUsers.Add(elem) + }) d.Deleted = other.Deleted } diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device_test.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device_test.go index 2f49ef68bb0..37e6563eb3a 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device_test.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/device_test.go @@ -32,6 +32,11 @@ func TestDevice_Merge(t *testing.T) { }, MemberOf: collections.NewUUIDSet(uuid.MustParse("fcda226a-c920-4d99-81bc-d2d691a6c212")), TransitiveMemberOf: collections.NewUUIDSet(uuid.MustParse("ca777ad5-9abf-4c9b-be1f-c38c6ec28f28")), + RegisteredOwners: collections.NewUUIDSet(uuid.MustParse("c59fbdb8-e442-46b1-8d72-c8ac0b78ec0a")), + RegisteredUsers: collections.NewUUIDSet( + uuid.MustParse("27cea005-7377-4175-b2ef-e9d64c977f4d"), + uuid.MustParse("c59fbdb8-e442-46b1-8d72-c8ac0b78ec0a"), + ), }, InOther: &Device{ ID: uuid.MustParse("187f924c-e867-477e-8d74-dd762d6379dd"), @@ -40,6 +45,11 @@ func TestDevice_Merge(t *testing.T) { }, MemberOf: collections.NewUUIDSet(uuid.MustParse("a77e8cbb-27a5-49d3-9d5e-801997621f87")), TransitiveMemberOf: collections.NewUUIDSet(uuid.MustParse("c550d32c-09b2-4851-b0f2-1bc431e26d01")), + RegisteredOwners: collections.NewUUIDSet(uuid.MustParse("81d1b5cd-7cd6-469d-9fe8-0a5c6cf2a7b6")), + RegisteredUsers: collections.NewUUIDSet( + uuid.MustParse("5e6d279a-ce2b-43b8-a38f-3110907e1974"), + uuid.MustParse("c59fbdb8-e442-46b1-8d72-c8ac0b78ec0a"), + ), }, Want: &Device{ ID: uuid.MustParse("187f924c-e867-477e-8d74-dd762d6379dd"), @@ -55,6 +65,15 @@ func TestDevice_Merge(t *testing.T) { uuid.MustParse("ca777ad5-9abf-4c9b-be1f-c38c6ec28f28"), uuid.MustParse("c550d32c-09b2-4851-b0f2-1bc431e26d01"), ), + RegisteredOwners: collections.NewUUIDSet( + uuid.MustParse("81d1b5cd-7cd6-469d-9fe8-0a5c6cf2a7b6"), + uuid.MustParse("c59fbdb8-e442-46b1-8d72-c8ac0b78ec0a"), + ), + RegisteredUsers: collections.NewUUIDSet( + uuid.MustParse("27cea005-7377-4175-b2ef-e9d64c977f4d"), + uuid.MustParse("5e6d279a-ce2b-43b8-a38f-3110907e1974"), + uuid.MustParse("c59fbdb8-e442-46b1-8d72-c8ac0b78ec0a"), + ), }, }, } @@ -70,6 +89,8 @@ func TestDevice_Merge(t *testing.T) { require.Equal(t, tc.Want.Fields, tc.In.Fields) require.ElementsMatch(t, tc.Want.MemberOf.Values(), tc.In.MemberOf.Values(), "list A: Expected, listB: Actual") require.ElementsMatch(t, tc.Want.TransitiveMemberOf.Values(), tc.In.TransitiveMemberOf.Values(), "list A: Expected, listB: Actual") + require.ElementsMatch(t, tc.Want.RegisteredOwners.Values(), tc.In.RegisteredOwners.Values(), "list A: Expected, listB: Actual") + require.ElementsMatch(t, tc.Want.RegisteredUsers.Values(), tc.In.RegisteredUsers.Values(), "list A: Expected, listB: Actual") }) } } diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph.go index 84e416c161a..44754e10fa6 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph.go @@ -18,6 +18,7 @@ import ( "github.com/google/uuid" + "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/internal/collections" "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/provider/azuread/authenticator" "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher" "github.com/elastic/elastic-agent-libs/config" @@ -31,7 +32,7 @@ const ( defaultGroupsQuery = "$select=displayName,members" defaultUsersQuery = "$select=accountEnabled,userPrincipalName,mail,displayName,givenName,surname,jobTitle,officeLocation,mobilePhone,businessPhones" - defaultDevicesQuery = "$select=accountEnabled,displayName,operatingSystem,operatingSystemVersion,physicalIds,extensionAttributes,alternativeSecurityIds" + defaultDevicesQuery = "$select=accountEnabled,deviceId,displayName,operatingSystem,operatingSystemVersion,physicalIds,extensionAttributes,alternativeSecurityIds" apiGroupType = "#microsoft.graph.group" apiUserType = "#microsoft.graph.user" @@ -109,9 +110,10 @@ type graph struct { logger *logp.Logger auth authenticator.Authenticator - usersURL string - groupsURL string - devicesURL string + usersURL string + groupsURL string + devicesURL string + deviceOwnerUserURL string } // SetLogger sets the logger on this fetcher. @@ -155,12 +157,12 @@ func (f *graph) Groups(ctx context.Context, deltaLink string) ([]*fetcher.Group, return groups, response.DeltaLink, nil } if response.NextLink == fetchURL { - return nil, "", fmt.Errorf("error during fetch groups, encountered nextLink fetch infinite loop") + return groups, "", nextLinkLoopError{"groups"} } if response.NextLink != "" { fetchURL = response.NextLink } else { - return nil, "", fmt.Errorf("error during fetch groups, encountered response without nextLink or deltaLink") + return groups, "", missingLinkError{"groups"} } } } @@ -207,12 +209,12 @@ func (f *graph) Users(ctx context.Context, deltaLink string) ([]*fetcher.User, s return users, response.DeltaLink, nil } if response.NextLink == fetchURL { - return nil, "", fmt.Errorf("error during fetch users, encountered nextLink fetch infinite loop") + return users, "", nextLinkLoopError{"users"} } if response.NextLink != "" { fetchURL = response.NextLink } else { - return nil, "", fmt.Errorf("error during fetch users, encountered response without nextLink or deltaLink") + return users, "", missingLinkError{"users"} } } } @@ -252,6 +254,10 @@ func (f *graph) Devices(ctx context.Context, deltaLink string) ([]*fetcher.Devic continue } f.logger.Debugf("Got device %q from API", device.ID) + + f.addRegistered(ctx, device, "registeredOwners", &device.RegisteredOwners) + f.addRegistered(ctx, device, "registeredUsers", &device.RegisteredUsers) + devices = append(devices, device) } @@ -259,16 +265,30 @@ func (f *graph) Devices(ctx context.Context, deltaLink string) ([]*fetcher.Devic return devices, response.DeltaLink, nil } if response.NextLink == fetchURL { - return nil, "", fmt.Errorf("error during fetch devices, encountered nextLink fetch infinite loop") + return devices, "", nextLinkLoopError{"devices"} } if response.NextLink != "" { fetchURL = response.NextLink } else { - return nil, "", fmt.Errorf("error during fetch devices, encountered response without nextLink or deltaLink") + return devices, "", missingLinkError{"devices"} } } } +// addRegistered adds registered owner or user UUIDs to the provided device. +func (f *graph) addRegistered(ctx context.Context, device *fetcher.Device, typ string, set *collections.UUIDSet) { + usersLink := fmt.Sprintf("%s/%s/%s", f.deviceOwnerUserURL, device.ID, typ) // ID here is the object ID. + users, _, err := f.Users(ctx, usersLink) + switch { + case err == nil, errors.Is(err, nextLinkLoopError{"users"}), errors.Is(err, missingLinkError{"users"}): + default: + f.logger.Errorf("Failed to obtain some registered user data: %w", err) + } + for _, u := range users { + set.Add(u.ID) + } +} + // doRequest is a convenience function for making HTTP requests to the Graph API. // It will automatically handle requesting a token using the authenticator attached // to this fetcher. @@ -342,6 +362,15 @@ func New(cfg *config.C, logger *logp.Logger, auth authenticator.Authenticator) ( devicesURL.RawQuery = url.QueryEscape(defaultDevicesQuery) f.devicesURL = devicesURL.String() + // The API takes a departure from the query approach here, so we + // need to construct a partial URL for use later when fetching + // registered owners and users. + ownerUserURL, err := url.Parse(f.conf.APIEndpoint + "/devices/") + if err != nil { + return nil, fmt.Errorf("invalid device owner/user URL endpoint: %w", err) + } + f.deviceOwnerUserURL = ownerUserURL.String() + return &f, nil } @@ -423,3 +452,19 @@ func newDeviceFromAPI(d deviceAPI) (*fetcher.Device, error) { return &newDevice, nil } + +type nextLinkLoopError struct { + endpoint string +} + +func (e nextLinkLoopError) Error() string { + return fmt.Sprintf("error during fetch %s, encountered nextLink fetch infinite loop", e.endpoint) +} + +type missingLinkError struct { + endpoint string +} + +func (e missingLinkError) Error() string { + return fmt.Sprintf("error during fetch %s, encountered response without nextLink or deltaLink", e.endpoint) +} diff --git a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph_test.go b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph_test.go index 1b512fb101d..e54a05a2bd5 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph_test.go +++ b/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher/graph/graph_test.go @@ -10,12 +10,16 @@ import ( "fmt" "net/http" "net/http/httptest" + "path" + "reflect" "testing" "time" + "github.com/google/go-cmp/cmp" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/internal/collections" "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/provider/azuread/authenticator/mock" "github.com/elastic/beats/v7/x-pack/filebeat/input/entityanalytics/provider/azuread/fetcher" "github.com/elastic/elastic-agent-libs/config" @@ -113,6 +117,24 @@ var devicesResponse2 = apiDeviceResponse{ }, } +var deviceOwnerResponses = map[string]apiUserResponse{ + "6a59ea83-02bd-468f-a40b-f2c3d1821983": { + Users: []userAPI{{"id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"}}, + }, + "adbbe40a-0627-4328-89f1-88cac84dbc7f": { + Users: []userAPI{{"id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"}}, + }, +} + +var deviceUserResponses = map[string]apiUserResponse{ + "6a59ea83-02bd-468f-a40b-f2c3d1821983": { + Users: []userAPI{{"id": "d897d560-3d17-4dae-81b3-c898fe82bf84"}, {"id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"}}, + }, + "adbbe40a-0627-4328-89f1-88cac84dbc7f": { + Users: []userAPI{{"id": "5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"}}, + }, +} + var groupsResponse1 = apiGroupResponse{ Groups: []groupAPI{ { @@ -202,6 +224,26 @@ func (s *testServer) setup(t *testing.T) { require.NoError(t, err) }) + mux.HandleFunc("/devices/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/json") + + var data []byte + var err error + + switch path.Base(r.URL.Path) { + case "registeredOwners": + data, err = json.Marshal(deviceOwnerResponses[path.Base(path.Dir(r.URL.Path))]) + case "registeredUsers": + data, err = json.Marshal(deviceUserResponses[path.Base(path.Dir(r.URL.Path))]) + default: + err = fmt.Errorf("unknown endpoint: %s", r.URL) + } + require.NoError(t, err) + + _, err = w.Write(data) + require.NoError(t, err) + }) + mux.HandleFunc("/groups/delta", func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") @@ -375,6 +417,13 @@ func TestGraph_Devices(t *testing.T) { }, }, }, + RegisteredOwners: collections.NewUUIDSet( + uuid.MustParse("5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"), + ), + RegisteredUsers: collections.NewUUIDSet( + uuid.MustParse("5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"), + uuid.MustParse("d897d560-3d17-4dae-81b3-c898fe82bf84"), + ), }, { ID: uuid.MustParse("adbbe40a-0627-4328-89f1-88cac84dbc7f"), @@ -399,6 +448,12 @@ func TestGraph_Devices(t *testing.T) { }, }, }, + RegisteredOwners: collections.NewUUIDSet( + uuid.MustParse("5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"), + ), + RegisteredUsers: collections.NewUUIDSet( + uuid.MustParse("5ebc6a0f-05b7-4f42-9c8a-682bbc75d0fc"), + ), }, } @@ -417,6 +472,13 @@ func TestGraph_Devices(t *testing.T) { gotDevices, gotDeltaLink, gotErr := f.Devices(ctx, "") require.NoError(t, gotErr) - require.EqualValues(t, wantDevices, gotDevices) + // Using go-cmp because testify is too weak for this comparison. + // reflect.DeepEqual works, but won't show a reasonable diff. + exporter := cmp.Exporter(func(t reflect.Type) bool { + return t == reflect.TypeOf(collections.UUIDSet{}) + }) + if !cmp.Equal(wantDevices, gotDevices, exporter) { + t.Errorf("unexpected result:\n--- got\n--- want\n%s", cmp.Diff(wantDevices, gotDevices, exporter)) + } require.Equal(t, wantDeltaLink, gotDeltaLink) } diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go b/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go index 871a48d9cbd..e344b56478f 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/conf.go @@ -6,6 +6,7 @@ package okta import ( "errors" + "strings" "time" "github.com/elastic/elastic-agent-libs/transport/httpcommon" @@ -41,6 +42,11 @@ type conf struct { OktaDomain string `config:"okta_domain" validate:"required"` OktaToken string `config:"okta_token" validate:"required"` + // Dataset specifies the datasets to collect from + // the API. It can be ""/"all", "users", or + // "devices". + Dataset string `config:"dataset"` + // SyncInterval is the time between full // synchronisation operations. SyncInterval time.Duration `config:"sync_interval"` @@ -154,7 +160,11 @@ func (c *conf) Validate() error { return errInvalidUpdateInterval case c.SyncInterval <= c.UpdateInterval: return errSyncBeforeUpdate - default: + } + switch strings.ToLower(c.Dataset) { + case "", "all", "users", "devices": return nil + default: + return errors.New("dataset must be 'all', 'users', 'devices' or empty") } } diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta.go b/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta.go index ff000520b2c..30f5e0d4166 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta.go @@ -44,11 +44,6 @@ type User struct { Embedded HAL `json:"_embedded,omitempty"` } -// HAL is a JSON Hypertext Application Language object. -// -// See https://datatracker.ietf.org/doc/html/draft-kelly-json-hal-06 for details. -type HAL map[string]any - // Profile is an Okta user's profile. // // See https://developer.okta.com/docs/reference/api/users/#profile-object for details. @@ -103,6 +98,61 @@ type Provider struct { Name *string `json:"name,omitempty"` } +// Device is an Okta device's details. +// +// See https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices for details +type Device struct { + Created time.Time `json:"created"` + ID string `json:"id"` + LastUpdated time.Time `json:"lastUpdated"` + Profile DeviceProfile `json:"profile"` + ResourceAlternateID string `json:"resourceAlternateID"` + ResourceDisplayName DeviceDisplayName `json:"resourceDisplayName"` + ResourceID string `json:"resourceID"` + ResourceType string `json:"resourceType"` + Status string `json:"status"` + Links HAL `json:"_links,omitempty"` // See https://developer.okta.com/docs/reference/api/users/#links-object for details. + + // Users is the set of users associated with the device. + // It is not part of the list devices API return, but can + // be populated by a call to GetDeviceUsers. + Users []User `json:"users,omitempty"` +} + +// DeviceProfile is an Okta device's hardware and security profile. +// +// See https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices for details +type DeviceProfile struct { + DiskEncryptionType *string `json:"diskEncryptionType,omitempty"` + DisplayName string `json:"displayName"` + IMEI *string `json:"imei,omitempty"` + IntegrityJailBreak *bool `json:"integrityJailBreak,omitempty"` + Manufacturer *string `json:"manufacturer,omitempty"` + MEID *string `json:"meid,omitempty"` + Model *string `json:"model,omitempty"` + OSVersion *string `json:"osVersion,omitempty"` + Platform string `json:"platform"` + Registered bool `json:"registered"` + SecureHardwarePresent *bool `json:"secureHardwarePresent,omitempty"` + SerialNumber *string `json:"serialNumber,omitempty"` + SID *string `json:"sid,omitempty"` + TPMPublicKeyHash *string `json:"tpmPublicKeyHash,omitempty"` + UDID *string `json:"udid,omitempty"` +} + +// DeviceDisplayName is an Okta device's annotated display name. +// +// See https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices for details +type DeviceDisplayName struct { + Sensitive bool `json:"sensitive"` + Value string `json:"value"` +} + +// HAL is a JSON Hypertext Application Language object. +// +// See https://datatracker.ietf.org/doc/html/draft-kelly-json-hal-06 for details. +type HAL map[string]any + // Response is a set of omit options specifying a part of the response to omit. // // See https://developer.okta.com/docs/reference/api/users/#content-type-header-fields-2 for details. @@ -164,12 +214,81 @@ func (o Response) String() string { func GetUserDetails(ctx context.Context, cli *http.Client, host, key, user string, query url.Values, omit Response, lim *rate.Limiter, window time.Duration) ([]User, http.Header, error) { const endpoint = "/api/v1/users" - u := url.URL{ + u := &url.URL{ Scheme: "https", Host: host, Path: path.Join(endpoint, user), RawQuery: query.Encode(), } + return getDetails[User](ctx, cli, u, key, user == "", omit, lim, window) +} + +// GetDeviceDetails returns Okta device details using the list devices API endpoint. host is the +// Okta user domain and key is the API token to use for the query. If device is not empty, +// details for the specific device are returned, otherwise a list of all devices is returned. +// +// See GetUserDetails for details of the query and rate limit parameters. +// +// See https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices for details. +func GetDeviceDetails(ctx context.Context, cli *http.Client, host, key, device string, query url.Values, lim *rate.Limiter, window time.Duration) ([]Device, http.Header, error) { + const endpoint = "/api/v1/devices" + + u := &url.URL{ + Scheme: "https", + Host: host, + Path: path.Join(endpoint, device), + RawQuery: query.Encode(), + } + return getDetails[Device](ctx, cli, u, key, device == "", OmitNone, lim, window) +} + +// GetDeviceUsers returns Okta user details for users asscoiated with the provided device identifier +// using the list device users API. host is the Okta user domain and key is the API token to use for +// the query. If device is empty, a nil User slice and header is returned, without error. +// +// See GetUserDetails for details of the query and rate limit parameters. +// +// See https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDeviceUsers for details. +func GetDeviceUsers(ctx context.Context, cli *http.Client, host, key, device string, query url.Values, omit Response, lim *rate.Limiter, window time.Duration) ([]User, http.Header, error) { + if device == "" { + // No user associated with a null device. Not an error. + return nil, nil, nil + } + + const endpoint = "/api/v1/devices" + + u := &url.URL{ + Scheme: "https", + Host: host, + Path: path.Join(endpoint, device, "users"), + RawQuery: query.Encode(), + } + du, h, err := getDetails[devUser](ctx, cli, u, key, true, omit, lim, window) + if err != nil { + return nil, h, err + } + users := make([]User, len(du)) + for i, du := range du { + users[i] = du.User + } + return users, h, nil +} + +// entity is an Okta entity analytics entity. +type entity interface { + User | Device | devUser +} + +type devUser struct { + User `json:"user"` +} + +// getDetails returns Okta details using the API endpoint in u. host is the Okta +// user domain and key is the API token to use for the query. If all is false, details +// for the specific user are returned, otherwise a list of all users is returned. +// +// See GetUserDetails for details of the query and rate limit parameters. +func getDetails[E entity](ctx context.Context, cli *http.Client, u *url.URL, key string, all bool, omit Response, lim *rate.Limiter, window time.Duration) ([]E, http.Header, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) if err != nil { return nil, nil, err @@ -203,22 +322,22 @@ func GetUserDetails(ctx context.Context, cli *http.Client, host, key, user strin return nil, nil, err } - if user == "" { - // List all users. - var users []User - err = json.Unmarshal(body.Bytes(), &users) + if all { + // List all entities. + var e []E + err = json.Unmarshal(body.Bytes(), &e) if err != nil { err = recoverError(body.Bytes()) } - return users, resp.Header, err + return e, resp.Header, err } - // Get single user's details. - var users [1]User - err = json.Unmarshal(body.Bytes(), &users[0]) + // Get single entity's details. + var e [1]E + err = json.Unmarshal(body.Bytes(), &e[0]) if err != nil { err = recoverError(body.Bytes()) } - return users[:], resp.Header, err + return e[:], resp.Header, err } // recoverError returns an error based on the returned Okta API error. Error diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta_test.go b/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta_test.go index 0ff02bc456e..63b6dbf6ba2 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta_test.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/internal/okta/okta_test.go @@ -16,6 +16,7 @@ import ( "net/http/httptest" "net/url" "os" + "strings" "testing" "time" @@ -24,7 +25,7 @@ import ( "golang.org/x/time/rate" ) -var logUsers = flag.Bool("log_user_response", false, "use to allow log users returned from the API") +var logResponses = flag.Bool("log_response", false, "use to log users/devices returned from the API") func Test(t *testing.T) { // https://developer.okta.com/docs/reference/core-okta-api/ @@ -72,7 +73,7 @@ func Test(t *testing.T) { t.Errorf("unexpected credentials with %s: %#v", omit, me.Credentials) } - if !*logUsers { + if !*logResponses { return } b, err := json.Marshal(me) @@ -122,7 +123,7 @@ func Test(t *testing.T) { t.Error("failed to find 'me' in user list") } - if !*logUsers { + if !*logResponses { return } b, err := json.Marshal(users) @@ -148,85 +149,166 @@ func Test(t *testing.T) { }) }) } -} - -func TestLocal(t *testing.T) { - // Make a global limiter with more capacity than will be set by the mock API. - // This will show the burst drop. - limiter := rate.NewLimiter(10, 10) - - // There are a variety of windows, the most conservative is one minute. - // The rate limit will be adjusted on the second call to the API if - // window is actually used to rate limit calculations. - const window = time.Minute - - const ( - key = "token" - msg = `[{"id":"userid","status":"STATUS","created":"2023-05-14T13:37:20.000Z","activated":null,"statusChanged":"2023-05-15T01:50:30.000Z","lastLogin":"2023-05-15T01:59:20.000Z","lastUpdated":"2023-05-15T01:50:32.000Z","passwordChanged":"2023-05-15T01:50:32.000Z","type":{"id":"typeid"},"profile":{"firstName":"name","lastName":"surname","mobilePhone":null,"secondEmail":null,"login":"name.surname@example.com","email":"name.surname@example.com"},"credentials":{"password":{"value":"secret"},"emails":[{"value":"name.surname@example.com","status":"VERIFIED","type":"PRIMARY"}],"provider":{"type":"OKTA","name":"OKTA"}},"_links":{"self":{"href":"https://localhost/api/v1/users/userid"}}}]` - ) - var wantUsers []User - err := json.Unmarshal([]byte(msg), &wantUsers) - if err != nil { - t.Fatalf("failed to unmarshal user data: %v", err) - } - ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - u, err := url.Parse(r.RequestURI) + t.Run("device", func(t *testing.T) { + query := make(url.Values) + query.Set("limit", "200") + devices, _, err := GetDeviceDetails(context.Background(), http.DefaultClient, host, key, "", query, limiter, window) if err != nil { - t.Errorf("unexpected error parsing request URI: %v", err) + t.Fatalf("unexpected error: %v", err) } - if u.Path != "/api/v1/users" { - t.Errorf("unexpected API endpoint: got:%s want:%s", u.Path, "/api/v1/users") + if *logResponses { + b, err := json.Marshal(devices) + if err != nil { + t.Errorf("failed to marshal devices for logging: %v", err) + } + t.Logf("devices: %s", b) } - if got := r.Header.Get("accept"); got != "application/json" { - t.Errorf("unexpected Accept header: got:%s want:%s", got, "application/json") + for _, d := range devices { + users, _, err := GetDeviceUsers(context.Background(), http.DefaultClient, host, key, d.ID, query, OmitCredentials, limiter, window) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + b, err := json.Marshal(users) + if err != nil { + t.Errorf("failed to marshal users for logging: %v", err) + } + t.Logf("users: %s", b) } - if got := r.Header.Get("authorization"); got != "SSWS "+key { - t.Errorf("unexpected Authorization header: got:%s want:%s", got, "SSWS "+key) + }) +} + +var localTests = []struct { + name string + msg string + id string + fn func(ctx context.Context, cli *http.Client, host, key, user string, query url.Values, lim *rate.Limiter, window time.Duration) (any, http.Header, error) + mkWant func(string) (any, error) +}{ + { + // Test case constructed from API-returned value with details anonymised. + name: "users", + msg: `[{"id":"userid","status":"STATUS","created":"2023-05-14T13:37:20.000Z","activated":null,"statusChanged":"2023-05-15T01:50:30.000Z","lastLogin":"2023-05-15T01:59:20.000Z","lastUpdated":"2023-05-15T01:50:32.000Z","passwordChanged":"2023-05-15T01:50:32.000Z","type":{"id":"typeid"},"profile":{"firstName":"name","lastName":"surname","mobilePhone":null,"secondEmail":null,"login":"name.surname@example.com","email":"name.surname@example.com"},"credentials":{"password":{"value":"secret"},"emails":[{"value":"name.surname@example.com","status":"VERIFIED","type":"PRIMARY"}],"provider":{"type":"OKTA","name":"OKTA"}},"_links":{"self":{"href":"https://localhost/api/v1/users/userid"}}}]`, + fn: func(ctx context.Context, cli *http.Client, host, key, user string, query url.Values, lim *rate.Limiter, window time.Duration) (any, http.Header, error) { + return GetUserDetails(context.Background(), cli, host, key, user, query, OmitNone, lim, window) + }, + mkWant: mkWant[User], + }, + { + // Test case from https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/#tag/Device/operation/listDevices + name: "devices", + msg: `[{"id":"devid","status":"CREATED","created":"2019-10-02T18:03:07.000Z","lastUpdated":"2019-10-02T18:03:07.000Z","profile":{"displayName":"Example Device name 1","platform":"WINDOWS","serialNumber":"XXDDRFCFRGF3M8MD6D","sid":"S-1-11-111","registered":true,"secureHardwarePresent":false,"diskEncryptionType":"ALL_INTERNAL_VOLUMES"},"resourceType":"UDDevice","resourceDisplayName":{"value":"Example Device name 1","sensitive":false},"resourceAlternateId":null,"resourceId":"guo4a5u7YAHhjXrMK0g4","_links":{"activate":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g4/lifecycle/activate","hints":{"allow":["POST"]}},"self":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g4","hints":{"allow":["GET","PATCH","PUT"]}},"users":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g4/users","hints":{"allow":["GET"]}}}},{"id":"guo4a5u7YAHhjXrMK0g5","status":"ACTIVE","created":"2023-06-21T23:24:02.000Z","lastUpdated":"2023-06-21T23:24:02.000Z","profile":{"displayName":"Example Device name 2","platform":"ANDROID","manufacturer":"Google","model":"Pixel 6","osVersion":"13:2023-05-05","registered":true,"secureHardwarePresent":true,"diskEncryptionType":"USER"},"resourceType":"UDDevice","resourceDisplayName":{"value":"Example Device name 2","sensitive":false},"resourceAlternateId":null,"resourceId":"guo4a5u7YAHhjXrMK0g5","_links":{"activate":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g5/lifecycle/activate","hints":{"allow":["POST"]}},"self":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g5","hints":{"allow":["GET","PATCH","PUT"]}},"users":{"href":"https://{yourOktaDomain}/api/v1/devices/guo4a5u7YAHhjXrMK0g5/users","hints":{"allow":["GET"]}}}}]`, + fn: func(ctx context.Context, cli *http.Client, host, key, device string, query url.Values, lim *rate.Limiter, window time.Duration) (any, http.Header, error) { + return GetDeviceDetails(context.Background(), cli, host, key, device, query, lim, window) + }, + mkWant: mkWant[Device], + }, + { + // Test case constructed from API-returned value with details anonymised. + name: "devices_users", + msg: `[{"created":"2023-08-07T21:48:27.000Z","managementStatus":"NOT_MANAGED","user":{"id":"userid","status":"STATUS","created":"2023-05-14T13:37:20.000Z","activated":null,"statusChanged":"2023-05-15T01:50:30.000Z","lastLogin":"2023-05-15T01:59:20.000Z","lastUpdated":"2023-05-15T01:50:32.000Z","passwordChanged":"2023-05-15T01:50:32.000Z","type":{"id":"typeid"},"profile":{"firstName":"name","lastName":"surname","mobilePhone":null,"secondEmail":null,"login":"name.surname@example.com","email":"name.surname@example.com"},"credentials":{"password":{"value":"secret"},"emails":[{"value":"name.surname@example.com","status":"VERIFIED","type":"PRIMARY"}],"provider":{"type":"OKTA","name":"OKTA"}},"_links":{"self":{"href":"https://localhost/api/v1/users/userid"}}}}]`, + id: "devid", + fn: func(ctx context.Context, cli *http.Client, host, key, device string, query url.Values, lim *rate.Limiter, window time.Duration) (any, http.Header, error) { + return GetDeviceUsers(context.Background(), cli, host, key, device, query, OmitNone, lim, window) + }, + mkWant: mkWant[devUser], + }, +} + +func mkWant[E entity](data string) (any, error) { + var v []E + err := json.Unmarshal([]byte(data), &v) + if v, ok := any(v).([]devUser); ok { + users := make([]User, len(v)) + for i, u := range v { + users[i] = u.User } + return users, nil + } + return v, err +} + +func TestLocal(t *testing.T) { + for _, test := range localTests { + t.Run(test.name, func(t *testing.T) { + // Make a global limiter with more capacity than will be set by the mock API. + // This will show the burst drop. + limiter := rate.NewLimiter(10, 10) - // Leave 49 remaining, reset in one minute. - w.Header().Add("x-rate-limit-limit", "50") - w.Header().Add("x-rate-limit-remaining", "49") - w.Header().Add("x-rate-limit-reset", fmt.Sprint(time.Now().Add(time.Minute).Unix())) + // There are a variety of windows, the most conservative is one minute. + // The rate limit will be adjusted on the second call to the API if + // window is actually used to rate limit calculations. + const window = time.Minute - // Set next link. - w.Header().Add("link", `; rel="next"`) + const key = "token" + want, err := test.mkWant(test.msg) + if err != nil { + t.Fatalf("failed to unmarshal entity data: %v", err) + } - fmt.Fprintln(w, msg) - })) - defer ts.Close() - u, err := url.Parse(ts.URL) - if err != nil { - t.Errorf("failed to parse server URL: %v", err) - } - host := u.Host + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + u, err := url.Parse(r.RequestURI) + if err != nil { + t.Errorf("unexpected error parsing request URI: %v", err) + } + name, _, ok := strings.Cut(test.name, "_") + endpoint := "/api/v1/" + name + if ok { + endpoint += "/" + test.id + "/users" + } + if u.Path != endpoint { + t.Errorf("unexpected API endpoint: got:%s want:%s", u.Path, endpoint) + } + if got := r.Header.Get("accept"); got != "application/json" { + t.Errorf("unexpected Accept header: got:%s want:%s", got, "application/json") + } + if got := r.Header.Get("authorization"); got != "SSWS "+key { + t.Errorf("unexpected Authorization header: got:%s want:%s", got, "SSWS "+key) + } - query := make(url.Values) - query.Set("limit", "200") - users, h, err := GetUserDetails(context.Background(), ts.Client(), host, key, "", query, OmitNone, limiter, window) - if err != nil { - t.Fatalf("unexpected error from GetUserDetails: %v", err) - } + // Leave 49 remaining, reset in one minute. + w.Header().Add("x-rate-limit-limit", "50") + w.Header().Add("x-rate-limit-remaining", "49") + w.Header().Add("x-rate-limit-reset", fmt.Sprint(time.Now().Add(time.Minute).Unix())) - if !cmp.Equal(wantUsers, users) { - t.Errorf("unexpected result:\n- want\n+ got\n%s", cmp.Diff(wantUsers, users)) - } + // Set next link. + w.Header().Add("link", fmt.Sprintf(`; rel="next"`, test.name)) + fmt.Fprintln(w, test.msg) + })) + defer ts.Close() + u, err := url.Parse(ts.URL) + if err != nil { + t.Errorf("failed to parse server URL: %v", err) + } + host := u.Host - lim := limiter.Limit() - if lim < 49.0/60.0 || 50.0/60.0 < lim { - t.Errorf("unexpected rate limit (outside [49/60, 50/60]: %f", lim) - } - if limiter.Burst() != 1 { // Set in GetUserDetails. - t.Errorf("unexpected burst: got:%d want:1", limiter.Burst()) - } + query := make(url.Values) + query.Set("limit", "200") + got, h, err := test.fn(context.Background(), ts.Client(), host, key, test.id, query, limiter, window) + if err != nil { + t.Fatalf("unexpected error from Get_Details: %v", err) + } - next, err := Next(h) - if err != nil { - t.Errorf("unexpected error from Next: %v", err) - } - if query := next.Encode(); query != "after=opaquevalue&limit=200" { - t.Errorf("unexpected next query: got:%s want:%s", query, "after=opaquevalue&limit=200") + if !cmp.Equal(want, got) { + t.Errorf("unexpected result:\n- want\n+ got\n%s", cmp.Diff(want, got)) + } + + lim := limiter.Limit() + if lim < 49.0/60.0 || 50.0/60.0 < lim { + t.Errorf("unexpected rate limit (outside [49/60, 50/60]: %f", lim) + } + if limiter.Burst() != 1 { // Set in GetUserDetails. + t.Errorf("unexpected burst: got:%d want:1", limiter.Burst()) + } + + next, err := Next(h) + if err != nil { + t.Errorf("unexpected error from Next: %v", err) + } + if query := next.Encode(); query != "after=opaquevalue&limit=200" { + t.Errorf("unexpected next query: got:%s want:%s", query, "after=opaquevalue&limit=200") + } + }) } } diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go b/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go index fe6a69890fe..4aff3cd3e59 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/okta.go @@ -12,6 +12,7 @@ import ( "io" "net/http" "net/url" + "strings" "time" "github.com/hashicorp/go-retryablehttp" @@ -243,12 +244,16 @@ func (p *oktaInput) runFullSync(inputCtx v2.Context, store *kvstore.Store, clien ctx := ctxtool.FromCanceller(inputCtx.Cancelation) p.logger.Debugf("Starting fetch...") - _, err = p.doFetch(ctx, state, true) + _, err = p.doFetchUsers(ctx, state, true) + if err != nil { + return err + } + _, err = p.doFetchDevices(ctx, state, true) if err != nil { return err } - if len(state.users) != 0 { + if len(state.users) != 0 || len(state.devices) != 0 { tracker := kvstore.NewTxTracker(ctx) start := time.Now() @@ -256,6 +261,9 @@ func (p *oktaInput) runFullSync(inputCtx v2.Context, store *kvstore.Store, clien 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) + } end := time.Now() p.publishMarker(end, end, inputCtx.ID, false, client, tracker) @@ -294,17 +302,24 @@ func (p *oktaInput) runIncrementalUpdate(inputCtx v2.Context, store *kvstore.Sto }() ctx := ctxtool.FromCanceller(inputCtx.Cancelation) - updatedUsers, err := p.doFetch(ctx, state, false) + updatedUsers, err := p.doFetchUsers(ctx, state, false) + if err != nil { + return err + } + updatedDevices, err := p.doFetchDevices(ctx, state, false) if err != nil { return err } var tracker *kvstore.TxTracker - if len(updatedUsers) != 0 { + if len(updatedUsers) != 0 || len(updatedDevices) != 0 { tracker = kvstore.NewTxTracker(ctx) for _, u := range updatedUsers { p.publishUser(u, state, inputCtx.ID, client, tracker) } + for _, d := range updatedDevices { + p.publishDevice(d, state, inputCtx.ID, client, tracker) + } tracker.Wait() } @@ -320,19 +335,25 @@ func (p *oktaInput) runIncrementalUpdate(inputCtx v2.Context, store *kvstore.Sto return nil } -// doFetch handles fetching user and group identities from Azure Active Directory -// and enriching users with group memberships. If fullSync is true, then any -// existing deltaLink will be ignored, forcing a full synchronization from -// Azure Active Directory. Returns a set of modified users by ID. -func (p *oktaInput) doFetch(ctx context.Context, state *stateStore, fullSync bool) ([]*User, error) { +// doFetchUsers handles fetching user identities from Okta. If fullSync is true, then +// 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: + p.logger.Debugf("Skipping user collection from API: dataset=%s", p.cfg.Dataset) + return nil, nil + } + var ( query url.Values err error ) // Get user changes. - if !fullSync && state.next != "" { - query, err = url.ParseQuery(state.next) + if !fullSync && state.nextUsers != "" { + query, err = url.ParseQuery(state.nextUsers) if err != nil { p.logger.Warnf("failed to parse next query: %v", err) } @@ -394,18 +415,160 @@ func (p *oktaInput) doFetch(ctx context.Context, state *stateStore, fullSync boo // have a complete set from that timestamp. query = url.Values{} query.Add("search", fmt.Sprintf(`lastUpdated ge "%s" and status pr`, lastUpdated.Format(okta.ISO8601))) - state.next = query.Encode() + state.nextUsers = query.Encode() p.logger.Debugf("received %d users from API", len(users)) return users, nil } -func grow(u []*User, n int) []*User { - if len(u)+n <= cap(u) { - return u +// doFetchDevices handles fetching device and associated user identities from Okta. +// If fullSync is true, then any existing deltaLink will be ignored, forcing a full +// 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: + p.logger.Debugf("Skipping device collection from API: dataset=%s", p.cfg.Dataset) + return nil, nil + } + + var ( + deviceQuery url.Values + userQueryInit url.Values + err error + ) + + // Get user changes. + if !fullSync && state.nextDevices != "" { + deviceQuery, err = url.ParseQuery(state.nextDevices) + if err != nil { + p.logger.Warnf("failed to parse next query: %v", err) + } + } + if deviceQuery == nil { + // Use "search" because of recommendation on Okta dev documentation: + // https://developer.okta.com/docs/reference/user-query/. + // Search term of "status pr" is required so that we get DEPROVISIONED + // users; a nil query is more efficient, but excludes these users. + // There is no equivalent documentation for devices, so we assume the + // behaviour is the same. + deviceQuery = url.Values{"search": []string{"status pr"}} + } + // Start user queries from the same time point. This must not + // be mutated since we may perform multiple batched gets over + // multiple devices. + userQueryInit = cloneURLValues(deviceQuery) + + var ( + devices []*Device + lastUpdated time.Time + ) + for { + batch, h, err := okta.GetDeviceDetails(ctx, p.client, p.cfg.OktaDomain, p.cfg.OktaToken, "", deviceQuery, p.lim, p.cfg.LimitWindow) + if err != nil { + p.logger.Debugf("received %d devices from API", len(devices)) + return nil, err + } + p.logger.Debugf("received batch of %d devices from API", len(batch)) + + for i, d := range batch { + userQuery := cloneURLValues(userQueryInit) + for { + // TODO: Consider softening the response to errors here. If we fail to get users + // from a device, do we want to fail completely? There are arguments in both + // directions. We _could_ keep a multierror and return that in the end, which + // would guarantee progression, but may result in holes in the data. What we are + // doing at the moment (both here and in doFetchUsers) guarantees no holes, but + // at the cost of potentially not making progress. + + const omit = okta.OmitCredentials | okta.OmitCredentialsLinks | okta.OmitTransitioningToStatus + + users, h, err := okta.GetDeviceUsers(ctx, p.client, p.cfg.OktaDomain, p.cfg.OktaToken, d.ID, userQuery, omit, p.lim, p.cfg.LimitWindow) + if err != nil { + p.logger.Debugf("received %d device users from API", len(users)) + return nil, err + } + p.logger.Debugf("received batch of %d device users from API", len(users)) + + // Users are not stored in the state as they are in doFetchUsers. We expect + // them to already have been discovered/stored from that call and are stored + // associated with the device undecorated with discovery state. Or, if the + // the dataset is set to "devices", then we have been asked not to care about + // this detail. + batch[i].Users = append(batch[i].Users, users...) + + next, err := okta.Next(h) + if err != nil { + if err == io.EOF { + break + } + p.logger.Debugf("received %d devices from API", len(devices)) + return devices, err + } + userQuery = next + } + } + + if fullSync { + for _, d := range batch { + state.storeDevice(d) + if d.LastUpdated.After(lastUpdated) { + lastUpdated = d.LastUpdated + } + } + } else { + devices = grow(devices, len(batch)) + for _, d := range batch { + devices = append(devices, state.storeDevice(d)) + if d.LastUpdated.After(lastUpdated) { + lastUpdated = d.LastUpdated + } + } + } + + next, err := okta.Next(h) + if err != nil { + if err == io.EOF { + break + } + p.logger.Debugf("received %d devices from API", len(devices)) + return devices, err + } + deviceQuery = next + } + + // Prepare query for next update. This is any record that was updated + // at or after the last updated record we saw this round. Use this rather + // than time.Now() since we may have received stale records. Use ge + // rather than gt since timestamps are second resolution, so we may not + // have a complete set from that timestamp. + deviceQuery = url.Values{} + deviceQuery.Add("search", fmt.Sprintf(`lastUpdated ge "%s" and status pr`, lastUpdated.Format(okta.ISO8601))) + state.nextDevices = deviceQuery.Encode() + + p.logger.Debugf("received %d devices from API", len(devices)) + return devices, nil +} + +func cloneURLValues(a url.Values) url.Values { + b := make(url.Values, len(a)) + for k, v := range a { + b[k] = append(v[:0:0], v...) + } + return b +} + +type entity interface { + *User | *Device | okta.User +} + +func grow[T entity](e []T, n int) []T { + if len(e)+n <= cap(e) { + return e } - new := append(u, make([]*User, n)...) - return new[:len(u)] + new := append(e, make([]T, n)...) + return new[:len(e)] } // publishMarker will publish a write marker document using the given beat.Client. @@ -465,3 +628,32 @@ func (p *oktaInput) publishUser(u *User, state *stateStore, inputID string, clie client.Publish(event) } + +// publishDevice will publish a device document using the given beat.Client. +func (p *oktaInput) publishDevice(d *Device, state *stateStore, inputID string, client beat.Client, tracker *kvstore.TxTracker) { + devDoc := mapstr.M{} + + _, _ = devDoc.Put("okta", d.Device) + _, _ = devDoc.Put("labels.identity_source", inputID) + _, _ = devDoc.Put("device.id", d.ID) + + switch d.State { + case Deleted: + _, _ = devDoc.Put("event.action", "device-deleted") + case Discovered: + _, _ = devDoc.Put("event.action", "device-discovered") + case Modified: + _, _ = devDoc.Put("event.action", "device-modified") + } + + event := beat.Event{ + Timestamp: time.Now(), + Fields: devDoc, + Private: tracker, + } + tracker.Add() + + p.logger.Debugf("Publishing device %q", d.ID) + + client.Publish(event) +} diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/okta_test.go b/x-pack/filebeat/input/entityanalytics/provider/okta/okta_test.go index 20df104c06a..1286cc24689 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/okta_test.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/okta_test.go @@ -11,6 +11,7 @@ import ( "net/http" "net/http/httptest" "net/url" + "path" "strings" "testing" "time" @@ -21,101 +22,186 @@ import ( ) func TestOktaDoFetch(t *testing.T) { - dbFilename := "TestOktaDoFetch.db" - store := testSetupStore(t, dbFilename) - t.Cleanup(func() { - testCleanupStore(store, dbFilename) - }) - - const ( - window = time.Minute - key = "token" - msg = `[{"id":"userid","status":"STATUS","created":"2023-05-14T13:37:20.000Z","activated":null,"statusChanged":"2023-05-15T01:50:30.000Z","lastLogin":"2023-05-15T01:59:20.000Z","lastUpdated":"2023-05-15T01:50:32.000Z","passwordChanged":"2023-05-15T01:50:32.000Z","type":{"id":"typeid"},"profile":{"firstName":"name","lastName":"surname","mobilePhone":null,"secondEmail":null,"login":"name.surname@example.com","email":"name.surname@example.com"},"credentials":{"password":{"value":"secret"},"emails":[{"value":"name.surname@example.com","status":"VERIFIED","type":"PRIMARY"}],"provider":{"type":"OKTA","name":"OKTA"}},"_links":{"self":{"href":"https://localhost/api/v1/users/userid"}}}]` - ) - - var wantUsers []User - err := json.Unmarshal([]byte(msg), &wantUsers) - if err != nil { - t.Fatalf("failed to unmarshal user data: %v", err) + tests := []struct { + dataset string + wantUsers bool + wantDevices bool + }{ + {dataset: "", wantUsers: true, wantDevices: true}, + {dataset: "all", wantUsers: true, wantDevices: true}, + {dataset: "users", wantUsers: true, wantDevices: false}, + {dataset: "devices", wantUsers: false, wantDevices: true}, } - wantUserStates := make(map[string]State) - - // Set the number of repeats. - const repeats = 3 - var n int - ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Leave 49 remaining, reset in one minute. - w.Header().Add("x-rate-limit-limit", "50") - w.Header().Add("x-rate-limit-remaining", "49") - w.Header().Add("x-rate-limit-reset", fmt.Sprint(time.Now().Add(time.Minute).Unix())) - - // Set next link if we can still repeat. - n++ - if n < repeats { - w.Header().Add("link", `; rel="next"`) - } - - userid := fmt.Sprintf("userid%d", n) - - // Store expected states. The State values are all Discovered - // unless the user is deleted since they are all first appearance. - states := []string{ - "ACTIVE", - "RECOVERY", - "DEPROVISIONED", - } - status := states[n%len(states)] - state := Discovered - if status == "DEPROVISIONED" { - state = Deleted - } - wantUserStates[userid] = state - - replacer := strings.NewReplacer( - "userid", userid, - "STATUS", status, - ) - fmt.Fprintln(w, replacer.Replace(msg)) - })) - defer ts.Close() - - u, err := url.Parse(ts.URL) - if err != nil { - t.Errorf("failed to parse server URL: %v", err) - } - a := oktaInput{ - cfg: conf{ - OktaDomain: u.Host, - OktaToken: key, - }, - client: ts.Client(), - lim: rate.NewLimiter(1, 1), - logger: logp.L(), - } - - ss, err := newStateStore(store) - if err != nil { - t.Fatalf("unexpected error making state store: %v", err) - } - defer ss.close(false) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - got, err := a.doFetch(ctx, ss, false) - if err != nil { - t.Fatalf("unexpected error from doFetch: %v", err) + for _, test := range tests { + t.Run(test.dataset, func(t *testing.T) { + suffix := test.dataset + if suffix != "" { + suffix = "_" + suffix + } + dbFilename := fmt.Sprintf("TestOktaDoFetch%s.db", suffix) + store := testSetupStore(t, dbFilename) + t.Cleanup(func() { + testCleanupStore(store, dbFilename) + }) + + const ( + window = time.Minute + key = "token" + users = `[{"id":"USERID","status":"STATUS","created":"2023-05-14T13:37:20.000Z","activated":null,"statusChanged":"2023-05-15T01:50:30.000Z","lastLogin":"2023-05-15T01:59:20.000Z","lastUpdated":"2023-05-15T01:50:32.000Z","passwordChanged":"2023-05-15T01:50:32.000Z","type":{"id":"typeid"},"profile":{"firstName":"name","lastName":"surname","mobilePhone":null,"secondEmail":null,"login":"name.surname@example.com","email":"name.surname@example.com"},"credentials":{"password":{"value":"secret"},"emails":[{"value":"name.surname@example.com","status":"VERIFIED","type":"PRIMARY"}],"provider":{"type":"OKTA","name":"OKTA"}},"_links":{"self":{"href":"https://localhost/api/v1/users/USERID"}}}]` + devices = `[{"id":"DEVICEID","status":"STATUS","created":"2019-10-02T18:03:07.000Z","lastUpdated":"2019-10-02T18:03:07.000Z","profile":{"displayName":"Example Device name 1","platform":"WINDOWS","serialNumber":"XXDDRFCFRGF3M8MD6D","sid":"S-1-11-111","registered":true,"secureHardwarePresent":false,"diskEncryptionType":"ALL_INTERNAL_VOLUMES"},"resourceType":"UDDevice","resourceDisplayName":{"value":"Example Device name 1","sensitive":false},"resourceAlternateId":null,"resourceId":"DEVICEID","_links":{"activate":{"href":"https://localhost/api/v1/devices/DEVICEID/lifecycle/activate","hints":{"allow":["POST"]}},"self":{"href":"https://localhost/api/v1/devices/DEVICEID","hints":{"allow":["GET","PATCH","PUT"]}},"users":{"href":"https://localhost/api/v1/devices/DEVICEID/users","hints":{"allow":["GET"]}}}}]` + ) + + data := map[string]string{ + "users": users, + "devices": devices, + } + + var wantUsers []User + if test.wantUsers { + err := json.Unmarshal([]byte(users), &wantUsers) + if err != nil { + t.Fatalf("failed to unmarshal user data: %v", err) + } + } + var wantDevices []Device + if test.wantDevices { + err := json.Unmarshal([]byte(users), &wantDevices) + if err != nil { + t.Fatalf("failed to unmarshal device data: %v", err) + } + } + + wantStates := make(map[string]State) + + // Set the number of repeats. + const repeats = 3 + var n int + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Leave 49 remaining, reset in one minute. + w.Header().Add("x-rate-limit-limit", "50") + w.Header().Add("x-rate-limit-remaining", "49") + w.Header().Add("x-rate-limit-reset", fmt.Sprint(time.Now().Add(time.Minute).Unix())) + + if strings.HasPrefix(r.URL.Path, "/api/v1/device") && strings.HasSuffix(r.URL.Path, "users") { + // Give one user if this is a get device users request. + fmt.Fprintln(w, data["users"]) + return + } + + base := path.Base(r.URL.Path) + + // Set next link if we can still repeat. + n++ + if n < repeats { + w.Header().Add("link", fmt.Sprintf(`; rel="next"`, base)) + } + + prefix := strings.TrimRight(base, "s") // endpoints are plural. + id := fmt.Sprintf("%sid%d", prefix, n) + + // Store expected states. The State values are all Discovered + // unless the user is deleted since they are all first appearance. + states := []string{ + "ACTIVE", + "RECOVERY", + "DEPROVISIONED", + } + status := states[n%len(states)] + state := Discovered + if status == "DEPROVISIONED" { + state = Deleted + } + wantStates[id] = state + + replacer := strings.NewReplacer( + strings.ToUpper(prefix+"id"), id, + "STATUS", status, + ) + fmt.Fprintln(w, replacer.Replace(data[base])) + })) + defer ts.Close() + + u, err := url.Parse(ts.URL) + if err != nil { + t.Errorf("failed to parse server URL: %v", err) + } + a := oktaInput{ + cfg: conf{ + OktaDomain: u.Host, + OktaToken: key, + Dataset: test.dataset, + }, + client: ts.Client(), + lim: rate.NewLimiter(1, 1), + logger: logp.L(), + } + + ss, err := newStateStore(store) + if err != nil { + t.Fatalf("unexpected error making state store: %v", err) + } + defer ss.close(false) + + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + t.Run("users", func(t *testing.T) { + n = 0 + + got, err := a.doFetchUsers(ctx, ss, false) + if err != nil { + t.Fatalf("unexpected error from doFetch: %v", err) + } + + if len(got) != wantCount(repeats, test.wantUsers) { + t.Errorf("unexpected number of results: got:%d want:%d", len(got), wantCount(repeats, test.wantUsers)) + } + for i, g := range got { + if wantID := fmt.Sprintf("userid%d", i+1); g.ID != wantID { + t.Errorf("unexpected user ID for user %d: got:%s want:%s", i, g.ID, wantID) + } + if g.State != wantStates[g.ID] { + t.Errorf("unexpected user state for user %s: got:%s want:%s", g.ID, g.State, wantStates[g.ID]) + } + } + }) + + t.Run("devices", func(t *testing.T) { + n = 0 + + got, err := a.doFetchDevices(ctx, ss, false) + if err != nil { + t.Fatalf("unexpected error from doFetch: %v", err) + } + + if len(got) != wantCount(repeats, test.wantDevices) { + t.Errorf("unexpected number of results: got:%d want:%d", len(got), wantCount(repeats, test.wantDevices)) + } + for i, g := range got { + if wantID := fmt.Sprintf("deviceid%d", i+1); g.ID != wantID { + t.Errorf("unexpected device ID for device %d: got:%s want:%s", i, g.ID, wantID) + } + if g.State != wantStates[g.ID] { + t.Errorf("unexpected device state for device %s: got:%s want:%s", g.ID, g.State, wantStates[g.ID]) + } + if g.Users == nil { + t.Errorf("expected users for device %s", g.ID) + } + } + + if t.Failed() { + b, _ := json.MarshalIndent(got, "", "\t") + t.Logf("document:\n%s", b) + } + }) + }) } +} - if len(got) != repeats { - t.Errorf("unexpected number of results: got:%d want:%d", len(got), repeats) - } - for i, g := range got { - if wantID := fmt.Sprintf("userid%d", i+1); g.ID != wantID { - t.Errorf("unexpected user ID for user %d: got:%s want:%s", i, g.ID, wantID) - } - if g.State != wantUserStates[g.ID] { - t.Errorf("unexpected user ID for user %s: got:%s want:%s", g.ID, g.State, wantUserStates[g.ID]) - } +func wantCount(n int, want bool) int { + if !want { + return 0 } + return n } diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/statestore.go b/x-pack/filebeat/input/entityanalytics/provider/okta/statestore.go index 2b616a2a337..8a11376af51 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/statestore.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/statestore.go @@ -17,12 +17,14 @@ import ( ) var ( - usersBucket = []byte("users") - stateBucket = []byte("state") + usersBucket = []byte("users") + devicesBucket = []byte("devices") + stateBucket = []byte("state") - lastSyncKey = []byte("last_sync") - lastUpdateKey = []byte("last_update") - usersLinkKey = []byte("users_link") + lastSyncKey = []byte("last_sync") + lastUpdateKey = []byte("last_update") + usersLinkKey = []byte("users_link") + devicesLinkKey = []byte("devices_link") ) //go:generate stringer -type State @@ -40,19 +42,28 @@ type User struct { State State `json:"state"` } +type Device struct { + okta.Device `json:"properties"` + State State `json:"state"` +} + // stateStore wraps a kvstore.Transaction and provides convenience methods for // accessing and store relevant data within the kvstore database. type stateStore struct { tx *kvstore.Transaction - // next is a url.Values stored as a string to make - // use of the direct serialisation/deserialisation + // nextUsers and nextDevices are url.Values stored as a string + // to make use of the direct serialisation/deserialisation // rather than encoding/json. - next string + nextUsers string + nextDevices string + // lastSync and lastUpdate are the times of the first update + // or sync operation of users/devices. lastSync time.Time lastUpdate time.Time users map[string]*User + devices map[string]*Device } // newStateStore creates a new instance of stateStore. It will open a new write @@ -67,8 +78,9 @@ func newStateStore(store *kvstore.Store) (*stateStore, error) { } s := stateStore{ - users: make(map[string]*User), - tx: tx, + users: make(map[string]*User), + devices: make(map[string]*Device), + tx: tx, } err = s.tx.Get(stateBucket, lastSyncKey, &s.lastSync) @@ -79,10 +91,14 @@ func newStateStore(store *kvstore.Store) (*stateStore, error) { if err != nil && !errIsItemNotFound(err) { return nil, fmt.Errorf("unable to get last update time from state: %w", err) } - err = s.tx.Get(stateBucket, usersLinkKey, &s.next) + err = s.tx.Get(stateBucket, usersLinkKey, &s.nextUsers) if err != nil && !errIsItemNotFound(err) { return nil, fmt.Errorf("unable to get users link from state: %w", err) } + err = s.tx.Get(stateBucket, devicesLinkKey, &s.nextDevices) + if err != nil && !errIsItemNotFound(err) { + return nil, fmt.Errorf("unable to get devices link from state: %w", err) + } err = s.tx.ForEach(usersBucket, func(key, value []byte) error { var u User @@ -98,6 +114,20 @@ func newStateStore(store *kvstore.Store) (*stateStore, error) { return nil, fmt.Errorf("unable to get users from state: %w", err) } + err = s.tx.ForEach(devicesBucket, func(key, value []byte) error { + var d Device + err = json.Unmarshal(value, &d) + if err != nil { + return fmt.Errorf("unable to unmarshal device from state: %w", err) + } + s.devices[d.ID] = &d + + return nil + }) + if err != nil && !errIsItemNotFound(err) { + return nil, fmt.Errorf("unable to get devices from state: %w", err) + } + return &s, nil } @@ -120,6 +150,25 @@ func (s *stateStore) storeUser(u okta.User) *User { return &su } +// storeDevice stores a device. If the device does not exist in the store, then the +// device will be marked as discovered. Otherwise, the user will be marked +// as modified. +func (s *stateStore) storeDevice(d okta.Device) *Device { + du := Device{Device: d} + if d.Status == "DEPROVISIONED" { + du.State = Deleted + return &du + } + if existing, ok := s.devices[d.ID]; ok { + du.State = Modified + *existing = du + } else { + du.State = Discovered + s.devices[d.ID] = &du + } + return &du +} + // close will close out the stateStore. If commit is true, the staged values on the // stateStore will be set in the kvstore database, and the transaction will be // committed. Otherwise, all changes will be discarded and the transaction will @@ -156,12 +205,18 @@ func (s *stateStore) close(commit bool) (err error) { return fmt.Errorf("unable to save last update time to state: %w", err) } } - if s.next != "" { - err = s.tx.Set(stateBucket, usersLinkKey, &s.next) + if s.nextUsers != "" { + err = s.tx.Set(stateBucket, usersLinkKey, &s.nextUsers) if err != nil { return fmt.Errorf("unable to save users link to state: %w", err) } } + if s.nextDevices != "" { + err = s.tx.Set(stateBucket, devicesLinkKey, &s.nextDevices) + if err != nil { + return fmt.Errorf("unable to save devices link to state: %w", err) + } + } for key, value := range s.users { err = s.tx.Set(usersBucket, []byte(key), value) @@ -169,6 +224,12 @@ func (s *stateStore) close(commit bool) (err error) { return fmt.Errorf("unable to save user %q to state: %w", key, err) } } + for key, value := range s.devices { + err = s.tx.Set(devicesBucket, []byte(key), value) + if err != nil { + return fmt.Errorf("unable to save device %q to state: %w", key, err) + } + } return s.tx.Commit() } diff --git a/x-pack/filebeat/input/entityanalytics/provider/okta/statestore_test.go b/x-pack/filebeat/input/entityanalytics/provider/okta/statestore_test.go index caac6bd383d..e43128a9346 100644 --- a/x-pack/filebeat/input/entityanalytics/provider/okta/statestore_test.go +++ b/x-pack/filebeat/input/entityanalytics/provider/okta/statestore_test.go @@ -28,7 +28,10 @@ func TestStateStore(t *testing.T) { if err != nil { t.Fatalf("failed to parse lastUpdate") } - const usersLink = "users-link" + const ( + usersLink = "users-link" + devicesLink = "devices-link" + ) t.Run("new", func(t *testing.T) { dbFilename := "TestStateStore_New.db" @@ -45,6 +48,7 @@ func TestStateStore(t *testing.T) { {key: lastSyncKey, val: lastSync}, {key: lastUpdateKey, val: lastUpdate}, {key: usersLinkKey, val: usersLink}, + {key: devicesLinkKey, val: devicesLink}, } for _, kv := range data { err := store.RunTransaction(true, func(tx *kvstore.Transaction) error { @@ -67,7 +71,8 @@ func TestStateStore(t *testing.T) { }{ {name: "lastSync", got: ss.lastSync, want: lastSync}, {name: "lastUpdate", got: ss.lastUpdate, want: lastUpdate}, - {name: "usersLink", got: ss.next, want: usersLink}, + {name: "usersLink", got: ss.nextUsers, want: usersLink}, + {name: "devicesLink", got: ss.nextDevices, want: devicesLink}, } for _, c := range checks { if !cmp.Equal(c.got, c.want) { @@ -83,7 +88,7 @@ func TestStateStore(t *testing.T) { testCleanupStore(store, dbFilename) }) - want := map[string]*User{ + wantUsers := map[string]*User{ "userid": { State: Discovered, User: okta.User{ @@ -118,6 +123,22 @@ func TestStateStore(t *testing.T) { }, }, } + wantDevices := map[string]*Device{ + "deviceid": { + State: Discovered, + Device: okta.Device{ + ID: "deviceid", + Status: "STATUS", + Created: time.Now(), + LastUpdated: time.Now(), + Links: okta.HAL{ + "self": map[string]interface{}{ + "href": "https://localhost/api/v1/devices/deviceid", + }, + }, + }, + }, + } ss, err := newStateStore(store) if err != nil { @@ -125,8 +146,10 @@ func TestStateStore(t *testing.T) { } ss.lastSync = lastSync ss.lastUpdate = lastUpdate - ss.next = usersLink - ss.users = want + ss.nextUsers = usersLink + ss.nextDevices = devicesLink + ss.users = wantUsers + ss.devices = wantDevices err = ss.close(true) if err != nil { @@ -140,7 +163,8 @@ func TestStateStore(t *testing.T) { }{ {name: "lastSyncKey", key: lastSyncKey, val: &ss.lastSync}, {name: "lastUpdateKey", key: lastUpdateKey, val: &ss.lastUpdate}, - {name: "usersLinkKey", key: usersLinkKey, val: &ss.next}, + {name: "usersLinkKey", key: usersLinkKey, val: &ss.nextUsers}, + {name: "devicesLinkKey", key: devicesLinkKey, val: &ss.nextDevices}, } for _, check := range roundTripChecks { want, err := json.Marshal(check.val) @@ -175,8 +199,8 @@ func TestStateStore(t *testing.T) { if err != nil { t.Errorf("unexpected error from store run transaction: %v", err) } - if !cmp.Equal(want, users) { - t.Errorf("unexpected result:\n- want\n+ got\n%s", cmp.Diff(want, users)) + if !cmp.Equal(wantUsers, users) { + t.Errorf("unexpected result:\n- want\n+ got\n%s", cmp.Diff(wantUsers, users)) } }) diff --git a/x-pack/filebeat/input/gcppubsub/input.go b/x-pack/filebeat/input/gcppubsub/input.go index 890e8b1ee10..6547333a5e0 100644 --- a/x-pack/filebeat/input/gcppubsub/input.go +++ b/x-pack/filebeat/input/gcppubsub/input.go @@ -147,7 +147,6 @@ func NewInput(cfg *conf.C, connector channel.Connector, inputContext input.Conte in.metrics.ackedMessageCount.Inc() in.metrics.bytesProcessedTotal.Add(uint64(len(msg.Data))) in.metrics.processingTime.Update(time.Since(msg.PublishTime).Nanoseconds()) - in.log.Error("ACKing pub/sub event") } else { in.metrics.failedAckedMessageCount.Inc() in.log.Error("Failed ACKing pub/sub event") diff --git a/x-pack/filebeat/input/httpjson/config_auth.go b/x-pack/filebeat/input/httpjson/config_auth.go index aa56b4d1135..94894803777 100644 --- a/x-pack/filebeat/input/httpjson/config_auth.go +++ b/x-pack/filebeat/input/httpjson/config_auth.go @@ -65,6 +65,7 @@ const ( oAuth2ProviderDefault oAuth2Provider = "" // oAuth2ProviderDefault means no specific provider is set. oAuth2ProviderAzure oAuth2Provider = "azure" // oAuth2ProviderAzure AzureAD. oAuth2ProviderGoogle oAuth2Provider = "google" // oAuth2ProviderGoogle Google. + oAuth2ProviderOkta oAuth2Provider = "okta" // oAuth2ProviderOkta Okta. ) func (p *oAuth2Provider) Unpack(in string) error { @@ -99,6 +100,10 @@ type oAuth2Config struct { // microsoft azure specific AzureTenantID string `config:"azure.tenant_id"` AzureResource string `config:"azure.resource"` + + // okta specific RSA JWK private key + OktaJWKFile string `config:"okta.jwk_file"` + OktaJWKJSON common.JSONBlob `config:"okta.jwk_json"` } // IsEnabled returns true if the `enable` field is set to true in the yaml. @@ -159,6 +164,9 @@ func (o *oAuth2Config) client(ctx context.Context, client *http.Client) (*http.C return nil, fmt.Errorf("oauth2 client: error loading credentials: %w", err) } return oauth2.NewClient(ctx, creds.TokenSource), nil + case oAuth2ProviderOkta: + return o.fetchOktaOauthClient(ctx, client) + default: return nil, errors.New("oauth2 client: unknown provider") } @@ -215,6 +223,8 @@ func (o *oAuth2Config) Validate() error { return o.validateAzureProvider() case oAuth2ProviderGoogle: return o.validateGoogleProvider() + case oAuth2ProviderOkta: + return o.validateOktaProvider() case oAuth2ProviderDefault: if o.TokenURL == "" || o.ClientID == "" || o.ClientSecret == nil { return errors.New("both token_url and client credentials must be provided") @@ -278,6 +288,22 @@ func (o *oAuth2Config) validateGoogleProvider() error { return fmt.Errorf("no authentication credentials were configured or detected (ADC)") } +func (o *oAuth2Config) validateOktaProvider() error { + if o.TokenURL == "" || o.ClientID == "" || len(o.Scopes) == 0 || (o.OktaJWKJSON == nil && o.OktaJWKFile == "") { + return errors.New("okta validation error: token_url, client_id, scopes and at least one of okta.jwk_json or okta.jwk_file must be provided") + } + // jwk_file + if o.OktaJWKFile != "" { + return populateJSONFromFile(o.OktaJWKFile, &o.OktaJWKJSON) + } + // jwk_json + if len(o.OktaJWKJSON) != 0 { + return nil + } + + return fmt.Errorf("okta validation error: no authentication credentials were configured or detected") +} + func populateJSONFromFile(file string, dst *common.JSONBlob) error { if _, err := os.Stat(file); errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("the file %q cannot be found", file) diff --git a/x-pack/filebeat/input/httpjson/chain.go b/x-pack/filebeat/input/httpjson/config_chain.go similarity index 100% rename from x-pack/filebeat/input/httpjson/chain.go rename to x-pack/filebeat/input/httpjson/config_chain.go diff --git a/x-pack/filebeat/input/httpjson/config_okta_auth.go b/x-pack/filebeat/input/httpjson/config_okta_auth.go new file mode 100644 index 00000000000..8bf2995d746 --- /dev/null +++ b/x-pack/filebeat/input/httpjson/config_okta_auth.go @@ -0,0 +1,190 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package httpjson + +import ( + "context" + "crypto/rsa" + "encoding/base64" + "encoding/json" + "fmt" + "math/big" + "net/http" + "net/url" + "strings" + "sync" + "time" + + "github.com/lestrrat-go/jwx/v2/jwa" + "github.com/lestrrat-go/jwx/v2/jwt" + "golang.org/x/oauth2" + "golang.org/x/oauth2/clientcredentials" +) + +// oktaTokenSource is a custom implementation of the oauth2.TokenSource interface. +// for more information, see https://pkg.go.dev/golang.org/x/oauth2#TokenSource +type oktaTokenSource struct { + mu sync.Mutex + ctx context.Context + conf *oauth2.Config + token *oauth2.Token + oktaJWK []byte +} + +// fetchOktaOauthClient fetches an OAuth2 client using the Okta JWK credentials. +func (o *oAuth2Config) fetchOktaOauthClient(ctx context.Context, _ *http.Client) (*http.Client, error) { + conf := &oauth2.Config{ + ClientID: o.ClientID, + Scopes: o.Scopes, + Endpoint: oauth2.Endpoint{ + TokenURL: o.TokenURL, + }, + } + + oktaJWT, err := generateOktaJWT(o.OktaJWKJSON, conf) + if err != nil { + return nil, fmt.Errorf("oauth2 client: error generating Okta JWT: %w", err) + } + + token, err := exchangeForBearerToken(ctx, oktaJWT, conf) + if err != nil { + return nil, fmt.Errorf("oauth2 client: error exchanging Okta JWT for bearer token: %w", err) + } + + tokenSource := &oktaTokenSource{ + conf: conf, + ctx: ctx, + oktaJWK: o.OktaJWKJSON, + token: token, + } + // reuse the tokenSource to refresh the token (automatically calls the custom Token() method when token is no longer valid). + client := oauth2.NewClient(ctx, oauth2.ReuseTokenSource(token, tokenSource)) + + return client, nil +} + +// Token implements the oauth2.TokenSource interface and helps to implement custom token refresh logic. +// parent context is passed via the customTokenSource struct since we cannot modify the function signature here. +func (ts *oktaTokenSource) Token() (*oauth2.Token, error) { + ts.mu.Lock() + defer ts.mu.Unlock() + + oktaJWT, err := generateOktaJWT(ts.oktaJWK, ts.conf) + if err != nil { + return nil, fmt.Errorf("error generating Okta JWT: %w", err) + } + token, err := exchangeForBearerToken(ts.ctx, oktaJWT, ts.conf) + if err != nil { + return nil, fmt.Errorf("error exchanging Okta JWT for bearer token: %w", err) + + } + + return token, nil +} + +func generateOktaJWT(oktaJWK []byte, cnf *oauth2.Config) (string, error) { + // unmarshal the JWK into a map + var jwkData map[string]string + err := json.Unmarshal(oktaJWK, &jwkData) + if err != nil { + return "", fmt.Errorf("error decoding JWK: %w", err) + } + + // create an RSA private key from JWK components + decodeBase64 := func(key string) (*big.Int, error) { + data, err := base64.RawURLEncoding.DecodeString(jwkData[key]) + if err != nil { + return nil, fmt.Errorf("error decoding RSA JWK component %s: %w", key, err) + } + return new(big.Int).SetBytes(data), nil + } + + n, err := decodeBase64("n") + if err != nil { + return "", err + } + e, err := decodeBase64("e") + if err != nil { + return "", err + } + d, err := decodeBase64("d") + if err != nil { + return "", err + } + p, err := decodeBase64("p") + if err != nil { + return "", err + } + q, err := decodeBase64("q") + if err != nil { + return "", err + } + dp, err := decodeBase64("dp") + if err != nil { + return "", err + } + dq, err := decodeBase64("dq") + if err != nil { + return "", err + } + qi, err := decodeBase64("qi") + if err != nil { + return "", err + } + + privateKeyRSA := &rsa.PrivateKey{ + PublicKey: rsa.PublicKey{ + N: n, + E: int(e.Int64()), + }, + D: d, + Primes: []*big.Int{p, q}, + Precomputed: rsa.PrecomputedValues{ + Dp: dp, + Dq: dq, + Qinv: qi, + }, + } + + // create a JWT token using required claims and sign it with the private key + now := time.Now() + tok, err := jwt.NewBuilder().Audience([]string{cnf.Endpoint.TokenURL}). + Issuer(cnf.ClientID). + Subject(cnf.ClientID). + IssuedAt(now). + Expiration(now.Add(time.Hour)). + Build() + if err != nil { + return "", err + } + signedToken, err := jwt.Sign(tok, jwt.WithKey(jwa.RS256, privateKeyRSA)) + if err != nil { + return "", fmt.Errorf("failed to sign token: %w", err) + } + + return string(signedToken), nil +} + +// exchangeForBearerToken exchanges the Okta JWT for a bearer token. +func exchangeForBearerToken(ctx context.Context, oktaJWT string, cnf *oauth2.Config) (*oauth2.Token, error) { + data := url.Values{} + data.Set("grant_type", "client_credentials") + data.Set("scope", strings.Join(cnf.Scopes, " ")) + data.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer") + data.Set("client_assertion", oktaJWT) + oauthConfig := &clientcredentials.Config{ + TokenURL: cnf.Endpoint.TokenURL, + EndpointParams: data, + } + tokenSource := oauthConfig.TokenSource(ctx) + + // get the access token + accessToken, err := tokenSource.Token() + if err != nil { + return nil, err + } + + return accessToken, nil +} diff --git a/x-pack/filebeat/input/httpjson/config_request.go b/x-pack/filebeat/input/httpjson/config_request.go index 86ec0a68a58..e1238898651 100644 --- a/x-pack/filebeat/input/httpjson/config_request.go +++ b/x-pack/filebeat/input/httpjson/config_request.go @@ -151,7 +151,7 @@ func (c *requestConfig) Validate() error { return fmt.Errorf("unsupported method %q", c.Method) } - if _, err := newBasicTransformsFromConfig(c.Transforms, requestNamespace, nil); err != nil { + if _, err := newBasicTransformsFromConfig(registeredTransforms, c.Transforms, requestNamespace, nil); err != nil { return err } diff --git a/x-pack/filebeat/input/httpjson/config_response.go b/x-pack/filebeat/input/httpjson/config_response.go index 2f0da5685f3..0e9f2f26d89 100644 --- a/x-pack/filebeat/input/httpjson/config_response.go +++ b/x-pack/filebeat/input/httpjson/config_response.go @@ -37,10 +37,10 @@ type splitConfig struct { } func (c *responseConfig) Validate() error { - if _, err := newBasicTransformsFromConfig(c.Transforms, responseNamespace, nil); err != nil { + if _, err := newBasicTransformsFromConfig(registeredTransforms, c.Transforms, responseNamespace, nil); err != nil { return err } - if _, err := newBasicTransformsFromConfig(c.Pagination, paginationNamespace, nil); err != nil { + if _, err := newBasicTransformsFromConfig(registeredTransforms, c.Pagination, paginationNamespace, nil); err != nil { return err } if c.DecodeAs != "" { @@ -52,7 +52,7 @@ func (c *responseConfig) Validate() error { } func (c *splitConfig) Validate() error { - if _, err := newBasicTransformsFromConfig(c.Transforms, responseNamespace, nil); err != nil { + if _, err := newBasicTransformsFromConfig(registeredTransforms, c.Transforms, responseNamespace, nil); err != nil { return err } diff --git a/x-pack/filebeat/input/httpjson/config_test.go b/x-pack/filebeat/input/httpjson/config_test.go index 1cd11f1f10f..74e72ded332 100644 --- a/x-pack/filebeat/input/httpjson/config_test.go +++ b/x-pack/filebeat/input/httpjson/config_test.go @@ -462,6 +462,43 @@ func TestConfigOauth2Validation(t *testing.T) { }, setup: func() { os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "./testdata/credentials.json") }, }, + { + name: "okta requires token_url, client_id, scopes and at least one of okta.jwk_json or okta.jwk_file to be provided", + expectedErr: "okta validation error: token_url, client_id, scopes and at least one of okta.jwk_json or okta.jwk_file must be provided accessing 'auth.oauth2'", + input: map[string]interface{}{ + "auth.oauth2": map[string]interface{}{ + "provider": "okta", + "client.id": "a_client_id", + "token_url": "localhost", + "scopes": []string{"foo"}, + }, + }, + }, + { + name: "okta oauth2 validation fails if jwk_json is not a valid JSON", + expectedErr: "the field can't be converted to valid JSON accessing 'auth.oauth2.okta.jwk_json'", + input: map[string]interface{}{ + "auth.oauth2": map[string]interface{}{ + "provider": "okta", + "client.id": "a_client_id", + "token_url": "localhost", + "scopes": []string{"foo"}, + "okta.jwk_json": `"p":"x","kty":"RSA","q":"x","d":"x","e":"x","use":"x","kid":"x","qi":"x","dp":"x","alg":"x","dq":"x","n":"x"}`, + }, + }, + }, + { + name: "okta successful oauth2 validation", + input: map[string]interface{}{ + "auth.oauth2": map[string]interface{}{ + "provider": "okta", + "client.id": "a_client_id", + "token_url": "localhost", + "scopes": []string{"foo"}, + "okta.jwk_json": `{"p":"x","kty":"RSA","q":"x","d":"x","e":"x","use":"x","kid":"x","qi":"x","dp":"x","alg":"x","dq":"x","n":"x"}`, + }, + }, + }, } for _, c := range cases { diff --git a/x-pack/filebeat/input/httpjson/encoding.go b/x-pack/filebeat/input/httpjson/encoding.go index 611894b0543..5dd62f10535 100644 --- a/x-pack/filebeat/input/httpjson/encoding.go +++ b/x-pack/filebeat/input/httpjson/encoding.go @@ -9,62 +9,16 @@ import ( "bytes" "encoding/csv" "encoding/json" + stdxml "encoding/xml" "errors" + "fmt" "io" "net/http" + "unicode" "github.com/elastic/mito/lib/xml" - - "github.com/elastic/elastic-agent-libs/logp" ) -type encoderFunc func(trReq transformable) ([]byte, error) - -type decoderFunc func(p []byte, dst *response) error - -var ( - registeredEncoders = map[string]encoderFunc{} - registeredDecoders = map[string]decoderFunc{} - defaultEncoder encoderFunc = encodeAsJSON - defaultDecoder decoderFunc = decodeAsJSON -) - -func registerEncoder(contentType string, enc encoderFunc) error { - if contentType == "" { - return errors.New("content-type can't be empty") - } - - if enc == nil { - return errors.New("encoder can't be nil") - } - - if _, found := registeredEncoders[contentType]; found { - return errors.New("already registered") - } - - registeredEncoders[contentType] = enc - - return nil -} - -func registerDecoder(contentType string, dec decoderFunc) error { - if contentType == "" { - return errors.New("content-type can't be empty") - } - - if dec == nil { - return errors.New("decoder can't be nil") - } - - if _, found := registeredDecoders[contentType]; found { - return errors.New("already registered") - } - - registeredDecoders[contentType] = dec - - return nil -} - func encode(contentType string, trReq transformable) ([]byte, error) { enc, found := registeredEncoders[contentType] if !found { @@ -81,35 +35,34 @@ func decode(contentType string, p []byte, dst *response) error { return dec(p, dst) } -func registerEncoders() { - log := logp.L().Named(logName) - log.Debugf("registering encoder 'application/json': returned error: %#v", - registerEncoder("application/json", encodeAsJSON)) - - log.Debugf("registering encoder 'application/x-www-form-urlencoded': returned error: %#v", - registerEncoder("application/x-www-form-urlencoded", encodeAsForm)) -} - -func registerDecoders() { - log := logp.L().Named(logName) - log.Debugf("registering decoder 'application/json': returned error: %#v", - registerDecoder("application/json", decodeAsJSON)) - - log.Debugf("registering decoder 'application/x-ndjson': returned error: %#v", - registerDecoder("application/x-ndjson", decodeAsNdjson)) - - log.Debugf("registering decoder 'text/csv': returned error: %#v", - registerDecoder("text/csv", decodeAsCSV)) - - log.Debugf("registering decoder 'application/zip': returned error: %#v", - registerDecoder("application/zip", decodeAsZip)) +var ( + // registeredEncoders is the set of available encoders. + registeredEncoders = map[string]encoderFunc{ + "application/json": encodeAsJSON, + "application/x-www-form-urlencoded": encodeAsForm, + } + // defaultEncoder is the decoder used when no registers + // encoder is available. + defaultEncoder = encodeAsJSON + + // registeredDecoders is the set of available decoders. + registeredDecoders = map[string]decoderFunc{ + "application/json": decodeAsJSON, + "application/x-ndjson": decodeAsNdjson, + "text/csv": decodeAsCSV, + "application/zip": decodeAsZip, + "application/xml": decodeAsXML, + "text/xml; charset=utf-8": decodeAsXML, + } + // defaultDecoder is the decoder used when no registers + // decoder is available. + defaultDecoder = decodeAsJSON +) - log.Debugf("registering decoder 'application/xml': returned error: %#v", - registerDecoder("application/xml", decodeAsXML)) - log.Debugf("registering decoder 'text/xml': returned error: %#v", - registerDecoder("text/xml; charset=utf-8", decodeAsXML)) -} +type encoderFunc func(trReq transformable) ([]byte, error) +type decoderFunc func(p []byte, dst *response) error +// encodeAsJSON encodes trReq as a JSON message. func encodeAsJSON(trReq transformable) ([]byte, error) { if len(trReq.body()) == 0 { return nil, nil @@ -120,10 +73,16 @@ func encodeAsJSON(trReq transformable) ([]byte, error) { return json.Marshal(trReq.body()) } +// decodeAsJSON decodes the JSON message in p into dst. func decodeAsJSON(p []byte, dst *response) error { - return json.Unmarshal(p, &dst.body) + err := json.Unmarshal(p, &dst.body) + if err != nil { + return textContextError{error: err, body: p} + } + return nil } +// encodeAsForm encodes trReq as a URL encoded form. func encodeAsForm(trReq transformable) ([]byte, error) { url := trReq.url() body := []byte(url.RawQuery) @@ -135,13 +94,15 @@ func encodeAsForm(trReq transformable) ([]byte, error) { return body, nil } +// decodeAsNdjson decodes the message in p as a JSON object stream +// It is more relaxed than NDJSON. func decodeAsNdjson(p []byte, dst *response) error { var results []interface{} dec := json.NewDecoder(bytes.NewReader(p)) for dec.More() { var o interface{} if err := dec.Decode(&o); err != nil { - return err + return textContextError{error: err, body: p} } results = append(results, o) } @@ -149,6 +110,7 @@ func decodeAsNdjson(p []byte, dst *response) error { return nil } +// decodeAsCSV decodes p as a headed CSV document into dst. func decodeAsCSV(p []byte, dst *response) error { var results []interface{} @@ -180,7 +142,7 @@ func decodeAsCSV(p []byte, dst *response) error { if err != nil { if err != io.EOF { //nolint:errorlint // csv.Reader never wraps io.EOF. - return err + return textContextError{error: err, body: p} } } @@ -189,6 +151,7 @@ func decodeAsCSV(p []byte, dst *response) error { return nil } +// decodeAsZip decodes p as a ZIP archive into dst. func decodeAsZip(p []byte, dst *response) error { var results []interface{} r, err := zip.NewReader(bytes.NewReader(p), int64(len(p))) @@ -209,7 +172,7 @@ func decodeAsZip(p []byte, dst *response) error { var o interface{} if err := dec.Decode(&o); err != nil { rc.Close() - return err + return textContextError{error: err, body: p} } results = append(results, o) } @@ -225,12 +188,108 @@ func decodeAsZip(p []byte, dst *response) error { return nil } +// decodeAsXML decodes p as an XML document into dst. func decodeAsXML(p []byte, dst *response) error { cdata, body, err := xml.Unmarshal(bytes.NewReader(p), dst.xmlDetails) if err != nil { - return err + return textContextError{error: err, body: p} } dst.body = body dst.header["XML-CDATA"] = []string{cdata} return nil } + +// textContextError is an error that can provide the text context for +// a decoding error from the csv, json and xml packages. +type textContextError struct { + error + body []byte +} + +func (e textContextError) Error() string { + var ctx []byte + switch err := e.error.(type) { + case nil: + return "" + case *json.SyntaxError: + ctx = textContext(e.body, err.Offset) + case *json.UnmarshalTypeError: + ctx = textContext(e.body, err.Offset) + case *csv.ParseError: + lines := bytes.Split(e.body, []byte{'\n'}) + l := err.Line - 1 // Lines are 1-based. + if uint(l) >= uint(len(lines)) { + return err.Error() + } + ctx = textContext(lines[l], int64(err.Column)) + case *stdxml.SyntaxError: + lines := bytes.Split(e.body, []byte{'\n'}) + l := err.Line - 1 // Lines are 1-based. + if uint(l) >= uint(len(lines)) { + return err.Error() + } + // The xml package does not provide column-level context, + // so just point to first non-whitespace character of the + // line. This doesn't make a great deal of difference + // except in deeply indented XML documents. + pos := bytes.IndexFunc(lines[l], func(r rune) bool { + return !unicode.IsSpace(r) + }) + if pos < 0 { + pos = 0 + } + ctx = textContext(lines[l], int64(pos)) + default: + return err.Error() + } + return fmt.Sprintf("%v: text context %q", e.error, ctx) +} + +func (e textContextError) Unwrap() error { + return e.error +} + +// textContext returns the context of text around the provided position starting +// ten bytes before pos and ten bytes after, dependent on the length of the +// text and the value of pos relative to bounds. If a text truncation is made, +// an ellipsis is added to indicate this. +func textContext(text []byte, pos int64) []byte { + if len(text) == 0 { + return text + } + const ( + dots = "..." + span = 10 + ) + left := maxInt64(0, pos-span) + right := minInt(pos+span+1, int64(len(text))) + ctx := make([]byte, right-left+2*int64(len(dots))) + copy(ctx[3:], text[left:right]) + if left != 0 { + copy(ctx, dots) + left = 0 + } else { + left = int64(len(dots)) + } + if right != int64(len(text)) { + copy(ctx[len(ctx)-len(dots):], dots) + right = int64(len(ctx)) + } else { + right = int64(len(ctx) - len(dots)) + } + return ctx[left:right] +} + +func minInt(a, b int64) int64 { + if a < b { + return a + } + return b +} + +func maxInt64(a, b int64) int64 { + if a > b { + return a + } + return b +} diff --git a/x-pack/filebeat/input/httpjson/encoding_test.go b/x-pack/filebeat/input/httpjson/encoding_test.go index 1a835bfd941..c42e8c65588 100644 --- a/x-pack/filebeat/input/httpjson/encoding_test.go +++ b/x-pack/filebeat/input/httpjson/encoding_test.go @@ -8,6 +8,7 @@ import ( "archive/zip" "bytes" "encoding/json" + "net/http" "net/url" "testing" @@ -61,29 +62,103 @@ func TestDecodeZip(t *testing.T) { assert.Equal(t, []string{"a.json", "b.ndjson", "c.ndjson"}, resp.header["X-Zip-Files"]) } +func TestDecodeJSON(t *testing.T) { + tests := []struct { + body string + result string + err string + }{ + { + body: "{}", + result: "{}", + }, + { + body: "{\"a\":\"b\"}", + result: "{\"a\":\"b\"}", + }, + { + body: "[{\"a\":\"b\"},\nunfortunate text\n{\"c\":\"d\"}]", + err: `invalid character 'u' looking for beginning of value: text context "...a\":\"b\"},\nunfortunate ..."`, + }, + } + for _, test := range tests { + resp := &response{} + err := decodeAsJSON([]byte(test.body), resp) + if test.err != "" { + assert.Error(t, err) + assert.EqualError(t, err, test.err) + } else { + assert.NoError(t, err) + + var j []byte + if test.body != "" { + j, err = json.Marshal(resp.body) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + assert.JSONEq(t, test.result, string(j)) + } else { + assert.Equal(t, test.result, string(j)) + } + } + } +} + func TestDecodeNdjson(t *testing.T) { tests := []struct { body string result string + err string }{ - {"{}", "[{}]"}, - {"{\"a\":\"b\"}", "[{\"a\":\"b\"}]"}, - {"{\"a\":\"b\"}\n{\"c\":\"d\"}", "[{\"a\":\"b\"},{\"c\":\"d\"}]"}, - {"{\"a\":\"b\"}\r\n{\"c\":\"d\"}", "[{\"a\":\"b\"},{\"c\":\"d\"}]"}, - {"{\"a\":\"b\"}\r\n{\"c\":\"d\"}\n", "[{\"a\":\"b\"},{\"c\":\"d\"}]"}, - {"{\"a\":\"b\"}\r\n{\"c\":\"d\"}\r\n", "[{\"a\":\"b\"},{\"c\":\"d\"}]"}, + { + body: "{}", + result: "[{}]", + }, + { + body: "{\"a\":\"b\"}", + result: "[{\"a\":\"b\"}]", + }, + { + body: "{\"a\":\"b\"}\n{\"c\":\"d\"}", + result: "[{\"a\":\"b\"},{\"c\":\"d\"}]", + }, + { + body: "{\"a\":\"b\"}\r\n{\"c\":\"d\"}", + result: "[{\"a\":\"b\"},{\"c\":\"d\"}]", + }, + { + body: "{\"a\":\"b\"}\r\n{\"c\":\"d\"}\n", + result: "[{\"a\":\"b\"},{\"c\":\"d\"}]", + }, + { + body: "{\"a\":\"b\"}\r\n{\"c\":\"d\"}\r\n", + result: "[{\"a\":\"b\"},{\"c\":\"d\"}]", + }, + { + body: "{\"a\":\"b\"}unfortunate text\r\n{\"c\":\"d\"}\r\n", + err: `invalid character 'u' looking for beginning of value: text context "{\"a\":\"b\"}unfortunate ..."`, + }, } for _, test := range tests { resp := &response{} err := decodeAsNdjson([]byte(test.body), resp) - if err != nil { - t.Fatalf("decodeAsNdjson failed: %v", err) - } - j, err := json.Marshal(resp.body) - if err != nil { - t.Fatalf("Marshal failed: %v", err) + if test.err != "" { + assert.Error(t, err) + assert.EqualError(t, err, test.err) + } else { + assert.NoError(t, err) + + var j []byte + if test.body != "" { + j, err = json.Marshal(resp.body) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + assert.JSONEq(t, test.result, string(j)) + } else { + assert.Equal(t, test.result, string(j)) + } } - assert.Equal(t, test.result, string(j)) } } @@ -93,20 +168,18 @@ func TestDecodeCSV(t *testing.T) { result string err string }{ - {"", "", ""}, + {body: "", result: ""}, { - "EVENT_TYPE,TIMESTAMP,REQUEST_ID,ORGANIZATION_ID,USER_ID\n" + + body: "EVENT_TYPE,TIMESTAMP,REQUEST_ID,ORGANIZATION_ID,USER_ID\n" + "Login,20211018071353.465,id1,id2,user1\n" + "Login,20211018071505.579,id4,id5,user2\n", - `[{"EVENT_TYPE":"Login","TIMESTAMP":"20211018071353.465","REQUEST_ID":"id1","ORGANIZATION_ID":"id2","USER_ID":"user1"}, + result: `[{"EVENT_TYPE":"Login","TIMESTAMP":"20211018071353.465","REQUEST_ID":"id1","ORGANIZATION_ID":"id2","USER_ID":"user1"}, {"EVENT_TYPE":"Login","TIMESTAMP":"20211018071505.579","REQUEST_ID":"id4","ORGANIZATION_ID":"id5","USER_ID":"user2"}]`, - "", }, { - "EVENT_TYPE,TIMESTAMP,REQUEST_ID,ORGANIZATION_ID,USER_ID\n" + + body: "EVENT_TYPE,TIMESTAMP,REQUEST_ID,ORGANIZATION_ID,USER_ID\n" + "Login,20211018071505.579,id4,user2\n", - "", - "record on line 2: wrong number of fields", + err: "record on line 2: wrong number of fields: text context \"Login,202110...\"", }, } for _, test := range tests { @@ -132,6 +205,62 @@ func TestDecodeCSV(t *testing.T) { } } +func TestDecodeXML(t *testing.T) { + tests := []struct { + body string + result string + err string + }{ + { + body: ` + +

+ Joord Lennart +

+ + Egil's Saga + +
+`, + result: `{"o":{"p":{"n":"Joord Lennart"},"i":{"n":"Egil's Saga"}}}`, + }, + { + body: ` + +

+ Joord Lennart +

+ + Egil's Saga + +
+`, + err: `XML syntax error on line 7: element closed by : text context "... Egil's S..."`, + }, + } + for _, test := range tests { + resp := &response{header: make(http.Header)} + err := decodeAsXML([]byte(test.body), resp) + if test.err != "" { + assert.Error(t, err) + assert.EqualError(t, err, test.err) + } else { + assert.NoError(t, err) + + var j []byte + if test.body != "" { + j, err = json.Marshal(resp.body) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + assert.JSONEq(t, test.result, string(j)) + } else { + assert.Equal(t, test.result, string(j)) + } + } + } +} + func TestEncodeAsForm(t *testing.T) { tests := []struct { params map[string]string @@ -159,3 +288,23 @@ func TestEncodeAsForm(t *testing.T) { assert.Equal(t, "application/x-www-form-urlencoded", trReq.header().Get("Content-Type")) } } + +func TestTextContext(t *testing.T) { + tests := []struct { + text string + pos int64 + want string + }{ + {}, + {text: "0987654321*1234567890", pos: 10, want: "0987654321*1234567890"}, + {text: "54321*1234567890xxxxx", pos: 5, want: "54321*1234567890..."}, + {text: "xxxxx0987654321*12345", pos: 15, want: "...0987654321*12345"}, + {text: "x0987654321*1234567890x", pos: 11, want: "...0987654321*1234567890..."}, + } + for _, test := range tests { + got := string(textContext([]byte(test.text), test.pos)) + if got != test.want { + t.Errorf("unexpected result for textContext(%q, %d): got:%q want:%q", test.text, test.pos, got, test.want) + } + } +} diff --git a/x-pack/filebeat/input/httpjson/input.go b/x-pack/filebeat/input/httpjson/input.go index 078bd80dd04..eea7bd39e28 100644 --- a/x-pack/filebeat/input/httpjson/input.go +++ b/x-pack/filebeat/input/httpjson/input.go @@ -29,6 +29,7 @@ import ( "github.com/elastic/beats/v7/libbeat/monitoring/inputmon" "github.com/elastic/beats/v7/libbeat/version" "github.com/elastic/beats/v7/x-pack/filebeat/input/internal/httplog" + "github.com/elastic/beats/v7/x-pack/filebeat/input/internal/httpmon" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/elastic-agent-libs/monitoring" @@ -256,7 +257,7 @@ func newNetHTTPClient(ctx context.Context, cfg *requestConfig, log *logp.Logger, } if reg != nil { - netHTTPClient.Transport = httplog.NewMetricsRoundTripper(netHTTPClient.Transport, reg) + netHTTPClient.Transport = httpmon.NewMetricsRoundTripper(netHTTPClient.Transport, reg) } netHTTPClient.CheckRedirect = checkRedirect(cfg, log) @@ -264,6 +265,43 @@ func newNetHTTPClient(ctx context.Context, cfg *requestConfig, log *logp.Logger, return netHTTPClient, nil } +func newChainHTTPClient(ctx context.Context, authCfg *authConfig, requestCfg *requestConfig, log *logp.Logger, reg *monitoring.Registry, p ...*Policy) (*httpClient, error) { + // Make retryable HTTP client + netHTTPClient, err := newNetHTTPClient(ctx, requestCfg, log, reg) + if err != nil { + return nil, err + } + + var retryPolicyFunc retryablehttp.CheckRetry + if len(p) != 0 { + retryPolicyFunc = p[0].CustomRetryPolicy + } else { + retryPolicyFunc = retryablehttp.DefaultRetryPolicy + } + + client := &retryablehttp.Client{ + HTTPClient: netHTTPClient, + Logger: newRetryLogger(log), + RetryWaitMin: requestCfg.Retry.getWaitMin(), + RetryWaitMax: requestCfg.Retry.getWaitMax(), + RetryMax: requestCfg.Retry.getMaxAttempts(), + CheckRetry: retryPolicyFunc, + Backoff: retryablehttp.DefaultBackoff, + } + + limiter := newRateLimiterFromConfig(requestCfg.RateLimit, log) + + if authCfg != nil && authCfg.OAuth2.isEnabled() { + authClient, err := authCfg.OAuth2.client(ctx, client.StandardClient()) + if err != nil { + return nil, err + } + return &httpClient{client: authClient, limiter: limiter}, nil + } + + return &httpClient{client: client.StandardClient(), limiter: limiter}, nil +} + // clientOption returns constructed client configuration options, including // setting up http+unix and http+npipe transports if requested. func clientOptions(u *url.URL, keepalive httpcommon.WithKeepaliveSettings) []httpcommon.TransportOption { diff --git a/x-pack/filebeat/input/httpjson/input_manager.go b/x-pack/filebeat/input/httpjson/input_manager.go index 93e76a6eb57..7eb2d628aaf 100644 --- a/x-pack/filebeat/input/httpjson/input_manager.go +++ b/x-pack/filebeat/input/httpjson/input_manager.go @@ -41,11 +41,6 @@ func NewInputManager(log *logp.Logger, store inputcursor.StateStore) InputManage // Init initializes both wrapped input managers. func (m InputManager) Init(grp unison.Group, mode v2.Mode) error { - registerRequestTransforms() - registerResponseTransforms() - registerPaginationTransforms() - registerEncoders() - registerDecoders() return multierr.Append( m.stateless.Init(grp, mode), m.cursor.Init(grp, mode), diff --git a/x-pack/filebeat/input/httpjson/input_test.go b/x-pack/filebeat/input/httpjson/input_test.go index bf12335ac3d..e88a0a28d30 100644 --- a/x-pack/filebeat/input/httpjson/input_test.go +++ b/x-pack/filebeat/input/httpjson/input_test.go @@ -259,8 +259,6 @@ var testCases = []struct { { name: "date_cursor", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerRequestTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) // mock timeNow func to return a fixed value timeNow = func() time.Time { t, _ := time.Parse(time.RFC3339, "2002-10-02T15:00:00Z") @@ -300,8 +298,6 @@ var testCases = []struct { { name: "tracer_filename_sanitization", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerRequestTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) // mock timeNow func to return a fixed value timeNow = func() time.Time { t, _ := time.Parse(time.RFC3339, "2002-10-02T15:00:00Z") @@ -343,9 +339,6 @@ var testCases = []struct { { name: "pagination", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerPaginationTransforms() - registerResponseTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL t.Cleanup(server.Close) @@ -385,9 +378,6 @@ var testCases = []struct { name: "first_event", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerPaginationTransforms() - registerResponseTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL t.Cleanup(server.Close) @@ -428,8 +418,6 @@ var testCases = []struct { { name: "pagination_with_array_response", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerPaginationTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL t.Cleanup(server.Close) @@ -473,8 +461,6 @@ var testCases = []struct { { name: "request_transforms_can_access_state_from_previous_transforms", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerRequestTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL + "/test-path" t.Cleanup(server.Close) @@ -509,9 +495,6 @@ var testCases = []struct { { name: "response_transforms_can't_access_request_state_from_previous_transforms", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerRequestTransforms() - registerResponseTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL t.Cleanup(server.Close) @@ -600,8 +583,6 @@ var testCases = []struct { { name: "date_cursor_while_using_chain", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerRequestTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) // mock timeNow func to return a fixed value timeNow = func() time.Time { t, _ := time.Parse(time.RFC3339, "2002-10-02T15:00:00Z") @@ -954,8 +935,6 @@ var testCases = []struct { name: "global_transform_context_separation_with_parent_last_response_object", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { var serverURL string - registerPaginationTransforms() - registerRequestTransforms() r := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/": @@ -973,7 +952,6 @@ var testCases = []struct { } }) server := httptest.NewServer(r) - t.Cleanup(func() { registeredTransforms = newRegistry() }) config["request.url"] = server.URL serverURL = server.URL config["chain.0.step.request.url"] = server.URL + "/$.exportId/$.files[:].id" @@ -1021,8 +999,6 @@ var testCases = []struct { name: "cursor_value_is_updated_for_root_response_with_chaining_&_pagination", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { var serverURL string - registerPaginationTransforms() - registerRequestTransforms() r := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/": @@ -1041,7 +1017,6 @@ var testCases = []struct { } }) server := httptest.NewServer(r) - t.Cleanup(func() { registeredTransforms = newRegistry() }) config["request.url"] = server.URL serverURL = server.URL config["chain.0.step.request.url"] = server.URL + "/$.exportId/$.files[:].id" @@ -1100,8 +1075,6 @@ var testCases = []struct { name: "cursor_value_is_updated_for_root_response_with_chaining_&_pagination_along_with_split_operator", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { var serverURL string - registerPaginationTransforms() - registerRequestTransforms() r := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/": @@ -1120,7 +1093,6 @@ var testCases = []struct { } }) server := httptest.NewServer(r) - t.Cleanup(func() { registeredTransforms = newRegistry() }) config["request.url"] = server.URL serverURL = server.URL config["chain.0.step.request.url"] = server.URL + "/$.exportId/$.files[:].id" @@ -1183,8 +1155,6 @@ var testCases = []struct { { name: "Test simple XML decode", setupServer: func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerDecoders() - registerRequestTransforms() r := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { const text = ` @@ -1210,7 +1180,6 @@ var testCases = []struct { w.Write([]byte(text)) }) server := httptest.NewServer(r) - t.Cleanup(func() { registeredTransforms = newRegistry() }) config["request.url"] = server.URL t.Cleanup(server.Close) }, @@ -1454,7 +1423,6 @@ func newChainPaginationTestServer( newServer func(http.Handler) *httptest.Server, ) func(testing.TB, http.HandlerFunc, map[string]interface{}) { return func(t testing.TB, h http.HandlerFunc, config map[string]interface{}) { - registerPaginationTransforms() var serverURL string r := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { @@ -1474,7 +1442,6 @@ func newChainPaginationTestServer( config["request.url"] = server.URL serverURL = server.URL config["chain.0.step.request.url"] = server.URL + "/$.records[:].id" - t.Cleanup(func() { registeredTransforms = newRegistry() }) } } diff --git a/x-pack/filebeat/input/httpjson/metrics.go b/x-pack/filebeat/input/httpjson/metrics.go index d1c019789c3..4e0ba508c01 100644 --- a/x-pack/filebeat/input/httpjson/metrics.go +++ b/x-pack/filebeat/input/httpjson/metrics.go @@ -38,7 +38,7 @@ func newInputMetrics(reg *monitoring.Registry) *inputMetrics { GetOrRegister("histogram", metrics.NewHistogram(out.intervalExecutionTime)) _ = adapter.GetGoMetrics(reg, "httpjson_interval_pages_execution_time", adapter.Accept). GetOrRegister("histogram", metrics.NewHistogram(out.intervalPageExecutionTime)) - _ = adapter.GetGoMetrics(reg, "httpjson_interval_pages_total", adapter.Accept). + _ = adapter.GetGoMetrics(reg, "httpjson_interval_pages", adapter.Accept). GetOrRegister("histogram", metrics.NewHistogram(out.intervalPages)) return out diff --git a/x-pack/filebeat/input/httpjson/metrics_test.go b/x-pack/filebeat/input/httpjson/metrics_test.go index 59043a8fcf8..653523ec5a2 100644 --- a/x-pack/filebeat/input/httpjson/metrics_test.go +++ b/x-pack/filebeat/input/httpjson/metrics_test.go @@ -32,16 +32,16 @@ func TestMetrics(t *testing.T) { { name: "Test pagination metrics", setupServer: func(t *testing.T, h http.HandlerFunc, config map[string]interface{}) { - registerPaginationTransforms() - registerResponseTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) server := httptest.NewServer(h) config["request.url"] = server.URL t.Cleanup(server.Close) }, baseConfig: map[string]interface{}{ "interval": time.Millisecond, - "request.method": http.MethodGet, + "request.method": http.MethodPost, + "request.body": map[string]interface{}{ + "field": "value", + }, "response.split": map[string]interface{}{ "target": "body.items", "transforms": []interface{}{ @@ -70,21 +70,20 @@ func TestMetrics(t *testing.T) { }, assertMetrics: func(reg *monitoring.Registry) error { checkHasValue := func(v interface{}) bool { - var c int64 switch t := v.(type) { case int64: - c = t + return t > 0 case map[string]interface{}: h := t["histogram"].(map[string]interface{}) - c = h["count"].(int64) + return h["count"].(int64) > 0 && h["max"].(int64) > 0 } - return c > 0 + return false } snapshot := monitoring.CollectStructSnapshot(reg, monitoring.Full, true) for _, m := range []string{ - "http_request_body_bytes", "http_request_get_total", + "http_request_body_bytes", "http_request_post_total", "http_request_total", "http_response_2xx_total", "http_response_body_bytes", "http_response_total", "http_round_trip_time", "httpjson_interval_execution_time", diff --git a/x-pack/filebeat/input/httpjson/pagination.go b/x-pack/filebeat/input/httpjson/pagination.go index ddaf5e8c670..1b8cfc6d240 100644 --- a/x-pack/filebeat/input/httpjson/pagination.go +++ b/x-pack/filebeat/input/httpjson/pagination.go @@ -19,12 +19,6 @@ import ( const paginationNamespace = "pagination" -func registerPaginationTransforms() { - registerTransform(paginationNamespace, appendName, newAppendPagination) - registerTransform(paginationNamespace, deleteName, newDeletePagination) - registerTransform(paginationNamespace, setName, newSetRequestPagination) -} - type pagination struct { log *logp.Logger httpClient *httpClient @@ -44,8 +38,8 @@ func newPagination(config config, httpClient *httpClient, log *logp.Logger) *pag return pagination } - rts, _ := newBasicTransformsFromConfig(config.Request.Transforms, requestNamespace, log) - pts, _ := newBasicTransformsFromConfig(config.Response.Pagination, paginationNamespace, log) + rts, _ := newBasicTransformsFromConfig(registeredTransforms, config.Request.Transforms, requestNamespace, log) + pts, _ := newBasicTransformsFromConfig(registeredTransforms, config.Response.Pagination, paginationNamespace, log) body := func() *mapstr.M { if config.Response.RequestBodyOnPagination { diff --git a/x-pack/filebeat/input/httpjson/request.go b/x-pack/filebeat/input/httpjson/request.go index 34532e1d550..f92d2944c70 100644 --- a/x-pack/filebeat/input/httpjson/request.go +++ b/x-pack/filebeat/input/httpjson/request.go @@ -8,10 +8,13 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "net/http" "net/url" + "reflect" + "strconv" "strings" "github.com/PaesslerAG/jsonpath" @@ -25,17 +28,210 @@ import ( const requestNamespace = "request" -func registerRequestTransforms() { - registerTransform(requestNamespace, appendName, newAppendRequest) - registerTransform(requestNamespace, deleteName, newDeleteRequest) - registerTransform(requestNamespace, setName, newSetRequestPagination) -} - type httpClient struct { client *http.Client limiter *rateLimiter } +func (r *requester) doRequest(stdCtx context.Context, trCtx *transformContext, publisher inputcursor.Publisher) error { + var ( + n int + ids []string + err error + urlCopy url.URL + urlString string + httpResp *http.Response + initialResponse []*http.Response + intermediateResps []*http.Response + finalResps []*http.Response + isChainWithPageExpected bool + chainIndex int + ) + + //nolint:bodyclose // response body is closed through drainBody method + for i, rf := range r.requestFactories { + finalResps = nil + intermediateResps = nil + // iterate over collected ids from last response + if i == 0 { + // perform and store regular call responses + httpResp, err = rf.collectResponse(stdCtx, trCtx, r) + if err != nil { + return fmt.Errorf("failed to execute rf.collectResponse: %w", err) + } + + if rf.saveFirstResponse { + // store first response in transform context + var bodyMap map[string]interface{} + body, err := io.ReadAll(httpResp.Body) + if err != nil { + return fmt.Errorf("failed to read http response body: %w", err) + } + httpResp.Body = io.NopCloser(bytes.NewReader(body)) + err = json.Unmarshal(body, &bodyMap) + if err != nil { + r.log.Errorf("unable to unmarshal first_response.body: %v", err) + } + firstResponse := response{ + url: *httpResp.Request.URL, + header: httpResp.Header.Clone(), + body: bodyMap, + } + trCtx.updateFirstResponse(firstResponse) + } + + if len(r.requestFactories) == 1 { + finalResps = append(finalResps, httpResp) + events := r.responseProcessors[i].startProcessing(stdCtx, trCtx, finalResps, true) + n = processAndPublishEvents(trCtx, events, publisher, true, r.log) + continue + } + + // if flow of control reaches here, that means there are more than 1 request factories + // if a chain step exists, only then we will initialize flags & variables here which are required for chaining + if r.requestFactories[i+1].isChain { + chainIndex = i + 1 + resp, err := cloneResponse(httpResp) + if err != nil { + return err + } + // the response is cloned and added to finalResps here, since the response of the 1st page (whether pagination exists or not), will + // be sent for further processing to check if any response processors can be applied or not and at the same time update the last_response, + // first_event & last_event cursor values. + finalResps = append(finalResps, resp) + + // if a pagination request factory exists at the root level along with a chain step, only then we will initialize flags & variables here + // which are required for chaining with root level pagination + if r.responseProcessors[i].pagination.requestFactory != nil { + isChainWithPageExpected = true + resp, err := cloneResponse(httpResp) + if err != nil { + return err + } + initialResponse = append(initialResponse, resp) + } + } + + intermediateResps = append(intermediateResps, httpResp) + ids, err = r.getIdsFromResponses(intermediateResps, r.requestFactories[i+1].replace) + if err != nil { + return err + } + // we avoid unnecessary pagination here since chaining is present, thus avoiding any unexpected updates to cursor values + events := r.responseProcessors[i].startProcessing(stdCtx, trCtx, finalResps, false) + n = processAndPublishEvents(trCtx, events, publisher, false, r.log) + } else { + if len(ids) == 0 { + n = 0 + continue + } + urlCopy = rf.url + urlString = rf.url.String() + + // new transform context for every chain step, derived from parent transform context + var chainTrCtx *transformContext + if rf.isChain { + chainTrCtx = trCtx.clone() + } + + var val string + var doReplaceWith bool + var replaceArr []string + if rf.replaceWith != "" { + replaceArr = strings.Split(rf.replaceWith, ",") + val, doReplaceWith, err = fetchValueFromContext(chainTrCtx, strings.TrimSpace(replaceArr[1])) + if err != nil { + return err + } + } + + // perform request over collected ids + for _, id := range ids { + // reformat urls of requestFactory using ids + rf.url, err = generateNewUrl(rf.replace, urlString, id) + if err != nil { + return fmt.Errorf("failed to generate new URL: %w", err) + } + + // reformat url accordingly if replaceWith clause exists + if doReplaceWith { + rf.url, err = generateNewUrl(strings.TrimSpace(replaceArr[0]), rf.url.String(), val) + if err != nil { + return fmt.Errorf("failed to generate new URL: %w", err) + } + } + // collect data from new urls + httpResp, err = rf.collectResponse(stdCtx, chainTrCtx, r) + if err != nil { + return fmt.Errorf("failed to execute rf.collectResponse: %w", err) + } + // store data according to response type + if i == len(r.requestFactories)-1 && len(ids) != 0 { + finalResps = append(finalResps, httpResp) + } else { + intermediateResps = append(intermediateResps, httpResp) + } + } + rf.url = urlCopy + + var resps []*http.Response + if i == len(r.requestFactories)-1 { + resps = finalResps + } else { + // The if comdition (i < len(r.requestFactories)) ensures this branch never runs to the last element + // of r.requestFactories, therefore r.requestFactories[i+1] will never be out of bounds. + ids, err = r.getIdsFromResponses(intermediateResps, r.requestFactories[i+1].replace) + if err != nil { + return err + } + resps = intermediateResps + } + + var events <-chan maybeMsg + if rf.isChain { + events = rf.chainResponseProcessor.startProcessing(stdCtx, chainTrCtx, resps, true) + } else { + events = r.responseProcessors[i].startProcessing(stdCtx, trCtx, resps, true) + } + n += processAndPublishEvents(chainTrCtx, events, publisher, i < len(r.requestFactories), r.log) + } + } + + defer httpResp.Body.Close() + // if pagination exists for the parent request along with chaining, then for each page response the chain is processed + if isChainWithPageExpected { + n += r.processRemainingChainEvents(stdCtx, trCtx, publisher, initialResponse, chainIndex) + } + r.log.Infof("request finished: %d events published", n) + + return nil +} + +// collectResponse returns response from provided request +func (rf *requestFactory) collectResponse(stdCtx context.Context, trCtx *transformContext, r *requester) (*http.Response, error) { + var err error + var httpResp *http.Response + + req, err := rf.newHTTPRequest(stdCtx, trCtx) + if err != nil { + return nil, fmt.Errorf("failed to create http request: %w", err) + } + + if rf.isChain && rf.chainHTTPClient != nil { + httpResp, err = rf.chainHTTPClient.do(stdCtx, req) + if err != nil { + return nil, fmt.Errorf("failed to execute chain http client.Do: %w", err) + } + } else { + httpResp, err = r.client.do(stdCtx, req) + if err != nil { + return nil, fmt.Errorf("failed to execute http client.Do: %w", err) + } + } + + return httpResp, nil +} + func (c *httpClient) do(stdCtx context.Context, req *http.Request) (*http.Response, error) { resp, err := c.limiter.execute(stdCtx, func() (*http.Response, error) { return c.client.Do(req) @@ -59,40 +255,6 @@ func (c *httpClient) do(stdCtx context.Context, req *http.Request) (*http.Respon return resp, nil } -func (rf *requestFactory) newRequest(ctx *transformContext) (transformable, error) { - req := transformable{} - req.setURL(rf.url) - - if rf.body != nil && len(*rf.body) > 0 { - req.setBody(rf.body.Clone()) - } - - header := http.Header{} - header.Set("Accept", "application/json") - header.Set("User-Agent", userAgent) - req.setHeader(header) - - var err error - for _, t := range rf.transforms { - req, err = t.run(ctx, req) - if err != nil { - return transformable{}, err - } - } - - if rf.method == http.MethodPost { - header = req.header() - if header.Get("Content-Type") == "" { - header.Set("Content-Type", "application/json") - req.setHeader(header) - } - } - - rf.log.Debugf("new request: %#v", req) - - return req, nil -} - type requestFactory struct { url url.URL method string @@ -114,7 +276,7 @@ type requestFactory struct { func newRequestFactory(ctx context.Context, config config, log *logp.Logger, metrics *inputMetrics, reg *monitoring.Registry) ([]*requestFactory, error) { // config validation already checked for errors here rfs := make([]*requestFactory, 0, len(config.Chain)+1) - ts, _ := newBasicTransformsFromConfig(config.Request.Transforms, requestNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, config.Request.Transforms, requestNamespace, log) // regular call requestFactory object rf := &requestFactory{ url: *config.Request.URL.URL, @@ -143,7 +305,7 @@ func newRequestFactory(ctx context.Context, config config, log *logp.Logger, met var rf *requestFactory // chain calls requestFactory object if ch.Step != nil { - ts, _ := newBasicTransformsFromConfig(ch.Step.Request.Transforms, requestNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, ch.Step.Request.Transforms, requestNamespace, log) ch.Step.Auth = tryAssignAuth(config.Auth, ch.Step.Auth) httpClient, err := newChainHTTPClient(ctx, ch.Step.Auth, ch.Step.Request, log, reg) if err != nil { @@ -170,7 +332,7 @@ func newRequestFactory(ctx context.Context, config config, log *logp.Logger, met chainResponseProcessor: responseProcessor, } } else if ch.While != nil { - ts, _ := newBasicTransformsFromConfig(ch.While.Request.Transforms, requestNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, ch.While.Request.Transforms, requestNamespace, log) policy := newHTTPPolicy(evaluateResponse, ch.While.Until, log) ch.While.Auth = tryAssignAuth(config.Auth, ch.While.Auth) httpClient, err := newChainHTTPClient(ctx, ch.While.Auth, ch.While.Request, log, reg, policy) @@ -203,268 +365,128 @@ func newRequestFactory(ctx context.Context, config config, log *logp.Logger, met return rfs, nil } -func (rf *requestFactory) newHTTPRequest(stdCtx context.Context, trCtx *transformContext) (*http.Request, error) { - trReq, err := rf.newRequest(trCtx) +func evaluateResponse(expression *valueTpl, data []byte, log *logp.Logger) (bool, error) { + var dataMap mapstr.M + + err := json.Unmarshal(data, &dataMap) if err != nil { - return nil, err + return false, fmt.Errorf("error while unmarshalling data : %w", err) } - - var body []byte - if rf.method == http.MethodPost { - if rf.encoder != nil { - body, err = rf.encoder(trReq) - } else { - body, err = encode(trReq.header().Get("Content-Type"), trReq) - } - if err != nil { - return nil, err - } + tr := transformable{} + paramCtx := &transformContext{ + firstEvent: &mapstr.M{}, + lastEvent: &mapstr.M{}, + firstResponse: &response{}, + lastResponse: &response{body: dataMap}, } - url := trReq.url() - req, err := http.NewRequest(rf.method, url.String(), bytes.NewBuffer(body)) + val, err := expression.Execute(paramCtx, tr, "", nil, log) if err != nil { - return nil, err + return false, fmt.Errorf("error while evaluating expression : %w", err) } - - req = req.WithContext(stdCtx) - - req.Header = trReq.header().Clone() - - if rf.user != "" || rf.password != "" { - req.SetBasicAuth(rf.user, rf.password) + result, err := strconv.ParseBool(val) + if err != nil { + return false, fmt.Errorf("error while parsing boolean value of string : %w", err) } - return req, nil + return result, nil } -type requester struct { - log *logp.Logger - client *httpClient - requestFactories []*requestFactory - responseProcessors []*responseProcessor -} - -func newRequester( - client *httpClient, - requestFactory []*requestFactory, - responseProcessor []*responseProcessor, - log *logp.Logger, -) *requester { - return &requester{ - log: log, - client: client, - requestFactories: requestFactory, - responseProcessors: responseProcessor, +func tryAssignAuth(parentConfig *authConfig, childConfig *authConfig) *authConfig { + if parentConfig != nil && childConfig == nil { + return parentConfig } + return childConfig } -// collectResponse returns response from provided request -func (rf *requestFactory) collectResponse(stdCtx context.Context, trCtx *transformContext, r *requester) (*http.Response, error) { - var err error - var httpResp *http.Response - - req, err := rf.newHTTPRequest(stdCtx, trCtx) - if err != nil { - return nil, fmt.Errorf("failed to create http request: %w", err) - } - - if rf.isChain && rf.chainHTTPClient != nil { - httpResp, err = rf.chainHTTPClient.do(stdCtx, req) - if err != nil { - return nil, fmt.Errorf("failed to execute chain http client.Do: %w", err) - } - } else { - httpResp, err = r.client.do(stdCtx, req) - if err != nil { - return nil, fmt.Errorf("failed to execute http client.Do: %w", err) - } - } - - return httpResp, nil -} - -// generateNewUrl returns new url value using replacement from oldUrl with ids -func generateNewUrl(replacement, oldUrl, id string) (url.URL, error) { - newUrl, err := url.Parse(strings.Replace(oldUrl, replacement, id, 1)) +func (rf *requestFactory) newHTTPRequest(stdCtx context.Context, trCtx *transformContext) (*http.Request, error) { + trReq, err := rf.newRequest(trCtx) if err != nil { - return url.URL{}, fmt.Errorf("failed to replace value in url: %w", err) + return nil, err } - return *newUrl, nil -} - -func (r *requester) doRequest(stdCtx context.Context, trCtx *transformContext, publisher inputcursor.Publisher) error { - var ( - n int - ids []string - err error - urlCopy url.URL - urlString string - httpResp *http.Response - initialResponse []*http.Response - intermediateResps []*http.Response - finalResps []*http.Response - isChainWithPageExpected bool - chainIndex int - ) - - //nolint:bodyclose // response body is closed through drainBody method - for i, rf := range r.requestFactories { - finalResps = nil - intermediateResps = nil - // iterate over collected ids from last response - if i == 0 { - // perform and store regular call responses - httpResp, err = rf.collectResponse(stdCtx, trCtx, r) - if err != nil { - return fmt.Errorf("failed to execute rf.collectResponse: %w", err) - } - - if rf.saveFirstResponse { - // store first response in transform context - var bodyMap map[string]interface{} - body, err := io.ReadAll(httpResp.Body) - if err != nil { - return fmt.Errorf("failed to read http response body: %w", err) - } - httpResp.Body = io.NopCloser(bytes.NewReader(body)) - err = json.Unmarshal(body, &bodyMap) - if err != nil { - r.log.Errorf("unable to unmarshal first_response.body: %v", err) - } - firstResponse := response{ - url: *httpResp.Request.URL, - header: httpResp.Header.Clone(), - body: bodyMap, - } - trCtx.updateFirstResponse(firstResponse) - } - - if len(r.requestFactories) == 1 { - finalResps = append(finalResps, httpResp) - events := r.responseProcessors[i].startProcessing(stdCtx, trCtx, finalResps, true) - n = processAndPublishEvents(trCtx, events, publisher, true, r.log) - continue - } - - // if flow of control reaches here, that means there are more than 1 request factories - // if a chain step exists, only then we will initialize flags & variables here which are required for chaining - if r.requestFactories[i+1].isChain { - chainIndex = i + 1 - resp, err := cloneResponse(httpResp) - if err != nil { - return err - } - // the response is cloned and added to finalResps here, since the response of the 1st page (whether pagination exists or not), will - // be sent for further processing to check if any response processors can be applied or not and at the same time update the last_response, - // first_event & last_event cursor values. - finalResps = append(finalResps, resp) - - // if a pagination request factory exists at the root level along with a chain step, only then we will initialize flags & variables here - // which are required for chaining with root level pagination - if r.responseProcessors[i].pagination.requestFactory != nil { - isChainWithPageExpected = true - resp, err := cloneResponse(httpResp) - if err != nil { - return err - } - initialResponse = append(initialResponse, resp) - } - } - - intermediateResps = append(intermediateResps, httpResp) - ids, err = r.getIdsFromResponses(intermediateResps, r.requestFactories[i+1].replace) - if err != nil { - return err - } - // we avoid unnecessary pagination here since chaining is present, thus avoiding any unexpected updates to cursor values - events := r.responseProcessors[i].startProcessing(stdCtx, trCtx, finalResps, false) - n = processAndPublishEvents(trCtx, events, publisher, false, r.log) + + var body []byte + if rf.method == http.MethodPost { + if rf.encoder != nil { + body, err = rf.encoder(trReq) } else { - if len(ids) == 0 { - n = 0 - continue - } - urlCopy = rf.url - urlString = rf.url.String() + body, err = encode(trReq.header().Get("Content-Type"), trReq) + } + if err != nil { + return nil, err + } + } - // new transform context for every chain step, derived from parent transform context - var chainTrCtx *transformContext - if rf.isChain { - chainTrCtx = trCtx.clone() - } + url := trReq.url() + req, err := http.NewRequest(rf.method, url.String(), bytes.NewBuffer(body)) + if err != nil { + return nil, err + } - var val string - var doReplaceWith bool - var replaceArr []string - if rf.replaceWith != "" { - replaceArr = strings.Split(rf.replaceWith, ",") - val, doReplaceWith, err = fetchValueFromContext(chainTrCtx, strings.TrimSpace(replaceArr[1])) - if err != nil { - return err - } - } + req = req.WithContext(stdCtx) - // perform request over collected ids - for _, id := range ids { - // reformat urls of requestFactory using ids - rf.url, err = generateNewUrl(rf.replace, urlString, id) - if err != nil { - return fmt.Errorf("failed to generate new URL: %w", err) - } + req.Header = trReq.header().Clone() - // reformat url accordingly if replaceWith clause exists - if doReplaceWith { - rf.url, err = generateNewUrl(strings.TrimSpace(replaceArr[0]), rf.url.String(), val) - if err != nil { - return fmt.Errorf("failed to generate new URL: %w", err) - } - } - // collect data from new urls - httpResp, err = rf.collectResponse(stdCtx, chainTrCtx, r) - if err != nil { - return fmt.Errorf("failed to execute rf.collectResponse: %w", err) - } - // store data according to response type - if i == len(r.requestFactories)-1 && len(ids) != 0 { - finalResps = append(finalResps, httpResp) - } else { - intermediateResps = append(intermediateResps, httpResp) - } - } - rf.url = urlCopy + if rf.user != "" || rf.password != "" { + req.SetBasicAuth(rf.user, rf.password) + } - var resps []*http.Response - if i == len(r.requestFactories)-1 { - resps = finalResps - } else { - // The if comdition (i < len(r.requestFactories)) ensures this branch never runs to the last element - // of r.requestFactories, therefore r.requestFactories[i+1] will never be out of bounds. - ids, err = r.getIdsFromResponses(intermediateResps, r.requestFactories[i+1].replace) - if err != nil { - return err - } - resps = intermediateResps - } + return req, nil +} - var events <-chan maybeMsg - if rf.isChain { - events = rf.chainResponseProcessor.startProcessing(stdCtx, chainTrCtx, resps, true) - } else { - events = r.responseProcessors[i].startProcessing(stdCtx, trCtx, resps, true) - } - n += processAndPublishEvents(chainTrCtx, events, publisher, i < len(r.requestFactories), r.log) +func (rf *requestFactory) newRequest(ctx *transformContext) (transformable, error) { + req := transformable{} + req.setURL(rf.url) + + if rf.body != nil && len(*rf.body) > 0 { + req.setBody(rf.body.Clone()) + } + + header := http.Header{} + header.Set("Accept", "application/json") + header.Set("User-Agent", userAgent) + req.setHeader(header) + + var err error + for _, t := range rf.transforms { + req, err = t.run(ctx, req) + if err != nil { + return transformable{}, err } } - defer httpResp.Body.Close() - // if pagination exists for the parent request along with chaining, then for each page response the chain is processed - if isChainWithPageExpected { - n += r.processRemainingChainEvents(stdCtx, trCtx, publisher, initialResponse, chainIndex) + if rf.method == http.MethodPost { + header = req.header() + if header.Get("Content-Type") == "" { + header.Set("Content-Type", "application/json") + req.setHeader(header) + } } - r.log.Infof("request finished: %d events published", n) - return nil + rf.log.Debugf("new request: %#v", req) + + return req, nil +} + +type requester struct { + log *logp.Logger + client *httpClient + requestFactories []*requestFactory + responseProcessors []*responseProcessor +} + +func newRequester( + client *httpClient, + requestFactory []*requestFactory, + responseProcessor []*responseProcessor, + log *logp.Logger, +) *requester { + return &requester{ + log: log, + client: client, + requestFactories: requestFactory, + responseProcessors: responseProcessor, + } } // getIdsFromResponses returns ids from responses @@ -516,38 +538,6 @@ func (r *requester) getIdsFromResponses(intermediateResps []*http.Response, repl return ids, nil } -// processAndPublishEvents process and publish events based on event type -func processAndPublishEvents(trCtx *transformContext, events <-chan maybeMsg, publisher inputcursor.Publisher, publish bool, log *logp.Logger) int { - var n int - for maybeMsg := range events { - if maybeMsg.failed() { - log.Errorf("error processing response: %v", maybeMsg) - continue - } - - if publish { - event, err := makeEvent(maybeMsg.msg) - if err != nil { - log.Errorf("error creating event: %v", maybeMsg) - continue - } - - if err := publisher.Publish(event, trCtx.cursorMap()); err != nil { - log.Errorf("error publishing event: %v", err) - continue - } - } - if len(*trCtx.firstEventClone()) == 0 { - trCtx.updateFirstEvent(maybeMsg.msg) - } - trCtx.updateLastEvent(maybeMsg.msg) - trCtx.updateCursor() - - n++ - } - return n -} - // processRemainingChainEvents, processes the remaining pagination events for chain blocks func (r *requester) processRemainingChainEvents(stdCtx context.Context, trCtx *transformContext, publisher inputcursor.Publisher, initialResp []*http.Response, chainIndex int) int { // we start from 0, and skip the 1st event since we have already processed it @@ -698,6 +688,170 @@ func (r *requester) processChainPaginationEvents(stdCtx context.Context, trCtx * return n, nil } +// generateNewUrl returns new url value using replacement from oldUrl with ids +func generateNewUrl(replacement, oldUrl, id string) (url.URL, error) { + newUrl, err := url.Parse(strings.Replace(oldUrl, replacement, id, 1)) + if err != nil { + return url.URL{}, fmt.Errorf("failed to replace value in url: %w", err) + } + return *newUrl, nil +} + +// processAndPublishEvents process and publish events based on event type +func processAndPublishEvents(trCtx *transformContext, events <-chan maybeMsg, publisher inputcursor.Publisher, publish bool, log *logp.Logger) int { + var n int + for maybeMsg := range events { + if maybeMsg.failed() { + log.Errorf("error processing response: %v", maybeMsg) + continue + } + + if publish { + event, err := makeEvent(maybeMsg.msg) + if err != nil { + log.Errorf("error creating event: %v", maybeMsg) + continue + } + + if err := publisher.Publish(event, trCtx.cursorMap()); err != nil { + log.Errorf("error publishing event: %v", err) + continue + } + } + if len(*trCtx.firstEventClone()) == 0 { + trCtx.updateFirstEvent(maybeMsg.msg) + } + trCtx.updateLastEvent(maybeMsg.msg) + trCtx.updateCursor() + + n++ + } + return n +} + +const ( + // This is generally updated with chain responses, if present, as they continue to occur + // Otherwise this is always the last response of the root request w.r.t pagination + lastResponse = "last_response" + // This is always the first root response + firstResponse = "first_response" + // This is always the last response of the parent (root) request w.r.t pagination + // This is only set if chaining is used + parentLastResponse = "parent_last_response" +) + +func fetchValueFromContext(trCtx *transformContext, expression string) (string, bool, error) { + var val interface{} + + switch keys := processExpression(expression); keys[0] { + case lastResponse: + respMap, err := responseToMap(trCtx.lastResponse) + if err != nil { + return "", false, err + } + val, err = iterateRecursive(respMap, keys[1:], 0) + if err != nil { + return "", false, err + } + case parentLastResponse: + respMap, err := responseToMap(trCtx.parentTrCtx.lastResponse) + if err != nil { + return "", false, err + } + val, err = iterateRecursive(respMap, keys[1:], 0) + if err != nil { + return "", false, err + } + case firstResponse: + // since first response body is already a map, we do not need to transform it + respMap, err := responseToMap(trCtx.firstResponse) + if err != nil { + return "", false, err + } + val, err = iterateRecursive(respMap, keys[1:], 0) + if err != nil { + return "", false, err + } + // In this scenario we treat the expression as a hardcoded value, with which we will replace the fixed-pattern + case expression: + return expression, true, nil + default: + return "", false, fmt.Errorf("context value not supported for key: %q in expression %q", keys[0], expression) + } + + return fmt.Sprint(val), true, nil +} + +// processExpression, splits the expression string based on the separator and looks for +// supported keywords. If present, returns an expression array containing separated elements. +// If no keywords are present, the expression is treated as a hardcoded value and returned +// as a merged string which is the only array element. +func processExpression(expression string) []string { + if !strings.HasPrefix(expression, ".") { + return []string{expression} + } + switch { + case strings.HasPrefix(expression, "."+firstResponse+"."), + strings.HasPrefix(expression, "."+lastResponse+"."), + strings.HasPrefix(expression, "."+parentLastResponse+"."): + return strings.Split(expression, ".")[1:] + default: + return []string{expression} + } +} + +func responseToMap(r *response) (mapstr.M, error) { + if r.body == nil { + return nil, fmt.Errorf("response body is empty for request url: %s", &r.url) + } + respMap := map[string]interface{}{ + "header": make(mapstr.M), + "body": make(mapstr.M), + } + + for key, value := range r.header { + respMap["header"] = mapstr.M{ + key: value, + } + } + respMap["body"] = r.body + + return respMap, nil +} + +func iterateRecursive(m mapstr.M, keys []string, depth int) (interface{}, error) { + val := m[keys[depth]] + + if val == nil { + return nil, fmt.Errorf("value of expression could not be determined for key %s", strings.Join(keys[:depth+1], ".")) + } + + switch v := reflect.ValueOf(val); v.Kind() { + case reflect.Bool: + return v.Bool(), nil + case reflect.Int, reflect.Int8, reflect.Int32, reflect.Int64: + return v.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint32, reflect.Uint64: + return v.Uint(), nil + case reflect.Float32, reflect.Float64: + return v.Float(), nil + case reflect.String: + return v.String(), nil + case reflect.Map: + nextMap, ok := v.Interface().(map[string]interface{}) + if !ok { + return nil, errors.New("unable to parse the value of the given expression") + } + depth++ + if depth >= len(keys) { + return nil, errors.New("value of expression could not be determined") + } + return iterateRecursive(nextMap, keys, depth) + default: + return nil, fmt.Errorf("unable to parse the value of the expression %s: type %T is not handled", strings.Join(keys[:depth+1], "."), val) + } +} + // cloneResponse clones required http response attributes func cloneResponse(source *http.Response) (*http.Response, error) { var resp http.Response diff --git a/x-pack/filebeat/input/httpjson/request_chain_helper.go b/x-pack/filebeat/input/httpjson/request_chain_helper.go deleted file mode 100644 index c75c573a17f..00000000000 --- a/x-pack/filebeat/input/httpjson/request_chain_helper.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License; -// you may not use this file except in compliance with the Elastic License. - -package httpjson - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - - retryablehttp "github.com/hashicorp/go-retryablehttp" - - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -const ( - // This is generally updated with chain responses, if present, as they continue to occur - // Otherwise this is always the last response of the root request w.r.t pagination - lastResponse = "last_response" - // This is always the first root response - firstResponse = "first_response" - // This is always the last response of the parent (root) request w.r.t pagination - // This is only set if chaining is used - parentLastResponse = "parent_last_response" -) - -func newChainHTTPClient(ctx context.Context, authCfg *authConfig, requestCfg *requestConfig, log *logp.Logger, reg *monitoring.Registry, p ...*Policy) (*httpClient, error) { - // Make retryable HTTP client - netHTTPClient, err := newNetHTTPClient(ctx, requestCfg, log, reg) - if err != nil { - return nil, err - } - - var retryPolicyFunc retryablehttp.CheckRetry - if len(p) != 0 { - retryPolicyFunc = p[0].CustomRetryPolicy - } else { - retryPolicyFunc = retryablehttp.DefaultRetryPolicy - } - - client := &retryablehttp.Client{ - HTTPClient: netHTTPClient, - Logger: newRetryLogger(log), - RetryWaitMin: requestCfg.Retry.getWaitMin(), - RetryWaitMax: requestCfg.Retry.getWaitMax(), - RetryMax: requestCfg.Retry.getMaxAttempts(), - CheckRetry: retryPolicyFunc, - Backoff: retryablehttp.DefaultBackoff, - } - - limiter := newRateLimiterFromConfig(requestCfg.RateLimit, log) - - if authCfg != nil && authCfg.OAuth2.isEnabled() { - authClient, err := authCfg.OAuth2.client(ctx, client.StandardClient()) - if err != nil { - return nil, err - } - return &httpClient{client: authClient, limiter: limiter}, nil - } - - return &httpClient{client: client.StandardClient(), limiter: limiter}, nil -} - -func evaluateResponse(expression *valueTpl, data []byte, log *logp.Logger) (bool, error) { - var dataMap mapstr.M - - err := json.Unmarshal(data, &dataMap) - if err != nil { - return false, fmt.Errorf("error while unmarshalling data : %w", err) - } - tr := transformable{} - paramCtx := &transformContext{ - firstEvent: &mapstr.M{}, - lastEvent: &mapstr.M{}, - firstResponse: &response{}, - lastResponse: &response{body: dataMap}, - } - - val, err := expression.Execute(paramCtx, tr, "", nil, log) - if err != nil { - return false, fmt.Errorf("error while evaluating expression : %w", err) - } - result, err := strconv.ParseBool(val) - if err != nil { - return false, fmt.Errorf("error while parsing boolean value of string : %w", err) - } - - return result, nil -} - -// fetchValueFromContext evaluates a given expression and returns the appropriate value from context variables if present -func fetchValueFromContext(trCtx *transformContext, expression string) (string, bool, error) { - var val interface{} - - switch keys := processExpression(expression); keys[0] { - case lastResponse: - respMap, err := responseToMap(trCtx.lastResponse) - if err != nil { - return "", false, err - } - val, err = iterateRecursive(respMap, keys[1:], 0) - if err != nil { - return "", false, err - } - case parentLastResponse: - respMap, err := responseToMap(trCtx.parentTrCtx.lastResponse) - if err != nil { - return "", false, err - } - val, err = iterateRecursive(respMap, keys[1:], 0) - if err != nil { - return "", false, err - } - case firstResponse: - // since first response body is already a map, we do not need to transform it - respMap, err := responseToMap(trCtx.firstResponse) - if err != nil { - return "", false, err - } - val, err = iterateRecursive(respMap, keys[1:], 0) - if err != nil { - return "", false, err - } - // In this scenario we treat the expression as a hardcoded value, with which we will replace the fixed-pattern - case expression: - return expression, true, nil - default: - return "", false, fmt.Errorf("context value not supported for key: %q in expression %q", keys[0], expression) - } - - return fmt.Sprint(val), true, nil -} - -func responseToMap(r *response) (mapstr.M, error) { - if r.body == nil { - return nil, fmt.Errorf("response body is empty for request url: %s", &r.url) - } - respMap := map[string]interface{}{ - "header": make(mapstr.M), - "body": make(mapstr.M), - } - - for key, value := range r.header { - respMap["header"] = mapstr.M{ - key: value, - } - } - respMap["body"] = r.body - - return respMap, nil -} - -func iterateRecursive(m mapstr.M, keys []string, depth int) (interface{}, error) { - val := m[keys[depth]] - - if val == nil { - return nil, fmt.Errorf("value of expression could not be determined for key %s", strings.Join(keys[:depth+1], ".")) - } - - switch v := reflect.ValueOf(val); v.Kind() { - case reflect.Bool: - return v.Bool(), nil - case reflect.Int, reflect.Int8, reflect.Int32, reflect.Int64: - return v.Int(), nil - case reflect.Uint, reflect.Uint8, reflect.Uint32, reflect.Uint64: - return v.Uint(), nil - case reflect.Float32, reflect.Float64: - return v.Float(), nil - case reflect.String: - return v.String(), nil - case reflect.Map: - nextMap, ok := v.Interface().(map[string]interface{}) - if !ok { - return nil, errors.New("unable to parse the value of the given expression") - } - depth++ - if depth >= len(keys) { - return nil, errors.New("value of expression could not be determined") - } - return iterateRecursive(nextMap, keys, depth) - default: - return nil, fmt.Errorf("unable to parse the value of the expression %s: type %T is not handled", strings.Join(keys[:depth+1], "."), val) - } -} - -// processExpression, splits the expression string based on the separator and looks for -// supported keywords. If present, returns an expression array containing separated elements. -// If no keywords are present, the expression is treated as a hardcoded value and returned -// as a merged string which is the only array element. -func processExpression(expression string) []string { - if !strings.HasPrefix(expression, ".") { - return []string{expression} - } - switch { - case strings.HasPrefix(expression, "."+firstResponse+"."), - strings.HasPrefix(expression, "."+lastResponse+"."), - strings.HasPrefix(expression, "."+parentLastResponse+"."): - return strings.Split(expression, ".")[1:] - default: - return []string{expression} - } -} - -func tryAssignAuth(parentConfig *authConfig, childConfig *authConfig) *authConfig { - if parentConfig != nil && childConfig == nil { - return parentConfig - } - return childConfig -} diff --git a/x-pack/filebeat/input/httpjson/request_chain_helper_test.go b/x-pack/filebeat/input/httpjson/request_chain_helper_test.go deleted file mode 100644 index 0c2bf384095..00000000000 --- a/x-pack/filebeat/input/httpjson/request_chain_helper_test.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License; -// you may not use this file except in compliance with the Elastic License. - -package httpjson - -import ( - "bytes" - "context" - "net/url" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/elastic/elastic-agent-libs/logp" -) - -func Test_newChainHTTPClient(t *testing.T) { - cfg := defaultChainConfig() - cfg.Request.URL = &urlConfig{URL: &url.URL{}} - ctx := context.Background() - log := logp.NewLogger("newChainClientTestLogger") - - type args struct { - ctx context.Context - authCfg *authConfig - requestCfg *requestConfig - log *logp.Logger - p []*Policy - } - tests := []struct { - name string - args args - }{ - { - name: "newChainClientTest", - args: args{ - ctx: ctx, - authCfg: cfg.Auth, - requestCfg: cfg.Request, - log: log, - p: nil, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := newChainHTTPClient(tt.args.ctx, tt.args.authCfg, tt.args.requestCfg, tt.args.log, nil, tt.args.p...) - assert.NoError(t, err) - assert.NotNil(t, got) - }) - } -} - -func Test_evaluateResponse(t *testing.T) { - log := logp.NewLogger("newEvaluateResponseTestLogger") - responseTrue := bytes.NewBufferString(`{"status": "completed"}`).Bytes() - responseFalse := bytes.NewBufferString(`{"status": "initiated"}`).Bytes() - - type args struct { - expression string - data []byte - log *logp.Logger - } - tests := []struct { - name string - args args - expectedError string - want bool - }{ - { - name: "newEvaluateResponse_resultIsTrue", - args: args{ - expression: `[[ eq .last_response.body.status "completed" ]]`, - data: responseTrue, - log: log, - }, - want: true, - expectedError: "", - }, - { - name: "newEvaluateResponse_resultIsFalse", - args: args{ - expression: `[[ eq .last_response.body.status "completed" ]]`, - data: responseFalse, - log: log, - }, - want: false, - expectedError: "", - }, - { - name: "newEvaluateResponse_invalidExpressionError", - args: args{ - expression: `eq .last_response.body.status "completed" ]]`, - data: responseFalse, - log: log, - }, - want: false, - expectedError: "error while parsing boolean value of string : strconv.ParseBool: parsing \"eq .last_response.body.status \\\"completed\\\" ]]\": invalid syntax", - }, - { - name: "newEvaluateResponse_emptyExpressionError", - args: args{ - expression: "", - data: responseFalse, - log: log, - }, - want: false, - expectedError: "error while evaluating expression : the template result is empty", - }, - { - name: "newEvaluateResponse_incompleteExpressionError", - args: args{ - expression: `[[.last_response.body.status]]`, - data: responseFalse, - log: log, - }, - want: false, - expectedError: "error while parsing boolean value of string : strconv.ParseBool: parsing \"initiated\": invalid syntax", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - expression := &valueTpl{} - err := expression.Unpack(tt.args.expression) - assert.NoError(t, err) - - got, err := evaluateResponse(expression, tt.args.data, tt.args.log) - if err != nil { - assert.EqualError(t, err, tt.expectedError) - } else { - assert.Equal(t, tt.want, got) - } - }) - } -} - -func TestProcessExpression(t *testing.T) { - tests := []struct { - in string - want []string - }{ - // Cursor values. - {in: ".first_response.foo", want: []string{"first_response", "foo"}}, - {in: ".first_response.", want: []string{"first_response", ""}}, - {in: ".last_response.foo", want: []string{"last_response", "foo"}}, - {in: ".last_response.", want: []string{"last_response", ""}}, - {in: ".parent_last_response.foo", want: []string{"parent_last_response", "foo"}}, - {in: ".parent_last_response.", want: []string{"parent_last_response", ""}}, - - // Literal values. - {in: ".literal_foo", want: []string{".literal_foo"}}, - {in: ".literal_foo.bar", want: []string{".literal_foo.bar"}}, - {in: "literal.foo.bar", want: []string{"literal.foo.bar"}}, - {in: "first_response.foo", want: []string{"first_response.foo"}}, - {in: ".first_response", want: []string{".first_response"}}, - {in: ".last_response", want: []string{".last_response"}}, - {in: ".parent_last_response", want: []string{".parent_last_response"}}, - } - for _, test := range tests { - got := processExpression(test.in) - assert.Equal(t, test.want, got) - } -} diff --git a/x-pack/filebeat/input/httpjson/request_test.go b/x-pack/filebeat/input/httpjson/request_test.go index 981089ff3ac..315a3d4864b 100644 --- a/x-pack/filebeat/input/httpjson/request_test.go +++ b/x-pack/filebeat/input/httpjson/request_test.go @@ -5,9 +5,11 @@ package httpjson import ( + "bytes" "context" "fmt" "net/http/httptest" + "net/url" "testing" "time" @@ -20,9 +22,6 @@ import ( ) func TestCtxAfterDoRequest(t *testing.T) { - registerRequestTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) - // mock timeNow func to return a fixed value timeNow = func() time.Time { t, _ := time.Parse(time.RFC3339, "2002-10-02T15:00:00Z") @@ -135,3 +134,151 @@ func TestCtxAfterDoRequest(t *testing.T) { lastResp, ) } + +func Test_newChainHTTPClient(t *testing.T) { + cfg := defaultChainConfig() + cfg.Request.URL = &urlConfig{URL: &url.URL{}} + ctx := context.Background() + log := logp.NewLogger("newChainClientTestLogger") + + type args struct { + ctx context.Context + authCfg *authConfig + requestCfg *requestConfig + log *logp.Logger + p []*Policy + } + tests := []struct { + name string + args args + }{ + { + name: "newChainClientTest", + args: args{ + ctx: ctx, + authCfg: cfg.Auth, + requestCfg: cfg.Request, + log: log, + p: nil, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newChainHTTPClient(tt.args.ctx, tt.args.authCfg, tt.args.requestCfg, tt.args.log, nil, tt.args.p...) + assert.NoError(t, err) + assert.NotNil(t, got) + }) + } +} + +func Test_evaluateResponse(t *testing.T) { + log := logp.NewLogger("newEvaluateResponseTestLogger") + responseTrue := bytes.NewBufferString(`{"status": "completed"}`).Bytes() + responseFalse := bytes.NewBufferString(`{"status": "initiated"}`).Bytes() + + type args struct { + expression string + data []byte + log *logp.Logger + } + tests := []struct { + name string + args args + expectedError string + want bool + }{ + { + name: "newEvaluateResponse_resultIsTrue", + args: args{ + expression: `[[ eq .last_response.body.status "completed" ]]`, + data: responseTrue, + log: log, + }, + want: true, + expectedError: "", + }, + { + name: "newEvaluateResponse_resultIsFalse", + args: args{ + expression: `[[ eq .last_response.body.status "completed" ]]`, + data: responseFalse, + log: log, + }, + want: false, + expectedError: "", + }, + { + name: "newEvaluateResponse_invalidExpressionError", + args: args{ + expression: `eq .last_response.body.status "completed" ]]`, + data: responseFalse, + log: log, + }, + want: false, + expectedError: "error while parsing boolean value of string : strconv.ParseBool: parsing \"eq .last_response.body.status \\\"completed\\\" ]]\": invalid syntax", + }, + { + name: "newEvaluateResponse_emptyExpressionError", + args: args{ + expression: "", + data: responseFalse, + log: log, + }, + want: false, + expectedError: "error while evaluating expression : the template result is empty", + }, + { + name: "newEvaluateResponse_incompleteExpressionError", + args: args{ + expression: `[[.last_response.body.status]]`, + data: responseFalse, + log: log, + }, + want: false, + expectedError: "error while parsing boolean value of string : strconv.ParseBool: parsing \"initiated\": invalid syntax", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expression := &valueTpl{} + err := expression.Unpack(tt.args.expression) + assert.NoError(t, err) + + got, err := evaluateResponse(expression, tt.args.data, tt.args.log) + if err != nil { + assert.EqualError(t, err, tt.expectedError) + } else { + assert.Equal(t, tt.want, got) + } + }) + } +} + +func TestProcessExpression(t *testing.T) { + tests := []struct { + in string + want []string + }{ + // Cursor values. + {in: ".first_response.foo", want: []string{"first_response", "foo"}}, + {in: ".first_response.", want: []string{"first_response", ""}}, + {in: ".last_response.foo", want: []string{"last_response", "foo"}}, + {in: ".last_response.", want: []string{"last_response", ""}}, + {in: ".parent_last_response.foo", want: []string{"parent_last_response", "foo"}}, + {in: ".parent_last_response.", want: []string{"parent_last_response", ""}}, + + // Literal values. + {in: ".literal_foo", want: []string{".literal_foo"}}, + {in: ".literal_foo.bar", want: []string{".literal_foo.bar"}}, + {in: "literal.foo.bar", want: []string{"literal.foo.bar"}}, + {in: "first_response.foo", want: []string{"first_response.foo"}}, + {in: ".first_response", want: []string{".first_response"}}, + {in: ".last_response", want: []string{".last_response"}}, + {in: ".parent_last_response", want: []string{".parent_last_response"}}, + } + for _, test := range tests { + got := processExpression(test.in) + assert.Equal(t, test.want, got) + } +} diff --git a/x-pack/filebeat/input/httpjson/response.go b/x-pack/filebeat/input/httpjson/response.go index 2b23d1fdb03..7adfd956fa2 100644 --- a/x-pack/filebeat/input/httpjson/response.go +++ b/x-pack/filebeat/input/httpjson/response.go @@ -18,12 +18,6 @@ import ( const responseNamespace = "response" -func registerResponseTransforms() { - registerTransform(responseNamespace, appendName, newAppendResponse) - registerTransform(responseNamespace, deleteName, newDeleteResponse) - registerTransform(responseNamespace, setName, newSetResponse) -} - type response struct { page int64 url url.URL @@ -53,6 +47,51 @@ func (resp *response) clone() *response { return clone } +func (resp *response) asTransformables(log *logp.Logger) []transformable { + var ts []transformable + + convertAndAppend := func(m map[string]interface{}) { + tr := transformable{} + tr.setHeader(resp.header.Clone()) + tr.setURL(resp.url) + tr.setBody(mapstr.M(m).Clone()) + ts = append(ts, tr) + } + + switch tresp := resp.body.(type) { + case []interface{}: + for _, v := range tresp { + m, ok := v.(map[string]interface{}) + if !ok { + log.Debugf("events must be JSON objects, but got %T: skipping", v) + continue + } + convertAndAppend(m) + } + case map[string]interface{}: + convertAndAppend(tresp) + default: + log.Debugf("response is not a valid JSON") + } + + return ts +} + +func (resp *response) templateValues() mapstr.M { + if resp == nil { + return mapstr.M{} + } + return mapstr.M{ + "header": resp.header.Clone(), + "page": resp.page, + "url": mapstr.M{ + "value": resp.url.String(), + "params": resp.url.Query(), + }, + "body": resp.body, + } +} + type responseProcessor struct { metrics *inputMetrics log *logp.Logger @@ -75,7 +114,7 @@ func newResponseProcessor(config config, pagination *pagination, xmlDetails map[ rps = append(rps, rp) return rps } - ts, _ := newBasicTransformsFromConfig(config.Response.Transforms, responseNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, config.Response.Transforms, responseNamespace, log) rp.transforms = ts split, _ := newSplitResponse(config.Response.Split, log) @@ -119,7 +158,7 @@ func newChainResponseProcessor(config chainConfig, httpClient *httpClient, xmlDe return rp } - ts, _ := newBasicTransformsFromConfig(config.Step.Response.Transforms, responseNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, config.Step.Response.Transforms, responseNamespace, log) rp.transforms = ts split, _ := newSplitResponse(config.Step.Response.Split, log) @@ -130,7 +169,7 @@ func newChainResponseProcessor(config chainConfig, httpClient *httpClient, xmlDe return rp } - ts, _ := newBasicTransformsFromConfig(config.While.Response.Transforms, responseNamespace, log) + ts, _ := newBasicTransformsFromConfig(registeredTransforms, config.While.Response.Transforms, responseNamespace, log) rp.transforms = ts split, _ := newSplitResponse(config.While.Response.Split, log) @@ -221,48 +260,3 @@ func (rp *responseProcessor) startProcessing(stdCtx context.Context, trCtx *tran return ch } - -func (resp *response) asTransformables(log *logp.Logger) []transformable { - var ts []transformable - - convertAndAppend := func(m map[string]interface{}) { - tr := transformable{} - tr.setHeader(resp.header.Clone()) - tr.setURL(resp.url) - tr.setBody(mapstr.M(m).Clone()) - ts = append(ts, tr) - } - - switch tresp := resp.body.(type) { - case []interface{}: - for _, v := range tresp { - m, ok := v.(map[string]interface{}) - if !ok { - log.Debugf("events must be JSON objects, but got %T: skipping", v) - continue - } - convertAndAppend(m) - } - case map[string]interface{}: - convertAndAppend(tresp) - default: - log.Debugf("response is not a valid JSON") - } - - return ts -} - -func (resp *response) templateValues() mapstr.M { - if resp == nil { - return mapstr.M{} - } - return mapstr.M{ - "header": resp.header.Clone(), - "page": resp.page, - "url": mapstr.M{ - "value": resp.url.String(), - "params": resp.url.Query(), - }, - "body": resp.body, - } -} diff --git a/x-pack/filebeat/input/httpjson/split.go b/x-pack/filebeat/input/httpjson/split.go index fd01f0775fc..8fa892a6ce0 100644 --- a/x-pack/filebeat/input/httpjson/split.go +++ b/x-pack/filebeat/input/httpjson/split.go @@ -66,7 +66,7 @@ func newSplit(c *splitConfig, log *logp.Logger) (*split, error) { return nil, fmt.Errorf("invalid target type: %s", ti.Type) } - ts, err := newBasicTransformsFromConfig(c.Transforms, responseNamespace, log) + ts, err := newBasicTransformsFromConfig(registeredTransforms, c.Transforms, responseNamespace, log) if err != nil { return nil, err } diff --git a/x-pack/filebeat/input/httpjson/split_test.go b/x-pack/filebeat/input/httpjson/split_test.go index c8c80076970..2c4553e9df6 100644 --- a/x-pack/filebeat/input/httpjson/split_test.go +++ b/x-pack/filebeat/input/httpjson/split_test.go @@ -15,8 +15,6 @@ import ( ) func TestSplit(t *testing.T) { - registerResponseTransforms() - t.Cleanup(func() { registeredTransforms = newRegistry() }) cases := []struct { name string config *splitConfig diff --git a/x-pack/filebeat/input/httpjson/texttemplate.go b/x-pack/filebeat/input/httpjson/texttemplate.go new file mode 100644 index 00000000000..d5f2bf1a346 --- /dev/null +++ b/x-pack/filebeat/input/httpjson/texttemplate.go @@ -0,0 +1,107 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package httpjson + +import ( + "errors" + "reflect" +) + +// These functions come from Go's text/template/funcs.go (1.19). +// +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var ( + errBadComparisonType = errors.New("invalid type for comparison") + errBadComparison = errors.New("incompatible types for comparison") +) + +type kind int + +const ( + invalidKind kind = iota + boolKind + complexKind + intKind + floatKind + stringKind + uintKind +) + +func basicKind(v reflect.Value) (kind, error) { + switch v.Kind() { + case reflect.Bool: + return boolKind, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return intKind, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return uintKind, nil + case reflect.Float32, reflect.Float64: + return floatKind, nil + case reflect.Complex64, reflect.Complex128: + return complexKind, nil + case reflect.String: + return stringKind, nil + } + return invalidKind, errBadComparisonType +} + +// indirectInterface returns the concrete value in an interface value, +// or else the zero reflect.Value. +// That is, if v represents the interface value x, the result is the same as reflect.ValueOf(x): +// the fact that x was an interface value is forgotten. +func indirectInterface(v reflect.Value) reflect.Value { + if v.Kind() != reflect.Interface { + return v + } + if v.IsNil() { + return reflect.Value{} + } + return v.Elem() +} + +// lt evaluates the comparison a < b. +func lt(arg1, arg2 reflect.Value) (bool, error) { + arg1 = indirectInterface(arg1) + k1, err := basicKind(arg1) + if err != nil { + return false, err + } + arg2 = indirectInterface(arg2) + k2, err := basicKind(arg2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = arg1.Int() < 0 || uint64(arg1.Int()) < arg2.Uint() + case k1 == uintKind && k2 == intKind: + truth = arg2.Int() >= 0 && arg1.Uint() < uint64(arg2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind, complexKind: + return false, errBadComparisonType + case floatKind: + truth = arg1.Float() < arg2.Float() + case intKind: + truth = arg1.Int() < arg2.Int() + case stringKind: + truth = arg1.String() < arg2.String() + case uintKind: + truth = arg1.Uint() < arg2.Uint() + default: + panic("invalid kind") + } + } + return truth, nil +} diff --git a/x-pack/filebeat/input/httpjson/transform.go b/x-pack/filebeat/input/httpjson/transform.go index 53db9b9d45d..d4055889bf0 100644 --- a/x-pack/filebeat/input/httpjson/transform.go +++ b/x-pack/filebeat/input/httpjson/transform.go @@ -228,7 +228,7 @@ func (e maybeMsg) failed() bool { return e.err != nil } func (e maybeMsg) Error() string { return e.err.Error() } // newTransformsFromConfig creates a list of transforms from a list of free user configurations. -func newTransformsFromConfig(config transformsConfig, namespace string, log *logp.Logger) (transforms, error) { +func newTransformsFromConfig(registeredTransforms registry, config transformsConfig, namespace string, log *logp.Logger) (transforms, error) { var trans transforms for _, tfConfig := range config { if len(tfConfig.GetFields()) != 1 { @@ -246,7 +246,7 @@ func newTransformsFromConfig(config transformsConfig, namespace string, log *log constructor, found := registeredTransforms.get(namespace, actionName) if !found { - return nil, fmt.Errorf("the transform %s does not exist. Valid transforms: %s", actionName, registeredTransforms.String()) + return nil, fmt.Errorf("the transform %s does not exist. Valid transforms: %s", actionName, registeredTransforms) } common.PrintConfigDebugf(cfg, "Configure transform '%v' with:", actionName) @@ -261,8 +261,8 @@ func newTransformsFromConfig(config transformsConfig, namespace string, log *log return trans, nil } -func newBasicTransformsFromConfig(config transformsConfig, namespace string, log *logp.Logger) ([]basicTransform, error) { - ts, err := newTransformsFromConfig(config, namespace, log) +func newBasicTransformsFromConfig(registeredTransforms registry, config transformsConfig, namespace string, log *logp.Logger) ([]basicTransform, error) { + ts, err := newTransformsFromConfig(registeredTransforms, config, namespace, log) if err != nil { return nil, err } diff --git a/x-pack/filebeat/input/httpjson/transform_registry.go b/x-pack/filebeat/input/httpjson/transform_registry.go index 26a739494db..c9936c987b0 100644 --- a/x-pack/filebeat/input/httpjson/transform_registry.go +++ b/x-pack/filebeat/input/httpjson/transform_registry.go @@ -5,7 +5,6 @@ package httpjson import ( - "errors" "fmt" "strings" @@ -13,45 +12,43 @@ import ( "github.com/elastic/elastic-agent-libs/logp" ) -type constructor func(config *conf.C, log *logp.Logger) (transform, error) - -var registeredTransforms = newRegistry() +// registry is a collection of namespaced transform constructors. +// The registry is keyed on the namespace major and then on the +// transforms name. +type registry map[string]map[string]constructor -type registry struct { - namespaces map[string]map[string]constructor -} +type constructor func(config *conf.C, log *logp.Logger) (transform, error) -func newRegistry() *registry { - return ®istry{namespaces: make(map[string]map[string]constructor)} +var registeredTransforms = registry{ + requestNamespace: { + appendName: newAppendRequest, + deleteName: newDeleteRequest, + setName: newSetRequestPagination, + }, + responseNamespace: { + appendName: newAppendResponse, + deleteName: newDeleteResponse, + setName: newSetResponse, + }, + paginationNamespace: { + appendName: newAppendPagination, + deleteName: newDeletePagination, + setName: newSetRequestPagination, + }, } -func (reg *registry) register(namespace, transform string, cons constructor) error { - if cons == nil { - return errors.New("constructor can't be nil") - } - - m, found := reg.namespaces[namespace] - if !found { - reg.namespaces[namespace] = make(map[string]constructor) - m = reg.namespaces[namespace] - } - - if _, found := m[transform]; found { - return errors.New("already registered") - } - - m[transform] = cons - - return nil +func (reg registry) get(namespace, transform string) (_ constructor, ok bool) { + c, ok := reg[namespace][transform] + return c, ok } func (reg registry) String() string { - if len(reg.namespaces) == 0 { + if len(reg) == 0 { return "(empty registry)" } var str string - for namespace, m := range reg.namespaces { + for namespace, m := range reg { names := make([]string, 0, len(m)) for k := range m { names = append(names, k) @@ -61,21 +58,3 @@ func (reg registry) String() string { return str } - -func (reg registry) get(namespace, transform string) (constructor, bool) { - m, found := reg.namespaces[namespace] - if !found { - return nil, false - } - c, found := m[transform] - return c, found -} - -func registerTransform(namespace, transform string, constructor constructor) { - logp.L().Named(logName).Debugf("Register transform %s:%s", namespace, transform) - - err := registeredTransforms.register(namespace, transform, constructor) - if err != nil { - panic(err) - } -} diff --git a/x-pack/filebeat/input/httpjson/transform_test.go b/x-pack/filebeat/input/httpjson/transform_test.go index 57a337f6581..9b1535898b5 100644 --- a/x-pack/filebeat/input/httpjson/transform_test.go +++ b/x-pack/filebeat/input/httpjson/transform_test.go @@ -47,8 +47,11 @@ func TestTransformableClone(t *testing.T) { } func TestNewTransformsFromConfig(t *testing.T) { - registerTransform("test", setName, newSetRequestPagination) - t.Cleanup(func() { registeredTransforms = newRegistry() }) + registeredTransforms := registry{ + "test": { + setName: newSetRequestPagination, + }, + } cases := []struct { name string @@ -104,7 +107,7 @@ func TestNewTransformsFromConfig(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { cfg := conf.MustNewConfigFrom(tc.paramCfg) - gotTransforms, gotErr := newTransformsFromConfig(transformsConfig{cfg}, tc.paramNamespace, nil) + gotTransforms, gotErr := newTransformsFromConfig(registeredTransforms, transformsConfig{cfg}, tc.paramNamespace, nil) if tc.expectedErr == "" { assert.NoError(t, gotErr) tr := gotTransforms[0].(*set) @@ -123,14 +126,15 @@ type fakeTransform struct{} func (fakeTransform) transformName() string { return "fake" } func TestNewBasicTransformsFromConfig(t *testing.T) { - fakeConstr := func(*conf.C, *logp.Logger) (transform, error) { - return fakeTransform{}, nil + registeredTransforms := registry{ + "test": { + setName: newSetRequestPagination, + "fake": func(*conf.C, *logp.Logger) (transform, error) { + return fakeTransform{}, nil + }, + }, } - registerTransform("test", setName, newSetRequestPagination) - registerTransform("test", "fake", fakeConstr) - t.Cleanup(func() { registeredTransforms = newRegistry() }) - cases := []struct { name string paramCfg map[string]interface{} @@ -160,7 +164,7 @@ func TestNewBasicTransformsFromConfig(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { cfg := conf.MustNewConfigFrom(tc.paramCfg) - _, gotErr := newBasicTransformsFromConfig(transformsConfig{cfg}, tc.paramNamespace, nil) + _, gotErr := newBasicTransformsFromConfig(registeredTransforms, transformsConfig{cfg}, tc.paramNamespace, nil) if tc.expectedErr == "" { assert.NoError(t, gotErr) } else { diff --git a/x-pack/filebeat/input/httpjson/value_tpl.go b/x-pack/filebeat/input/httpjson/value_tpl.go index 4decfdc5c19..133271e726f 100644 --- a/x-pack/filebeat/input/httpjson/value_tpl.go +++ b/x-pack/filebeat/input/httpjson/value_tpl.go @@ -66,6 +66,8 @@ func (t *valueTpl) Unpack(in string) error { "hmacBase64": hmacStringBase64, "join": join, "toJSON": toJSON, + "max": max, + "min": min, "mul": mul, "now": now, "parseDate": parseDate, @@ -295,6 +297,32 @@ func div(a, b int64) int64 { return a / b } +func min(arg1, arg2 reflect.Value) (interface{}, error) { + lessThan, err := lt(arg1, arg2) + if err != nil { + return nil, err + } + + // arg1 is < arg2. + if lessThan { + return arg1.Interface(), nil + } + return arg2.Interface(), nil +} + +func max(arg1, arg2 reflect.Value) (interface{}, error) { + lessThan, err := lt(arg1, arg2) + if err != nil { + return nil, err + } + + // arg1 is < arg2. + if lessThan { + return arg2.Interface(), nil + } + return arg1.Interface(), nil +} + func base64Encode(values ...string) string { data := strings.Join(values, "") if data == "" { diff --git a/x-pack/filebeat/input/httpjson/value_tpl_test.go b/x-pack/filebeat/input/httpjson/value_tpl_test.go index aacbda3eede..37589cd8821 100644 --- a/x-pack/filebeat/input/httpjson/value_tpl_test.go +++ b/x-pack/filebeat/input/httpjson/value_tpl_test.go @@ -356,6 +356,76 @@ func TestValueTpl(t *testing.T) { paramTr: transformable{}, expectedVal: "4", }, + { + name: "func min int", + value: `[[min 4 1]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "1", + }, + { + name: "func max int", + value: `[[max 4 1]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "4", + }, + { + name: "func max float", + value: `[[max 1.23 4.666]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "4.666", + }, + { + name: "func min float", + value: `[[min 1.23 4.666]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "1.23", + }, + { + name: "func min string", + value: `[[min "a" "b"]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "a", + }, + { + name: "func max string", + value: `[[max "a" "b"]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "b", + }, + { + name: "func min int64 unix seconds", + value: `[[ min (now.Unix) 1689771139 ]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "1689771139", + }, + { + name: "func min int year", + value: `[[ min (now.Year) 2020 ]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "2020", + }, + { + name: "func max duration", + value: `[[ max (parseDuration "59m") (parseDuration "1h") ]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "1h0m0s", + }, + { + name: "func min int ", + value: `[[ min (now.Year) 2020 ]]`, + paramCtx: emptyTransformContext(), + paramTr: transformable{}, + expectedVal: "2020", + }, { name: "func sha1 hmac Hex", value: `[[hmac "sha1" "secret" "string1" "string2"]]`, diff --git a/x-pack/filebeat/input/internal/httplog/roundtripper.go b/x-pack/filebeat/input/internal/httplog/roundtripper.go index 2280dc73d60..820bcf449df 100644 --- a/x-pack/filebeat/input/internal/httplog/roundtripper.go +++ b/x-pack/filebeat/input/internal/httplog/roundtripper.go @@ -17,17 +17,12 @@ import ( "strconv" "time" - "github.com/rcrowley/go-metrics" "go.uber.org/atomic" "go.uber.org/zap" "go.uber.org/zap/zapcore" - - "github.com/elastic/elastic-agent-libs/monitoring" - "github.com/elastic/elastic-agent-libs/monitoring/adapter" ) var _ http.RoundTripper = (*LoggingRoundTripper)(nil) -var _ http.RoundTripper = (*MetricsRoundTripper)(nil) // TraceIDKey is key used to add a trace.id value to the context of HTTP // requests. The value will be logged by LoggingRoundTripper. @@ -212,190 +207,3 @@ func copyBody(b io.ReadCloser) (r io.ReadCloser, body []byte, err error) { } return io.NopCloser(&buf), buf.Bytes(), nil } - -// MetricsRoundTripper is an http.RoundTripper that monitors requests and responses. -type MetricsRoundTripper struct { - transport http.RoundTripper - - metrics *httpMetrics -} - -type httpMetrics struct { - reqs *monitoring.Uint // total number of requests - reqErrs *monitoring.Uint // total number of request errors - reqDelete *monitoring.Uint // number of DELETE requests - reqGet *monitoring.Uint // number of GET requests - reqHead *monitoring.Uint // number of HEAD requests - reqOptions *monitoring.Uint // number of OPTIONS requests - reqPatch *monitoring.Uint // number of PATCH requests - reqPost *monitoring.Uint // number of POST requests - reqPut *monitoring.Uint // number of PUT requests - reqsAccSize *monitoring.Uint // accumulated request body size - reqsSize metrics.Sample // histogram of the request body size - resps *monitoring.Uint // total number of responses - respErrs *monitoring.Uint // total number of response errors - resp1xx *monitoring.Uint // number of 1xx responses - resp2xx *monitoring.Uint // number of 2xx responses - resp3xx *monitoring.Uint // number of 3xx responses - resp4xx *monitoring.Uint // number of 4xx responses - resp5xx *monitoring.Uint // number of 5xx responses - respsAccSize *monitoring.Uint // accumulated response body size - respsSize metrics.Sample // histogram of the response body size - roundTripTime metrics.Sample // histogram of the round trip (request -> response) time -} - -// NewMetricsRoundTripper returns a MetricsRoundTripper that sends requests and -// responses metrics to the provided input monitoring registry. -// It will register all http related metrics into the provided registry, but it is not responsible -// for its lifecyle. -func NewMetricsRoundTripper(next http.RoundTripper, reg *monitoring.Registry) *MetricsRoundTripper { - return &MetricsRoundTripper{ - transport: next, - metrics: newHTTPMetrics(reg), - } -} - -func newHTTPMetrics(reg *monitoring.Registry) *httpMetrics { - if reg == nil { - return nil - } - - out := &httpMetrics{ - reqs: monitoring.NewUint(reg, "http_request_total"), - reqErrs: monitoring.NewUint(reg, "http_request_errors_total"), - reqDelete: monitoring.NewUint(reg, "http_request_delete_total"), - reqGet: monitoring.NewUint(reg, "http_request_get_total"), - reqHead: monitoring.NewUint(reg, "http_request_head_total"), - reqOptions: monitoring.NewUint(reg, "http_request_options_total"), - reqPatch: monitoring.NewUint(reg, "http_request_patch_total"), - reqPost: monitoring.NewUint(reg, "http_request_post_total"), - reqPut: monitoring.NewUint(reg, "http_request_put_total"), - reqsAccSize: monitoring.NewUint(reg, "http_request_body_bytes_total"), - reqsSize: metrics.NewUniformSample(1024), - resps: monitoring.NewUint(reg, "http_response_total"), - respErrs: monitoring.NewUint(reg, "http_response_errors_total"), - resp1xx: monitoring.NewUint(reg, "http_response_1xx_total"), - resp2xx: monitoring.NewUint(reg, "http_response_2xx_total"), - resp3xx: monitoring.NewUint(reg, "http_response_3xx_total"), - resp4xx: monitoring.NewUint(reg, "http_response_4xx_total"), - resp5xx: monitoring.NewUint(reg, "http_response_5xx_total"), - respsAccSize: monitoring.NewUint(reg, "http_response_body_bytes_total"), - respsSize: metrics.NewUniformSample(1024), - roundTripTime: metrics.NewUniformSample(1024), - } - - _ = adapter.GetGoMetrics(reg, "http_request_body_bytes", adapter.Accept). - GetOrRegister("histogram", metrics.NewHistogram(out.reqsSize)) - _ = adapter.GetGoMetrics(reg, "http_response_body_bytes", adapter.Accept). - GetOrRegister("histogram", metrics.NewHistogram(out.respsSize)) - _ = adapter.GetGoMetrics(reg, "http_round_trip_time", adapter.Accept). - GetOrRegister("histogram", metrics.NewHistogram(out.roundTripTime)) - - return out -} - -// RoundTrip implements the http.RoundTripper interface, sending -// request and response metrics to the underlying registry. -// -// http_request_total -// http_request_errors_total -// http_request_delete_total -// http_request_get_total -// http_request_head_total -// http_request_options_total -// http_request_patch_total -// http_request_post_total -// http_request_put_total -// http_request_body_bytes_total -// http_request_body_bytes -// http_response_total -// http_response_errors_total -// http_response_1xx_total -// http_response_2xx_total -// http_response_3xx_total -// http_response_4xx_total -// http_response_5xx_total -// http_response_body_bytes_total -// http_response_body_bytes -// http_round_trip_time -func (rt *MetricsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - if rt.metrics == nil { - return rt.transport.RoundTrip(req) - } - - rt.metrics.reqs.Add(1) - - rt.monitorByMethod(req.Method) - - var ( - body []byte - err error - ) - - req.Body, body, err = copyBody(req.Body) - if err != nil { - rt.metrics.reqErrs.Add(1) - } else { - rt.metrics.reqsAccSize.Add(uint64(len(body))) - rt.metrics.reqsSize.Update(int64(len(body))) - } - - reqStart := time.Now() - resp, err := rt.transport.RoundTrip(req) - rt.metrics.roundTripTime.Update(time.Since(reqStart).Nanoseconds()) - - if resp != nil { - rt.metrics.resps.Add(1) - } - - if resp == nil || err != nil { - rt.metrics.respErrs.Add(1) - return resp, err - } - - rt.monitorByStatusCode(resp.StatusCode) - - resp.Body, body, err = copyBody(resp.Body) - if err != nil { - rt.metrics.respErrs.Add(1) - } else { - rt.metrics.respsAccSize.Add(uint64(len(body))) - rt.metrics.respsSize.Update(int64(len(body))) - } - - return resp, err -} - -func (rt *MetricsRoundTripper) monitorByMethod(method string) { - switch method { - case http.MethodDelete: - rt.metrics.reqDelete.Add(1) - case http.MethodGet: - rt.metrics.reqGet.Add(1) - case http.MethodHead: - rt.metrics.reqHead.Add(1) - case http.MethodOptions: - rt.metrics.reqOptions.Add(1) - case http.MethodPatch: - rt.metrics.reqPatch.Add(1) - case http.MethodPost: - rt.metrics.reqPost.Add(1) - case http.MethodPut: - rt.metrics.reqPut.Add(1) - } -} - -func (rt *MetricsRoundTripper) monitorByStatusCode(code int) { - switch code / 100 { - case 1: - rt.metrics.resp1xx.Add(1) - case 2: - rt.metrics.resp2xx.Add(1) - case 3: - rt.metrics.resp3xx.Add(1) - case 4: - rt.metrics.resp4xx.Add(1) - case 5: - rt.metrics.resp5xx.Add(1) - } -} diff --git a/x-pack/filebeat/input/internal/httpmon/roundtripper.go b/x-pack/filebeat/input/internal/httpmon/roundtripper.go new file mode 100644 index 00000000000..2c01146c69a --- /dev/null +++ b/x-pack/filebeat/input/internal/httpmon/roundtripper.go @@ -0,0 +1,194 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +// Package httpmon provides http request and response metric monitoring. +package httpmon + +import ( + "net/http" + "time" + + "github.com/rcrowley/go-metrics" + + "github.com/elastic/elastic-agent-libs/monitoring" + "github.com/elastic/elastic-agent-libs/monitoring/adapter" +) + +var _ http.RoundTripper = (*MetricsRoundTripper)(nil) + +// MetricsRoundTripper is an http.RoundTripper that monitors requests and responses. +type MetricsRoundTripper struct { + transport http.RoundTripper + + metrics *httpMetrics +} + +type httpMetrics struct { + reqs *monitoring.Uint // total number of requests + reqErrs *monitoring.Uint // total number of request errors + reqDelete *monitoring.Uint // number of DELETE requests + reqGet *monitoring.Uint // number of GET requests + reqHead *monitoring.Uint // number of HEAD requests + reqOptions *monitoring.Uint // number of OPTIONS requests + reqPatch *monitoring.Uint // number of PATCH requests + reqPost *monitoring.Uint // number of POST requests + reqPut *monitoring.Uint // number of PUT requests + reqsAccSize *monitoring.Uint // accumulated request body size + reqsSize metrics.Sample // histogram of the request body size + resps *monitoring.Uint // total number of responses + respErrs *monitoring.Uint // total number of response errors + resp1xx *monitoring.Uint // number of 1xx responses + resp2xx *monitoring.Uint // number of 2xx responses + resp3xx *monitoring.Uint // number of 3xx responses + resp4xx *monitoring.Uint // number of 4xx responses + resp5xx *monitoring.Uint // number of 5xx responses + respsAccSize *monitoring.Uint // accumulated response body size + respsSize metrics.Sample // histogram of the response body size + roundTripTime metrics.Sample // histogram of the round trip (request -> response) time +} + +// NewMetricsRoundTripper returns a MetricsRoundTripper that sends requests and +// responses metrics to the provided input monitoring registry. +// It will register all http related metrics into the provided registry, but it is not responsible +// for its lifecyle. +func NewMetricsRoundTripper(next http.RoundTripper, reg *monitoring.Registry) *MetricsRoundTripper { + return &MetricsRoundTripper{ + transport: next, + metrics: newHTTPMetrics(reg), + } +} + +func newHTTPMetrics(reg *monitoring.Registry) *httpMetrics { + if reg == nil { + return nil + } + + out := &httpMetrics{ + reqs: monitoring.NewUint(reg, "http_request_total"), + reqErrs: monitoring.NewUint(reg, "http_request_errors_total"), + reqDelete: monitoring.NewUint(reg, "http_request_delete_total"), + reqGet: monitoring.NewUint(reg, "http_request_get_total"), + reqHead: monitoring.NewUint(reg, "http_request_head_total"), + reqOptions: monitoring.NewUint(reg, "http_request_options_total"), + reqPatch: monitoring.NewUint(reg, "http_request_patch_total"), + reqPost: monitoring.NewUint(reg, "http_request_post_total"), + reqPut: monitoring.NewUint(reg, "http_request_put_total"), + reqsAccSize: monitoring.NewUint(reg, "http_request_body_bytes_total"), + reqsSize: metrics.NewUniformSample(1024), + resps: monitoring.NewUint(reg, "http_response_total"), + respErrs: monitoring.NewUint(reg, "http_response_errors_total"), + resp1xx: monitoring.NewUint(reg, "http_response_1xx_total"), + resp2xx: monitoring.NewUint(reg, "http_response_2xx_total"), + resp3xx: monitoring.NewUint(reg, "http_response_3xx_total"), + resp4xx: monitoring.NewUint(reg, "http_response_4xx_total"), + resp5xx: monitoring.NewUint(reg, "http_response_5xx_total"), + respsAccSize: monitoring.NewUint(reg, "http_response_body_bytes_total"), + respsSize: metrics.NewUniformSample(1024), + roundTripTime: metrics.NewUniformSample(1024), + } + + _ = adapter.GetGoMetrics(reg, "http_request_body_bytes", adapter.Accept). + GetOrRegister("histogram", metrics.NewHistogram(out.reqsSize)) + _ = adapter.GetGoMetrics(reg, "http_response_body_bytes", adapter.Accept). + GetOrRegister("histogram", metrics.NewHistogram(out.respsSize)) + _ = adapter.GetGoMetrics(reg, "http_round_trip_time", adapter.Accept). + GetOrRegister("histogram", metrics.NewHistogram(out.roundTripTime)) + + return out +} + +// RoundTrip implements the http.RoundTripper interface, sending +// request and response metrics to the underlying registry. +// +// http_request_total +// http_request_errors_total +// http_request_delete_total +// http_request_get_total +// http_request_head_total +// http_request_options_total +// http_request_patch_total +// http_request_post_total +// http_request_put_total +// http_request_body_bytes_total +// http_request_body_bytes +// http_response_total +// http_response_errors_total +// http_response_1xx_total +// http_response_2xx_total +// http_response_3xx_total +// http_response_4xx_total +// http_response_5xx_total +// http_response_body_bytes_total +// http_response_body_bytes +// http_round_trip_time +func (rt *MetricsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if rt.metrics == nil { + return rt.transport.RoundTrip(req) + } + + rt.metrics.reqs.Add(1) + + rt.monitorByMethod(req.Method) + + if req.ContentLength >= 0 { + rt.metrics.reqsAccSize.Add(uint64(req.ContentLength)) + rt.metrics.reqsSize.Update(req.ContentLength) + } + + reqStart := time.Now() + resp, err := rt.transport.RoundTrip(req) + rt.metrics.roundTripTime.Update(time.Since(reqStart).Nanoseconds()) + + if resp != nil { + rt.metrics.resps.Add(1) + } + + if resp == nil || err != nil { + rt.metrics.respErrs.Add(1) + return resp, err + } + + rt.monitorByStatusCode(resp.StatusCode) + + if resp.ContentLength >= 0 { + rt.metrics.respsAccSize.Add(uint64(resp.ContentLength)) + rt.metrics.respsSize.Update(resp.ContentLength) + } + + return resp, err +} + +func (rt *MetricsRoundTripper) monitorByMethod(method string) { + switch method { + case http.MethodDelete: + rt.metrics.reqDelete.Add(1) + case http.MethodGet: + rt.metrics.reqGet.Add(1) + case http.MethodHead: + rt.metrics.reqHead.Add(1) + case http.MethodOptions: + rt.metrics.reqOptions.Add(1) + case http.MethodPatch: + rt.metrics.reqPatch.Add(1) + case http.MethodPost: + rt.metrics.reqPost.Add(1) + case http.MethodPut: + rt.metrics.reqPut.Add(1) + } +} + +func (rt *MetricsRoundTripper) monitorByStatusCode(code int) { + switch code / 100 { + case 1: + rt.metrics.resp1xx.Add(1) + case 2: + rt.metrics.resp2xx.Add(1) + case 3: + rt.metrics.resp3xx.Add(1) + case 4: + rt.metrics.resp4xx.Add(1) + case 5: + rt.metrics.resp5xx.Add(1) + } +} diff --git a/x-pack/filebeat/input/netflow/decoder/decoder.go b/x-pack/filebeat/input/netflow/decoder/decoder.go index 993c373c881..0e1ef3df92c 100644 --- a/x-pack/filebeat/input/netflow/decoder/decoder.go +++ b/x-pack/filebeat/input/netflow/decoder/decoder.go @@ -7,14 +7,13 @@ package decoder import ( "bytes" "encoding/binary" + "errors" "fmt" "io" "log" "net" "sync" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/config" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/protocol" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/record" @@ -59,7 +58,7 @@ func (p *Decoder) Start() error { for _, proto := range p.protos { if err := proto.Start(); err != nil { p.stop() - return errors.Wrapf(err, "failed to start protocol version %d", proto.Version()) + return fmt.Errorf("failed to start protocol version %d: %w", proto.Version(), err) } } p.started = true diff --git a/x-pack/filebeat/input/netflow/decoder/v1/v1.go b/x-pack/filebeat/input/netflow/decoder/v1/v1.go index 8d9008c9393..e023341c4ad 100644 --- a/x-pack/filebeat/input/netflow/decoder/v1/v1.go +++ b/x-pack/filebeat/input/netflow/decoder/v1/v1.go @@ -7,13 +7,12 @@ package v1 import ( "bytes" "encoding/binary" + "fmt" "io" "log" "net" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/config" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/fields" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/protocol" @@ -92,11 +91,11 @@ func (p *NetflowProtocol) OnPacket(buf *bytes.Buffer, source net.Addr) (flows [] numFlows, timestamp, metadata, err := p.readHeader(buf, source) if err != nil { p.logger.Printf("Failed parsing packet: %v", err) - return nil, errors.Wrap(err, "error reading netflow header") + return nil, fmt.Errorf("error reading netflow header: %w", err) } flows, err = p.flowTemplate.Apply(buf, numFlows) if err != nil { - return nil, errors.Wrap(err, "error parsing flows") + return nil, fmt.Errorf("error parsing flows: %w", err) } for i := range flows { flows[i].Exporter = metadata diff --git a/x-pack/filebeat/input/netflow/decoder/v8/v8.go b/x-pack/filebeat/input/netflow/decoder/v8/v8.go index 855b8d3c914..9fa88ea1c68 100644 --- a/x-pack/filebeat/input/netflow/decoder/v8/v8.go +++ b/x-pack/filebeat/input/netflow/decoder/v8/v8.go @@ -13,8 +13,6 @@ import ( "net" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/config" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/fields" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/protocol" @@ -323,7 +321,7 @@ func (p *NetflowV8Protocol) OnPacket(buf *bytes.Buffer, source net.Addr) (flows header, err := ReadPacketHeader(buf) if err != nil { p.logger.Printf("Failed parsing packet: %v", err) - return nil, errors.Wrap(err, "error reading V8 header") + return nil, fmt.Errorf("error reading V8 header: %w", err) } template, found := templates[header.Aggregation] if !found { @@ -333,7 +331,7 @@ func (p *NetflowV8Protocol) OnPacket(buf *bytes.Buffer, source net.Addr) (flows metadata := header.GetMetadata(source) flows, err = template.Apply(buf, int(header.Count)) if err != nil { - return nil, errors.Wrapf(err, "unable to decode V8 flows of type %d", header.Aggregation) + return nil, fmt.Errorf("unable to decode V8 flows of type %d: %w", header.Aggregation, err) } for i := range flows { flows[i].Exporter = metadata diff --git a/x-pack/filebeat/input/netflow/decoder/v9/v9.go b/x-pack/filebeat/input/netflow/decoder/v9/v9.go index e70bda4ab3b..fdb46076c87 100644 --- a/x-pack/filebeat/input/netflow/decoder/v9/v9.go +++ b/x-pack/filebeat/input/netflow/decoder/v9/v9.go @@ -6,12 +6,11 @@ package v9 import ( "bytes" + "fmt" "log" "net" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/config" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/protocol" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/record" @@ -76,7 +75,7 @@ func (p *NetflowV9Protocol) OnPacket(buf *bytes.Buffer, source net.Addr) (flows header, payload, numFlowSets, err := p.decoder.ReadPacketHeader(buf) if err != nil { p.logger.Printf("Unable to read V9 header: %v", err) - return nil, errors.Wrapf(err, "error reading header") + return nil, fmt.Errorf("error reading header: %w", err) } buf = payload @@ -105,7 +104,7 @@ func (p *NetflowV9Protocol) OnPacket(buf *bytes.Buffer, source net.Addr) (flows f, err := p.parseSet(set.SetID, session, body) if err != nil { p.logger.Printf("Error parsing set %d: %v", set.SetID, err) - return nil, errors.Wrapf(err, "error parsing set") + return nil, fmt.Errorf("error parsing set: %w", err) } flows = append(flows, f...) } diff --git a/x-pack/filebeat/input/netflow/definitions.go b/x-pack/filebeat/input/netflow/definitions.go index 267abef5a92..62e6dc3f1b0 100644 --- a/x-pack/filebeat/input/netflow/definitions.go +++ b/x-pack/filebeat/input/netflow/definitions.go @@ -5,13 +5,13 @@ package netflow import ( + "errors" "fmt" "io/ioutil" "math" "os" "strconv" - "github.com/pkg/errors" "gopkg.in/yaml.v2" "github.com/elastic/beats/v7/x-pack/filebeat/input/netflow/decoder/fields" @@ -64,7 +64,7 @@ func LoadFieldDefinitions(yaml interface{}) (defs fields.FieldDict, err error) { defs = fields.FieldDict{} if !isIPFIX { if err := loadFields(tree, 0, defs); err != nil { - return nil, errors.Wrap(err, "failed to load NetFlow fields") + return nil, fmt.Errorf("failed to load NetFlow fields: %w", err) } return defs, nil } @@ -81,7 +81,7 @@ func LoadFieldDefinitions(yaml interface{}) (defs fields.FieldDict, err error) { return nil, fmt.Errorf("IPFIX fields for pem=%d malformed", pem) } if err := loadFields(tree, uint32(pem), defs); err != nil { - return nil, errors.Wrapf(err, "failed to load IPFIX fields for pem=%d", pem) + return nil, fmt.Errorf("failed to load IPFIX fields for pem=%d: %w", pem, err) } } return defs, nil @@ -101,7 +101,7 @@ func LoadFieldDefinitionsFromFile(path string) (defs fields.FieldDict, err error } var tree interface{} if err := yaml.Unmarshal(contents, &tree); err != nil { - return nil, errors.Wrap(err, "unable to parse YAML") + return nil, fmt.Errorf("unable to parse YAML: %w", err) } return LoadFieldDefinitions(tree) } diff --git a/x-pack/filebeat/input/netflow/input.go b/x-pack/filebeat/input/netflow/input.go index 16aa958396d..97f9931f325 100644 --- a/x-pack/filebeat/input/netflow/input.go +++ b/x-pack/filebeat/input/netflow/input.go @@ -6,12 +6,11 @@ package netflow import ( "bytes" + "fmt" "net" "sync" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/filebeat/channel" "github.com/elastic/beats/v7/filebeat/harvester" "github.com/elastic/beats/v7/filebeat/input" @@ -108,7 +107,7 @@ func NewInput( for _, yamlPath := range config.CustomDefinitions { f, err := LoadFieldDefinitionsFromFile(yamlPath) if err != nil { - return nil, errors.Wrapf(err, "failed parsing custom field definitions from file '%s'", yamlPath) + return nil, fmt.Errorf("failed parsing custom field definitions from file '%s': %w", yamlPath, err) } customFields = append(customFields, f) } @@ -120,7 +119,7 @@ func NewInput( WithSequenceResetEnabled(config.DetectSequenceReset). WithSharedTemplates(config.ShareTemplates)) if err != nil { - return nil, errors.Wrapf(err, "error initializing netflow decoder") + return nil, fmt.Errorf("error initializing netflow decoder: %w", err) } input := &netflowInput{ diff --git a/x-pack/filebeat/input/o365audit/auth/auth.go b/x-pack/filebeat/input/o365audit/auth/auth.go index 69899e34031..6b0fea75c12 100644 --- a/x-pack/filebeat/input/o365audit/auth/auth.go +++ b/x-pack/filebeat/input/o365audit/auth/auth.go @@ -5,8 +5,9 @@ package auth import ( + "fmt" + "github.com/Azure/go-autorest/autorest/adal" - "github.com/pkg/errors" ) // TokenProvider is the interface that wraps an authentication mechanism and @@ -28,7 +29,7 @@ type servicePrincipalToken adal.ServicePrincipalToken func (provider *servicePrincipalToken) Token() (string, error) { inner := (*adal.ServicePrincipalToken)(provider) if err := inner.EnsureFresh(); err != nil { - return "", errors.Wrap(err, "refreshing spt token") + return "", fmt.Errorf("refreshing spt token: %w", err) } token := inner.Token() return token.OAuthToken(), nil diff --git a/x-pack/filebeat/input/o365audit/auth/cert.go b/x-pack/filebeat/input/o365audit/auth/cert.go index 1d0dc9f7526..f4912e0afc4 100644 --- a/x-pack/filebeat/input/o365audit/auth/cert.go +++ b/x-pack/filebeat/input/o365audit/auth/cert.go @@ -10,7 +10,6 @@ import ( "fmt" "github.com/Azure/go-autorest/autorest/adal" - "github.com/pkg/errors" "github.com/elastic/elastic-agent-libs/transport/tlscommon" ) @@ -22,11 +21,11 @@ func NewProviderFromCertificate( conf tlscommon.CertificateConfig) (sptp TokenProvider, err error) { cert, privKey, err := loadConfigCerts(conf) if err != nil { - return nil, errors.Wrap(err, "failed loading certificates") + return nil, fmt.Errorf("failed loading certificates: %w", err) } oauth, err := adal.NewOAuthConfig(endpoint, tenantID) if err != nil { - return nil, errors.Wrap(err, "error generating OAuthConfig") + return nil, fmt.Errorf("error generating OAuthConfig: %w", err) } spt, err := adal.NewServicePrincipalTokenFromCertificate( @@ -46,14 +45,14 @@ func NewProviderFromCertificate( func loadConfigCerts(cfg tlscommon.CertificateConfig) (cert *x509.Certificate, key *rsa.PrivateKey, err error) { tlsCert, err := tlscommon.LoadCertificate(&cfg) if err != nil { - return nil, nil, errors.Wrapf(err, "error loading X509 certificate from '%s'", cfg.Certificate) + return nil, nil, fmt.Errorf("error loading X509 certificate from '%s': %w", cfg.Certificate, err) } if tlsCert == nil || len(tlsCert.Certificate) == 0 { return nil, nil, fmt.Errorf("no certificates loaded from '%s'", cfg.Certificate) } cert, err = x509.ParseCertificate(tlsCert.Certificate[0]) if err != nil { - return nil, nil, errors.Wrapf(err, "error parsing X509 certificate from '%s'", cfg.Certificate) + return nil, nil, fmt.Errorf("error parsing X509 certificate from '%s': %w", cfg.Certificate, err) } if tlsCert.PrivateKey == nil { return nil, nil, fmt.Errorf("failed loading private key from '%s'", cfg.Key) diff --git a/x-pack/filebeat/input/o365audit/auth/secret.go b/x-pack/filebeat/input/o365audit/auth/secret.go index c34d6d48cc6..98b5c9dbfda 100644 --- a/x-pack/filebeat/input/o365audit/auth/secret.go +++ b/x-pack/filebeat/input/o365audit/auth/secret.go @@ -5,8 +5,9 @@ package auth import ( + "fmt" + "github.com/Azure/go-autorest/autorest/adal" - "github.com/pkg/errors" ) // NewProviderFromClientSecret returns a token provider that uses a secret @@ -14,7 +15,7 @@ import ( func NewProviderFromClientSecret(endpoint, resource, applicationID, tenantID, secret string) (p TokenProvider, err error) { oauth, err := adal.NewOAuthConfig(endpoint, tenantID) if err != nil { - return nil, errors.Wrap(err, "error generating OAuthConfig") + return nil, fmt.Errorf("error generating OAuthConfig: %w", err) } spt, err := adal.NewServicePrincipalToken(*oauth, applicationID, secret, resource) if err != nil { diff --git a/x-pack/filebeat/input/o365audit/config.go b/x-pack/filebeat/input/o365audit/config.go index d6178e9cbcc..dd419c54679 100644 --- a/x-pack/filebeat/input/o365audit/config.go +++ b/x-pack/filebeat/input/o365audit/config.go @@ -5,12 +5,11 @@ package o365audit import ( + "errors" "fmt" "net/url" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit/auth" "github.com/elastic/elastic-agent-libs/transport/tlscommon" ) @@ -147,16 +146,16 @@ func (c *Config) Validate() (err error) { } if hasCert { if err = c.CertificateConfig.Validate(); err != nil { - return errors.Wrap(err, "invalid certificate config") + return fmt.Errorf("invalid certificate config: %w", err) } } c.API.Resource, err = forceURLScheme(c.API.Resource, "https") if err != nil { - return errors.Wrapf(err, "resource '%s' is not a valid URL", c.API.Resource) + return fmt.Errorf("resource '%s' is not a valid URL: %w", c.API.Resource, err) } c.API.AuthenticationEndpoint, err = forceURLScheme(c.API.AuthenticationEndpoint, "https") if err != nil { - return errors.Wrapf(err, "authentication_endpoint '%s' is not a valid URL", c.API.AuthenticationEndpoint) + return fmt.Errorf("authentication_endpoint '%s' is not a valid URL: %w", c.API.AuthenticationEndpoint, err) } return nil } diff --git a/x-pack/filebeat/input/o365audit/contentblob.go b/x-pack/filebeat/input/o365audit/contentblob.go index 598ca5f8b9a..55283aaa39c 100644 --- a/x-pack/filebeat/input/o365audit/contentblob.go +++ b/x-pack/filebeat/input/o365audit/contentblob.go @@ -6,12 +6,12 @@ package o365audit import ( "encoding/json" + "errors" "fmt" "net/http" "time" "github.com/Azure/go-autorest/autorest" - "github.com/pkg/errors" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit/poll" "github.com/elastic/elastic-agent-libs/mapstr" @@ -53,13 +53,13 @@ func (c contentBlob) OnResponse(response *http.Response) (actions []poll.Action) } var raws []json.RawMessage if err := readJSONBody(response, &raws); err != nil { - return append(actions, poll.Terminate(errors.Wrap(err, "reading body failed"))) + return append(actions, poll.Terminate(fmt.Errorf("reading body failed: %w", err))) } entries := make([]mapstr.M, len(raws)) for idx, raw := range raws { var entry mapstr.M if err := json.Unmarshal(raw, &entry); err != nil { - return append(actions, poll.Terminate(errors.Wrap(err, "decoding json failed"))) + return append(actions, poll.Terminate(fmt.Errorf("decoding json failed: %w", err))) } entries[idx] = entry id, _ := getString(entry, "Id") diff --git a/x-pack/filebeat/input/o365audit/contentblob_test.go b/x-pack/filebeat/input/o365audit/contentblob_test.go index 223c2aa971a..1a71595d7e9 100644 --- a/x-pack/filebeat/input/o365audit/contentblob_test.go +++ b/x-pack/filebeat/input/o365audit/contentblob_test.go @@ -5,10 +5,10 @@ package o365audit import ( + "errors" "testing" "time" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/elastic/beats/v7/libbeat/beat" diff --git a/x-pack/filebeat/input/o365audit/dates.go b/x-pack/filebeat/input/o365audit/dates.go index ff6eb5db989..6e6c99c80ec 100644 --- a/x-pack/filebeat/input/o365audit/dates.go +++ b/x-pack/filebeat/input/o365audit/dates.go @@ -5,11 +5,10 @@ package o365audit import ( + "errors" "fmt" "time" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/mapstr" ) diff --git a/x-pack/filebeat/input/o365audit/input.go b/x-pack/filebeat/input/o365audit/input.go index cf92f1a4f46..3793ce43d6a 100644 --- a/x-pack/filebeat/input/o365audit/input.go +++ b/x-pack/filebeat/input/o365audit/input.go @@ -7,11 +7,11 @@ package o365audit import ( "context" "encoding/json" + "fmt" "time" "github.com/Azure/go-autorest/autorest" "github.com/joeshaw/multierror" - "github.com/pkg/errors" v2 "github.com/elastic/beats/v7/filebeat/input/v2" cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" @@ -70,7 +70,7 @@ func Plugin(log *logp.Logger, store cursor.StateStore) v2.Plugin { func configure(cfg *conf.C) ([]cursor.Source, cursor.Input, error) { config := defaultConfig() if err := cfg.Unpack(&config); err != nil { - return nil, nil, errors.Wrap(err, "reading config") + return nil, nil, fmt.Errorf("reading config: %w", err) } var sources []cursor.Source @@ -100,7 +100,7 @@ func (inp *o365input) Test(src cursor.Source, ctx v2.TestContext) error { } if _, err := auth.Token(); err != nil { - return errors.Wrapf(err, "unable to acquire authentication token for tenant:%s", tenantID) + return fmt.Errorf("unable to acquire authentication token for tenant:%s: %w", tenantID, err) } return nil @@ -150,7 +150,7 @@ func (inp *o365input) runOnce( } if _, err := tokenProvider.Token(); err != nil { - return errors.Wrapf(err, "unable to acquire authentication token for tenant:%s", stream.tenantID) + return fmt.Errorf("unable to acquire authentication token for tenant:%s: %w", stream.tenantID, err) } config := &inp.config @@ -171,7 +171,7 @@ func (inp *o365input) runOnce( ), ) if err != nil { - return errors.Wrap(err, "failed to create API poller") + return fmt.Errorf("failed to create API poller: %w", err) } start := initCheckpoint(log, cursor, config.API.MaxRetention) @@ -243,7 +243,7 @@ func (env apiEnvironment) toBeatEvent(raw json.RawMessage, doc mapstr.M) beat.Ev ts, err := getDateKey(doc, "CreationTime", apiDateFormats) if err != nil { ts = time.Now() - errs = append(errs, errors.Wrap(err, "failed parsing CreationTime")) + errs = append(errs, fmt.Errorf("failed parsing CreationTime: %w", err)) } b := beat.Event{ Timestamp: ts, diff --git a/x-pack/filebeat/input/o365audit/listblobs.go b/x-pack/filebeat/input/o365audit/listblobs.go index ebdbddf79f6..58437b9f614 100644 --- a/x-pack/filebeat/input/o365audit/listblobs.go +++ b/x-pack/filebeat/input/o365audit/listblobs.go @@ -6,6 +6,7 @@ package o365audit import ( "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" @@ -13,7 +14,6 @@ import ( "time" "github.com/Azure/go-autorest/autorest" - "github.com/pkg/errors" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit/poll" ) @@ -280,10 +280,10 @@ func readJSONBody(response *http.Response, dest interface{}) error { autorest.ByClosing()) body, err := ioutil.ReadAll(response.Body) if err != nil { - return errors.Wrap(err, "reading body failed") + return fmt.Errorf("reading body failed: %w", err) } if err = json.Unmarshal(body, dest); err != nil { - return errors.Wrap(err, "decoding json failed") + return fmt.Errorf("decoding json failed: %w", err) } return nil } diff --git a/x-pack/filebeat/input/o365audit/poll/poll.go b/x-pack/filebeat/input/o365audit/poll/poll.go index d32ea4ec135..3f616d433b3 100644 --- a/x-pack/filebeat/input/o365audit/poll/poll.go +++ b/x-pack/filebeat/input/o365audit/poll/poll.go @@ -6,12 +6,12 @@ package poll import ( "context" + "errors" "fmt" "net/http" "time" "github.com/Azure/go-autorest/autorest" - "github.com/pkg/errors" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit/auth" "github.com/elastic/elastic-agent-libs/logp" @@ -90,14 +90,14 @@ func (r *Poller) fetchWithDelay(item Transaction, minDelay time.Duration) error if r.tp != nil { token, err := r.tp.Token() if err != nil { - return errors.Wrap(err, "failed getting a token") + return fmt.Errorf("failed getting a token: %w", err) } decorators = append(decorators, autorest.WithBearerAuthorization(token)) } request, err := autorest.Prepare(&http.Request{}, decorators...) if err != nil { - return errors.Wrap(err, "failed preparing request") + return fmt.Errorf("failed preparing request: %w", err) } delay := max(item.Delay(), minDelay) r.log.Debugf(" -- wait %s for %s", delay, request.URL.String()) @@ -115,7 +115,7 @@ func (r *Poller) fetchWithDelay(item Transaction, minDelay time.Duration) error for _, act := range acts { if err = act(r); err != nil { - return errors.Wrapf(err, "error acting on %+v", act) + return fmt.Errorf("error acting on %+v: %w", act, err) } } @@ -242,7 +242,7 @@ func Terminate(err error) Action { if err == nil { return errors.New("polling terminated without a specific error") } - return errors.Wrap(err, "polling terminated due to error") + return fmt.Errorf("polling terminated due to error: %w", err) } } diff --git a/x-pack/filebeat/module/cisco/shared/gen-ecs-mapping-docs.go b/x-pack/filebeat/module/cisco/shared/gen-ecs-mapping-docs.go index 929a2b9dfb9..f4f6ccb34b5 100644 --- a/x-pack/filebeat/module/cisco/shared/gen-ecs-mapping-docs.go +++ b/x-pack/filebeat/module/cisco/shared/gen-ecs-mapping-docs.go @@ -8,13 +8,12 @@ package main import ( "encoding/csv" + "errors" "flag" "fmt" "io" "os" "sort" - - "github.com/pkg/errors" ) var outputFile = flag.String("output", "ftd-ecs-mappings.asciidoc", "Output file") @@ -114,7 +113,7 @@ func loadMappings(reader io.Reader) (m idMappings, err error) { break } if err != nil { - return m, errors.Wrapf(err, "failed reading line %d", lineNum) + return m, fmt.Errorf("failed reading line %d: %w", lineNum, err) } if len(record) < 3 { return m, fmt.Errorf("line %d has unexpected number of columns: %d", lineNum, len(record)) diff --git a/x-pack/filebeat/module/cisco/shared/gen-ftd-ecs-mapping.go b/x-pack/filebeat/module/cisco/shared/gen-ftd-ecs-mapping.go index 6ad9a255212..8ce78bbf1df 100644 --- a/x-pack/filebeat/module/cisco/shared/gen-ftd-ecs-mapping.go +++ b/x-pack/filebeat/module/cisco/shared/gen-ftd-ecs-mapping.go @@ -8,6 +8,7 @@ package main import ( "encoding/csv" + "errors" "flag" "fmt" "io" @@ -16,8 +17,6 @@ import ( "unicode" "gopkg.in/yaml.v2" - - "github.com/pkg/errors" ) var ( @@ -142,7 +141,7 @@ func generate() error { content = append(content, end...) n, err := outHandle.Write(content) if err != nil { - return errors.Wrap(err, "failed writing output file") + return fmt.Errorf("failed writing output file: %w", err) } if n != len(content) { return fmt.Errorf("short write on output file. expected=%d, written=%d", len(content), n) @@ -160,7 +159,7 @@ func loadMappings(reader io.Reader) (m mappings, err error) { break } if err != nil { - return m, errors.Wrapf(err, "failed reading line %d", lineNum) + return m, fmt.Errorf("failed reading line %d: %w", lineNum, err) } if len(record) < 3 { return m, fmt.Errorf("line %d has unexpected number of columns: %d", lineNum, len(record)) diff --git a/x-pack/filebeat/module/cisco/shared/ingest/asa-ftd-pipeline.yml b/x-pack/filebeat/module/cisco/shared/ingest/asa-ftd-pipeline.yml index bded54f9f57..551fa190985 100644 --- a/x-pack/filebeat/module/cisco/shared/ingest/asa-ftd-pipeline.yml +++ b/x-pack/filebeat/module/cisco/shared/ingest/asa-ftd-pipeline.yml @@ -293,7 +293,7 @@ processors: patterns: - ^%{NOTSPACE:event.outcome} ((protocol %{POSINT:network.iana_number})|%{NOTSPACE:network.transport}) src %{NOTCOLON:_temp_.cisco.source_interface}:%{IPORHOST:source.address}(/%{POSINT:source.port})?\s*(\(%{CISCO_USER:_temp_.cisco.source_username}\) )?dst %{NOTCOLON:_temp_.cisco.destination_interface}:%{IPORHOST:destination.address}(/%{POSINT:destination.port})?%{DATA}by access-group "%{NOTSPACE:_temp_.cisco.list_id}" pattern_definitions: - HOSTNAME: "\\b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\\.?|\\b)" + HOSTNAME: '\b(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62}))*(\.?|\b)' IPORHOST: "(?:%{IP}|%{HOSTNAME})" NOTCOLON: "[^:]*" CISCO_USER: ((LOCAL\\)?(%{HOSTNAME}\\)?%{USERNAME}(@%{HOSTNAME})?(, *%{NUMBER})?) @@ -359,7 +359,7 @@ processors: patterns: - Built %{NOTSPACE:network.direction} %{NOTSPACE:network.transport} connection %{NUMBER:_temp_.cisco.connection_id} for %{NOTCOLON:_temp_.cisco.source_interface}:%{IPORHOST:source.address}/%{NUMBER:source.port} \(%{IPORHOST:_temp_.natsrcip}/%{NUMBER:_temp_.cisco.mapped_source_port}\)(\(%{CISCO_USER:_temp_.cisco.source_username}\))? to %{NOTCOLON:_temp_.cisco.destination_interface}:%{NOTSPACE:destination.address}/%{NUMBER:destination.port} \(%{NOTSPACE:_temp_.natdstip}/%{NUMBER:_temp_.cisco.mapped_destination_port}\)(\(%{CISCO_USER:_temp_.cisco.destination_username}\))?( \(%{CISCO_USER:_temp_.cisco.termination_user}\))?%{GREEDYDATA} pattern_definitions: - HOSTNAME: "\\b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\\.?|\\b)" + HOSTNAME: '\b(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62}))*(\.?|\b)' IPORHOST: "(?:%{IP}|%{HOSTNAME})" NOTCOLON: "[^:]*" CISCO_USER: ((LOCAL\\)?(%{HOSTNAME}\\)?%{USERNAME}(@%{HOSTNAME})?(, *%{NUMBER})?) @@ -376,7 +376,7 @@ processors: - Teardown %{DATA} %{NOTSPACE:network.transport} translation from %{NOTCOLON:_temp_.cisco.source_interface}:%{IPORHOST:source.address}/%{NUMBER:source.port}(\s*\(%{CISCO_USER:_temp_.cisco.source_username}\))? to %{NOTCOLON:_temp_.cisco.destination_interface}:%{IP:destination.address}/%{NUMBER:destination.port} duration %{DURATION:_temp_.duration_hms} pattern_definitions: NOTCOLON: "[^:]*" - HOSTNAME: "\\b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\\.?|\\b)" + HOSTNAME: '\b(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62}))*(\.?|\b)' IPORHOST: "(?:%{IP}|%{HOSTNAME})" CISCO_USER: ((LOCAL\\)?(%{HOSTNAME}\\)?%{USERNAME}(@%{HOSTNAME})?(, *%{NUMBER})?) DURATION: "%{INT}:%{MINUTE}:%{SECOND}" @@ -392,7 +392,7 @@ processors: patterns: - "Built %{NOTSPACE:network.direction} %{NOTSPACE:network.protocol} connection for faddr (?:%{NOTCOLON:_temp_.cisco.source_interface}:)?%{ECSDESTIPORHOST}/%{NUMBER}\\s*(?:\\(%{CISCO_USER:_temp_.cisco.destination_username}\\) )?gaddr (?:%{NOTCOLON}:)?%{MAPPEDSRC}/%{NUMBER} laddr (?:%{NOTCOLON:_temp_.cisco.source_interface}:)?%{ECSSOURCEIPORHOST}/%{NUMBER}\\s*(?:\\(%{CISCO_USER:_temp_.cisco.source_username}\\) )?(type %{NUMBER:_temp_.cisco.icmp_type} code %{NUMBER:_temp_.cisco.icmp_code})?" pattern_definitions: - HOSTNAME: "\\b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\\.?|\\b)" + HOSTNAME: '\b(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62}))*(\.?|\b)' IPORHOST: "(?:%{IP}|%{HOSTNAME})" NOTCOLON: "[^:]*" ECSSOURCEIPORHOST: "(?:%{IP:source.address}|%{HOSTNAME:source.domain})" @@ -847,7 +847,7 @@ processors: - ^Teardown %{NOTSPACE:network.transport} (?:state-bypass )?connection %{NOTSPACE:_temp_.cisco.connection_id} (?:for|from) %{NOTCOLON:_temp_.cisco.source_interface}:%{DATA:source.address}/%{NUMBER:source.port:int}\s*(?:\(?%{CISCO_USER:_temp_.cisco.source_username}\)? )?to %{NOTCOLON:_temp_.cisco.destination_interface}:%{DATA:destination.address}/%{NUMBER:destination.port:int}\s*(?:\(?%{CISCO_USER:_temp_.cisco.destination_username}\)? )?duration (?:%{DURATION:_temp_.duration_hms} bytes %{NUMBER:network.bytes}) - ^Teardown %{NOTSPACE:network.transport} connection for faddr (?:%{NOTCOLON:_temp_.cisco.source_interface}:)?%{ECSDESTIPORHOST}/%{NUMBER}\s*(?:\(?%{CISCO_USER:_temp_.cisco.destination_username}\)? )?gaddr (?:%{NOTCOLON}:)?%{MAPPEDSRC}/%{NUMBER} laddr (?:%{NOTCOLON:_temp_.cisco.source_interface}:)?%{ECSSOURCEIPORHOST}/%{NUMBER}\s*(?:\(%{CISCO_USER:_temp_.cisco.source_username}\))?(\s*type %{NUMBER:_temp_.cisco.icmp_type} code %{NUMBER:_temp_.cisco.icmp_code})? pattern_definitions: - HOSTNAME: "\\b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\\.?|\\b)" + HOSTNAME: '\b(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z\-_]{0,62}))*(\.?|\b)' IPORHOST: "(?:%{IP}|%{HOSTNAME})" NOTCOLON: "[^:]*" ECSSOURCEIPORHOST: "(?:%{IP:source.address}|%{HOSTNAME:source.domain})" diff --git a/x-pack/filebeat/module/crowdstrike/falcon/ingest/pipeline.yml b/x-pack/filebeat/module/crowdstrike/falcon/ingest/pipeline.yml index 9aeb653b488..94d312d7e11 100644 --- a/x-pack/filebeat/module/crowdstrike/falcon/ingest/pipeline.yml +++ b/x-pack/filebeat/module/crowdstrike/falcon/ingest/pipeline.yml @@ -281,7 +281,7 @@ processors: commandLine = commandLine.trim(); if (commandLine != "") { - def args = Arrays.asList(/ /.split(commandLine)); + def args = new ArrayList(Arrays.asList(/ /.split(commandLine))); args.removeIf(arg -> arg == ""); ctx['process'] = new HashMap(); diff --git a/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log b/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log index 0980bf0fb60..f7cb78602c8 100644 --- a/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log +++ b/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log @@ -19,7 +19,7 @@ "SeverityName": "High", "FileName": "explorer.exe", "FilePath": "\\Device\\HarddiskVolume1\\Windows", - "CommandLine": "C:\\Windows\\Explorer.EXE", + "CommandLine": "C:\\Windows\\Explorer.EXE --test", "SHA256String": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a", "MD5String": "ac4c51eb24aa95b77f705ab159189e24", "MachineDomain": "CORP-DOMAIN", diff --git a/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log-expected.json b/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log-expected.json index 0756dfac477..9ed50798143 100644 --- a/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log-expected.json +++ b/x-pack/filebeat/module/crowdstrike/falcon/test/falcon-events.log-expected.json @@ -1,6 +1,6 @@ [ { - "crowdstrike.event.CommandLine": "C:\\Windows\\Explorer.EXE", + "crowdstrike.event.CommandLine": "C:\\Windows\\Explorer.EXE --test", "crowdstrike.event.ComputerName": "alice-laptop", "crowdstrike.event.DetectDescription": "Terminated a process related to the deletion of backups, which is often indicative of ransomware activity.", "crowdstrike.event.DetectId": "ldt:ec86abd353824e96765ecbe18eb4f0b4:38655257584", @@ -67,9 +67,10 @@ "log.offset": 0, "message": "Terminated a process related to the deletion of backups, which is often indicative of ransomware activity.", "process.args": [ - "C:\\Windows\\Explorer.EXE" + "C:\\Windows\\Explorer.EXE", + "--test" ], - "process.command_line": "C:\\Windows\\Explorer.EXE", + "process.command_line": "C:\\Windows\\Explorer.EXE --test", "process.executable": "C:\\Windows\\Explorer.EXE", "process.name": "explorer.exe", "process.pid": 38684386611, @@ -126,7 +127,7 @@ "log.flags": [ "multiline" ], - "log.offset": 2063, + "log.offset": 2071, "message": "Incident score 1.2", "service.type": "crowdstrike", "tags": [ @@ -169,7 +170,7 @@ "log.flags": [ "multiline" ], - "log.offset": 2579, + "log.offset": 2587, "message": "quarantined_file_update", "related.user": [ "Crowdstrike" diff --git a/x-pack/filebeat/module/fortinet/firewall/ingest/pipeline.yml b/x-pack/filebeat/module/fortinet/firewall/ingest/pipeline.yml index 92037a746b1..244b5e1726e 100644 --- a/x-pack/filebeat/module/fortinet/firewall/ingest/pipeline.yml +++ b/x-pack/filebeat/module/fortinet/firewall/ingest/pipeline.yml @@ -7,6 +7,11 @@ processors: field: message patterns: - '%{SYSLOG5424PRI}%{GREEDYDATA:syslog5424_sd}$' +- gsub: + field: syslog5424_sd + pattern: "\u0000" + replacement: "" + if: ctx.syslog5424_sd != null - script: lang: painless if: ctx.syslog5424_sd != null diff --git a/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log b/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log new file mode 100644 index 00000000000..4d7d8613adc Binary files /dev/null and b/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log differ diff --git a/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log-expected.json b/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log-expected.json new file mode 100644 index 00000000000..89c0254c914 --- /dev/null +++ b/x-pack/filebeat/module/fortinet/firewall/test/event-nul.log-expected.json @@ -0,0 +1,167 @@ +[ + { + "@timestamp": "2020-04-23T12:32:48.000-05:00", + "event.action": "FSSO-logon", + "event.category": [ + "authentication" + ], + "event.code": "0102043014", + "event.dataset": "fortinet.firewall", + "event.kind": "event", + "event.module": "fortinet", + "event.outcome": "success", + "event.start": "2020-04-18T12:32:48.439-05:00", + "event.timezone": "-0500", + "event.type": [ + "start", + "user" + ], + "fileset.name": "firewall", + "fortinet.firewall.action": "FSSO-logon", + "fortinet.firewall.server": "elasticserver", + "fortinet.firewall.subtype": "user", + "fortinet.firewall.type": "event", + "fortinet.firewall.vd": "root", + "input.type": "log", + "log.level": "notice", + "log.offset": 0, + "message": "log contains NUL terminators", + "network.type": "ipv4", + "observer.name": "testswitch3", + "observer.product": "Fortigate", + "observer.serial_number": "someotherrouteridagain", + "observer.type": "firewall", + "observer.vendor": "Fortinet", + "related.ip": [ + "10.10.10.10" + ], + "related.user": [ + "elasticouser" + ], + "rule.description": "FSSO logon authentication status", + "service.type": "fortinet", + "source.ip": "10.10.10.10", + "source.user.name": "elasticouser", + "tags": [ + "fortinet-firewall", + "forwarded" + ] + }, + { + "@timestamp": "2020-04-23T12:32:47.000-05:00", + "destination.ip": "8.8.4.4", + "destination.port": 500, + "event.action": "negotiate", + "event.category": [ + "network" + ], + "event.code": "0101037124", + "event.dataset": "fortinet.firewall", + "event.kind": "event", + "event.module": "fortinet", + "event.outcome": "failure", + "event.reason": "peer SA proposal not match local policy", + "event.start": "2020-04-18T12:32:48.339-05:00", + "event.timezone": "-0500", + "event.type": [ + "connection" + ], + "fileset.name": "firewall", + "fortinet.firewall.action": "negotiate", + "fortinet.firewall.cookies": "345hkjhdrs87/0000000000000000", + "fortinet.firewall.outintf": "wan2", + "fortinet.firewall.peer_notif": "NOT-APPLICABLE", + "fortinet.firewall.status": "negotiate_error", + "fortinet.firewall.subtype": "vpn", + "fortinet.firewall.type": "event", + "fortinet.firewall.vd": "root", + "input.type": "log", + "log.level": "error", + "log.offset": 361, + "message": "IPsec phase 1 error", + "network.type": "ipv4", + "observer.name": "testswitch3", + "observer.product": "Fortigate", + "observer.serial_number": "someotherrouteridagain", + "observer.type": "firewall", + "observer.vendor": "Fortinet", + "related.ip": [ + "175.16.199.1", + "8.8.4.4" + ], + "rule.description": "IPsec phase 1 error", + "service.type": "fortinet", + "source.geo.city_name": "Changchun", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 43.88, + "source.geo.location.lon": 125.3228, + "source.geo.region_iso_code": "CN-22", + "source.geo.region_name": "Jilin Sheng", + "source.ip": "175.16.199.1", + "source.port": 500, + "tags": [ + "fortinet-firewall", + "forwarded" + ] + }, + { + "@timestamp": "2020-04-23T12:32:31.000-05:00", + "destination.ip": "8.4.5.4", + "destination.port": 500, + "event.action": "negotiate", + "event.category": [ + "network" + ], + "event.code": "0101037127", + "event.dataset": "fortinet.firewall", + "event.kind": "event", + "event.module": "fortinet", + "event.outcome": "success", + "event.start": "2020-04-18T12:32:31.628-05:00", + "event.timezone": "-0500", + "event.type": [ + "connection" + ], + "fileset.name": "firewall", + "fortinet.firewall.action": "negotiate", + "fortinet.firewall.cookies": "df868dsg876d/0000000000000000", + "fortinet.firewall.init": "local", + "fortinet.firewall.mode": "main", + "fortinet.firewall.outintf": "wan1", + "fortinet.firewall.result": "OK", + "fortinet.firewall.role": "initiator", + "fortinet.firewall.stage": "1", + "fortinet.firewall.status": "success", + "fortinet.firewall.subtype": "vpn", + "fortinet.firewall.type": "event", + "fortinet.firewall.vd": "root", + "fortinet.firewall.vpntunnel": "elasticvpn", + "input.type": "log", + "log.level": "notice", + "log.offset": 935, + "message": "progress IPsec phase 1", + "network.direction": "outbound", + "network.type": "ipv4", + "observer.name": "testswitch3", + "observer.product": "Fortigate", + "observer.serial_number": "someotherrouteridagain", + "observer.type": "firewall", + "observer.vendor": "Fortinet", + "related.ip": [ + "1.128.3.4", + "8.4.5.4" + ], + "rule.description": "Progress IPsec phase 1", + "service.type": "fortinet", + "source.as.number": 1221, + "source.as.organization.name": "Telstra Pty Ltd", + "source.ip": "1.128.3.4", + "source.port": 500, + "tags": [ + "fortinet-firewall", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml b/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml index a7d4b22ee7e..062066ab7ab 100644 --- a/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml +++ b/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml @@ -5,7 +5,7 @@ processors: - grok: field: message patterns: - - '^<%{POSINT:syslog_pri}>(\d{1,3}\s)?(?:%{TIMESTAMP_ISO8601:_temp_.raw_date})\s%{SYSLOGHOST:syslog_hostname}\s%{PROG:syslog_program}\s(?:%{POSINT:syslog_pid}|-)?\s%{WORD:log_type}\s\[.+?\s%{GREEDYDATA:log.original}\]$' + - '^<%{POSINT:syslog_pri}>(\d{1,3}\s)?(?:%{TIMESTAMP_ISO8601:_temp_.raw_date})\s%{SYSLOGHOST:syslog_hostname}\s%{PROG:syslog_program}\s(?:%{POSINT:syslog_pid}|-)?\s%{WORD:log_type}\s\[(?:[^=]+\s)?%{GREEDYDATA:log.original}\]$' # split Juniper-SRX fields - kv: diff --git a/x-pack/filebeat/module/juniper/srx/test/flow.log b/x-pack/filebeat/module/juniper/srx/test/flow.log index 89c8b63e546..16ce15c66f9 100644 --- a/x-pack/filebeat/module/juniper/srx/test/flow.log +++ b/x-pack/filebeat/module/juniper/srx/test/flow.log @@ -23,3 +23,4 @@ <14>1 2020-07-13T16:43:05.041Z SRX100HM RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.81.2.69.144.129 reason="idle Timeout" source-address="10.1.1.100" source-port="64720" destination-address="91.228.167.172" destination-port="8883" connection-tag="0" service-name="None" nat-source-address="172.19.34.100" nat-source-port="24519" nat-destination-address="91.228.167.172" nat-destination-port="8883" nat-connection-tag="0" src-nat-rule-type="source rule" src-nat-rule-name="our-nat-rule" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="3851" packets-from-client="161" bytes-from-client="9530" packets-from-server="96" bytes-from-server="9670" elapsed-time="23755" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/1.0" encrypted="UNKNOWN" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A" secure-web-proxy-session-type="NA" peer-session-id="0" peer-source-address="0.0.0.0" peer-source-port="0" peer-destination-address="0.0.0.0" peer-destination-port="0" hostname="NA NA" src-vrf-grp="N/A" dst-vrf-grp="N/A"] <14>1 2020-07-13T16:12:05.530Z SRX100HM RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2636.81.2.69.144.129 source-address="10.1.1.100" source-port="49583" destination-address="175.16.199.1" destination-port="53" connection-tag="0" service-name="junos-dns-udp" nat-source-address="172.19.34.100" nat-source-port="30838" nat-destination-address="175.16.199.1" nat-destination-port="53" nat-connection-tag="0" src-nat-rule-type="source rule" src-nat-rule-name="our-nat-rule" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="17" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="15399" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/1.0" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] <14>1 2020-07-13T16:12:05.530Z SRX100HM RT_FLOW - APPTRACK_SESSION_CLOSE [junos@2636.81.2.69.144.129 reason="Closed by junos-alg" source-address="10.1.1.100" source-port="63381" destination-address="175.16.199.1" destination-port="53" service-name="junos-dns-udp" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="172.19.34.100" nat-source-port="26764" nat-destination-address="175.16.199.1" nat-destination-port="53" src-nat-rule-name="our-nat-rule" dst-nat-rule-name="N/A" protocol-id="17" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="15361" packets-from-client="1" bytes-from-client="66" packets-from-server="1" bytes-from-server="82" elapsed-time="3" username="N/A" roles="N/A" encrypted="No" profile-name="N/A" rule-name="N/A" routing-instance="default" destination-interface-name="ge-0/0/0.0" uplink-incoming-interface-name="N/A" uplink-tx-bytes="0" uplink-rx-bytes="0" category="N/A" sub-category="N/A" apbr-policy-name="N/A" multipath-rule-name="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] +<14>1 2023-08-08T14:28:00.778-05:00 Route1- RT_FLOW - RT_FLOW_SESSION_DENY [source-address="192.168.1.1" source-port="39017" destination-address="8.8.4.4" destination-port="53" connection-tag="0" service-name="junos-dns-udp" protocol-id="17" icmp-type="0" policy-name="dns_deny_outbound" source-zone-name="trust" destination-zone-name="untrust" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="reth0.0" encrypted="No" reason="Denied by policy" session-id="85905209174" application-category="N/A" application-sub-category="N/A" application-risk="-1" application-characteristics="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] diff --git a/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json index 4f4f7275fbc..79bae3051f9 100644 --- a/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json +++ b/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json @@ -1867,5 +1867,62 @@ "forwarded", "juniper.srx" ] + }, + { + "@timestamp": "2023-08-08T17:28:00.778-02:00", + "client.ip": "192.168.1.1", + "client.port": 39017, + "destination.ip": "8.8.4.4", + "destination.port": 53, + "event.action": "flow_deny", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"192.168.1.1\" source-port=\"39017\" destination-address=\"8.8.4.4\" destination-port=\"53\" connection-tag=\"0\" service-name=\"junos-dns-udp\" protocol-id=\"17\" icmp-type=\"0\" policy-name=\"dns_deny_outbound\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth0.0\" encrypted=\"No\" reason=\"Denied by policy\" session-id=\"85905209174\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"-1\" application-characteristics=\"N/A\" src-vrf-grp=\"N/A\" dst-vrf-grp=\"N/A\"", + "event.outcome": "success", + "event.risk_score": -1.0, + "event.severity": 14, + "event.timezone": "-02:00", + "event.type": [ + "connection", + "denied" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.encrypted": "No", + "juniper.srx.icmp_type": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "Denied by policy", + "juniper.srx.service_name": "junos-dns-udp", + "juniper.srx.session_id": "85905209174", + "juniper.srx.tag": "RT_FLOW_SESSION_DENY", + "log.level": "informational", + "log.offset": 19862, + "network.iana_number": "17", + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "reth0.0", + "observer.ingress.zone": "trust", + "observer.name": "Route1-", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.1.1", + "8.8.4.4" + ], + "rule.name": "dns_deny_outbound", + "server.ip": "8.8.4.4", + "server.port": 53, + "service.type": "juniper", + "source.ip": "192.168.1.1", + "source.port": 39017, + "tags": [ + "forwarded", + "juniper.srx" + ] } ] \ No newline at end of file diff --git a/x-pack/filebeat/module/salesforce/_meta/config.yml b/x-pack/filebeat/module/salesforce/_meta/config.yml index 07b54b43fe3..f5c6c9c7f06 100644 --- a/x-pack/filebeat/module/salesforce/_meta/config.yml +++ b/x-pack/filebeat/module/salesforce/_meta/config.yml @@ -125,3 +125,6 @@ # URL, should include the instance_url #var.url: "https://instance_id.my.salesforce.com" + + # Interval, should include the time interval + #var.interval: 1h \ No newline at end of file diff --git a/x-pack/filebeat/module/salesforce/_meta/docs.asciidoc b/x-pack/filebeat/module/salesforce/_meta/docs.asciidoc index e0bb1ea3da8..edfce0ea7ad 100644 --- a/x-pack/filebeat/module/salesforce/_meta/docs.asciidoc +++ b/x-pack/filebeat/module/salesforce/_meta/docs.asciidoc @@ -218,6 +218,7 @@ Example config: var.user: "my.email@here.com" var.password: "password" var.url: "https://instance-url.salesforce.com" + var.interval: 1h ---- include::../include/var-paths.asciidoc[] @@ -246,6 +247,12 @@ The password used as part of the authentication flow. It is required for authent The URL of the Saleforce instance. +*`var.interval`*:: + +Period of fetching logs, i.e. 1s/1m/1h. + +Note: The default value of `var.interval` is 1h. It is important to exercise caution when reducing the interval, as it directly affects the API rate limit of the Salesforce instance. Salesforce API rate limit is ~1000 API calls per hour. Hence if user goes with lower limit of var.interval, the Salesforce API rate limit will exceed and any additional API requests beyond the limit will result in an error response from the Salesforce API. The error message will typically indicate that the rate limit has been exceeded. Please refer to the following link for the https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm[Salesforce API Rate Limit]. + [float] ==== `apex-rest` fileset settings diff --git a/x-pack/filebeat/module/sonicwall/_meta/docs.asciidoc b/x-pack/filebeat/module/sonicwall/_meta/docs.asciidoc index 595b2a31acb..d1f82f17dd2 100644 --- a/x-pack/filebeat/module/sonicwall/_meta/docs.asciidoc +++ b/x-pack/filebeat/module/sonicwall/_meta/docs.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] -:modulename: sonicwall +:modulename: sonicwall_firewall :has-dashboards: false == Sonicwall module diff --git a/x-pack/filebeat/modules.d/activemq.yml.disabled b/x-pack/filebeat/modules.d/activemq.yml.disabled index 82c70b16947..e19824686ae 100644 --- a/x-pack/filebeat/modules.d/activemq.yml.disabled +++ b/x-pack/filebeat/modules.d/activemq.yml.disabled @@ -1,5 +1,5 @@ # Module: activemq -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-activemq.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-activemq.html - module: activemq # Audit logs diff --git a/x-pack/filebeat/modules.d/aws.yml.disabled b/x-pack/filebeat/modules.d/aws.yml.disabled index 6a49839c116..c730b8aea07 100644 --- a/x-pack/filebeat/modules.d/aws.yml.disabled +++ b/x-pack/filebeat/modules.d/aws.yml.disabled @@ -1,5 +1,5 @@ # Module: aws -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-aws.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-aws.html - module: aws cloudtrail: diff --git a/x-pack/filebeat/modules.d/awsfargate.yml.disabled b/x-pack/filebeat/modules.d/awsfargate.yml.disabled index 57a5e419135..c2e96fd2f93 100644 --- a/x-pack/filebeat/modules.d/awsfargate.yml.disabled +++ b/x-pack/filebeat/modules.d/awsfargate.yml.disabled @@ -1,5 +1,5 @@ # Module: awsfargate -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-awsfargate.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-awsfargate.html - module: awsfargate log: diff --git a/x-pack/filebeat/modules.d/azure.yml.disabled b/x-pack/filebeat/modules.d/azure.yml.disabled index 04fe209e3f7..97eb4b9e461 100644 --- a/x-pack/filebeat/modules.d/azure.yml.disabled +++ b/x-pack/filebeat/modules.d/azure.yml.disabled @@ -1,5 +1,5 @@ # Module: azure -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-azure.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-azure.html - module: azure # All logs diff --git a/x-pack/filebeat/modules.d/barracuda.yml.disabled b/x-pack/filebeat/modules.d/barracuda.yml.disabled index 6327b8d6a75..3926a2fec96 100644 --- a/x-pack/filebeat/modules.d/barracuda.yml.disabled +++ b/x-pack/filebeat/modules.d/barracuda.yml.disabled @@ -1,5 +1,5 @@ # Module: barracuda -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-barracuda.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-barracuda.html - module: barracuda waf: diff --git a/x-pack/filebeat/modules.d/bluecoat.yml.disabled b/x-pack/filebeat/modules.d/bluecoat.yml.disabled index 98a4cef099b..28badfd0def 100644 --- a/x-pack/filebeat/modules.d/bluecoat.yml.disabled +++ b/x-pack/filebeat/modules.d/bluecoat.yml.disabled @@ -1,5 +1,5 @@ # Module: bluecoat -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-bluecoat.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-bluecoat.html - module: bluecoat director: diff --git a/x-pack/filebeat/modules.d/cef.yml.disabled b/x-pack/filebeat/modules.d/cef.yml.disabled index cda083f4a5e..1834c8f4dba 100644 --- a/x-pack/filebeat/modules.d/cef.yml.disabled +++ b/x-pack/filebeat/modules.d/cef.yml.disabled @@ -1,5 +1,5 @@ # Module: cef -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-cef.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-cef.html - module: cef log: diff --git a/x-pack/filebeat/modules.d/checkpoint.yml.disabled b/x-pack/filebeat/modules.d/checkpoint.yml.disabled index 62d30a992b7..595beccdbff 100644 --- a/x-pack/filebeat/modules.d/checkpoint.yml.disabled +++ b/x-pack/filebeat/modules.d/checkpoint.yml.disabled @@ -1,5 +1,5 @@ # Module: checkpoint -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-checkpoint.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-checkpoint.html - module: checkpoint firewall: diff --git a/x-pack/filebeat/modules.d/cisco.yml.disabled b/x-pack/filebeat/modules.d/cisco.yml.disabled index 6bc846f93f6..b2aca39798e 100644 --- a/x-pack/filebeat/modules.d/cisco.yml.disabled +++ b/x-pack/filebeat/modules.d/cisco.yml.disabled @@ -1,5 +1,5 @@ # Module: cisco -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-cisco.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-cisco.html - module: cisco asa: diff --git a/x-pack/filebeat/modules.d/coredns.yml.disabled b/x-pack/filebeat/modules.d/coredns.yml.disabled index fb7e9995130..bfcc3bba412 100644 --- a/x-pack/filebeat/modules.d/coredns.yml.disabled +++ b/x-pack/filebeat/modules.d/coredns.yml.disabled @@ -1,5 +1,5 @@ # Module: coredns -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-coredns.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-coredns.html - module: coredns # Fileset for native deployment diff --git a/x-pack/filebeat/modules.d/crowdstrike.yml.disabled b/x-pack/filebeat/modules.d/crowdstrike.yml.disabled index aea362f2e40..8f30c4ed899 100644 --- a/x-pack/filebeat/modules.d/crowdstrike.yml.disabled +++ b/x-pack/filebeat/modules.d/crowdstrike.yml.disabled @@ -1,5 +1,5 @@ # Module: crowdstrike -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-crowdstrike.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-crowdstrike.html - module: crowdstrike diff --git a/x-pack/filebeat/modules.d/cyberarkpas.yml.disabled b/x-pack/filebeat/modules.d/cyberarkpas.yml.disabled index f2168e9d453..8b4ddf9b814 100644 --- a/x-pack/filebeat/modules.d/cyberarkpas.yml.disabled +++ b/x-pack/filebeat/modules.d/cyberarkpas.yml.disabled @@ -1,5 +1,5 @@ # Module: cyberarkpas -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-cyberarkpas.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-cyberarkpas.html - module: cyberarkpas audit: diff --git a/x-pack/filebeat/modules.d/cylance.yml.disabled b/x-pack/filebeat/modules.d/cylance.yml.disabled index 164642f0738..48cbb166e82 100644 --- a/x-pack/filebeat/modules.d/cylance.yml.disabled +++ b/x-pack/filebeat/modules.d/cylance.yml.disabled @@ -1,5 +1,5 @@ # Module: cylance -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-cylance.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-cylance.html - module: cylance protect: diff --git a/x-pack/filebeat/modules.d/envoyproxy.yml.disabled b/x-pack/filebeat/modules.d/envoyproxy.yml.disabled index d95316b3c30..b06026cc061 100644 --- a/x-pack/filebeat/modules.d/envoyproxy.yml.disabled +++ b/x-pack/filebeat/modules.d/envoyproxy.yml.disabled @@ -1,5 +1,5 @@ # Module: envoyproxy -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-envoyproxy.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-envoyproxy.html - module: envoyproxy # Fileset for native deployment diff --git a/x-pack/filebeat/modules.d/f5.yml.disabled b/x-pack/filebeat/modules.d/f5.yml.disabled index 4db5209693d..cb9399134fe 100644 --- a/x-pack/filebeat/modules.d/f5.yml.disabled +++ b/x-pack/filebeat/modules.d/f5.yml.disabled @@ -1,5 +1,5 @@ # Module: f5 -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-f5.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-f5.html - module: f5 bigipapm: diff --git a/x-pack/filebeat/modules.d/fortinet.yml.disabled b/x-pack/filebeat/modules.d/fortinet.yml.disabled index e31eb967d73..a07a18bca93 100644 --- a/x-pack/filebeat/modules.d/fortinet.yml.disabled +++ b/x-pack/filebeat/modules.d/fortinet.yml.disabled @@ -1,5 +1,5 @@ # Module: fortinet -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-fortinet.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-fortinet.html - module: fortinet firewall: diff --git a/x-pack/filebeat/modules.d/gcp.yml.disabled b/x-pack/filebeat/modules.d/gcp.yml.disabled index b0b5f636b10..601be53f69b 100644 --- a/x-pack/filebeat/modules.d/gcp.yml.disabled +++ b/x-pack/filebeat/modules.d/gcp.yml.disabled @@ -1,5 +1,5 @@ # Module: gcp -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-gcp.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-gcp.html - module: gcp vpcflow: diff --git a/x-pack/filebeat/modules.d/google_workspace.yml.disabled b/x-pack/filebeat/modules.d/google_workspace.yml.disabled index 85142dfcaf0..a079e429f84 100644 --- a/x-pack/filebeat/modules.d/google_workspace.yml.disabled +++ b/x-pack/filebeat/modules.d/google_workspace.yml.disabled @@ -1,5 +1,5 @@ # Module: google_workspace -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-google_workspace.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-google_workspace.html - module: google_workspace saml: diff --git a/x-pack/filebeat/modules.d/ibmmq.yml.disabled b/x-pack/filebeat/modules.d/ibmmq.yml.disabled index 4ad3209a90e..fd19cafb3c9 100644 --- a/x-pack/filebeat/modules.d/ibmmq.yml.disabled +++ b/x-pack/filebeat/modules.d/ibmmq.yml.disabled @@ -1,5 +1,5 @@ # Module: ibmmq -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-ibmmq.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-ibmmq.html - module: ibmmq # All logs diff --git a/x-pack/filebeat/modules.d/imperva.yml.disabled b/x-pack/filebeat/modules.d/imperva.yml.disabled index cd864075960..e6616398303 100644 --- a/x-pack/filebeat/modules.d/imperva.yml.disabled +++ b/x-pack/filebeat/modules.d/imperva.yml.disabled @@ -1,5 +1,5 @@ # Module: imperva -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-imperva.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-imperva.html - module: imperva securesphere: diff --git a/x-pack/filebeat/modules.d/infoblox.yml.disabled b/x-pack/filebeat/modules.d/infoblox.yml.disabled index 24d524d259d..910a896d12a 100644 --- a/x-pack/filebeat/modules.d/infoblox.yml.disabled +++ b/x-pack/filebeat/modules.d/infoblox.yml.disabled @@ -1,5 +1,5 @@ # Module: infoblox -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-infoblox.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-infoblox.html - module: infoblox nios: diff --git a/x-pack/filebeat/modules.d/iptables.yml.disabled b/x-pack/filebeat/modules.d/iptables.yml.disabled index 2d51c67f24e..a4c73b7a04a 100644 --- a/x-pack/filebeat/modules.d/iptables.yml.disabled +++ b/x-pack/filebeat/modules.d/iptables.yml.disabled @@ -1,5 +1,5 @@ # Module: iptables -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-iptables.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-iptables.html - module: iptables log: diff --git a/x-pack/filebeat/modules.d/juniper.yml.disabled b/x-pack/filebeat/modules.d/juniper.yml.disabled index 583f47bb7f7..5fb85afc302 100644 --- a/x-pack/filebeat/modules.d/juniper.yml.disabled +++ b/x-pack/filebeat/modules.d/juniper.yml.disabled @@ -1,5 +1,5 @@ # Module: juniper -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-juniper.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-juniper.html - module: juniper junos: diff --git a/x-pack/filebeat/modules.d/microsoft.yml.disabled b/x-pack/filebeat/modules.d/microsoft.yml.disabled index e4af73ad6ed..4c5528f5b76 100644 --- a/x-pack/filebeat/modules.d/microsoft.yml.disabled +++ b/x-pack/filebeat/modules.d/microsoft.yml.disabled @@ -1,5 +1,5 @@ # Module: microsoft -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-microsoft.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-microsoft.html - module: microsoft # ATP configuration diff --git a/x-pack/filebeat/modules.d/misp.yml.disabled b/x-pack/filebeat/modules.d/misp.yml.disabled index 4e405aaac70..28ca6608367 100644 --- a/x-pack/filebeat/modules.d/misp.yml.disabled +++ b/x-pack/filebeat/modules.d/misp.yml.disabled @@ -1,5 +1,5 @@ # Module: misp -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-misp.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-misp.html # Deprecated in 7.14.0: Recommended to migrate to the Threat Intel module. diff --git a/x-pack/filebeat/modules.d/mssql.yml.disabled b/x-pack/filebeat/modules.d/mssql.yml.disabled index c8473c91dd5..ee3f225a941 100644 --- a/x-pack/filebeat/modules.d/mssql.yml.disabled +++ b/x-pack/filebeat/modules.d/mssql.yml.disabled @@ -1,5 +1,5 @@ # Module: mssql -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-mssql.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-mssql.html - module: mssql # Fileset for native deployment diff --git a/x-pack/filebeat/modules.d/mysqlenterprise.yml.disabled b/x-pack/filebeat/modules.d/mysqlenterprise.yml.disabled index 33c1731cd19..50e8860671f 100644 --- a/x-pack/filebeat/modules.d/mysqlenterprise.yml.disabled +++ b/x-pack/filebeat/modules.d/mysqlenterprise.yml.disabled @@ -1,5 +1,5 @@ # Module: mysqlenterprise -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-mysqlenterprise.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-mysqlenterprise.html - module: mysqlenterprise audit: diff --git a/x-pack/filebeat/modules.d/netflow.yml.disabled b/x-pack/filebeat/modules.d/netflow.yml.disabled index 7f365e90b43..b2584b16890 100644 --- a/x-pack/filebeat/modules.d/netflow.yml.disabled +++ b/x-pack/filebeat/modules.d/netflow.yml.disabled @@ -1,5 +1,5 @@ # Module: netflow -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-netflow.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-netflow.html - module: netflow log: diff --git a/x-pack/filebeat/modules.d/netscout.yml.disabled b/x-pack/filebeat/modules.d/netscout.yml.disabled index c6d5520629b..6a0e4c0dce6 100644 --- a/x-pack/filebeat/modules.d/netscout.yml.disabled +++ b/x-pack/filebeat/modules.d/netscout.yml.disabled @@ -1,5 +1,5 @@ # Module: netscout -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-netscout.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-netscout.html - module: netscout sightline: diff --git a/x-pack/filebeat/modules.d/o365.yml.disabled b/x-pack/filebeat/modules.d/o365.yml.disabled index ab61528d6f9..99724949b39 100644 --- a/x-pack/filebeat/modules.d/o365.yml.disabled +++ b/x-pack/filebeat/modules.d/o365.yml.disabled @@ -1,5 +1,5 @@ # Module: o365 -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-o365.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-o365.html - module: o365 audit: diff --git a/x-pack/filebeat/modules.d/okta.yml.disabled b/x-pack/filebeat/modules.d/okta.yml.disabled index 062856ce4e4..13706b240d2 100644 --- a/x-pack/filebeat/modules.d/okta.yml.disabled +++ b/x-pack/filebeat/modules.d/okta.yml.disabled @@ -1,5 +1,5 @@ # Module: okta -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-okta.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-okta.html - module: okta system: diff --git a/x-pack/filebeat/modules.d/oracle.yml.disabled b/x-pack/filebeat/modules.d/oracle.yml.disabled index aa24b1f6755..c74c5f889f8 100644 --- a/x-pack/filebeat/modules.d/oracle.yml.disabled +++ b/x-pack/filebeat/modules.d/oracle.yml.disabled @@ -1,5 +1,5 @@ # Module: oracle -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-oracle.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-oracle.html - module: oracle database_audit: diff --git a/x-pack/filebeat/modules.d/panw.yml.disabled b/x-pack/filebeat/modules.d/panw.yml.disabled index 1a630f8fb4e..93b9a683603 100644 --- a/x-pack/filebeat/modules.d/panw.yml.disabled +++ b/x-pack/filebeat/modules.d/panw.yml.disabled @@ -1,5 +1,5 @@ # Module: panw -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-panw.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-panw.html - module: panw panos: diff --git a/x-pack/filebeat/modules.d/proofpoint.yml.disabled b/x-pack/filebeat/modules.d/proofpoint.yml.disabled index 34b31277086..2c5dfec92e5 100644 --- a/x-pack/filebeat/modules.d/proofpoint.yml.disabled +++ b/x-pack/filebeat/modules.d/proofpoint.yml.disabled @@ -1,5 +1,5 @@ # Module: proofpoint -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-proofpoint.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-proofpoint.html - module: proofpoint emailsecurity: diff --git a/x-pack/filebeat/modules.d/rabbitmq.yml.disabled b/x-pack/filebeat/modules.d/rabbitmq.yml.disabled index 437cf9a5721..2b2171f86d0 100644 --- a/x-pack/filebeat/modules.d/rabbitmq.yml.disabled +++ b/x-pack/filebeat/modules.d/rabbitmq.yml.disabled @@ -1,5 +1,5 @@ # Module: rabbitmq -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-rabbitmq.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-rabbitmq.html - module: rabbitmq # All logs diff --git a/x-pack/filebeat/modules.d/radware.yml.disabled b/x-pack/filebeat/modules.d/radware.yml.disabled index 553d8459127..fe39a7b805e 100644 --- a/x-pack/filebeat/modules.d/radware.yml.disabled +++ b/x-pack/filebeat/modules.d/radware.yml.disabled @@ -1,5 +1,5 @@ # Module: radware -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-radware.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-radware.html - module: radware defensepro: diff --git a/x-pack/filebeat/modules.d/salesforce.yml.disabled b/x-pack/filebeat/modules.d/salesforce.yml.disabled index 93d04365a86..4931e8e006e 100644 --- a/x-pack/filebeat/modules.d/salesforce.yml.disabled +++ b/x-pack/filebeat/modules.d/salesforce.yml.disabled @@ -1,5 +1,5 @@ # Module: salesforce -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-salesforce.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-salesforce.html - module: salesforce @@ -128,3 +128,6 @@ # URL, should include the instance_url #var.url: "https://instance_id.my.salesforce.com" + + # Interval, should include the time interval + #var.interval: 1h \ No newline at end of file diff --git a/x-pack/filebeat/modules.d/snort.yml.disabled b/x-pack/filebeat/modules.d/snort.yml.disabled index 89d25c4b556..d8befbb7d7c 100644 --- a/x-pack/filebeat/modules.d/snort.yml.disabled +++ b/x-pack/filebeat/modules.d/snort.yml.disabled @@ -1,5 +1,5 @@ # Module: snort -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-snort.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-snort.html - module: snort log: diff --git a/x-pack/filebeat/modules.d/snyk.yml.disabled b/x-pack/filebeat/modules.d/snyk.yml.disabled index f92cf1d71f0..ab6b379f389 100644 --- a/x-pack/filebeat/modules.d/snyk.yml.disabled +++ b/x-pack/filebeat/modules.d/snyk.yml.disabled @@ -1,5 +1,5 @@ # Module: snyk -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-snyk.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-snyk.html - module: snyk audit: diff --git a/x-pack/filebeat/modules.d/sonicwall.yml.disabled b/x-pack/filebeat/modules.d/sonicwall.yml.disabled index f267d355b37..cf0706bdd81 100644 --- a/x-pack/filebeat/modules.d/sonicwall.yml.disabled +++ b/x-pack/filebeat/modules.d/sonicwall.yml.disabled @@ -1,5 +1,5 @@ # Module: sonicwall -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-sonicwall.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-sonicwall.html - module: sonicwall firewall: diff --git a/x-pack/filebeat/modules.d/sophos.yml.disabled b/x-pack/filebeat/modules.d/sophos.yml.disabled index e875354ad62..42aa513de7e 100644 --- a/x-pack/filebeat/modules.d/sophos.yml.disabled +++ b/x-pack/filebeat/modules.d/sophos.yml.disabled @@ -1,5 +1,5 @@ # Module: sophos -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-sophos.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-sophos.html - module: sophos xg: diff --git a/x-pack/filebeat/modules.d/squid.yml.disabled b/x-pack/filebeat/modules.d/squid.yml.disabled index 81d5f6e0af0..bc34fdcb5a6 100644 --- a/x-pack/filebeat/modules.d/squid.yml.disabled +++ b/x-pack/filebeat/modules.d/squid.yml.disabled @@ -1,5 +1,5 @@ # Module: squid -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-squid.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-squid.html - module: squid log: diff --git a/x-pack/filebeat/modules.d/suricata.yml.disabled b/x-pack/filebeat/modules.d/suricata.yml.disabled index 98e905fff23..14b1855a058 100644 --- a/x-pack/filebeat/modules.d/suricata.yml.disabled +++ b/x-pack/filebeat/modules.d/suricata.yml.disabled @@ -1,5 +1,5 @@ # Module: suricata -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-suricata.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-suricata.html - module: suricata # All logs diff --git a/x-pack/filebeat/modules.d/threatintel.yml.disabled b/x-pack/filebeat/modules.d/threatintel.yml.disabled index 717de295f33..d5a0365f40c 100644 --- a/x-pack/filebeat/modules.d/threatintel.yml.disabled +++ b/x-pack/filebeat/modules.d/threatintel.yml.disabled @@ -1,5 +1,5 @@ # Module: threatintel -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-threatintel.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-threatintel.html - module: threatintel abuseurl: diff --git a/x-pack/filebeat/modules.d/tomcat.yml.disabled b/x-pack/filebeat/modules.d/tomcat.yml.disabled index dc7a8d7eadd..1fda24706e3 100644 --- a/x-pack/filebeat/modules.d/tomcat.yml.disabled +++ b/x-pack/filebeat/modules.d/tomcat.yml.disabled @@ -1,5 +1,5 @@ # Module: tomcat -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-tomcat.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-tomcat.html - module: tomcat log: diff --git a/x-pack/filebeat/modules.d/zeek.yml.disabled b/x-pack/filebeat/modules.d/zeek.yml.disabled index 2ceeeea911d..4017a6e3997 100644 --- a/x-pack/filebeat/modules.d/zeek.yml.disabled +++ b/x-pack/filebeat/modules.d/zeek.yml.disabled @@ -1,5 +1,5 @@ # Module: zeek -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-zeek.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-zeek.html - module: zeek capture_loss: diff --git a/x-pack/filebeat/modules.d/zookeeper.yml.disabled b/x-pack/filebeat/modules.d/zookeeper.yml.disabled index f632c0de9e7..a2cb2977935 100644 --- a/x-pack/filebeat/modules.d/zookeeper.yml.disabled +++ b/x-pack/filebeat/modules.d/zookeeper.yml.disabled @@ -1,5 +1,5 @@ # Module: zookeeper -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-zookeeper.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-zookeeper.html - module: zookeeper # All logs diff --git a/x-pack/filebeat/modules.d/zoom.yml.disabled b/x-pack/filebeat/modules.d/zoom.yml.disabled index b7a5bc35a00..8fb6dffcaff 100644 --- a/x-pack/filebeat/modules.d/zoom.yml.disabled +++ b/x-pack/filebeat/modules.d/zoom.yml.disabled @@ -1,5 +1,5 @@ # Module: zoom -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-zoom.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-zoom.html - module: zoom webhook: diff --git a/x-pack/filebeat/modules.d/zscaler.yml.disabled b/x-pack/filebeat/modules.d/zscaler.yml.disabled index 732a033073b..8ca0cea079c 100644 --- a/x-pack/filebeat/modules.d/zscaler.yml.disabled +++ b/x-pack/filebeat/modules.d/zscaler.yml.disabled @@ -1,5 +1,5 @@ # Module: zscaler -# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-zscaler.html +# Docs: https://www.elastic.co/guide/en/beats/filebeat/main/filebeat-module-zscaler.html - module: zscaler zia: diff --git a/x-pack/filebeat/processors/decode_cef/cef/cef_test.go b/x-pack/filebeat/processors/decode_cef/cef/cef_test.go index 297642b559f..cc4a4ed786c 100644 --- a/x-pack/filebeat/processors/decode_cef/cef/cef_test.go +++ b/x-pack/filebeat/processors/decode_cef/cef/cef_test.go @@ -20,7 +20,7 @@ import ( var generateCorpus = flag.Bool("corpus", false, "generate fuzz corpus from test cases") const ( - standardMessage = `CEF:26|security|threatmanager|1.0|100|trojan successfully stopped|10|src=10.0.0.192 dst=12.121.122.82 spt=1232 eventId=1` + standardMessage = `CEF:26|security|threatmanager|1.0|100|trojan successfully stopped|10|src=10.0.0.192 dst=12.121.122.82 spt=1232 eventId=1 in=4294967296 out=4294967296` headerOnly = `CEF:26|security|threatmanager|1.0|100|trojan successfully stopped|10|` @@ -124,6 +124,8 @@ func TestEventUnpack(t *testing.T) { "dst": IPField("12.121.122.82"), "spt": IntegerField(1232), "eventId": LongField(1), + "in": LongField(4294967296), + "out": LongField(4294967296), }, e.Extensions) }) @@ -449,6 +451,8 @@ func TestEventUnpackWithFullExtensionNames(t *testing.T) { "destinationAddress": IPField("12.121.122.82"), "sourcePort": IntegerField(1232), "eventId": LongField(1), + "bytesIn": LongField(4294967296), + "bytesOut": LongField(4294967296), }, e.Extensions) } diff --git a/x-pack/filebeat/processors/decode_cef/cef/keys.go b/x-pack/filebeat/processors/decode_cef/cef/keys.go index 7ea0f00d446..43854a304c0 100644 --- a/x-pack/filebeat/processors/decode_cef/cef/keys.go +++ b/x-pack/filebeat/processors/decode_cef/cef/keys.go @@ -90,11 +90,11 @@ var extensionMapping = map[string]mappedField{ }, "in": { Target: "bytesIn", - Type: IntegerType, + Type: LongType, }, "out": { Target: "bytesOut", - Type: IntegerType, + Type: LongType, }, "customerExternalID": { Target: "customerExternalID", diff --git a/x-pack/filebeat/processors/decode_cef/docs/decode_cef.asciidoc b/x-pack/filebeat/processors/decode_cef/docs/decode_cef.asciidoc index 9910e4d39f4..859d24c49c2 100644 --- a/x-pack/filebeat/processors/decode_cef/docs/decode_cef.asciidoc +++ b/x-pack/filebeat/processors/decode_cef/docs/decode_cef.asciidoc @@ -6,8 +6,17 @@ decode_cef ++++ -The `decode_cef` processor decodes Common Event Format (CEF) messages. This -processor is available in Filebeat. +The `decode_cef` processor decodes Common Event Format (CEF) messages. It +follows the specification defined in +https://archive.org/download/commoneventformatv25/CommonEventFormatV25.pdf[ +_Micro Focus Security ArcSight Common Event Format, Version 25_]. This processor +is available in Filebeat. This is an example CEF message. + +`CEF:0|SomeVendor|TheProduct|1.0|100|connection to malware C2 successfully +stopped|10|src=192.0.2.10 dst=203.0.113.2 spt=31224` + +Any content that precedes `CEF:` is ignored. This allows the processor to +directly parse CEF content from messages that contain syslog headers. Below is an example configuration that decodes the `message` field as CEF after renaming it to `event.original`. It is best to rename `message` to diff --git a/x-pack/filebeat/tests/integration/managerV2_test.go b/x-pack/filebeat/tests/integration/managerV2_test.go index 48f2069220b..3332d549fa2 100644 --- a/x-pack/filebeat/tests/integration/managerV2_test.go +++ b/x-pack/filebeat/tests/integration/managerV2_test.go @@ -10,11 +10,11 @@ import ( "fmt" "os" "path/filepath" + "sync/atomic" "testing" "time" "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/structpb" "github.com/elastic/beats/v7/libbeat/tests/integration" "github.com/elastic/beats/v7/x-pack/libbeat/management" @@ -62,7 +62,7 @@ func TestInputReloadUnderElasticAgent(t *testing.T) { Id: "default", Type: "elasticsearch", Name: "elasticsearch", - Source: requireNewStruct(t, + Source: integration.RequireNewStruct(t, map[string]interface{}{ "type": "elasticsearch", "hosts": []interface{}{"http://localhost:9200"}, @@ -87,7 +87,7 @@ func TestInputReloadUnderElasticAgent(t *testing.T) { Streams: []*proto.Stream{ { Id: "log-input-1", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "enabled": true, "type": "log", "paths": []interface{}{logFilePath}, @@ -108,7 +108,7 @@ func TestInputReloadUnderElasticAgent(t *testing.T) { Id: "default", Type: "elasticsearch", Name: "elasticsearch", - Source: requireNewStruct(t, + Source: integration.RequireNewStruct(t, map[string]interface{}{ "type": "elasticsearch", "hosts": []interface{}{"http://localhost:9200"}, @@ -133,7 +133,7 @@ func TestInputReloadUnderElasticAgent(t *testing.T) { Streams: []*proto.Stream{ { Id: "log-input-2", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "enabled": true, "type": "log", "paths": []interface{}{logFilePath}, @@ -266,7 +266,7 @@ func TestFailedOutputReportsUnhealthy(t *testing.T) { "../../filebeat.test", ) - finalStateReached := false + finalStateReached := atomic.Bool{} var units = []*proto.UnitExpected{ { Id: "output-unit-borken", @@ -278,7 +278,7 @@ func TestFailedOutputReportsUnhealthy(t *testing.T) { Id: "default", Type: "logstash", Name: "logstash", - Source: requireNewStruct(t, + Source: integration.RequireNewStruct(t, map[string]interface{}{ "type": "logstash", "invalid": "configuration", @@ -300,7 +300,7 @@ func TestFailedOutputReportsUnhealthy(t *testing.T) { Streams: []*proto.Stream{ { Id: "log-input", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "enabled": true, "type": "log", "paths": "/tmp/foo", @@ -320,7 +320,7 @@ func TestFailedOutputReportsUnhealthy(t *testing.T) { // So we wait until the state matches the desired state CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { if management.DoesStateMatch(observed, units, 0) { - finalStateReached = true + finalStateReached.Store(true) } return &proto.CheckinExpected{ @@ -338,18 +338,166 @@ func TestFailedOutputReportsUnhealthy(t *testing.T) { ) require.Eventually(t, func() bool { - return finalStateReached + return finalStateReached.Load() }, 30*time.Second, 100*time.Millisecond, "Output unit did not report unhealthy") t.Cleanup(server.Stop) } -func requireNewStruct(t *testing.T, v map[string]interface{}) *structpb.Struct { - str, err := structpb.NewStruct(v) - if err != nil { - require.NoError(t, err) +func TestRecoverFromInvalidOutputConfiguration(t *testing.T) { + filebeat := integration.NewBeat( + t, + "filebeat", + "../../filebeat.test", + ) + + // Having the log file enables the inputs to start, while it is not + // strictly necessary for testing output issues, it allows for the + // input to start which creates a more realistic test case and + // can help uncover other issues in the startup/shutdown process. + logFilePath := filepath.Join(filebeat.TempDir(), "flog.log") + generateLogFile(t, logFilePath) + + logLevel := proto.UnitLogLevel_INFO + filestreamInputHealthy := proto.UnitExpected{ + Id: "input-unit-healthy", + Type: proto.UnitType_INPUT, + ConfigStateIdx: 1, + State: proto.State_HEALTHY, + LogLevel: logLevel, + Config: &proto.UnitExpectedConfig{ + Id: "filestream-input", + Type: "filestream", + Name: "filestream-input-healty", + Streams: []*proto.Stream{ + { + Id: "filestream-input-id", + Source: integration.RequireNewStruct(t, map[string]interface{}{ + "id": "filestream-stream-input-id", + "enabled": true, + "type": "filestream", + "paths": logFilePath, + }), + }, + }, + }, + } + + filestreamInputStarting := proto.UnitExpected{ + Id: "input-unit-2", + Type: proto.UnitType_INPUT, + ConfigStateIdx: 1, + State: proto.State_STARTING, + LogLevel: logLevel, + Config: &proto.UnitExpectedConfig{ + Id: "filestream-input", + Type: "filestream", + Name: "filestream-input-starting", + Streams: []*proto.Stream{ + { + Id: "filestream-input-id", + Source: integration.RequireNewStruct(t, map[string]interface{}{ + "id": "filestream-stream-input-id", + "enabled": true, + "type": "filestream", + "paths": logFilePath, + }), + }, + }, + }, + } + + healthyOutput := proto.UnitExpected{ + Id: "output-unit", + Type: proto.UnitType_OUTPUT, + ConfigStateIdx: 1, + State: proto.State_HEALTHY, + LogLevel: logLevel, + Config: &proto.UnitExpectedConfig{ + Id: "default", + Type: "elasticsearch", + Name: "elasticsearch", + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "type": "elasticsearch", + "hosts": []interface{}{"http://localhost:9200"}, + "username": "admin", + "password": "testing", + "protocol": "http", + "enabled": true, + }), + }, + } + + brokenOutput := proto.UnitExpected{ + Id: "output-unit-borken", + Type: proto.UnitType_OUTPUT, + ConfigStateIdx: 1, + State: proto.State_FAILED, + LogLevel: logLevel, + Config: &proto.UnitExpectedConfig{ + Id: "default", + Type: "logstash", + Name: "logstash", + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "type": "logstash", + "invalid": "configuration", + }), + }, + } + + // Those are the 'states' Filebeat will go through. + // After each state is reached the mockServer will + // send the next. + protoUnits := [][]*proto.UnitExpected{ + { + &healthyOutput, + &filestreamInputHealthy, + }, + { + &brokenOutput, + &filestreamInputStarting, + }, + { + &healthyOutput, + &filestreamInputHealthy, + }, + {}, // An empty one makes the Beat exit + } + + // We use `success` to signal the test has ended successfully + // if `success` is never closed, then the test will fail with a timeout. + success := make(chan struct{}) + // The test is successful when we reach the last element of `protoUnits` + onObserved := func(observed *proto.CheckinObserved, protoUnitsIdx int) { + if protoUnitsIdx == len(protoUnits)-1 { + close(success) + } + } + + server := integration.NewMockServer( + protoUnits, + []uint64{0, 0, 0, 0}, + []*proto.Features{nil, nil, nil, nil}, + onObserved, + 100*time.Millisecond, + ) + require.NoError(t, server.Start(), "could not start the mock Elastic-Agent server") + defer server.Stop() + + filebeat.RestartOnBeatOnExit = true + filebeat.Start( + "-E", fmt.Sprintf(`management.insecure_grpc_url_for_testing="localhost:%d"`, server.Port), + "-E", "management.enabled=true", + "-E", "management.restart_on_output_change=true", + ) + + select { + case <-success: + case <-time.After(60 * time.Second): + t.Fatal("Output did not recover from a invalid configuration after 60s of waiting") } - return str } // generateLogFile generates a log file by appending the current diff --git a/x-pack/functionbeat/Dockerfile b/x-pack/functionbeat/Dockerfile index 3d0953e88e1..b49fdc7bfd8 100644 --- a/x-pack/functionbeat/Dockerfile +++ b/x-pack/functionbeat/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.10 +FROM golang:1.20.7 RUN \ apt-get update \ @@ -11,7 +11,7 @@ RUN \ && rm -rf /var/lib/apt/lists/* # Use a virtualenv to avoid the PEP668 "externally managed environment" error caused by conflicts -# with the system Python installation. golang:1.19.10 uses Debian 12 which now enforces PEP668. +# with the system Python installation. golang:1.20.6 uses Debian 12 which now enforces PEP668. ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" diff --git a/x-pack/functionbeat/docs/troubleshooting.asciidoc b/x-pack/functionbeat/docs/troubleshooting.asciidoc index b18a37a2fe1..777f24edd82 100644 --- a/x-pack/functionbeat/docs/troubleshooting.asciidoc +++ b/x-pack/functionbeat/docs/troubleshooting.asciidoc @@ -9,6 +9,7 @@ following tips: * <> * <> +* <> * <> //sets block macro for getting-help.asciidoc included in next section @@ -29,5 +30,14 @@ include::{libbeat-dir}/getting-help.asciidoc[] include::{libbeat-dir}/debugging.asciidoc[] +//sets block macro for metrics-in-logs.asciidoc included in next section +[id="understand-{beatname_lc}-logs"] +[role="xpack"] +== Understand metrics in {beatname_uc} logs + +++++ +Understand logged metrics +++++ +include::{libbeat-dir}/metrics-in-logs.asciidoc[] diff --git a/x-pack/functionbeat/function/provider/provider.go b/x-pack/functionbeat/function/provider/provider.go index f3b4d56bd8a..6c33eb80b1a 100644 --- a/x-pack/functionbeat/function/provider/provider.go +++ b/x-pack/functionbeat/function/provider/provider.go @@ -8,8 +8,6 @@ import ( "context" "fmt" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/feature" "github.com/elastic/beats/v7/libbeat/publisher/pipeline" "github.com/elastic/beats/v7/x-pack/functionbeat/function/core" @@ -51,7 +49,7 @@ type Runnable struct { func (r *Runnable) Run(ctx context.Context, t telemetry.T) error { client, err := r.makeClient(r.config) if err != nil { - return errors.Wrap(err, "could not create a client for the function") + return fmt.Errorf("could not create a client for the function: %w", err) } defer client.Close() return r.function.Run(ctx, client, t) diff --git a/x-pack/functionbeat/function/provider/provider_test.go b/x-pack/functionbeat/function/provider/provider_test.go index e68eb9f57a4..47385cbb029 100644 --- a/x-pack/functionbeat/function/provider/provider_test.go +++ b/x-pack/functionbeat/function/provider/provider_test.go @@ -9,7 +9,6 @@ import ( "errors" "testing" - e "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/elastic/beats/v7/libbeat/beat" @@ -47,7 +46,7 @@ func TestRunnable(t *testing.T) { } errReceived := runnable.Run(context.Background(), telemetry.Ignored()) - assert.Equal(t, err, e.Cause(errReceived)) + assert.Equal(t, "could not create a client for the function: "+err.Error(), errReceived.Error()) }) t.Run("propagate functions errors to the coordinator", func(t *testing.T) { @@ -59,7 +58,7 @@ func TestRunnable(t *testing.T) { } errReceived := runnable.Run(context.Background(), telemetry.Ignored()) - assert.Equal(t, err, e.Cause(errReceived)) + assert.Equal(t, err.Error(), errReceived.Error()) }) t.Run("when there is no error run and exit normaly", func(t *testing.T) { diff --git a/x-pack/functionbeat/manager/core/makezip.go b/x-pack/functionbeat/manager/core/makezip.go index aa311db9c34..6f5c2c2d530 100644 --- a/x-pack/functionbeat/manager/core/makezip.go +++ b/x-pack/functionbeat/manager/core/makezip.go @@ -9,8 +9,6 @@ import ( yaml "gopkg.in/yaml.v2" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/cfgfile" "github.com/elastic/beats/v7/libbeat/cmd/instance" "github.com/elastic/beats/v7/x-pack/functionbeat/config" @@ -105,7 +103,7 @@ func keystorePackager() (keystore.Packager, error) { store, err := instance.LoadKeystore(cfg, "functionbeat") if err != nil { - return nil, errors.Wrapf(err, "cannot load the keystore for packaging") + return nil, fmt.Errorf("cannot load the keystore for packaging: %w", err) } packager, ok := store.(keystore.Packager) diff --git a/x-pack/heartbeat/include/fields.go b/x-pack/heartbeat/include/fields.go index f284bbb9ea5..5952fb2168d 100644 --- a/x-pack/heartbeat/include/fields.go +++ b/x-pack/heartbeat/include/fields.go @@ -19,5 +19,5 @@ func init() { // AssetFieldsYml returns asset data. // This is the base64 encoded zlib format compressed contents of fields.yml. func AssetFieldsYml() string { - return "eJzsvft7GzeyKPh7/gqsZr+VlEO2SL0sa+/sXkWSE33HD40lT+Yknk8Eu0ESoybQAdCSmbPnf98PVQAa/ZBMyaJjZ3xvjociu4GqQqFQVajHX8jPR29fn73+8f8gJ5IIaQjLuCFmxjWZ8JyRjCuWmnzRI9yQW6rJlAmmqGEZGS+ImTFyenxBCiX/xVLT++4vZEw1y4gU8P0NU5pLQQ6SQTLoZ+wm+e4v5DxnVDNywzU3ZGZMoQ+3tqbczMpxksr5FsupNjzdYqkmRhJdTqdMG5LOqJgy+MoOPeEsz3Ty3Xd9cs0Wh4Sl+jtCDDc5O7QPfEdIxnSqeGG4FPAVeeHeIe7tw+8I6RNB5+yQrP9vw+dMGzov1r8jhJCc3bD8kKRSMfhbsd9Krlh2SIwq8SuzKNghyajBP2vzrZ9Qw7bsmOR2xgSQit0wYYhUfMqFJWHyHbxHyKWlN9fwUBbeYx+Moqkl9UTJeTVCz07MU5rnC6JYoZhmwnAxhYnciNV0nYumZalSFuY/m0Qv4G9kRjUR0kObk0CeHrLHDc1LBkAHYApZlLmdxg3rJptwpQ283wBLsZTxmwqqghcs56KC662jOa4XmUhFaJ7jCDrBdWIf6Lywi76+PRju9wd7/e2dy8HB4WDvcGc3Odjb+WXdrc6Elrm5gqHCIvrlz+mY5bpz4XGV5dhyOHyBH6/w+2u2uJUq62CA41IbObcPbCGtCsqVDrgdU0HGjJR2uxhJaJaROTOUcDGRak7tIPZ7hyu5mMkyz2CLplIYygURTNslRXCAre3/O8pzXBtNqGJEG2kJSLWHNABw6gk3ymR6zdSIUJGR0fWBHjlytCj832u0KHKeAnRrh2RtImV/TNVaj6wxcWO/KZTMyhR+/59lCD9nWtMpu4fyc2rS2ZUU+eLKsA+mg9IvpCK5nDpaASu5YR3jOIrhT/ZJ93OPyMLwOf89sKxlsRvObu124oJQeNp+wVQgnJ1OG1WmprSkzeVUk1tuZrI0hIpqx9Rg6BFpZkw5yUNSXP1UipQaJqJNY6QFYk4omZVzKvqK0YyOc0Z0OZ9TtSAy2qzxDp6XueFFHnDXhH3g2kqLGVtUE87HXLCMcGEkkSI83Vzrn1ieS/KzVHm2xCoaOr1v88SbhE+FVOyKjuUNOyTDwfZue0Vfcm0snu49HXaJoVPCaDrz2NfZ89eY+5Alt9f+uQwX0ikTyFnuBDkKX0yVLItDst3Bd5czhm+GVXU708lxSujYMgVK3Im5tRvSympjz9OJWzoqFnaNqN3YeW63co9kzOAHqYgca6Zu7HIie0vLljNpV1YqYug102TOqC4Vm9sH3LDhseaG14SLNC8zRn5g1IoWwFWTOV0QmmtJVCns225epRM4PAHR5HuHqhtSz6w8HrNK9MNOsPBTnmvPq0gkVQph95VEAlnYIvyUG/J2xlR8UMxoUTDLsRZZ2NkBVThELAGE496JlEZIY3nBI3tIznC61CodcoJIwz63G7dXwZdYViBO8RkzapJovx+dvwIVyB3SdYTcitOi2LKo8JQlpOKNWKBnknnSgSQHnYbwCXIL18Qe5cTMlCynM/JbyUo7vl5ow+aa5Pyakf+kk2vaI29ZxpE/CiVTpjUXU78o7nFdpjMr+F/KqTZUzwjiQS6A3I5kuEGBye/ZJ7HGVO2accnzLPHyzs3elABdMuBOKdDcYacfDBOZ1RDsVDVSThw/4Np5Hne6FIp9q1QJN4CRYXdSsegYD3YgxYVAFSgMaXdGoeQNz1jP6kS6YCmf8JTg26B7cR00REfZSDLNmVE8tTwVVOJnyX4yIBt0nu3vbvZIzsfwM3796z7d3mEHk4PJzmCyNxgMx3Rnd5ftsr3d7CB7no4PttPxcPAsDSBafAzZHmwP+oPt/mCPbO8cDgeHwwH5j8FgMCDvLo//GShcW+EJzTWrLSsrZmzOFM2veFZfVOaW4wkW1s9BeGYl4oQzhdKCa7dvNvgEDig4xfRmc4m5VYbUHBRPbxvQVEltF0Ibqqz4HJeGjJBDeDaC7Wc3XnuFDuiuJfSkRogm+k/D0+8E/81qzg/HO2hsViKhHIP3bkE1HDMCUot3MKBDL6uhZ/9dBYJO8QVxGh8ArRXUhOJTePqhhjLlNww0Xyrca/i0+3nG8mJS5lZmWgngMAwDm1tJXjj5TbjQhorUacKN40fbieEMskzitC1SaVusoAokQxibayIYy9C8vZ3xdNaeKgjyVM7tZNZyi/A+m1j54Q8aQBVPIP+VnBgmSM4mhrB5YRbtpZxIWVtFu1CrWMXLRXHP8vnDzU5AaH5LF5poY/8NtLXWhJ551sRldYYevmuVuqQijQhHdKBq9SyyuJtozKpHQGPhk9rCVyvWZIDa4s9pOrPWZpvE8Tiezk5wr4DUf3dHQp3YDZj2wYWi0u1Ya9U1lbU0Usi5LDW5AA3gI+rrkSC0egWVBrJxdLGJG9Mpow6wVArBwBdxJgxTghlyrqSRqfTn/sbZ+SZRsoTTsFBswj8wTUqRMTyn7emrZG4Hs9JNKjKXihHBzK1U10QWTFEjldVvvfuAzWg+sS9QYtWbnBGazbng2tideeN1aTtWJueoeFNDnEcEkZjPpeiRNGdU5YvqBAQbKEArc54uwL6YMVAZLILJJ+tHopyPg1573xGay6C81ZbIHRU4DqF5LlPQsR2kreVzamf4OmwEt7puoI2ji9ebpITB80V1Emm0rcKS4F45q9EjYsnh3nD/eQ1hqaZU8N9BbCbt4+VT1Aewbq9iKkci0LsFyL1Og47lq5SfBuXfRJjALC3sf5TScuTLl8fRjkxz3jAkj6tv7rEkj9ybdut57qTasSM33O4M3Ah+cdyGdJqwBw4tRMWmVGVgOVjDQArdi55Hq2HM0bXLpaA5meTyliiWWmO75ue4PD53o+I5VYHZgs1+YR+PIIPtqJkI9qJ95uK/XpOCptfMbOjNBGZB10jhBEprKnRfWkWvNqk3dBVo3kxbOJwp5qlkFBWaAjAJuZBzFoyjUqORaZiakzXvk5VqrXLDKDbxssuBIhoIatxw7mfnBMCVHbNgBIMTICKA24wWLDH1y1xNEcOPbg7HRH4Ce5aVurQEcaNW1jcXFrx/lQIXAIxxNK+9x7xjsIq+QprWkFbNwvXqwz72LsngyMTxtvw8wSUNmwcVN5plRLM5FYancBKwD8bpeOwDau89VKm8HNBB0zOS3HCLLv+dVZ4ViyhTYM9pbkrqluNsQhayVGGOCc1zz3z+fLAydCrVomcf9SqKNjzPCRO6VE4fdX5wq8ZkTBvLHpaklmATnudBjNGiULJQnBqWL57AqqZZppjWq7K8YBega8XxnJvQaUlB/MzHfFrKUucL5HJ4JwjSW0suLecM7gVIzjU4P8/Oe9aIxtNYKkLtMfOBaGn5JyHkvyqKB62x0qFwfyh662Hy+2GUuC9GSLK6LioIN5GqmZXoo8aDcpTwYmRBGSUI1qhHMlYwkTljADV5KSogwM/jVrLStZJ/u+Oc6uTf9kSPvFwLw/RH1P5oxdEnVH+tBsgP9gd09IV7PbcTHSOgIG0v0MFuDTBk55XYflbK4h6OrXgHpWPOhjWPd1xzurBbED3P8LKVB5PSHi6/WRk+4SyLxwZlhArUAOxLYVRB0YIGeuJWqObImLIGQCBguHTxd6wARZa5y9MwKBOKp7O5PVW7LOvE/ZGk7h1P6ymTScrN4mpFTpNja8d0cuUrazcx516tgSOF4YIJc5XKbBUwXd7Kfs6MYfY4zVj9rjnMvq674X599N1HNmg3Misi8OuYj/1kbaClMjNyNGeKp7QDyFIYtbjiWq6K5sc4BTm7eANEb0F4fHQnWKtiTQdS5yofU0GzNqXgZPu4t2TK5FUheVAr6peAUky5KTNUwXJq4I8WBOv/TdZyuI3uP9tJ9oe7BzuDHlnLqVk7JLt7yd5g7/nwgPzPegvIpz3OGk5ezVTfq1LRT2jEefL0iHNyoWItJ2SqqChzqrhZxDrRgqRWNwNLIhK8x17lCS5E5HCuUElOmT3snT01yaVUTmfogctsxitrpVIuELycFLOF5vaDv7FMvYzSEQivpYkiQOCelqNjaQ66zZRJj21b4o6lNlL0s7S1NoXUhuar2mXr5zA8ijWqtUx5dXeJMQIO5ArRv7uYikrbd1dQ4bopXKCOGbkW8lZY244SiwpMJBX55eycRDgRYG1QpW+oWpBbnlkNDk41t6vx4go+tun3fHewO3iImFVsyqVYpQB7CzPcJ7/6fzu+C64VSTAHU6cA+1vJxqzNf9aq+b2yCZ70WJ0xDIb6HfygkxrD9cKt7dnR66PouU7g3UG1daSmcCzTrR9KJqS+OuIqUj4/whi8+AiW4YEaHmfnwUqr64cbZ+c3u5bbz85v9jeT2lxzmq5iP786Ou4GpnFpIaQJt8dz6hTwty+OybPB7jbcv2O0IcsOyak1nmRqmCEb4BDgukcO+mNeqahWx9/Eq1+nGrlgtltJfi2LgqmUavZPMmMfaMZSPqc5yfiUG7j7sWqU8VptGNOBjxNbASJIKTSfuqAdNmUqIRdlCnf+N+5BF+uFd1YIAw0jzhbFjHVI38GgPxj0907h353+9k5tpQQ1SZMzOs/Hbu5Yv1RUaPQgnZ1brJw/BQNEXx9dBuck2WDJNHF+dyuVK5cpQU+cd8nXLoHDoRP544hRFC5qxJTkkmZkTHMqUjgDJ1yxW5rn6P9UsrRHY8PKt0gXUpmHGfne5NNG8W7LP6aGHf9roQf6/R5g/dawPse3H2XrbtfhaK3JMib43etx7tYgFhTxfPY80oYpll11WdlPpydaoTTj0xnTJprU0wjn7gEiRcEyD7Iux/hTtP4vqttw1Pei4Zy9bfWVtYaVu2bF11r8Rbdh767fM2aYmoNWWyiWcm31FVCbKPoAIUYJgnnLcc5TosvJhH8II8IzGzNjisOtLXwEn0ikmm4m5FItQCxKVLQ+cKtFopI1XhDN50W+IIZeV+uKPsOcagNiFyNXUacS0hBwfd2yPAfsL1+eVHFRa6lMyuu1tmC8ywkQyL5KbgiTANMHk+EeF4qP54tU+Dz3rAL6OmEfUlaYKuwOXqvuZlvsnsB9PCUFVYZHFw2kBQEID45z2f9zv6M2U9k1YICUdk3szCkV1U0DqfNVL6JAiNttITRmubztZvPuPVHfNzFt125vbxNGtUnmCzcCMgbuDKrNWhSlgEC4UWZUV2G3gCuoH2GaSptb0+V4O9HleFjbfL0aE1fgoUHhXNo+bq0aY62He05IK+B5DpfYTHHZEfpjEVhWEzSyuAI0PoPUY5OJPaRumJ3VMYrDfoNdvjzZ7KExFSypiu6BaCg6ev46EoSAZVnPK9EmSdoCsjlvGDYKLLKrBHzwdUtGkIp3CcVqJZYTj/B9jW9KzVSyWpaJ/Xd4cy0V3gfbyTFkZc7gPkRO7joWqSAvT47OIRAWMT4JQ8W8st7Gjs0pz1eE3DuLAUzgjZikDYCVnh0G8ld0A2PRXNfVMQBOKHpDeU7HeYdxm4+ZMuSUC22YY6waReB69Q9jO5h99XyHSK4sELcdjOrjqhE/Hy8HVz5bRU6NVa472BPhXKFLNV4JnKwNxIzq2ao4wVEKpI2dBx1zSjFr1bUi06kTS4JQIcUiTjFC+yRilXeauYjWEWDBM7yvhj8sdqOgAqRSTHCtaF6bk4qsQ6uCCMsOplpJYPMdcc1IstbuvugP+3v97WF/e7C9u737fLj97OBZf3v/+fbu9vPdwW5/e2dv+Hxv/9nBfn84GAzaSDyds/Azy8GLmbU+0V0PWShc3EsqmrA7ZaCSefNy+slY/kgpCulmwMowk7+vAL9kPRGtAfT6r2vXfEwFvYKYzbUeWVMMtG4xvbID+sSsO+lWxdTJEgEPIXX+i7sj6jDVl+DuDBEWMBQYLGKiaMjhq9BAPxrGbntnAkRwkzuziybkVZXdwXUcZk4FOT3eRovLbtAJM+mMabibiUYn3GiX0FUBaTd3PW+xllDGdQhfroPgxlWlcJliis2lCcHORJZG84xFMzUhQ5gocalMHiHPOqJ61d0r1VMscdBqIMjZcpN7h48dlusKVEewKB/aA+ei1FxYgWb5pO/SXtF6hadcClLyPYpB+MpQNWUm+Z4QI2vMPfbBApg9Z5/yMK2v64j6XrR6jF1EmZxYItRYRCpL1qm0WLhQRN0jiukC9ep8kZCf5C27YSoimWZGkw4E3KANNOalNdulcVmjE7hpC/dVSkrjQA+DE+e0hlPACwNZUaHigAg1iENKTUnzsFCO0pimh7didoE8A/vZGojYFbMiMuQ4OzLGk3kyBqJV9PSpvNInXsVRHgZDW8OatRcNw0U8bHdQdAkIW8tawXYHRdsc1QHdEwQJpnApuDrFcL3ag24uYPM4iIpnIS/XHfoLkvHJhKnYXQ23xxyyTq2qbI/avmGCCkOYuOFKinn9nqaSrUc/X4TJedbzAVog/8mbtz+SswwzZCF4qGzqH23LdX9//9mzZwcHB8+fP+8k5ypDAtoE9SoAzTnV99Ay0DDQ6NNoicZXi5oZ10VOF7EpEvuRsCxHP2M3y7qTnG3Hc24WV+3b1KdTVKJ58LaU+7BOOCnxbFUMb1yAZapTiLgozJYGU+o+o9r0h/XbYZ9TtLqtd+Zzyc5OvEgGFcIf+E1AeX+4vbNrVeXnAzpOMzYZdEO8Qu4OMMfxgm2oo2tg+LKdvPZkEL3yOkeUx3YvGc12MmcZL+s+f3egfZO3TyJvlxAaDYJ/k8hPKZE9cf9Mgnl5tL8e0f0InP544b480F+++F8eF1f77LOcDG6uWOZ2SZaaHDkP7/TI0e+lYtE3HZUqFn03ySPJ8HnktScERsUtSwKUsnUidIvW+YI8mgzWWl0mS+iTo9g9JWDCxCMfF/+it7pHqMW3R6ZpUd02S4VxaDSXKaOi7XK8XTp60CGOEZwrQtsFcD7p4fFA/Hxhn8/D3x4RXxYiLmOTcW24mJZcz/xzuuGkg+pPlbLir22wTBloKp5teoRNQRM5Pd4mN5q8pPNxRnvkx+Nz8uPxKbmpNJyjoiCnYspF2EN/f2Vfsd+7kkJdO5EWBWHuNfvZgdxzmKpS9MiEqik1rEdymL69H/H7ZZfs310k/7vL4j+ZEI6DEr8+ERuC574J0K9GgDof+Tenx+dyejQI/s3p8ZROD0/cfzOnh0P7T+X0aOL0VTg9HNB/CqeHw+XfXcNukOHfVdGuyPBn0reXR/zr1MiXx++bzv6l6+whSE5m7ErzqaCm9KXXXbSczBi5qP1yd9jc5Yxp1qxmXoszhfizMRdULTB9PkyqP71gYsanTJsrmk+l4mY2XyXPzaieQf01P1nQfC1GmKiBlbXvTvuocWWgAzb8oNhAhWvikndDohBUzApD+o4clunhSQUFaV3mSMXPSJsK3Da/6Bnd3ttfdotjeeE6hVsBtGMpc0ZFFxF/wJ8gDJoWEEbJsVKno4NF3WVFt6NDLRt8JP4zch3wqd3nKyxHbRkiClxelhN4h7nkKsH7LhlkTkU5oa5XxHhhKeRbAdwwkUmVRGOyqnK5Yjm7oZgoe1RYvvn+zQUErHVl5MwTOydLPhSpPY4/LJamraGmXFmxuaMs467EZFuKwHnOlMF0QeZA6abxpMx9zf4plB9Si8LIqaLFjKeEKSWVrsIh41FvaM6zuJyKVFYIaePnIy8ZvWGkFFEVxYlPzIdXq1e8FlKNH4a9tbazSGcsve4qAX/69u2bt1fvXl++fXdxeXpy9fbNm8ul16jEjjMrKo9xgcPXS3150R60uqogFU+VtDxMjqUqZK1I9scVC0bnK97Hdoqn3MwwnlRut7pyxH4Lu4YjUbxp5Rx52B4+/dtP//jl4NXB0d+XpqXvyLQENbOKVWsUO7FbhIqM1DtV1U/2Rg8pKOwNZ1pbrm8Ptof9gf3vcrh9OBwc7gx+WVrOwx5jyzDHPefS+oWR9hCGpYv2ecfeJemsni/8d7vhMby4ev2u93xQeirnvt5kD0k549XxXsvk9eHGlaSxp7+UuXbtJ1y4OAExgnoBCqkWuzzsBAVJ9ol07T7wMTEOrKr60X/DFOaJ0ynlIqrrZ98ICqRV8WNPYacspjXif0TQLkOYSmsGDdfJuKAwx1/eU7Q5PFgvzOtK5raaeUW9gFz/EAdkgCJE7JvQog3D5KvI8e+8wIr09BnLiygVDVIvsKpIGFm7pA6xsLaH3etPEIOeFmVShuZd9zOWTmnOsqtJLmlnsbf1c6ZSq+Yen79DGqLRy7Xr8sF/r/rEubqncgJP2zMwKn0gMsINUdgQBLAeWJYdJuQipZApb7UxqewpMhgE/tH441X847K7K+P6OlGMZklHrdAHVYiF80vavVThCGOSjSktp2wTGlQQjeV/sCbEBp1OFZtGLcRcWhHNcwBNbxLNRcqqdHDsRxOV+F/alwmo3ipu2GfA1c5jmPgD0V1lomS17XlWj47mczpdqdMl9qjBZCHDCQGyIhY7Cnla1UEzdLoiyCqZ6uCi00YyfNSp8f7po46N9/RsbHr9YVbX/rA275zNpVo8ncB7BeMRGI8UKP3sx+UFWGD/JxNkK2S5amFFqGQXpsUK1QmbQu2DpxAsd4kUKEVlz2F7IOd5KI4NFbUmNG07Zqpd8WRSxePLxeoQDr1VPeZ/JMJO51gRa73F0cmcCjpF3Z3rCo2WkYLtTiM10GpMV9ooRuexInhiFamL6uuPdIKMRvGamaHXDAvScIGF9b1pIditazVXjR9KXut0xqIrnjPR9Ur94aqQYKhWET0aHLrQ/NMTXDbLxvrMz/hVlxQ5kXkuoSvqnArB1CEZ/XeEMFxq/k+/9pX9rJlpfAvlmwqasv8ZVcoshw6WLs856pAK9lKofTCj0A5ZeWNJOQ8NodpX/anoyMDgizDRCXklVaMrh2MVrOAzkaVwWaBch87UUB0Kgw6SVG6NczndoqLPhQm9RvtG9s2M9UNsAjW0j7P2cZX6uEq/2rcdjIXU5p9hjY8EOcW3NaMqndXWIJVCc0g+rfdOGtP0GvtPZjxlGq3PcGFQZxWoVjvXtfJIjfddbV9yUjJkDtxFN0xAZdL2uBqzkqFMEzKIHYp98KypmLYSw2BrjlpFlE7eZ9rVsAgdSkfvRz0y2rL/fG//+X/tP2v2n/9l//l/7D//n/2HjMgGsFXFJpse4lFvBBdlo7+MEt99XDPcMnWiQ8cXZoUe1PConJd3MMO05BnbYsL3LMdhtsIwW2mpFBNmy1G4nypGDesDlZKZmed/afxCC94vqJn1C6roXP8ak/CfT2CzuU25hCS2TGeoMFf3aEtrlcfa7qGowaaZoaSjhsyhQ61mQjPvhnOutffh6HkfmbteeCXvRatj7UhMufiQULAH7LoXSs6ZmbES/mIig3Lio3hkZlJkvhrnAmgQ03XLwZQ22C0Svs+wF/6M3jBPMaKZiUe9ZaGFEIrd92vgIePp+7VQQ8e/C08kZISlMty3I+cVikeFGcN1EA5MNRl1yNVR8l78wBYSHE4NRo6H7DgyUmu/KU4tkiwjcLxiYYJRgA3nnlEdbYN42JgxD98LQr4nr3yJAs8Ho/4If3ktQXdBD4ewKmkkzdea53O8xg/RXGH/PxVnH2HVE1/CPYyfgPEEH4PDx3UpoiABYV9yMY2J5U6i5L14RQVUSVea0Nza8gsf7shc4XYvjLGzJ114nyJyU23LdOkBQt76e243xphpQwpLbJ4yLEnuyJkQC048JEIGdeK8By6ucA4XLCP39ihx7SyRVZz7HLokQ9eleFx70kAznvDu3cxbP0PqvBqP6dh2FJYmZlrQZir5fQ+3xkN+IuNW3ceXZdslY8GW4dj1I0HkDVOWhCB7FwWrCSLHL3H7ADyd8gWyLsviMJq1XE71GjDfGmr+ei0hPzPCPhQsxe5d9uCnWUbWjLL7Ya3mhVvTC2FmzK7rWtXXjCoyKU2pOuKP7ITL+W2jflw1hb3x9T0Ke/RopXCiU7upIDJvS9U78AXosX3ZFpZKTuquWbgiqjqpYWGdWnO3nquxbDUU76uASGPXogs50i5o1FOddja48wvbgVvUMu5jzeLwHHbN4ip3813t0KIJQE3NoBIrapea5VzUGsFizy836tg3UgMfv6hjrO+a0JOhTky/XeJ+f2dRfSrk1TC2vx50d/T1+vUAb9ySHkpfwQEpup/zVAhYYhOIQOmvqitcrdndUq3hwrbHAZ6qNVwYFlrE4U781hruW2u4f6/WcPF29DXzQTJ+ef3hYlC/NYl7erp/axL3rUnctyZx35rEfWsS961J3Lcmcd+axH2VTeJiJfHL6BQXQfStXdwX0C6OF+Awj/jkIz3SWK05WqH4jRW8J69+2exqj1ZVTv6iOsRBS7Io8NNhCuGgFW2MtItlKXHCIDXv6TFcRc+3Bxixn6/xW23fky+o+1vN3fmtBdy3FnDfWsB9awH3rQXctxZw31rAfWsB91XftHxrAfetBdy3FnDfWsB9awH3rQXcA1rAZTmeuz7O6+VL+PP+hIxlCtmAyz3nY0UVZ5pkC0Hn6ETxBJU0Q0+a9HUD4GbD/QzhnLJgyvWkAhmpMY7cSoc1PaPQz702zxoqhVVtFzBovCEw9mkJzgJgBsfTLsY02FI+JePQQ/M9OUEE+jkX126+BdkYJVmejzZJKudzSKkAB5EU5GcuMnmrq/cvENw3WBBiY5Ro2fXeO8E/9EGZbeHegqUGxiLn464B5zR9c/EEGcm1KkjJt3JCn6+cUIP0X1F1oQbk34oNra7YUJPU32oPffG1h5pL9ucpRdTA7FtloqerTNQk7Z+tUFETv291i1ZUt6hB6G9ljO6gk9U+k3m2tyLp9epkD6d4EDx6RocrAujip6Ph4yCqVNoVwLS9t/84qPbctfdKoNobbj8GKp0xtozEfhRUFyenp+cPg2pFKkfNv+ts1eYBjEdKni/InBa6q3ICGGdQf1hftzfzNVOC5TvbiXdkLIFuQc2qHJkvyjxHiO0kLdwbwB8fvnd+gvcXYOPvbL9/FEIsgdxEw9JQiXgFdWbO35F4Gt+Q2/u0LdotFD/s7z4AC3twUrFYEQKYhANxpzBNi816Pr83I9TAUzxnfajp9qT6ccGSCLBVY9sIf34Esuc0jhH/OHJ2+KsbpvRnwM5N80jM9pOd5Pn+YJAMn+0O9x6AIp8Xq7wPOcJbkFBIrJDKuBY856e408iRIA4K0u9DoAg8RiK4iP3FXaF7O2fCxZSpQnHhqo1DztoNE4RODFNEMaSYy9/07XmsvtgHPCs9TVGhg/mvscSCTKEyR9ZzKX63GGUBmbxYW8UoWlX/sNBjanRdx1MCH6amViFkwhVjCxAUWC/GzBSjpq+YKxCyPRjubg2GW0ZhBZb+nObWaOsjcfrOmQgVQjoCMdP9g8FOusueb28P7YcspXvP93cozXb2s2zyAAbxGVFXsBlWeHUXdsKnSLOL86Oz15fJ6T9OH4Cis4NXjZeb5lPwWwvi+v2Ho1PvnIfPb4KbHY/gtfsJEO5NBBp0/t7k9QX8ec+9yQu8MXEJH3bCk9cX5LeSwQaE+kJC3zJVbQT7O9z/hPRnxmEvhiBncNuKac7CWAtSKC7hhmTKDODlhnWDbowyoaGo1CE8P9okeH4v/CTx6BBO4BPx8R7U3fiYkJyM04bcfo2xL7QWV+ZgQJv2lqETBdcuZHHAOG0o8dXR5lNketcosXSFw1YxCAp3d1EBASrcGxjyQ9OZm4torOdGFDOlEtE1tb9NaHa6uJwxAjEL12zh6FUlWfuFQfpr5mat55CPF+T0+KJyR79lqVSZGwtkNEjW2HM7r9DBH/3kgtzat06PL9zwzdwju8aW97AMBgQeQ0g9w6KhtYIP9jnP4+TIkDkXfF7Oe+7LMK5HCkpgRfyGNXRGFjgoQdBCg+sq4qVnDYowJIQSpnCgcvDMWYyoJoXUmo8xiiSDghtWL4zKm/hyczJi4xagVJO01Eb6cnDNLHaHc5rTlZUZwF4vFFMvwoL4Sn1V7TXf3waOedX23p297gTdjrYqXcdX+ItFI8ae+kD2+uZgFPac9Bl0+GrBRKZ9RA1UaAFp5UkSD+hxbx3/w0Hi/+ukwiozFpuJ30bGzYkaoJOCKYjdjWhzBm4wcEPKCTl+ffTqlECNIlcvTuY3ViuLhNP6usYaP6NIxJio6IQUDKUGhOLoQloSh+uYaBDYlwk5C7JKSOOjJptj+kzx0W8l06HCwcgeOyyq6BEtC4QQ3xE17pfGmGXiB+8tmMwh2NswdQP3WlZ0A8JAgc5V8O5ems5iyc4mIJhq1TG4TqnKWJaQX5iSvhrQHNylMxf3gTK0IuC4ohpO0VGXoJtRV9gI73JWNcF7pIwB3qzBPWM0Y+pqktPp6i4tfcDNNnFZ9VZM4swEZq71mypYamplmw7J0VGPXB73yNuTHnl71CNHJz1yfNIjJ286nMy/rr09WeuRtbdHPhbnrsrXT7o0FidMM4qvw6h2oQ1O6yiUnCo6R9YLtzqVYQepBkxhDZp4IKhbWfCqfAqKBd1hWW8Ph/U2xbLoSHp9cuRd2IwUeIGFChR2BXBXQNdcQK4P6q01VZaQOdOaTlkSB5BwDaFCjnZOgBl/LYjDoGoMlIGIpnjMO2n0t3enb/+rRqMgEz+brqCcdojnBJojH1ULaqJ7lSciHIUN0OITLziLXalMn9IipOiDi8OqgnF92w3MbdnZhronFgIy3N7fjFNFpK69UQnxOLeUasJ0Sgu7p6hmZDjwOaGabLw/OTnZrBTwH2h6TXRO9cwZer+VEqrRhJHdUAm5pGPdIylVitMpc1aDKz+b86ha0oSxLB4Bqskql8f43vTIe4VvvRfAf8zdIz7sdA3r/Ifn7X3L1fuScvUCX3zmpD1ecyo4DO/LtGsJi68ot+z29rab6N8SyVAEfkske1giWcVAn8c8cFbS/ZrF0dFRvaSSN1WvPqXmwVHLQ5fn5OzcKnIMGv+OYs/GqOFi8D+OvKfP8Q6fTHha5uBAKjXrkTFLaamDV/qGKs7MwptGMafOqdHWJIyKeSfk9IOB4sEBvqgqpAfUzJhiWOBX6CQizqjSWaEMODfBmwXhbFDq18zYHKqZREOjXoAvwe+Mag5B9WHEG65LaAzl1BWr4U6k6jRzIqeJtXeqP4dNw8frwZ/DDPBzdVfBef0GAjdr0K1wU6zHuyJ49X2QVNZzFIZKfJbx6sfWQpYqKuIe3QpA8NiU3zBtH4rvE3rwRRxjhlXww7iZ0GGUCcLWvBhYFooKAO/ld3cANSAa80vhi6IWTDn8N2SBXtd8YYfQUoYTxdlquC02E3IkMkKdhyaM2arrazfV3bcT3o9vrTgnDFr8HRy+obdvWrv3OT3+2L3PK2ZoP3ZS+xZ1zgv96a2dOy/aowAexX4ruWLxMJ/EzKfHF+HWHQ62QHfsg2FkQkYs1Yl7aIR5nB6MSiqCqgSyqNQGuybDFXfuykjGDpmfZ0zgWsLCpkrqSIPzld37fec0dRcaFiAIA875dGbyRZWlUXl6Kmzg/Sg/KGcGW6VPlbvhptm/LKi+zko6Y3PaoD+pZW51sNQwGSSDmKPySY2jXr4gP4FT6iOM1ZmH9ZKL8gM5/cDSEk3fl1xcw4cXWGdp4/Tli03ooAhl8z+Z+T5D3NErms6g2HUce+SIbKnVHXd0sN9fPvRovDDsSqpsqULDj8Hhh4VhRLPfSmiBIid3A/6SG5MzcioyTpcPuC/KqxWeX8fn78LxdS/Vz4RhS0etwYnApbiKAtMfE7/utChobMlEpQSFEkkW1HVdMT05s+KCGpcAFjYuN3F7PuVDCjK42LCKm68uOKHX6Et1wSWIilR66YhL9gEiepbAepJTY1h1c1yv0ckxGh2HYxlhOZuHtEcMPV8UbHm40B2e0DFfcfzW3+thW5ajjqJsqx8w/PvMt1IjG0c/nG0+FI1VOlFRRtcvGJv7Ylk4V3i7Cp3W8CiIgHTzPhBMJoxaxPVin6xEmyNmNcGnUtQ1pVwtD6+vDT4MsSVRuNX0AFcH/9Ig6ys65isC9eN7y1McNYg3Fw+l+AqPH8cd951Ay0L52YXaA3eai/R8qnMBh3uCc8GFMS0DmGBRxtajQqd8zFRrrcNJbe3pT4mP0uW4j9psGBK8yIJRMyMjlk8Sj3Hy/Wj5rRxeSmd8mbSTDiFZ63dR18JmvK9/K10G4piOec7NAlLbFR+XMcn0A7uIBritBJbFMgH4DwL9YkaFkIK44UlK87R0EcZBTXs00KsMG7DMd+H4EXaVixR4KIwrvChtgRjXKl4eQl9v/EpOJsv1MXwSYHG2TwBX89+XoexDmoW0gAy12O1kD4d1hWdjC1Q71MMhvOHKlDS/Wr4X0oP0uxaUbr56RbbHAPz41X8EtA9c/ak9cj/XkQmT/dFHJmL8wCPTvfQAFeOxG8VRzRMrMNODYV3xhm7A+bAtDXWGrkJFpBWB6TVMV4WpKvQEaUYQKsV1hMzS8BuWT1aYWeWHJ3oxH0uXgGS30ZIWRXDgKOW6Cnq/bfhi6dpZVES5Fq7YCVxGLCBGLWzed9gNd47bHZ9zwfxFwaCXWs7IhBlsT+mvdaBAXko1urlUHIaLHntuNMsnUR1ggaM/QabFirpbAJExsK8RLI6A122pbAUQ3F3SsQMCF0z4ETC6K9514O1jE+v73dD0+gq6hC6xZW55nqU04PyZa/NdYvWKFJpr+pbUXCPpLLcWOaR6sA+mjuRnClgIy9iLg0uw1gf4+eIUNKz6HRkswQv+L3pDk5yKafK6zPNzCUHlp/7xWIjc+JsoL0TCF/cLEbeBay1IXSoVVMz4YO4ozFQ1yQd+MoqnNWFQdc23jxJoUOQ6U+pWI9FG61ToS1k1J0fhVEV8vJRBNMF9n288HioeUhMyHiBiRkyrMUjoVy4nERJuPD8U9WV+LJdBMURisYeq7L2otasLkMbAlNBOwY3p05gghiduGICt8sIgqRTCKYljZm4ZVJKL+pfSeqdTnIwLbrDXkV2qXGqL25FfiY+TG1rW+CEh/0mU2IQmJ3NGdanAz6NDZ+s2ZaPH4LrD0GsWeDgmc8weFY3nbC4hy5BpO4wfLqso7frK3vAgkQybQ1R2qVhCLhiuuWvZbk+6EaLNMYnL3Sp7LxAUfA0JWWELx4llDlIoSmSoady9ftL1ZtrO0H+6Ro84eogD8RHmruZnpLrHjcIwIzzOehPRW+TMWDYC1qgiDWZUeHqn1LCphPAOP35YdCtIRkCoPs2yUY+M3H7qw35i8JVVkvoYzZGN4r6QUYkjYYHL80VsQLhEdnREso5YolIz1S+o1paYfUw5rS/GlAlzxbOrFVe3m+IOspvL4+HCifBeUSpfrslrHyMALeFZFZSFIQRAmdAv2XWQxabXkarGoUW2v6S5qZecqjclwn49Elq8zawOknomqJdINlUzZddcOYQ1YDRbZcW5ugCKTXLoPj5jRJYmlf6ooyaAJO/q/+DqPAEZ1td1LBy5jmH17XPmly8vvJAKIzqAU6aiZtV23LOTkEg8ZVharRJo8LiVZFzrEjtkV3e69dXxnCo85V1kn6sV5StRNat72QWsjejTt6w+hPR1u6vBooehyBUGwUBDVBc9gj3Kw7BQZeGWWwO8akuGpRcaLeQr2x0qUNeitISM1goKeTJlGcORxV2HRyHKY0bknBvDGt2dO/rWH1YPjCq0+i5iMpA4YnwkEHRIidOpiBy7jLFab1jLJVFkSjXZnGsY6COTZZJpiJsNy9KYt6J1PP+982oupm5aVwNPyPb8sQS2y+uWIHa/jOwsV36Wq7uGrsECJhyytns+3uYV3YJ2h5vj7KQtW/16LWuF+1NiNScfFl50fD6RpYIorGOc03eLxnoJGKzKQ8BGLC4w/M8Fh7s1sAN54MmMM0VVOourTjWPwcoER1GzNuZTMi6h1dYaROpUI3Km6wHqkbTPDVNO4WxMcegO0RFZOH09BLgRKHDvAsbdY9W6pobfcLNwuWihoiyojXAmhcZlbka7KCNfeMWXtqRxa1Fdjj1YTQUjjO8DI928EI4O0sBCWDAVqPF7aPGvQ497HclJaixnwdKESL2Iku1gy9qR9hF/wtOd92fOlk+jtMFQlAKltD3fIGIVai9HlIua+/viB6VmQW/PmK6VFnUWvCaliDr994hiU6qyPF59UMDhaWJNydJ+kIpY9MAHDJGIqOvLG6ZA0YeaQP5I9sY117Wjy9U+QVOzU1bs7u8e1ImPyt5HZMFd4VnrbjfgIPVz3b6zVS87iqSzMm/CVVQUUjGKdZcFijmwxsYLjEsueMFyLtidPI31v1PXN+9/h7KpKDaoib+q2uk6WGv0A2hZCDm7owN6fCoLMrdWkeamxDDSnvO0m1tJwrRuo41ZR7Aqatn+zzROC6+VdvLXqmhgZSyH/HS0TeP4bZfx6+4SGopIzXKEZYFX8WyBNQnl+jPCjZMSDUjmUnAjq0oZ1RBWO5TVitk//U22keSasYKUBeqI8FK8uepUTal23oM6Ha3ijjsupXkvXtmG5tTOZtgeDPf7g73+9s7l4OBwsHe4s5sc7D37pZ7HYM/m1g3p01dMdNM0SjyIGkUwSwkSS7G2lrX0oGyDc2nlcmrJ7Y4bbO1J09o5k8tpz7ngcjnd7MWTxwWS0ZxcuOMFa0NUoi6ulG83RQw2LDrUFZuDzIa6+VZT8zHhMLw1MWtzg7ctlJuYy6zMK9bHHkfYqcFXZM+k6VV6bjxMx2FT0HTGkogWYXlLtUzz9I4rxcabXBSluQrREVRIV1LCu+BKEz9A9Sue57zzGcxVAx4ZdjLOiZu6Fn1OIKsuTFvnJJRTSHW75/FvJjLYQJjPZ6r8uVqFkC5Z5AUNzC4y742xa8pb3ZeYWKYIwl1HSgVq6zRpHiTIb/bg9N97tSoAbs8aSL+TY/DYZXXf8wovo36iekY2CqZmtNB282kD11FVhT4Iy1P01p1kBsKPKaZ4Re73uRTaKIs+eG0hZcFqjk2mH27v7O7tPzt4Puj6dPTD8UkN9VXeoJydWGy8Vyv2ezVgPqC7k73BIKtDJqasXRh8eZ3kMpwJ2ALES1WqFL9hwaJLmTCK5q4yi5GqpWGAbuE7f4AyMKoOnFgXb/ClVxfyRaiYmDhJWZ3EuZat0WvaVDzBnLmi8772Ntr69ry2AEXnuzvLNb3tdDeeCef3srsL/a7WDNO6nFuNQUhicQNrpxc0BXf2+mSvmZJC5nJa6/hjjxp57TNsuT6s0Yr8ryZy1Td+uUdLndl7yXAwXL7k/DVvCqMvzM719RAeZeiifx1z9OxAfT9K83oICr15tSH+OQaldiGhMZndvuyuUqLUNmwhANXbdb2ZVbcF7fxM3mpBeRe37aE5U8YrMrAXahcUDfeVczRN2o7PquEDpofNsNWtxsIwAEGt6GJ0wJEZFRkkhFzO2AKSzG6tqQxNf/w2VcziDPdF1ZeoZgBBlMwrrLmBUWCnz1heYEyNNpYZbmcM3H+hNFQq5+gDItRAQt20zKkKNasq01FZ5apD5bEUrLF+TadamSKLs0TV2qCKEODS1BRdnqkzH8BAQVlVFlgC17EVNFy2JjIMjRZFXk5BE2h7UqpEVwo7QXjtGfXhI1AF4fzd7Pl9gyOPGqUcaqZgdRsMNy72+bv0zBrVvex/EN3r5H1rZTf7YIKPwHKtMFyFTfbOcfmdykHMLiE+BAt+2uf8wBuunJkuco71RLmxFlrs1CmoMnrTcnK8Wbxy3yNA5YlURDFIS7/TTLc2ATzhWoxkMr2qHNBWHFjdJyRkYZE0gqV/WVZtK2tfuGR7AMQozm68tT66wtUfwb1MqRn0GMKek/KGKcUzx6w0Si72+fQe3B4pcmYtUM0YGb1AcQXJNouC6ZEX06NTq1ryFGEkb5lTmztOsgtWkOFzMjg43N4/HA7wLvX49MXh4P/6y3B79/++YGlpFw7/Ilj5eE4FnTKF3w0T9+hw4D5USq4VdboEMYTdzrWRRcEy/wL+r1bpX4eDxP7/Icm0+et2Mky2k21dmL8Ot3e2v4uI0Qj0CEvVdca6C6Uv+pi1huRjT1mH38hX+MiYkC6/MMhwPDsjdzP1CwKBBZX1THlu9bfgWiqY8gWcwkkqDHhM7JmN9ZHxhqelzL2WxhVBc73uXL1gqN1Nww2d18Oz2r5GuYk1IxsqgD21fAuW6JyrTvEGYXr2CHS+S9QOeOUdihCMQD+yh6II8HuVnGK9DTgOC1l6y5VsBNzcPQwWrkRNJQxaFf1B5dThCF6PqjFkFR0buswEPwRqFnb0SNjpUM0BjygrR2iexwu81LLexKnpbmHjchAvSgX8VJFFuCK87owDJyIU+bV6vtYydeEmuA53KF+mJoWrnhx28IoEk0bMkOUMPyvEAIdLiEOrW4168RFDxSIob3DicKhDGq6ao9u762p1NBO641B1ZK2JGFdQelUZ3OsXofZF1z5DdzrsKlRUfH2ei4V2Pri29/2lnEbe5jmqjTUVoyq44U3UkIzsjOY4JC10KLunrqPbLHAkXyz03OqpM2OKbBM86tjprBy7UAV/D93oRRpG3MB2Jb2qH0bfodj3x1X/qLRGpJhu3tW9pbaMilG9uozNtzA6uZ0t4tIVPsysLaTajueOYBw7GtDN6kE8BaXciVZLUcfgIcqnFq8Txv0ZVDAfRgBvj+oyxQ0Z5Ie7mnKvIN1GFWjV0T9bVL3ELPIh6KvRR53csjGBrpOuIpZowBMNaXdvxgR3x47V9awQDMZMOBsa4AUxWltnBBKZcjTOJQRjaG7YqINpLqGAl2tDR0oRLvnrav9H7X7F6i7MFTCbm4C8e/uS5Fxc+9Jg9/fP9HzZ5Do/CrYrhlA3nsahcyGeFgXFUWQx94LSUytBHzkJDsE8tAe1Yni6zqWA20w4csONKNCzvSq+SwcKiLhW3hbMsfWXwQB8jUsvD9fXVzrSEe/SGie5pJ1R02+5viYwAtiHikvFsTpXUxBqJ6uIljkkUuqofOc7zdztGaAG91furg91AbtzkztgvxJSLdMd+U4k1l+DL47/zjIY9iMI9TAOU6cUroADEgPLM8PBoMN/OafcNYx2jfIXsoR1r98ouRMBJQnUE9YRQLp+gWiHuHX+SGsgUedSBDSQaq6GD2hJ2OC6cUfgy6UsQb0HpXetX/g6LJiweteRDtHqjUehkhHC72/eMDuqFQfQg2tQel2vfs4+0NQQqDTjatg7nSgKCIjDATxs1R1muAlqUeuGRWb9A26t7qEUlODFAOMwQX3/1A7M+y5sfw5VzoOxEEaMq6FHtfbwKX+v5OMrYqPcSyeduEvGsvAHdxRqGlYCApbdrNz5FFIpNNcm1rsdZ8auRhMaf3e1JHA6XsBnzCyZoV/TKJfTRMPvif89SWXGRokXvv7r6niNvflVhhDmSLspWopK7VYYpdqEK3ZL88jdeHZysRmiUWtvBPXbsTXhRhN5K8KMWMzNnu9VlbYwbioLDPC9G90oTCkg3D5FntV52lC1TCLy/feEeAn50ZtCF+Ic3xVGHIF3hlVcyh2XhXaf/i7FCgsJ3m+k1lCyG6ISHHaFA0LoaHMJGA7mui6SK0Yzr5O5w9ozenXhEx2TuAE9c1TxrLFFn6aswGI0YVJfGxMq7FO7/aUA0+/sxE2+dloqWbCto7k2TGV0vhaV66bjsWI3aOP6xy8u1zbR5CQ//XQ4n1fChNPcP9Uf7B0OBmubDTHazjT6wrxUZsbVI2MeITyw7oBqhPKt6XLcx+DHNTjpe8hSGEgYnR2kUuRbAZVRTK7uESbseusoQtLJ1QwCDGTk+EKkoG5uoeySgtLpnDq+JGkzCv0zxi46vxIUTqlzTamW6T7yKMZpmg4CxobGaF4jkyDcuIDI9humDZ967OoeniWsCoEh525ovBfgop+xwsxao+OR5C79KmcP3meLOMHP1TsVYHiSIqcpu9M+ucMuqbb8J9kn80WHhQJTbO1tPxtmLBv3J3vjQX93e3jQP3g2GfR3abp78GxAdw4m7H7rxfPDhNJamdAXlH6sTqjVI0rNlE/qC5ER3Yl8k1KgNU+1yzSL0q3AXVrvRN/wOHxabm+eLXsy39Mu3HcL9ykZsPpw4wczuNgh8Kt4ZB9QXo+lZTuG60mTRsMcUXYKMr6pVic81AproZPn2R6lu326f7DX3033Jn26vT3u7+7uTg4G45003T5YFl2j+HS6lOfz7koTJ7WMuhqLueGXT+F3zzun0NVKG95UxHfTBl9Uz99h9rxpzEx6d0jUQ7FbYU7y2mWETmiv3Oap96KrT9F78T7IyveEfA+i772wn4pyrMsxfobwSFD+8W+rkSn8CGfAWpcEXVL8cRdU4MWf//uerOYjbJvdSIGFxjuteBTILtZkbM3CenC6y9K1v0Ksvs9LhZJ8KPf98fcC+oq7YifO6owuTEC/gStYf0D5xF//NxXZllQVsqQWZdtznWTC7dx4gVOe+Qt48qqKcvj1xdmrf/pOp7pK8XWCXW8m+LI7HNxdRyMNFpzE0CWAZUjNBj7hfKii0NyFzpOkymJM+CfYa+svqYtWc8FrOSZG+aE77zX9BVi1xBrDyKEFMBwgeAfXEYZKDZZOW1mZlKrrGK5HmC+2isKXrjwfaK03VC0szxQ5NZb3E/ITUxguD92N2IcZLTVcHuauFgvKgLoSa5Wl4CDncR6oq918w3pwkwq9AbIeybhiqZFqYVX3VC0KEwdWoOxhPTLjWcZED9Iy8F8p8kXPKY49cqu46bi4W/91zT+71iNr+LTvE7BMXprM2JXmU4HJ5Bmf2gOG5lalN7NlHK2P70qEnaNJmKwKjOdTNMTcBcTdDUjieLaAhfZX814Aul5twe4AczsM6RvHgjfKPqkg3MX1MKn8ZkibCtyOW9QZ3d7bfyTpMRXqI6byEupfFLDK4e7RzwDZq2iptg7tdSuJHss09hMX09WpJeuNpnnL8kmUaxEyxkCmR8Vb51SUE5qGegG0uvS9YSKTKql5JoNhHNsCR4Xlqu/fXEBniK7OMfPEzsmSD0WawIXgY0m92kT9+6/RaincBEHpJvmkxBY7uZxO7RYHsSenihYznvqKS8HhEY8Kmb6NYDqjSm38fOQlozeMlKJy0nHfLAZfrV7xRkQ1fuVtoZqUwqWpt1cMuplcvXt9+fbdxeXpydXbN28uH7tkJZZObhesfBJH2AUOXwtbgIxLFGVNxEJYATmWqpC19JqHYmYYna9409spnnLnw3hSua3tgjP8fnfaYlJt9DDoAzf86d9++scvB68Ojv7+WNJ6h/AnKH8ndj9B8mEtHzQwBx4KdiOEwBbMMYLTsn1EbA+2h/2B/e9yuH04HBzuDJbPCWjiZ/fnUqrtPSfe+oWRPpYjlhEd+x77OEdc8vd6TZC75IXr/+z7Ess5HhwQ2QJpnVEycO0WAVoE1a4SrJohZa6r0JEbli+wUgYqICjg2irep5zNIBQ/kczdmgVePU65gTqekY7hSyP44h+R/szIGGulu0SGaEE6xTqtrcVHZPYD6dSVg/0w4woMSN90A62hZe0pSH1CZqu9X7em0ijP6KnMv8picsYqVsbA6kDdBiH+Fnr2wzBuAdG0Kgu4/xvN7VQjd1XA7V5hmowAiyjUyWVlY8K9ZRNT6d/20R7RXKRhOH8L4eH2uxRqSzbyiOMaWU/e+AEGD77gejBhAKhlEmS0DqK3BlcFpR8/TkFwZlAuQXTFbeXjmnGZ4jdR8Da09HbXVdEVUgvDrZmcsy2ae8oHTO1wVzjMpyLbydwnCmx1bD1+D7b1Cy0QzP4sr7RM4SNJO9Oeojz3omAqpZrhAVC79oXDNQ+BJHGD9mWlEssnyZ+jA5TF5GvvAmVx+Co7QQHg/87doPJJ8qV2hLKw/Um6QkWofPGdoSJYv/TuUBGoX0OHqAjcr6lLVAz2V9opKkLhC+8WFUH6pXeMsqB+qV2j4j5KSwD379w5qvbiV9Y9qgb719RBqgb4F9xFqgbnF9tJqgbl19FNqhvkL7ejVA3eL7arVA3Kr6WzVCfQX253qbjf0mc6Wr/WDlO1F7+CLlM1eL/gTlMA51febcri8IV3nIqjmg0Tq7RU4YYozNIj7EOal5m/dMwZhc+ZvKfASHBpwwX/jOoofcIPrMmGD743VCXT3zd74OcOY8JsUJFRxM7skEG/sTb9fa0H3uw1HGGtI0+8cPI3RKVKdd0R1vCE8SgwhSv07yNT4LqqGVcaB6QGlg3ovxFoW/egyJe7tfFDh5ACuJJrTtQaPQzqZiEuzpbmt3ShYYGosUvrqA3T+JBjGNLagsAN0NSm2YgFTrxrDVfOEBJWx+P15YuLnq9DTaiguZzK0qWakKMcMlkMQ0fUhVGMzsnG0cnFZi/UIXbbIozqajHCo9AbJlyh/KuEMix5zjLyf54cXR4l5BcpWHJWBWRg5bG5dAnPtVx4X5vDSBc6GsrXZfJW5JJmcb1ncIoIZqDm9tHJBVyy+VoeFdXdXZtU80MyOj58X1Aze2/kewszaNdhVxxqOWdXgUlHSIFR49swsrvTq6rR+I1SVV6o3kqwbUt9wlGzwF30phVLMRStl5oPVw9APErFHWWeE4u06xyT2M+jHl6rxldRwHjdpXrjRYysw49Iy+nKQn3OFZ9TtcA4achT/PHsZPPee9X14WAwrN/+VlHWq4YwjrXqhK59G2oPqWSe7a0IvlcnezhFe1I9o8MVzXrx09HwnmmrWNgVTLy9t3/P1HvDZfw9j5x6b7h959Q6Y2xVTHhxcXJ6eh5NvcSm5WJ1jR7O7NhV+qtXa/D0qDQXnybS3MHbe/s7Bzv1PTznc7bK69ZXZ69O0ZPtAyDi6EC0NeOdTaTyR6Oc1LwRhJTQQManQd7e3iacCppINd3Cch5gcGzNWcZpH/y88efkw8zM81/Pjl4fRYfbhKec5ugV/mfPRTX4K9eE/Gw1wo669FYVwGuGcc56tfRmbJUQ6shGqId+R0uy0nx1nPTKMlJMdi6ITA3NK+6inUl/64P93UGDhT4xaKojZioEO1EoSwrRbfXNv0It+HXjsHGHfOjTWlkXvnYwRua5OKAWybyl0NTm5a1YWZwGpobZCdZB4VaxH/SeU9PqNk8H0mduzvrCa2px4FyvsXzBtOuIyqqZb1kU7fSwqKytu1a8YJ8j1uj4/F09zshQNWWmSsPsjDVaPtCogIzzgopVhdShYQLV22GalvrX8+mDEMvowlr6GA/awOuTwu8LlkSArRrb6NtHIntOq7iFZZCzw684diBgd1O/J34gZvvJTvJ8fzBIhs92h3sPQJHPixV6xtaP0BnmkHK32FDfnJyf4k6z1rWDgvT70BEPHovbchD7S6O4e9RDA4O4OcMyFIRODCSJI8VcKQvlWi2mMmNYIb+SZooKHbKLNBZX9T0bfP+FW9f2gIqpr5umaHDNAPSYnVkPIVdOPaKmpphNuGJsgaUpxrmcbmGt575VLaxs2toeDHe3BsMt8FNwMe270LM+EqfvchUTq7O17elBun8w2El32fPt7aH9kKV07/n+DqXZzn6WTR7AID6i5Qo2wwrVirATPkWaXZwfnb2+TE7/cfoAFF2azarxctN8Cn5rQVy//3B06v1Z8PlNKOB6gSm3yxLg4TdgHS5lO4jd1mCQ1ByEUXAzKgnoJMJKRVyTNfvnWpuFh/s7B7s1QPGYvvqqVbBLVDVACYPSR4s5VOb5bM3wYbXA6NpA3su4goIKDpLNFs+F6gehFNJKq31AhZyzE7LxDjxuqqrcGWXdbVw03HGoyy/jlPuwN3ieUOeW5jco0lZ+q+VyIqN5XcjVxsXR680EbSowskNZgK4kUVqaGVYEpSKrpSLBko5LUzm/3WUvOTv3N+VM98jJ6wsSY0zIBnQi4XmWUpVp55Znc8rz6r02Yb9PGLY9SFK59D0t0B56OKsE4VzlgeKJ7+pIgdjdOH4NfGOBgDzgiISBuC1sXft08PKRn/h0Ro60LhUVKSMXTN0wRY6PHkeEUpiVpd5UBIBZyMbxJnYsbeL37uIxwEelDli2yoU8iSdy63jymHU8/uu7ix5581e/nmci7ZE37/5qNbKoWFiPHL/+6z1rHrbOJ619LlOat8q5Pvni+2m8vHm52VKaLHtYSfF3zm4fg4lUUypcvb0VYxNPpcnGm0/YzGci/VRkaX5VCr4qxbELZ5oTO6NF/d0jcG8w+mPw14ZCDtUVKK2rq60ejk47HxbDxvnCwXnZIxegupy3WPqY5nwileD0QSgKaa7AeFwCp7u8tZd8DtYeWo3N7G3ogAS6NJiiQvOMKSzuxdsZ7tuD7UF/8Kw/3CeDncPh3uHO8/8YDA4HgwdjhS2eVokW1sxdAqXh8/7gAFAaHu4ODrf3HoESlDBOr67ZYuWVgY5axYB8cQIs9wCQ2JFbqL69eNi5ECGVlupmVRvrEqsY3rAotIoRluf2gdT9VKEVlReCxNVw+HEdFUry9zktIgiuTbG3PXwsJdiHQgr20GyjRr4gDhEWMGPgum4sX6jTsQRW+3t7O8881ZftlPUI7D/RNof69tYyd5ZStKq6oCla7Ny01fvtwe7SpSkBZs0Up/lVLbr/qRnXtZXFqapy/bqsuLj7FIQmKKEKfLqImjNO4gbIsPbFjLp6+D3C4yBXdBD6AC8JplZutRBrL4Us7DB0OqOQpara1N3be/HDD8+Pn52c/vBi8Pxg8PxkuH18fPQwaREqXKxcAkbBVRNLyLjkUiizEUmJn1nVCRzvpANR8OieQE8vLsiPkrykYkqOoRqTC/pcJOSCseAtnXIzK8fgKJ3KnIrp1lRujXM53prKYTLc3dIq3cJyTluWMPBPMpV/ebmz86z/cmdvp0V/DNboP1Q+OyP+j7FcdTBdPRhNrDByNpnmckzzoOUJtvSFRwPJP8Iy/UTD1AP/JVimrepkzgWEff3uME0vLv9aqa498vKvF1SQF9bo5DqVkenas+ZLAobq0677F2OV1jB/FCp/tFl610atLeEnY/YF2KANRB+Gy5/ZnnR3uqtVi6IEYzup01NaXLdzP+QhZpXhZnN1nX90f95T1vlHJn3R4hS6+yi1cDHxUKaRVsFeUAHHwqoYVtSCIHEPaa11ASjjUybDK3H9R99BiGErf4zYZukMFMSqMaOF7Ozca3tSudtj1ddlUeQ8lOz6pFL53CxWVUnx2AvI9j2nFEYxWu+riC0imDBXaSsw7kngubyVfVfdKG0FWobZ13U3zK+X1rYqRFZE2Ne10pRusjbAUpkZOQJbgDYABLXlimu5KlofO83o7OINELutMBx1grQqVnTgdK7sMRW0UVXMb9uPgDJl8iouJlKX2FJMuSkzrBmZUwN/tK+i/pus5VKsHZL+s51kf7h7sDPokbWcmrVDsruX7A32ng8PyP/UrwFXmSX0zsoYn/bYiFqigTQ9X2cOm+LICZkqKsqc1lq3mxlbWJnKUJpGV+vH3jBt9IjlCqVvCp3RdA/vSHMplbOZe8HsbXcSRfDyKnkZ1dUeyDk8KeuZYVVGDLpXuLCGt5yDeI/kd/uCfyy1kaKfpbV1KaQ2NF/Vrlo/h+FRfDVTtmAtPLi1wpzQd6HRtChqqBxaoo4ZuRby1rVssajARFKRX87OYwMHWyhWVeBvecbyBR5k3iaCpj/wsU2757uD3aU9popNrRKyQmH1Fma4T1b1/3bcBdOKpJWDp1NY/a1kY1bnue6Wbk9zZLrOjuR31xYsZrJe0FTOjl4fRc91Au4Ooq0jNYUjl279UDIh9dURV+wjLXHbGUlevwtf3N+3CNOMnJpnpVFH90J4RldNCRo1DZ+2RVEm55SvLE02VhBC4Dr8hYSAJqFz5nqLxt3ba+2WBXl5cnRu9/8RNoGvimEi/HE6XEiQWVV0jfOf8ro7r0JKYoYMZsdsha4Un+vYjGkOACXf1XOZYr79yf99j2HiWzp4tq04NWo9ys0t1+654MOMW5DiidoI7YQmfsGbqbyjzo7CXHcY8upkrwcJaZsES/IwpxIk5CjLPFCT0AgGw1PdEOMFyeUtuJR9YH4dRDzxqfewYh0FbBysWUEVlCd0I9P66bWhBb3Gnmo9gs2RZ3Tnam+4vRkQrHK+q3NOMxPSk9tIw8NRWeoSOvPcBLOXEgWhs1bPYQL6zWKwIDkFFaMfrEQ3oJeN/6I7LigYKRCkMvSYy6rELgQRsnvDLeXCmZpkw+ToqS9YjyhmJ8N615tPYAR+7jTKz59B+cckT/4xeZNfSMpkEH3SVSz3os//fW+rLehr1Wy1hTfXudufVmxwoQ0VUbvj0+MLeDf53kuozi60Vl9ut6aCSaWotp/XYaAV1YwWBRMsAx8bqLpVMMGcUV0qrEV3SzU0kRQJ4OrCIuspSDOqsluqWC/U1pljBWHdIycyvcboCkO5ABPIbvz/LMeQzg9dkLNQmPFT9v3dyUpPojxWId2ujkQ8X1c15Kv9esR0WpRJqel0mSMb+slnV3d3qT9nypqUkD4FZwCuHkS0hMbv7h62artun4bu8TXLhxs8DVzvbWxdH6lRFynNLd4TarUlS6FaX/tIyzqEPygxtxLmAR7sxbe6Ff9Cp50bpujUKxqVme1e173QjXwAkA6D8aURpqsYpmVNsIzr60QxmiVxxu5jr/SNNNUFuM8CJhtTWk7ZJnTqsodnyrSelNYw36DTqWLTqLsAQbrTPAfQ9KarcB/KsmDPOJLKPH9gxT1AFXuDrR5XO49h4o9E9/PZIWgxyEkkNr2U98bIXZZIVU0ed0Yabwk7yPq6vstGCSNKRV4z88PZm4ua9QIzYaXY9tgV0NFMYUSwjlzyi+ooUv/m9eWbizfLLsWUyeQLcscDOH8Wl3wdmS/ULY9AfnGu+RisL8Q9b0H64l30Fshvbvov001v1+abq/7JXfWWrF+iuz6C68tw2VuA/vxu+7oTYEWUX//JjR1radGmOjPOwKtyCjW5nTmpOPKQjcAfaPeKYqZUQnt/Muiozjr/iKv7afBxfm7UjeMGYkc60BHNVuOLJJbwSs/KRt9nPVxjzBkVXEwnZW6l5kKWijBxw5WEckrR8Kd+yV2EvcKYc2dtjsaMGqy416RC8REq8KILT/CN8KKZpBl8kjRdFbOQV0fH8bSBAhZxIY2r2Y61q0BQvn1xTJ4Ndreh93E5nUKt4kNyStMZkalhhmy4NmY9ctAf8yqx2tp7m9jt0mm2zstwK8mvIer6n2TGPtCMpXxOc2wCqMmU33jfOaxpZcggn+PEFJq5lcK1ZObCsClTCblAk5LfuAfx2sv51l1n3jDibFHMWMfhuf7r2mDQHwz6e6fw705/e2etR1pf7voG2XffszzN8r2+d59D/JZLG4YdHu3uaFe/E/yDc0l5vQUM799KmkMpqjBmZCeC14+iBuRc/ZW/qNSW5JCuYJU7RexSZtCvyZq69eUz0j7f2ESudX/CplAT/ClcD3c5HeAKSZbg6aR57qcG1oEmKq1O3iCKnszl0EC1oOk1W6pE+HLIuvG+OHS5WN3SKpYyCCX0SH8huK56bQPefxC+UicTOuf5qsLN31wQHJ9seJ1NsWxGTY9kbMyp6JGJYmyssx65RQdZuwAGPtmCu8zzp4P6M5chad0soISuV4ILFamcb6nb9UVTS+VX8l/0prW210wJ9oRUuh8HnC2ADYadoreuUUML8t1kNxn0h8PtvruPbkL/tL6HL2OF44qMjlB3Lek/mvTwESGfaz39fG7vpkwYqXukHJfClPftV6pueWu/rrCmzvo7jdJw5OYZOW8D9Kc2bCoV/x2fkE0kuTCyUkwrY3OsJM3ApGIKKrCCHOON4kr+cc3IROa5vLUjOwOmXlSVbPh4ErZ5SHIsPj+nKVBU8A9VTuRtq+3sGYL05sJaP+vr0NMD7+fAGeNMKReHkXO8f2P19uP2iXGlw4Wr5ISc54xqKCRJSg1OGXvWyIL5PiWQ4olTnR5f9CxVCyULqRnhJvKJucL1bS0c0HzAkbTain8tPl9WYA0HyXA3GdagbXP109gJl663XsNGeCEVOc5lmYVbG3+hhBkZcJXvWvlCRaKcXzMyMtvJnGW8nI8Sy0w384rb2ldG4d6+h61pwh2Wr+AXZ4JUxnkYsctIr9sKZbFkRd67lKoLlkqR6UohmlFNxowJglFr9WXb2d6LwzmMqUVg/nR5eQ5/3x3O8cLHr4WkGfsSduyH/OYgf0qVe9mjmQlNJDxS1tJSuRcxiv1WMv0EsZh+oLHMFo9Rzz/aW+siri7XAJ/ArE2iHxw8uxtEVz15CSB9Waw/5gy/dJY1Lve9+P7E8lySW6lcs4cW3itYlUu4mtf3rc2GBRYc6NjzsuO0Hu7udC/VyuJg14+cv68ZCgtdsGq0Bse+ciGEuZxqHx0S1jLNOTQQsThqKAcF5U2hpCj1baHC03ZFeVaFSaKkw+sYIqToa0NFRlWGYCDRKn/z6B/9twhZ/+ykahQilf3l2AHKpbC/dlRU3N5hu3v7z/rs4Pm4P9zOdvp0d2+/v7u9vz/cHT7bfUBAi1+kOTMzubKFqq0FTnVfN3zFwHPFjT2PICo29HIJfXkx/LweHTH68fRyVB1JoykzvivKj+xyBI4/ax03i9t4Tat+x9Qm/Pmbi8tu6q24ucD6K+7KCga10u7HpvyPKBqipuYlhPLli3rg35hq9Bb4kzpqGBcLqIqaVvFzz4+O8YX+JejIrg0uOZbzgipvdc5jkGkY1Kp/kdIQZltf1yQe1o3qFZIZywvnuc+YYanrCaEYNZqE0GtC5lynUkz4FLpPuU3dXkk+p1O2NeVLF9D1NFZswpRaWQ7wWzd8xYrx1mnJXF9bY5zLaVwPbKsBuy6k0Oyzn+s47bIHewzk13qy34fx3Ue7x/xzn+0O2scd7g7oP1r0OTCeTvZFS/iEws+N2iH98JfHiL+arAujOuXlSWSeI6421JS6I4rh01us1vcNTtQdzLA7qMdEr9a4B7jucqwNwXivGiE5H3tsDZ7Vvrw/Jy8MEOfl+RpniqVSWcUSLhKwpi9+rM9LauY0FOhWzDWHHy+wTSyyhktrmnDFbmme94iSJbT+yCW1myOnImVqM4xabZMPYZuEsWZUZOBBouHOIZVCuOsDQs7c61TbreDGpMQqdXk0TEUCBM6PpZnQUsGtBtEFFdDicBP3dAyHv2jpIEVH2sOnW8o053RVtaYD6+AseNdRrWSV2tfrCAbzq1p5USzLzn2bI9RxgcQcdOAekaVxHxTJ5r9b6wgi0aolEXTe5cZyLy4rTVZmBlb0OjtpEqvG9hW1Ll6/Om/tH0LOTjpOvqVNqRWGOJ7Fa8Hu5oh2SyYz+wj8VaGHaSy/Xro/78lNOmmlDYFNZk+yXE6ncEKxdEYF13PLXP5LMKkt9FGNGDDKq1QlKwCr1fpoulJrOjeul6GpNRMgtHXLqtV+/iiNuW5H6oXO5TRMNGbRkQb5mWRkwcXHku9HNUT8W1VnNOn8mJA85XrE1jG06oVFgmXx+N8HW3ZcGqKoc5qSEcL8/QjSKYXzpp4eXzjyPUFCVOj/uSqtrtXCyhIcGgCA1YO0Si2zW9O/caMZNux9Pa6W6m1Vbf1JxQ3klmqxvm4wAwczTgJ8PZJJWK/QVfU+j8HWDVVbuZxuTUoBnUB04jfaEhIl7m7zpLcCb7wXxWIV4qH9MtQLOAXaOM6VMaXc7YF2BHJDKTC1oFE+u2EKAppNo+QsnN7C5SZPJSQGItvDIHjBAPvGzZtJhquCG2th364U9IUswRtXlCbebWGvW6nkgSHQ+xAVjQvc6v6nzTh3Tc6ZX0kUSaNbqsSoR0ZMKfs/HP6pdA2ad3jrmFLOPxGJ2mnTg/Bk0a5xAChO5E56exa6Vo6om/kyuaUuQQjFGyseJc2p9gFcXHDDXYpgNQPoDs5SoSQttZHz7igDqaa+3wT2R0rGUhptFC2SH/ynGrHQ4QcdvJKcN4OEHxxCY4eI4mhqjRgpF95+czwH4RKIuXM8xrlojf3SQHV3+048VpkM0eSBp8IufN9VUcBfHYdiIq7/e02yY1wguOFTg+9Vk3W/YscFmVD1o25vsMA3yb/oDe0keinSFRaPbJHcTWd3BTq7W1T+CO9wXwgypLKDmFoCfuwdfxeUTtrNmaGQsxLLcpemEp2BKD3n3MRsccOpGybc+GvGyNsXx5rs7W7vWqR3hvu7SQf8yYSmPOdmkazClbAeYegqPxM/Yet4A2zpDeU5HeexInCUWnsbdoqMsLJ2t0XrjoxkKnzAcZV2HIa0727vtBl3e+deGq1QSkSUsid1Hz1iSxOrgQekMD3rwqVQXKrlitA+bKkby+znaTP0I5eYVUNyTQ7I9xVx/iMoC0kYEY7SUMjcvq+gTwNhHwqWurt+H5BNHfc08tOfDztu+nb2usgaAHj4NvrojglK0tI7pqY6u6MFCtRDY8NIYMTaYlW5pzlxJWmASk1n1dnJxWYvVgytZtcC3u3MqbSEd/aS/3GU3Au61TPhMPN6pgVWGy5SE6mzVt+0Go8sUPHLK7hTWaBN3tAtO0FpLXmnTAgLvmrN4Y9mhjBhPVNgKSYA/+QdHBDZFX/g4kdQtNb91JkJjQjy2CfzOvrqI+WyQvx3rXAMOnLn81I4IwAtcHnDlNNQaFWlBsIR/Dhx4Rddc3f4SPfHlJnxo/sAKDdsM0mUCqcmPUGhl8oAWtU2gk76Ua3kaErsgqhueAqabYhacU6GeMmRl7wjPdBuA/l0K2PakLNz3QOHuO7FFeo1mGO3XPlWF5uNKD1U2Z2+jVwRAWm3UgXneig5EMaoucraMRkVWrq2yBE2Y+ZjOiodqSLYLRtXVLKkHME196hjpJ6LS5zQlI2lvB7FoQAjc2tVVzVqhJog+tEN4ZjFlW+MDBXbMOv4t5KpBRfT9p6lfF7jro4L3JZd/5DL23W8vcVbW2xuzJRCR/9Y2i0FJT4asUlnEzJCNsEb5RFGwFiWscaHtf3998olT/fIyO9j9xNqMbyipi7nHYfV/kGNAE64mMXVKoO+fCdq70oVkPXvkbPbAgvE4c6gmtyyPHfyL+BTKGlkKvMqjb4uGqM2QsRImffpVEht7KHoQ7uM9Lxeyf9JXg+57u4cHfVCsQyS8+nMbAXi9XkGRfQ69MHD2Zv/0K93f/qPVz/uvfqvrYPZmfrH+W/p7i9/+33w19pSBNZYgZ9p7cQP7hUDvzWNopMJT5P34q3vHMNCeBVV7PC9IO8Dcd6T7/3F5ntByPfuZhM/czGWpcjwD1ma6C/uOjG7lz74v+KRyfekFMDc78V7AUJ5TovCCh4QU9o7du2B5wyguRTcSOVLrrAPphcP2eHxrQLToCSOJlBhw1LlhrPbnqvpGDJXNXm/5hFei4eWirxfc9ivJffC60ktFSmY4nNmmGrBH4/tUbkf/hrgzWUNE9Xo0YkcLtNaj7xfC4sGf4VFW3PY+mWLCJG8F5V7qfaKczClSmqYNUBEYApoGo+hflyjGyqGFHqFYe2NhgLkjTBzK2EJNagc7tI7TJKg14vmWtaGRTArTMLktRndpuiYy+emx4P60fzFSATEZRVjH0XUu8yQSZnDt2cX5/YAj4f8+/nrcKKGeP9kre11AlrWxMhEqluqMpZdfUp2e9W6GO9gIidk9JO7FSiU/NCOnho+306GyTCpe1U5FXS1XTmgNMS5Pyxeo42/4QX57e1tYmFIpJpuUa35FPIU9JY/XvoIXPuL5MPMzPPNyhy5cMcKKCG5a3Li39Ju8WnOp8IdaKAbv2bmRS5vMWwZPrnsgjAuRDujdl+69IIunNqt8eqEFmIpEt/tf3wdUmIFU/FFL80ydwK7xB/L+V4ducmpcA/HzuJqb0H8jGBqbvns7y+PXiOH/dbnov8bfmEoXg9zTVzpgYQc5VbJi+rKITz+7tBOm/AMyAqf3SUjwB7B1LjHtbpEGBLg0Exk7tIbZAAsGgQp2p17MNhOhr8RJlJa6DJ3IRpGRmIeI2AalvAvjF33yM9cMT2j6jrZDAT/WBCGRSBx2K1oxwDN26EYtXCd1u5eOsoiwmCFzpA3zrJHZO4KurgTnQeGxqwQEagTMeU3TLhkPCwoDRlFznSo6lj5TddE50eI3P6ZT3gN7M6k9vsMni7jxmeyP8a8ce92GDjVLx0mjv8xDOmNnW4jZ7sed+hF8gr06nUXLffm4v9n7+2b28iRPOH/71MgtBcnux+yROrNliIm7mhJbitGlmVR7u7t0QYFVoEkRkWADaAksTf2uz+BxEuhWCWZIllu2c25vRlZIoHMBJDITGT+8hR95AlJjaV2H1bVdYJwwhmeEuEJiqo9dPCebxroJmHyBkIDN1KO6nOKfV2cT7t2b/B1SKxrj6YHXMgNggakzVAmFcFJYKz+08wTnjoPJZPnBqUg21dZMmkgFU8aiE7u9ps0Hk8aiKg4el2X/FQ8I76aKkPn2Gv2yjb7LNIS2DVyCBqvTiSJG2hCxyCWuoSipy5I5Xu+wn6Ey8u/sNtR4NM2Tv0p/N1T4OZBcuYswjlEA7EHMmno2yoz0XcuKsK4CQHvJu8MrUisGm58k6BisgC/OmKzaEFb71tfMQYfRRZ72/maZ5/54jDNzaCYxcRAJllWwenzhcalDH7FkcjY/AJAkg+Uni5ywGWzGOvu3UQ2ILaq/SvwlilTIpM2vGwu2q2JAH5hXAcM5UzRPLxgBza2qR02JCmYEfIMUi7B9i4NraXaufjoixb+V648/P4MXhZwmj7xsGB1uEuOpgOEma/hAKkbPqXfF9LlhJq9IXO7+wl5Axd2VJPhIWgcoY9EAkTcHxnJzMDo5OoMIPqha7n0kcaJ4IBIlod2/DC+04cgJt6RVyo6eUCi3MlRdwWvISTMmV/Mq3Nn3YJYoRE3blSefw8R+iCZ3HjQWjyAZOIvDK0VzYYADMZwCMVNEhodTF3xgws0ItQ1pQRYjAsRMD+uq7mddalmigrcuxWUFmhHeba0AAX4HiEYiCVkXuVvwb68QKJ1KcGz/aWSDH/42oISx99nsUGJoe/ZjAtZ+M6tuRJTZTje1UUkrBZ2iLzulcCHyJ7g7jEdDGUX+QsgFgRyG4t3he2RdWofFRroxEba8zvo+OPvDfThsoHOyFB/Qjt6swK9yPopjXtmmPmbs6+bGqybGqybGqybGqybGqybGqybGqybGqybGsyHwzDT06Bo5+aPgiuMZDh/v/ZQhg8sfK+xDIduvQ5mLIOLUBLiDx/NKLP8vYczHEffczyjwMMPE9BwXH3DiAZlMR+HST+LRTRypAhsRp25Lay2KkUzIIrhB/1KNOP44+9zS3KxBMA8wS+HHqu+xWvqdFNoclOmwEtq3fRmZm+ssOnN6vzioxxd4Mm1dLn78EFYHgtQYJKhFA9vPJdaWwRbC3Jsc7NhkGfv+VdO//Ko5xpDMoWH8NK+LENcDDGjf866hKcDxHgImAB5zoQkJAmh1y1dKRkoRMYTVeHItXuQNtv9ubAQ67Yc9g8vo2nDui3Hui3Hui3Hui3Hui3H99KWYyJ4ksXz4BAvGsizMzxi0MyQKLctsrvHByCC4rTeChgXGLOT2bBX0XSvrX3JqIj9m7tNI2JeKCADb+zqiYvmvLDtQdFEEPeU4ipr8pGmEyKjKrQvV/skQkx5Z/QB9Fci4X8m8D9ggMEPPE0JAISZ6Jz+KU9yq6j9LwSncnxblvA6UMJ+gYHn23Dd6RgzNRPerjy/KyHNb7Xg7syxnOIRkQrqF+C7Ltt09vdf7b9iUwGDCiJBjLPtCqV865rCrE7HjTGDXrAC4VihbOLu+OWACWivXr3YuTj1qtAU4Ht4TCzEFDmzBYdVw34j3LX7ROH2vFo+TjOpiKgzjFR4j7fTPZe8TNRlPX+5PHPEacE7UdutswzN9e6Sq9AxWUy48MA7yaPFdSw8jI+gu60+r/m+hVoefAslwimOyw7VbdYnTWMZzG2yBM57XXdsMAXCg4EBjbKxQgOr8WrAhfFymoowzFRZIyLIyVbZpMJqt6iL8/LsNOK3OsFuPquaMPCfq9awPoZI1ZzwpBkn8f3cZqfnp0Y/xfVam58XW5Q9LxM10h7eou7EG8vLVJzqYyMYAXQZxsc4gbBFyrNkwDOWiGl5x+VfeZq/R4+Zv+Bnfv8V7KNwHFc6QJjQegIsRuNUBW+yOSBRzMcTzFy0jAubuVKwNmeyPUIwJOkR/EcknQBMFBYCM2MsDGiqhQrjQDc3FxykLCEP4JQx+KALMHoycn5Wge1c2/PUl8pmXGpmSaLSZbE6cr51ECjcaS58lzu6hU3svdJufvc83Rbik8Pz9siB1Zt2NuaxvDH6XcaM1wHjrwSMv+No8fetJVYcKv6O48TrIPE6SDxXhfRLjxCHEBh4SMKb/iL41ZMXfG4tPn6/g3UoFU5TkvhCXzero+9UuREkAu0JWWqlodzX8gxRo4iCa0XSP8NRIRfZD20JMWPamtt8LEg0hS4vcWDmLRUSE/GIKhKrTNSlNOxaFaYqrfrD2/3efhF9oJ/RNKk5XrfZsWepcjVBPWkqZqM1frvkx9ztFv+bAB/EY0JpLUcV6n7omAoDZgrhCQDLuSEqACAHu4M35O1Bkuy3+62Dt2/77W1CWq1W/+Dtwf7+2/03b9qtOJn34McjEt/KrK677cgOXxKW4xA8ljsiDJRq1ZW8/7a/s32Q4IO3BztkZ7d1cBC/Sd7iZC/uH8QHu8XnmWDymjg6LlaGAH5aUTt4yj9NCPOQzIIPBR7Du0mK2TCDqCS3W0pCcuyWICnF/ZRskcGAxjSvekc55kDRszTi7MmY13bPn7IEloYN0YjfhwxDywK/orbaL5NENKEcpYGGKe/jtCQX8+sqRsg8nnKCVaXZd6UVImCAVdJXlFxKY8JkbbbRmRneNpfKY6YhZe6wB3pCm1RYGw9C2bsCZGosDDNi6OwLPkbdi+PfkJvujEqlRSBCm0NK2k9JDqEnJ8kDwOfZIeXW67Ke6UxwPCJ+4O2oVaN/UHlFBFPkO4cXDfP6+mVdYDUykiysGy1tqLD3VCbFFmz9rSOSplhsDflWO2pvRwez/YEBfb22gP0HPtYkmyiYnyx8IvGWDdivVOamiu9Wip5oQOFhdbnWZXozzXvfaINnDq6f1ZzC7ZhC093yPbK9vdP+Zs6RC02XbQFIfLT+gbNDwy1merJNJ6ThOtCpES5+xDxq5U8QEJfwYDSHSEzGDZRMbocN1BfkvoGY/sWQjBuIZfDrf2NRPvNiMvcLTb2WmFvQ4ixhN9jt6CB0Cor+wAn6AL18F/EIfjV+ILrgQumtj04eSJyZH19dnLz2rXy+C3P76OJLYRqksBgS5cPE0OWpZH7v785tPRbC97UUkjAo+oRpChkUpjWgBddNEFbwKZoS6PpXDuzQWHCt9dARFxMuilBWX2GzfqvSs5qUzctncnqBw+rsr3Cmx67ZrfKszfhNz2RrP9qJDvZbraj9Zre9Ny9/dDwZYVlbU80cGh+cmzEg4Bts+4sT24OtwxwVqNmEBqLwMRTQhfRfbM65S1wYUDYkYiIoU6hPGeBtw8M0wgNFBLSp1uLyfS5MU9KYJ6QZtrFEFujTubMSjTAUKcSZENpqN8apgSGMR/B2Buj5SmDvDgP1JsL2Vaj9+/v7aEAFIVMCePv9lA+31EgQrJqCmCaEW9ut9u5Wq72lBI5vKRs2xzjV9kjTCKepJ6RsGI3UOC1fVK14/21rJ94lB9vbbf1DEuO9g/0djJOd/SSZu9+666PRg2NQd0mcFuQyGqx70Tk9v4pOfjuZl796kyk9U1UZlc9kbsPr5+uHzom7heHn2Ye8jae5D3iPXYWyMwyCXz39pD1XpNBNUf0grY+zf5SGHozQCcCizhV7x0PPHTccoslWsBWDbrhjA3gXmcqpGzf9hCY3iA8UYUgqPJUuJm2mQlRJkg4QZn51NVcTatSM/qDxx11/AnjsMuTmceXl7JxhXRXKmx0h8NTitoPwsBhmAAjf0MIQysfrIWOpL3maKeL6IOcqckQQ8YZeoOI+4qlWyiaTwEhsIri2pqAQnCp6Vyg3r6zpAr+wT9mWlKONBtpopvq/M0mE/t92K9L/r70/W9Sl5dYDIInnOUwzkQjChspfUW7P6LEhVWI665kUCqCCLgcOKta2wdAc63/1s/iWKIQZTqeSSsQZGvF7P+RYm21+TdC99qe9UlDcrFFwlNBHuE38F8ZG/pj5EakNRxlDQmZyQmPKM+l7WpWX4BnmbEJ6kg4Zhrh0QodEqh5Oh1xQNaorRgo5NPbCQ34ybwhoegprN7NgBu1XL5hpnDbMqBwhz4VtAIF9e1dbueiL6qBJth/SVWhrVQ6fFADqbFVU3jfOyCYntyx1OcLbe/sLip48UPlVoPM+5ynBrEqm78yfwja3dIBwLpawN0HpyGp1trkg5fonyoY19mPS2yWIAs67T6j0H3VNlGY7kenjmg0wuIqmZDUPFJns+LADJ8lbEQuSkjvbhaUz0bvqp09dQMMo74uYjyM9J4keJnEEOfyLilphldV3tXztNSjoAIcMKdUidxo05aYrRiymE8WHAk9GNDbdymV+R4Wj3uGUJiGulHbbRSaVm0+b4HcEZSwH6LU9hd1X86+45OJ8fD/sPZYoY/AURCp66p9cXn667H05v7r80r06Oe5dfvp0teiSZQAHUxdsUNcMX7BEIXPHqLKVBgVmOFMEj2s+9HqKVZ58GA+e36A+BV4h8ydvY9RH+UHPr+DnHfiTzx9++/3tx7edXxYVrb6hFB5P5hDuY49Dx/o8YZaYZ3PfE8lvDnMp6INgHvT1UYIWP3Bblq+I7dZ2u9nS/3fV3j5stw53Wr8vemXA+Zzr6euJG2+zq7hrLhnqiIpzr918OgOURhPjY+Vff+x7zibT/hxcHCQx0EtqRHM7opAGA7BIBRhxbWZwnrqGXNp0I+nUvEYbA8QouLI5vczdDEpxSTFXWxaQr0yHVOG0aGOYp229mYaYMqkKLgfEdaamX1yh5X+lWseFtfiKzn6unMZjzJJeSufCbLmnaRJjr8JWkt5XlPL7LE0dVUhTZTYKuAu2mb9VdrM5m87H85NaX2/GxzNbFqdp7mwE8ofaxJIXsoQXGLqAqAk9MAXynt+8y0TSQfQNXg0+4nikRV54ObDq4OTs/SOvBm/3m/M/HGhO+lNFelwktdXRvptqy4z8kcHrJx88TvwZVSol6IQlFM9tAGge4knWq/EZ8ejiS6Ea91EGTpnyEd/5CBcEtmovuDAXuVdPHpQw9TYm88JlG/g2l5rcTZk/m7l8EuuY5kaFApXWz2iqTMI1hAuTCLLtMPM4nQN8ay4QGzI2rSR43stiLv7JA8Tq5+B8kGKlCCNJFftntrjZDEcSRAzGnanJM9cilDs/h7YRvF5GuF93heovxRcZvbvCblfvzPWU47m96rw7fb0IK4DAWBMT5q3XgDw+dk6eQ6vepTWReowVRuYtOSDUzrsAqYQpMQ3RmFeWUmGFmk+wCskaKNC6szg3Wg/tDXC4fZt0R3RuTz6LbNnDfVoTuV8/b07yZ5RlD+hTdxHJ13hF2Z3y1C31HEq/ucJb4PTZd95V3R1muBXdHa7H5BzEMRJ4naVGYfA44J6/bE2COcAGpg3HI9fQsrzuQfyB6IWyfl5enGFDr/apCgBz9dAGB8Qhh/SnSGb95kwzWkipZERb9Tchx9FPN8873v6L8YhuL6ZACzAwM4nPtCn/yGwkpY/7NKVqCiF6QftZKDZLx0LLDFcAn8yTgfMs8rsjzBhnyA6PYpzGtl1ubtotRfggxbU9C+qN2LV7E04ZTLYYnTVmBZTIDOsLn0elQ/7v8cFAkrpe/EsEm9mWJHnxlFBI9JyLUN8ZISy4eR69Nd6hJXL1UItReUeFynDas/irq7YLS5Ta+Rze63JE15Ec/CjFC+yEIYSDvtHVCpP91Ver4XiBq9V+8RnmyKIHx0rOCcxvqoXorfmQz9D6/GM+woIkvZT2BSQE1kSqs0zNdMhPZ56RIEWAyoChZ/GgSDqoMSfTDY/kdNznNnVRH6vneyVsqWok1zMkiFUj+HrVY1J7v9naa27vXLXeHrb2Dnd2o7d7O/M/KBnUlBqfHx9HGql6cyQzzR6MFjMvkdBmF15E+gHMi6mSMw3EZQgM6EflA3QPoNKF+m4o0IE+S46QZv5+9+XL6XEDdadyzJlL/kM/fzk9lnndN/QJdkm8MHMGrKZT/1Zqeqf5prLwTFrm+ogzqUQWwysatjl16dQOF0oOULJjPtZUTQSOFY2hFHBMFR2Gz/IXp8dIkEwCXP89SVMo+w0ecbGTZux3GAeERTomDYRjwaWcBbdBrs2Jlh6XquKNLd6Od/f2koPBwcHOm725S0nzx5XV7cJvjBzRmUkQLB7eIEFwRmLh886MTGhVs7/npfBdwcsVVea1upjJl7cFg22liBi7poyAYhZVNYjPjQXcN7YCjOnRO/PJ3Cm3iGhQjRhm1ur/wKNcRQlhe+fNvFtHH8BonOzVpL4+Hu+ZKcqTypHHWFz1rN0PnfYT0+bJcTVMvL23/8TUe+154h0LTr3X3n50apkQMk8Wx0JTd49PTi6CqefYd981zM2mu9JM2MB/v8vHBFJmUGxL7U3tuc2KEkjSMU2rCgBntdcEC61C1gncz0vgnqcyI5fsOsX7W6Z4W8GvM73/skzv6hX4jhK+qxlY533Xl/f9iMTX6d8vPv37kZX7cbLAqxlcJ4OvLhn8EQn/aDnhj7C5Tg2vKTW8Wt7rDPGviWudKP4dJIrb1fpx8sUDhr73tPGAle8yezyk/2+cRB6I4aXmkgck/iAp5WWOXnxmeZnkl55gXqb4e8gzL1P9PaWbV1D/nWadlzl54cnnZYJfeg56QPFLTUUPSFxnpC8qse8tMb2Khe8pP72K/hecpl5F7ovNVq8i9vtIWn+S8pebu15F9otNYa8i9nvJZH+K9peb0F6gep3XvpjEvof09iqyX3CWe0jud57sHrDy3eS8O5q/n9R3T/E6A36dAf8XZ8C7vfhSE+HryXV/jmDW2fDzS+ubJsU/k6xvlzb/fMK+YWL984n7hqn3zyXupSXnW+JeYI7+N0rDn19GE/It3vnr7iaTM/M36SuTM/zjdpjJefzRe83knK67zqy7zsyzT374/jOe079jJ5qyHIZzhSeeFQ0+zb1qyy80aQkq6mzir/Ps+kSPr73o5xpik1nqS8n6z+va6NvdlNZgd3t3+5nEgds1h3CfFbOyWaT1Ra1AQSXR6rfFFQyMTo9XIVtLZY36yZIbvih6gs3szdZziabqZcdfvN8AlM5EJvQOhN83TEjOOBK+Xg9Lv0dBZugoyG30pXuHfshB0H8co77g95IIJIkCbUaVJcJFge5J37SPhduaqXSK+ISwIIt83lXIJpry5+3uouNIYs6SogobYa3GCEPZpLRb2jvbzzXY7rnQxkAvoYLEiosVuh2r3zV6c1iCkSd4tvR3VihbIz4mWzilMZlbNj+GR/n3cSV/aB/yb+A8rr1GtPYan94gP7y7+Lf3E1+ig+iJ+/bun5v6JTl33nz7C123GRpegmPmSXqBbtcTJ+/H8cmcVP46j8tR8NL9qfm3wwqcLUedIEMqlZWF7Ud9Gf7u8YbU74FdZBpIg71lLxs/gN4Jxl2w5Bj2F2vXDAWWYXbyyi3RT65QCmZB94IqRWwb7D6WZH8XERbzRBtV+RF8z4VnXJQZbyCZxSN9CrtE/aLNv5MHKFy5JMPPGRFT+7tGEYwAWl3LidnxPE/HgmI0k6J1k056+nc3kUfQ4BNrbPYz5UyGAFmJKGf13hHhKiwAOSLPZvV1+1oPXJ783Ht3et65/E/DOUmcBVuyJ3///C7rHLU6v3x+d9XpdDrwb/Off8xrZ8ASmxvoa5BLMxX8xYU8MrAEpmpXL6M+KGZcVy/khXLhGcYSYZcsXPVNkL9dC7fQESy/pGwYpHHZz/vNAFOiV1qY3d8bINST3y4658e97u+vzbqHyT6eBqpy54YzYse1U9o6cMh6sxPCRtWjf/xydnUKc8HYbrg0Rf2cyjssKFRkpgDTZoZl2ZgIGgOv+c7VYx7/+uny2Gzck597n/W/CqQHuyzYRB4/KCExHeMUCWLzpY3P9YpEQ3Sz0d64qUhN2vzXxtHhtVD4WpCkp9Tkuk/Z9XiKJ5OIPJBnwNrBxipnF68G1UdhlmCRFNfbXKNWWzicDDnLodkS83Ixond1MNDp9wW5o7Be4Hi4KJeer3SNfPjn2cd5Cb4l0xro/UDvSBNuHXpnswT5AFLzS8R2P72/+rVzeXKdO0VOVZ9fXR8Zi8UWPl6fjrUZ856mBJ1AmqHeoJ9gUnl9T5kmVO+7ub0mrEY1sA/IInrsEDhEL1VDDwcnFHR01cJdLy0Qf8wrBHN9TPrZcBhUxn1FQiGdqxTReeA+G3BCe5eXNsh8FOfGEmi1oq2U/+pxU2kzwLeUROmrekwsMtUAx/oixoqgCb3jJktZ8IwlCKMJJYD14ejTeszdXYDxAh+ASyBEg7NxMKlNY4A/YlM0SbH+JGX6hjk56trMU3QVkmCHNhEmTYnVBeMGkgqCVO524gMAn4EpjE1g70YqAuMl9yUtNh9DN1aK0Y3npKMVZCyI8tnlWkKnF67miUgXYnMBPpYQAUnSDcT7kog7IhouVT3fEcom2TZQnFLCVAO5j+pTwojSRnQ04OIei4QkPTqJ0OkATXmG8GRCLL7O6YXT24rn1NPJTQM+qUlS2lwwQgOJYTSkd4RpFpSgdxSn6bSBGNeWvzbB7kfEb3OqYDIMgcT+NEc7DaY6bB9sR61oO2rvucqgZUzpGsO5nTQ1dweWIyLN9uBMC0q4DWctLoN35I5FA2TotUsmjbMJyHG5XO2oWuQjkk70dpJUZTYoC1LVU20KvUUkoKSNcBG5CsKwOcYpleiVQQIjggw4fENvNK1K4TL0BMyPBgLJ+zXKV49vCuB9yFr/KqhkqBb8iTlbXhzh581VQtD7z8fnsoESPsaUmTL7Bvia0lps9ld6k6cUy2fU3tN5knj9h0pcW31+elHJXDHWIGsDYXL7G/CvZhYBfle1CD43/yuy8vdMZlfJXTLu30/cMPoz9rBD2Y17A3FQbxAPsjUpplSGTb3uRNzJCw+146QJsIWOrmgH4ZQIFXDLuAF0AcZyj8puMpgiKCCyo5knEucfGFcqINzuwkOnmx1RyZhKePrShrTgqb7MlL7uZMN9VBMGp+D0uLt1etHN/zCggtzjNNUbmfTdkAHSSPCBTKQWJU02EGGJwX5JiLKFrVpVmKtNEvTq5PjyNZIQS/eFS0TFK9DQOFMjXtce1uaRPsFDzOif9oLkAk0kyRLOpmN31AwRcNThJ61huUGkIklBqcIauh3ndwxo98K+D127rsKiecZF8gw/LsaKDFcauSsebjeBFYs1Hu1QQeElsZ1t7D3lROBlou+qfNO4GrtqUXSUIuOJdr5OAwvujODbub3b2h/Yr8CDL72tw7Lb5XZyqGbyXcrjWyTIHxmRCizFSdZPaYyOz7umMu7D1dVFF22hq7MuYBPymKdy7qulrvLKjuHx9NioLypd1eA9VSNT8Y1kzA3Mj7aNh2Bmeps0j984tVm5cZ61Ydqt9rxySWlMmKzrESZ0s+xM1jI3NtTTmsGLxlStaZcIJwThO0zTygK/zgTHI4K2o7lT7mp9gCKFV1rgE0KBDkJ1vnNx9unon73j825PH4Le1Vl3Xt4EgYebuC4GNy/dBOjL5ZlePfw15PFwrf3qVt4G/q9ajHp4bdGbu9YGWA3c8+amRAmPs7xeuTgbuGv6ZG5u5vuJcZXvooZ2IkKERYxSym6BH5N2YQhMzSOWEUHf+Sb5JWeRvMAIKkcqXd4GYdE9vaUTklAccTHc0v/aWmh5tQVWG/bM+czOlUQ10ISnNJ42jMViLAJIRPS3rna34GQ/6+43Ja9jMu7nUGJ5gM4GT3sXVuX33hvra145ZdkL0f0Q1+HCZzF4GcGVIPM7wThPwWVgMB2+fh0UFWb5Wmi3Wub/zyu7etPWruAUm4y1LSTIHZWzpkOfaK5h70DUxHZyKbMWfYUnn5ABEg5dp27+myecp479nF5kB9mCpX3pgUCW/htD2DsVMWfMLs/AG+rGFUKCDLGAsKwk4LbIRvB5s/59ah5ujT4dpPwe3uVEkntS77lAV0cXdtSGhQ5zZBraYkLv8gwayqiiOEXd/zxHExzfEvVKOsREO6geMKfFPPqYveiNrtmZrIJMpyV5/K9cCzi5QKIctoNDhNL6RwjHKjO4C5JYZH8xRht+vA2tP+BWC4Z1VLAZwqWB/Ld/tt6jVd5aiytMU5lfFnZEQwpgt7OhW+B8ipAPGzLpFiYwfjVwYUcMYM7BOf13xsymgIcvE3W0364aLBct46o05ABUsF5Gk40462ofmeG3HAvFtzUTJsNJgiQZY6ZobJ6hHuCOxQyRB5Oq2CgodSohtDbIUv2xO6rZpX+S/AVaM0qEwoXYm4ubCj/HQDvUbkxmVKi7SEzg1D55SkXTFBETrjPYShAxAF87COKCwAY0Tb1uwpOJ4BNBsSK+pcNSTvfciF4LGVRwGsyVaBfMh7cLWFF43KfDjGcynZpdDt/x2h/ecaUv4k6pVHo1Ty8aCLu4HYSgM0YfkOR6/0QI/WcucZze46k0Af3iVY7vHU3uPNxE9hc3RmRF241p6yp/uk4y114BQuURndxoUm4iQ9ZNAyVkQuBVAHFrSyDOgoikvmZnEoewjAp4i4vkDlmQHDMOwmnKPZU20MEZH/NMWhVh5J7/2hNoNYgd6FWne/66BEsDScY4HuWRKSNKk+VJKm7uvfb+wSzPYXjmJWINzJ+t9CngpDpj72fOhylBZ2dHBSlUJPvMk9v5KILhO0jrASiVAIsTTqLdCEZhlxfo7W4x4ALb+SuULdxBJ4i954inQKXdnJXt11y7OhMEZRDiw2iQ6cvlD63DAdkpGNvE8Fn+fpA7UHhsn/7G2PbWyedIiKB3AQS+R5c2mk2bNkQrEX1/CT7OjVYmaDzSjlzZfRpwHtl/RLH9jpP1kPAopmpaV1OmI6qm1bvyI2dKEJyWyeFMUUZYFWbQSmi6uufN1CRrAb6Pv9hdLgnMvimr6T7vzOsAFJmpScDnhW5XdrIy0VyoEepA9hGuIDJjSkx7VPK6ZH5kpkCn3U8g9BKFR51Hyapra1qSKlf5CDOclCUFN1vJqSuRMyS8FwLnF5EHORtSlSXGBEuxgn+UY/j/jTZSzjYOUfPNTrTf3n2702qgjRSrjUO0uxfttfYO2m/R/2yWiKwxLrf5RRLRdKbUTMwaIyeeBsImimQMaz5AQ4FZlmIR9rVTIzJFMYDYaU+igClnTR5VjANSYYzkmDDzhgQVHCk3qXV9InIkMOet5MaFIS/NgXVNrLiBYqejwsTFcw4QlvqDxqkCH0TbLGOwbYaEO27LGrfPpeKsmcSltZlwqXBa1ynbvIDhjVrDUvKYFvMEPcmFVl+ZNpFza99mpfiUGn0vufjeLeP3DHI5kWbFgLEJ9PvpBQp4QrC1wZS+w2KK7mmiLTi41eyphsdT82NZfge7rd25w9BarIIMKWd1KrBLmOEp/dX8fPQYXTVpMEtTpQL7nJE+Ke8/7dX8yWe7eK3mWnXlNnp8/3DhNYLLdj3tnHeCz1USby+qrY4YwrWMt95lhHHZ61BB5n+2mnyFy+psiDwxasY+fHV6cberd/vpxd3+62JOxBjHdZznj52jamJmgvyM2wC+sSrNSbt8f4TetHa3AX00Gw4BxfkQnWjniceKKPTKhl4b6G2zT3MTVdv4r02PR2sa2afZe47+lU0mRMRYkv9CI/KAXeoxdLmTaEjvXKw1zD9EjnwzsUkGz5jtVUyZIkMiItTN4phISe/sB43rLskEC9clEPsRR9PJiFRo31ar2Wo1907gv3ea2zuFlWJYRUvkymxeCcykDUpBPV0YROljfVGcd658bNLiRVLrneaXH0cTQe+0uj3++PvrYDmLlw6o7pTjBPVxilkM116QUsEFEjzTt+GMY6/5nPC5CuieVagWCgCqhF+uCEx07xk+brFU0Xx7IY+2WLBXXoYliyit2EN1gNBs1RERJOlV+dIrbmxOhyMiVTCpk5GZuwGMTCYk8SRnffOnmTIfK75GUAICw1mvWlslGzO+7IZWUhvhLx7vnm4i14ANC7CMJKZSWyW29TlE+lJ6a8tFTf6EzAYD+uBHhM+8Gik1OdzaMh8xn4i4GL6O0JVJLVXcmFMPdOwf6/pTJOl4kk6Rwrf5uprIYIqlAuWa4j5JpbGcGFeQGmgQkDX3V2fH0t+jGzGPstuNsvp7zNX3Yq9zN/hJYNN7x+CJQInLSgsM9Twd0aQAkoeYTIxD4cMvNhWiuFXsdo8QOmXaQsVC0eA5AZUoAOVh27Tq/2//bjPXvPcCbkaW2sr4GLP8PQEV91UjkIBtiSDLDPVJyu+rt3n1mSiem1C2G/f39xHBUkXjqR3BbAxzMrBUG3kX91PbkNaMMsI5SLbh1ZQ7uWlym21DZv3tSGb9duHwNQqbOCevALBspRCMsdEwZ45xpASmqT4yEyIor2hXqxmY195TfNIDNr6B1iODAYEexXpWu1Es96/I1dnx64Zxmby/lMvdC82ojoZ7bgQloLes2yvBIYnKCnJ2Xj9sUGGsVwn2wfetGUErPqYU85WYTz3C7wv7JpNERPVumTBKl5cU+0znIIcD8cFj1yJm6Oy4c6FVVsdwfOyHCvfKZpk7MsY0rYm5L5oDmKDYRKdAgNaeK8Yu+cbvLJrNTZlfAxBqeiKdLu0TodAJZVIRu7EKEoFH1L9s25k8mtr3nWGythyix7tz2Dwhm0YEDztbLqu9YnsaOmsMnIYrYSYrE1EnDJSVFGgbqNGB8JswNVCFhENTYGXUEkOYcTYd0z+DjHQjQv/PL5IMslQfhhvggibmVRr+obm78SZAzNnArNVskiNLKqwq7fxVbaqvItKsZivZ1YIpZ093t9lu7jW3283t1vbu9u5Be/vN2zfN7f2D7d3tg93WbnN7Z699sLf/5u1+s91qtcpMrC4k+I31YHekvU9m0exTPqTsSVHhiDyqAwVPa8Ob6Lg6StjKMJN7lYDoo6X50QKKW9rHDPdwMqZso4E2BAGrmw17esCvVlWEOXMOgDFImnO/erKolbhvl1KwVPg3U0QCEYo8MzxoN32PJYp5mpIYgI/sb6+gm5odGMr9pjxDA8oScxy9ckj5UFqt4LvuuLmhHNpkIdqTOuBcMa7IIaqg376iS5IOmqapnHXj7Ocs1ln0k4HNsL806JDRTyhPfPaCMF/Q/FsMSfsln2HjEqaghDfm8PSuBZapITcwEqZoooEg986YkunU7YgP/J5ASatyjWOkiQnNQ+84084qV5pnrfu0QnNrok1r4wFyrmbkRFSeE2szfwsrb3L9ClvLdruzabDmjSdvdiNzweQk68XQasBD+hUlZocN5eYLTLjw2ZiztNmEBYPsYblySanm61G+AcvU5Wv9FfL0oKVFdDSLx6izm+RJyl5wjlvHPgWYUlx4CnVJmNRvyuJ5B70w6/oFcCjoy+VpXszn3hpe0cnd7qEJ7wr0Lzq52/8v+Odrk/wmiMki9MMCTsQrkw4nq/ogvdmOtvejVrR9uLe7MzcUNWF3VHA2JnP1oF9Ipqd5WpmpPPMzWjGHupZKJDLGihBFNqoCcGDugyJjoII8Alg4sESvLBSheRlTeEjZsIE+dxrBdXxHUj4ZQ8ETUXH0ulGiT/vuvieayTTSVy12wDWOqjziYE9ZDlJm7GSvNLUaC2o3ZRD31twFk5eXOGdp7tWdjMiYCJzW2MDvxM1RMu2CE/OKDgACiDxQqbfvzHGhCWLaVk3TqcUfla7JnCAAKChNB78bJ2BtBCecSK39y5J6i3cHe63WoCCMWqzaiv6FvkIAtnG+JU4Hszs95uOJoDIw/fnAgF0wnhCbfVFgOdcrfsuA4QCBm4TICsHar5SaD4bEWASuMb7V97pCEy4l7RuQPG+n5KEoba/ojTwmStDY2C4A8DRjvRQhI7ThBAHjOEuxAHr9kGRMFSS05gaj/9s5VzaxmhpsC0bMlS0Jyb9gT1KBDIhl84LY8/MfpHCbimnjzGKFbvT3rGelHS34p5Y+mNm4Ioia7Lwhe6Q/IC1M9uPdgzfbSZ8cDFrtN7u4vb/zpt9/u737ZrBf2I815SwUYhJus5nM9ydvLVLK2LS71J9MsPMBGMTuF5ym/N4sv+9zH2xmr/RAqiIDLAEfDweUiaKXbCwFV4/g9Cy8d+YnhPkwf3hDWNMFS+DgJMVS0dgibxROkXOYw8i5eWjMpPJJ2igICr8jWMmqQUxo1Sph6Lw58SiG/qN6IW9y196gyAz0wTBvM0Hf0orgfMhH0x634ibiCak1H83tJuy3BEw5o2eCnaDuudFF4QUZXtvMps/7v8ExDUouQ1xPSK8CQ9vAmzSCRXCse7WYp5P1XbdVP6i9TjxlDuLGjTbfXppRyQEJ5R01Q4D+rFnzoP6uuFHtHow0CXp6WWEg6UuPbW7mYQWA8rZ2O7ziAXN+tsbMqx4XjkgLABKCjueRDA4nmrJhRuXIr1p+KOFI6/sCZZPCVW/vOS41qSgMOFk8RysXBlYw5C14lVC2rSp3Ta5g3O55jZpGK3gZW6bGmJmiLUkqzAQ3X7Nl/9Muamjrya19jtX6HFasa9fjR3Y93CKvPZDniGvto6x9lJfgo8y/Y9dezNqLWdiLecY2W/s5az9n7ees1s+Z//jJAFx3pSWCBrEZwfgz0pgbmNPSWBM+OjwTO/ykZ99G8MWZtl7GLq94Ay7YK95SKDxCGk6CSU7cIp8OzCBc+DGwIDPUzZ7yRxT8vbPgbgq6++Yruv2ZC1aJ37OaNful2GrOLZl7t5/Dm7aaXnGUcn6LsL4aDR4oUebZdObFPuhu5++Qsrx2ou1o7jaLf92p8+kt5rV4HQFZbQTEinUdAfmRIyBukdcRkOeIax0BWUdAvpMIiN2x6wjIOgJSZwTEbbN1BGQdAVlHQL55BMQevxcdAbE0riMg30sExC7YOgLyNTmtd/RL2NFPIm7/TfarD8rlESJXbpT/5olqI/MpV6jj2hqVoJ6RJKbOZBCgdTuo4y0DuBIUeMhC06QAe1lvDFyEg25YvJYQwB1AL62ZEIKhGKoKRITQ2HkPv5CpAF/6K8jSIZ6NhZfOeXoMQDmYJeZM0gRQHbTMtGuRUkbCZsAGJdiO2nfQy1BTzIp8y8cmdGIoCtPt9RAp/DSodTOhJz+2izlYyAuHJGmwr11Vk3dYoIzONJOr/pyTgufSwMZ5cX9fONJW7msc6TWO9BpH+i/FkTYn0bVqz5XgCwSTNqSuwaRXL/I1mPQaTHoNJr0Gk16DSa/BpNdg0msw6e8TTNrYhy8ETBqIWYNJvxgwabs7vgKirLUyRF7y6497fOVKIOWgtxtSAkNskQ1fPLD0o+KIlpTHCwSWnt/F/Ybo0lY/oJeELm0EtUaXXqNLr9Gl1+jSa3TpNbr0Gl16jS69Rpdeo0uv0aXX6NJrdOk1uvTfBl1ajQTBRso22+sq/83j2V4b702Wjj6mKZaSDqauAAaK0FIi9I9xzEXiDCs7F1L4gTM+nl5bCq+9UaQZ/nh6dXmCOldX/+fon9cPnRM0EHhMtE0VXbNSQpjWBprfAiX5wJYOk9/kvRwqbAjAxcROj7sNdP7z+19trZ7La8co5uOx1tKW5CgfGuLLwFCkcKxoHP0UEjYmmEEjf5cIp2wswhrFrtU+4oN8TOXHtIRdb9DxBMfqeuN1VJiRxCNQCE9Pmo9sUnBuKYMoB9i4OB55fOj+1D1TKZN/aOZpwLrFMR9PUirhzSYfcshx6skkLIEXRpQQprWn9tNMwqEmfeN/oSVTtvKEgnnOo0EGrzx1xhPQMsjfoyhLtEvNhUS8/28SK2nnc6Fjm12IWVIw/gMgaYhcuyEpZ1tBBsS8/mHAY+RJmoNbQ3MVt5/gL0H64yNcV3C7HNXR3ymZaxkhvfTsr+USvBaWjLPE4rrs3Y28bvy6p9Va746whIsmI5kS8GbtKLjuCQCjv+5lEv4n0IJaD55zRrbO+P3WR5LQbLz1gQ5H1z0Z4zRP9aQMdSaQEfmAOu5q716d/oa2o3Z4wwXj/mII8tncOUUIBvfNEEz+FZYozqTiY5dvfM1OHiagzcNR7+z7uiCH1wyhnyCzoOsq+9yvGDE/nfF784PhzfysGdyYXXnzgeVWPVihmpb92KVhmKvWFkiYJGct4CSL3dtiftnOsnp6gR4i+H+QtG8aJkD+SUrviHBqtMOGKRHo5J9LqlIIXdSMUBGgKHgzzVNgn0cLIRT0ioq824XfX3xg/XjK2euS4CYjKkf/bzb+v7BgBjQlEYYXWjKPB5/kBW5F5/MMnje00Q2BdJoaLA43dGUROOMKLEr9aXO/SHRLyAQpgeNbs6v012Hc6CvG+HycKlu4XB9MiXNJQAT5fIEAOv6X9qkgz6rpT5GPYKAPRJDNTQnlm6xJHkY4kxCaceaX0UOBOaXtJ0EQsTrL5KW7pJ9DhEU8onekYdAKYF0aecyogQiLxXSiSJIH/ckDiTNFGmhEk4SwBhIEJ+a/9TXXsHZBA90LqioKYzb/teE+qx0s8+mvOlZzrWXME9KTdMiwNtOjhA6JVD2cDrmgajSua4HhPRRLsPT8ZL7ES9NjQuiCxxAm9aKcCciHBbWeCyjx1T4T7B4qkc2m8E84UMeQB1CmQUm1/qQA8A0b08+BV4xscnLL6yRHeHtv7nLX+VfF4Ih8JQjS5zwlmFWJ+535U+gEUqjEcjNoIdmElrKHr92hGraa/omyYY1YLXqTBWGqeXdX0KqogA0S4NlADfQAx5oRk3yDJB+oe603jPkWBWMSB2IgkSApubOucWei9+JPn7pQMlf1/jKO9JwkepjE0UTwh2kNq6CwyuqEm6L6x9kopi/Bi4mwFVsEGVKqV2OQmTeslA+HkI2uVSwfCjwZ0RgRIbTz6LM5w1HvcEqTMLuWC+3gS+XmQ2cE3xGUsaCObuDytOCr+VdcPnk+vh9W39MZi0ckvq3CpTi5vPx02ftyfnX5pXt1cty7/PTpqobVzMDPriuvsmuGL9SIQKarUZslS5zGgutzgY64mHCBn9VQZ26mFcHjmrWInmKVqgTG48LqClsW6xSIxb8Kep75QZ+pQU4+f/jt97cf33Z+qUHq+g5VeDxPxuBj9u6xPqCYJcbkvfeVmG5LmbtJn6whYcRkOkJ9Jtzn5Ztqu7Xdbrb0/121tw/brcOd1u813FygC+Yy9J+4kze7igvn/gX6qELHoHhUzHf5RSsm05cu//pj33POuYmdQuCqYYQ+orkRVMhEcb3qco2obSTOU4tRgm1nQQTqzlhPRpmWTdearAfQzUuuQLVZZJ6Ah1ThtGggaY8aMqLwEFMWFK5BXTRl2vWAQGwBravydsGFZfrK1bE6EWpvejkH9b22qGEcfY+DRzmvTwrFv2aLFr6/Es70SCt2vHOv04JCYFNiA/AA1a64A/OzcWEYxu4I455mE00BuhnrqW4sJhjV55JIdANcBDAS+hsQVfs36Bv3KAeOiv5oA0nKYj8cJCmwnG6fj6cltAopJySA0lh9QMyiUJhmoUEacchGyeNK8CoYc957Xbz5LJAce8r5pvYtIUKnvq7d5nkaTSTCqJapzmxY/zavTCrJZWvEx2QLp/l6LSUfTUTPTL6siCqP3zEU99ra0ydkdJUXX1FprilnD+X2PUO/UpbwezlTC2KiBjl2gK/XMNeh1lmh5GOeVpWwLfmeAPIk6SCCMJIi4ELWtO0+4ngEUB3BVO40nZy9rz5RD2/3m/tzowZ9hcn+VJEeF8ny2+YRFt9NteNI/sjgNYIPHufrjCqVEnTCEopX4YRo9uJJ1ivjJq2MuaOLLwXopEd5O2WKpKviyV7OvaSEwvasK/XkQQkM8VNQVh5B1ReJ6Bk3pb9YI3RqiLHhu9znUWAg9TOaKoO0N57Q1GrM2OEP9wka4FtjqY5xCo4UsMKFXPLZw4uGPEy4mOvZf5BipQirfvk/s4FnMxxJEEkJwDCbODaY5tMJWRnZI4ITIiLcp71KVKmV7dcZYCm9XTtBzOydMZHhHXuAY4Jedd6dvl4xl5B5UxN/H2AKk9zz2JlcERtBy/uVGyPailVYn8WABzvvarkgTIlpWO+/sgI7uxT5BDWvh8lsqfn8bG60HtobBj3awZs4fuRKLPiQI9nDfVoTJ18/9m69zijLHtCn7orXq8Zb2W69py7mFTHxzbX1apUAHa/0ujTD1X9dSltbPAfdj2f3bXYYwvCIHaa8MZshZ8pxcDxCdrLyRip4LrdkaiNvufdin+ssapokPmEwBHbrT5HM+k2Th+OHhIJARrAaoZuQ4+inm5VpGT9mPKLbi2n/Qtpe0TAe0ab8I7PB8j7u05SqaY6oXkC3jMPC45WxpW8ePpknYPAszrojzBhnyA6PYpzGWWrrDXx5dU08DVI8rMt20ju7azc7nGiYbOUs1FiYUuIgzDtcGQMOhKfHBwNJ6mpWU+LFzFYfN5L+Oc+6PAdbr8SDxy/Sk62clRotihInBqR4xQzcUaEynPbmz997lkVeYsLOVyx1rIGfxbfWAsysdmsNly8jmN/QgMn+akPDcLxaQ8OO+Qy7bdFDaoXqZOm34qpZqVnXzLCxUm0zwoIkvZT2BRa0tgRR5xOY6ZCfrlhDlPO6KvYUSQc1Fp+64ZGcjvs8NfWn+giv1MHU1NYZxYA3Yj9LA5GHOM0Sl6yQEgw/J7y6p5XPAoHHH8g0KsBv+IEleuUSuBUW0fDP1w14EfJjelQE6APg9Zl96k/Qq43hnxsNePfZMCNsVPQdnAQ3xOJCH3Bxu+Kq/plrQO+TW3gCznPuTH/HGbhDHLzK++PhhfaJmZBMI+jR6If2aU/wlD87UWl0P6idBXXsy7pBA9fLipXeEHaNYBpXlw5DWvgW80CXz+cH1t8w1SeQIlvk4/zqfbdhNAG8jOOUD3kGr/OYoU4KaFuKmIBoVwmCx+hV57j72qXHELfkflTT5MB81JR/uyfKf2dSaW8tJQn638edq06EfueMRKd50phpcDeGV8tCY6D+1L1YQuYApO3btAGJEn7PUo4dsHGxFAx1GOocd+HB3OGB5VK37+ZcjA/RzdHh9QSr0bXi15pmcF78WTqUfEx6fpPeGAnczPzWj2zf582DamguuCQXdJN/K0I35Qldeyk/ZPBNfV5CKkpfmv1w/gHImct3R5am0Fe0YT+of75pmMSK8KkXNl6AzBAc/3ARA5d9cU0wrC1T8ULQMRZTi+hweoxe/Xx6/PrJ9InNdqvVXoUlltfS1s1XmHtaydOqkh705RuNk72auPp4vAf3+yqudBhHjnC7Jlq7HzrtlRObV0rUQO723v7KCd5rzxPIXJDgvfb2igmWCSF1Hclu9/jk5GJlBFNWwiZeXUEhK0HZ56lFuaXpehzMKsjtvf2dtzurUJFjOiZ1Zot8PP14Yl6lXBpZmHFu8W8DxYm4cKYMHxTCbAhBfTEaKTWRh1tb9/f3EcUMR1wMt7CUdGi6T2+NSUJxE15fwp+jh5Eap/867fiWANoYGdCY4tS81fxXw2Z5ubSQCP2q7f6xSRHFDOxBYIZKV3jTt4BufswxlyrvMRWy7jBxVrFs9W3NjwASPijsRx4rnObbtRo1dbO1v9tayZ5cMm+2Im3W57tqp40npk3rCkj9RpBTdh1CjzVwZbWL40qXfNJoaXmcW7oa15Hfs9rS58BVhwk2wbsTlVgKq7KotPm9OkZWjyrx3vkLYQJ3Y2Y3+LBERcZuIfSQBDmtz8vY3VrtBpqQb5FsenTxpZhoahpven++Otl0JZmmEyjhn2BWV/72qUfmNtOUnJCGa8QLSfo2Q7FpyiNmWK6rKG5CvgFqhRfETIeTBeRwgcM2MEvxrf+35tQsz/hdMWvmmUzvRzvRwX6rFbXf7Lb3VsM9HU/qxEPsmCi05dfm9ADgIbo4MacadRiyVKBmE4Ci4WMooAvpv8x0ch1QNiRiIihTpn4KoI/utKIcKCKQIEaYtp2j66QZ84Q0gc9c3wrMpK8vlqZ/N4/jTAiSNCzmmGnLamp0rKUpsA9hAvUGC6JYvSWsWYpVwSAeUEHIFDTPVj/lwy0DVtLUdpvWg1vbrfbuVqu9BfE8yoZNm5bcNMJpWviDSNvKFb0a4v23rZ14lxxsb7f1D0mM9w72dzBOdvaTZLCavePSDHtwhGo0sfz5WUZzdi86p+dX0clvJ6vh3hba1s2ynWYZ1jf8rQFAhDZaDD9/mhCDCoW6BhZkBbJ5/pN6xQuQHkTrCfAsC5H5oGrH2EUmOqsHhSK2Df3PCkDq9v7O21XYC8Yy6b10c/TKGFBgkGorSk7HKWW3K3lurjEOAYsPzvgrs8sTKqB7gKW/jMakP7YCnrLaIutXDn789Bi9+gJBdYEkiTNB1TTEBXjVnYm4G+eqvrj7w17rIML2KYveGR1e+6u7hYEI5rXJuK+6nfPXkXGoIdDjAZmqIDNwpkYcRAiwxkFFNGyffqbyBzOHjJw3oSKygY7PuyjkGKFXtsFaEmORSPuUVwAMyzOF8+X4KbKd2KOYr2xZqJQZEZFhoc7L1a2LhYiFe+bV0TlsRE0EAKYE0vVyLwnCtsOHCDqg66GOlJnALCaoa5piH83d5nNu+UCzu9plY7rrvTp6DQaknGX9S3fFfAXQVCSpc/mPw4ns6h8vsvpH//jSbaBP/3C74JTFDfTpyz+gcUqOlddAR+f/eGKn+LNY146BdpU5pE9dW8ZN43Tb2euSRao3ldZKv1Byv2ImQzzWmhkNp5Lo1aclFMcpi2uUA057GaN1GexV4sAp0jNqqXxZQCwzJ2fFopEKQ3l1D/yI+iBq/b2v59Omj5vP3/pXDdQFG++idEaOcEoHXDC6CqAG4J5x1YMAwRzsPvZwcUXH4NGbyMAsbg6ViHFwbyDcwCRNoPEUgM6UFnm7td1qtt402/uotXPY3jvcOfj/Wq3D1tyNWudhuE8GfK7Y7cIcD6iQah5u2wfN1lvgtn242zrc3lstt6YnUu+WTGuHoeyUkCcdzlTYwOmWlA/2ZXdll1rAb5yJu7oOsfZhYPwgR5Ygkqb6A7H9U85xAHMJqBv+UqcyAOx0j68l+TAq1WRvu12DkMjDhDPy3JLiGWwCM4Rf9oTAY83MonsMtzkY3t/b23njFoQl5GGmMQiPeya4ONswZHWCWTJqA00J6Z8+RBXsBTnBsYnlUFX2nrZbu29XxY4kguK0Nzdi/xINbMxUDosfrlR/LKpvd2j2BApSKsLiaQ7w65qrm4xI2DGTEWYZtGtuIBrWU5gwtUvH5eDkptrw0p6qx6TxQ8cjDDgaoiz4vb33794dHL05Pnn3vnXwtnVw3N4+OuqsTDN59LPaFfFpsS9VARXUQ7AFGulXYh4HxkTLTIa98IxJMuAZA+Tmnzk6w2yIjgAw1FYKTCPUJcSH84dUjbI+RPKHPMVsuDXkW/2U97eGvB21d7ekiLcM4uiWFgz8VzTk/3G2s/Omebazt1NuewQpaM0VXhM26PLXhBOkjyc4MmYZNpUY0TDlfZx6m5eRVTzxzfD/V4QL6osWOL5eQrighMhrA336cD4aL+he/SO38Rvo7B9dzNB7gVlMZcyDeEJDe4cRRA++2W55MaGCglBWzeVfHSt4TCkUFr5Opl9AYGBGBitj82/q5Ns8i3otwQACRU9qTbPSNt5ZlikhVU8SMs/ZfNR9NyVRs3DJlCntwg1NMx5brQWOvOnCRwAseaSK3YK1V+PJm+V2E+IZ7XaztXfVfnO4vXe4+yZqtZZGUh4SHsVUTesCJz9y+recOMCZEgQviZAH9HOmqPYce3EpLXglTFzd86aFwYxLeet+9k1Zzej5ktZmkcWa1um8AB5vJyuzwoUaoQ44UEsqFcMV2HM9KnldS3dkTcbT7idYu7K5tJLVMXzUdYYsD5W76wgzvCzcruYB0FxLlkqJ/iHhvRA7rnhbcTakKkuMPkyxgn+Uddl/o42Us41D1HyzE+23d9/utBpoI8Vq4xDt7kV7rb2D9lv0PytQbXUW936RRDQd1MJM6iVGTp4NBxBt+nryARoKzLIUi7D9hRqRKYqx9qf7PAtLZo9chEKPESQrUWHqXmPCFBHSNNUfpJwLGzxp+PhH4rqa+UENeWkOzmJ8iQaKvblcLAPPC1lNdI4yaKQ4hgLmIeGO23J6UJ9LxVkzWfIFSi/mhEuF07o0xeYFDG80/Gx5Niyg47EA+Q/d8vIMcptZ7QGRx3jqoVBvGb9n0C0NaVZgIi7Q76cXoTeLkE2WsH2z7mlC0qkpM3YOMHS/hh/LAj/Ybe0uGfbXwhZkqC29GlXzJczwlGZufl4S1zlgpCbdbJmoVM2fM9InK9j32rD8k7NaLBvXTlqP7+7/XHW5xsunnfNO8LlKbq1VsNURQ7CM8Na7jDAuex0qAqyohaRA5ymZ9B96duvCPH2p2LcQ8YE/lE/0LWxH29FOtGQOZIq/qTsCEBwvzhsZY3FL2TBSaV01shtXAg8GNEZnmmV0IbjiMU8hUqqteUuBjNClC2WbR9e8K2rYLhX9hH79cHp1Yjqf/nx5cnJufux8fHdyaX68PDkutUP9dUTVkq9Nroyvh+eJsKxqy7hZw85hXh7+7vv2O0dv5DnE8Ngz29e1BKCe+B7RC2iJ3d0lIxY2L72usMtV0b7M2d+ULiW+vJyp+LOXiXSEsyU1vCDQz7G2QNqlGx99uTxDKWW3UDrIQ7ycqmZ4T25m91Rly9SDnKIt/6WtVqvV3t5Z8nbQRozU5h6A8odl4St3az45kGuYBZqfKsKMGdzHkuzvIsJinmg9nVvC77nwcDmOWMRNFQRnMjclukSB1XzyACrnkgw/Z0RM7e8axf5XMYdzxlni2/dYBCKtoOBh+Cad9PTvbvLEAD6xC9rPlNu6QWNRE8gRJOZ3RDiUWmhglqPr+bZQWqVdnvzce3d63rn8T8O5vxAqgGk+v8s6R63OL5/fXXU6nQ782/znH6vcAQYk8WvNR13GdeU6H7mScK3v9SrrA2HGddDNXmYXXh7GYDLYhlXfhOWxS+VJht0hKRumuZNjP+/3iklMf6Vl3f29ATI/+e2ic37c6/7+2gJG5QuU00BVXswGkGIwrp3StiCRJoQOE8I+1qN//HJ2dQpzwdhuOOju5Ee8w4ICKH9K2FCNzLA2gwB4zTe2HvP410+Xx2Zfn/zc+6z/VSA92ITBHvMeZkJiOi4BDaBXJBqim432xk0FEtrmvzaODq+FwteCJD2lJtd9yq7HUzyZROSBLN2PuLjvyhUqq2lhqTBLsEiK28HgZFpd47G3ZgVgdsyKmBzR2VSvlfDX6fcFuTPxBLhjXf21nq90rXz459nHFfFzS6Y1sPOB3pGmIKkpMoFSKD4AmNJyysWn91e/di5PrvNaOXdNnF9dH2VCEKbsi8/16RgPiSlVOoHm3Hr3f4JJ5fU9ZZpQvalXJJxyqdlKpPM+BzjLQQpMc3JI4WP2+qha9uul5eVVTIXcro9JPxsOl0VM8wIM2ajrMcIkb1krpLS9VsOQjDFjRPSkwnMB/z7mRUCgXhPe+WXr5PjSNpJ12L0ZNPwfZGk6RQlRpo39GKc0pjyTYb0dtEP+cnlW9iGW5NO6+cvweG48IL06dAydUkMTGQBmeF8ScUcSrbKTLLboTuBTQY/SqqyV7SVDljWWTm5c2aYiBYfQ39HGDD2aaql8As7BYKAMda9Of0PbUSsKIwblsMKhCRPgTHHGxzyTTeNP2F8LRQc4VuZfHt6mFIZI+BhT1tQyMh+F8romThJh/q33l/mJTu52gz/Qyd2+/efMmGMcB58bZ4o8mB+1L2x/Mi2WzT9cs2Tzr0yk1wyFQ/4E9ZpNHEPw2nzq3mi3plMqzVsyNX952GsdNIPEp1IQxfOx3NbJRBoZ6dXlUh3D6E6jZSLNrcYNKEbxZY4bgdF9ypDkY4JiLCEsoR3XMZ4icJUtXurphb5Ptrgw4QmzPdJpjomEUYE15EBymDm4ptEioJfmMVADyTDkzo6/MUPcmCeNkELDkCbMVoJqOlOqiMApOr242/djEhan3Ka43/zrxmCI/tcNenV6cvUeXb4/8oNuv9nZfm1oCj+YZ9w6N8A9q3joYAsc58jNw1JAdslyLkp++T1UO4Sz7zyeS9tXNPvJczxa361KaDco6IwMG3Ae/Oer8uiuwackCtEBospg/MqG3syMK0TuiJjqKQyS8Mz3ZwZ3006IoDxB40yaLsV9h/ZFEuNyEZezlpsE8OE+QRsTNtzIk74BODrSv/t7AFnrnTcQGEDj69p4FwbwOVBgFgsGjtt/3ATqTPHJxswi3/zHjandUmiCRY52aIletucACCBL0zmYn4mHrB4c4nRg4I2/XJ6ZTgwGVQYzpXXplGdC34C51p0GGwfgu/MIAWXoxrF2A0hlALOjCr12BYk5k0pkYEtCemDYFgJge3I2TBz/0ShmUR8e7u7ubBnQnP/7xz/s782//0PxyfJr5tTTS1i3zS/MP2x4tQnbXCJJ4D0kl6eXY4V6oQwxou65uEVjzqjigrKh0VreKnb3eJ9o9Wi3i4XexDLcABg8BpTyoc3v0F/VGnigCDPg5qEZap4psBoVDmC4X8bEbkX/NT8slq6nqyO0Aeg3KTGJp4yrsvZaaOvo0R758/K7aoKlDBTcylGv7fBOidmrdcn8YkP4XLg3T4V0L2wgJiAs0MxW5BuroPXZj21fb+6j75hHid/dLRfzLP2epjn5IyO1Va2AvQYT2APo87CASfMXG5WuYtyfYb16MweldMf+X7hjjVEXNiUIZ4n0/YSL5jrj+rugXUQefjCl1gHtkbX1hamjg/n6mfKfagSTGWaNWehHNG0oGCLjicrpAdLNJ2/st2fQ6BI6gIc7BclVfaLuSdCFWk+q7rlxkVZhSBgvlAiS9Op1Ca8g+DscEdDhblK4c8zEDRDSZEK8rpFZ3/xp5tmtYBsHY5kPQ6h5Y8B5+Dy5AYBe4S9mrwxjY9vFSIgiYgx5jhNBYipJOnWNRVIqFUrpbaFOV2aDAX3wI8JnXunL4nBry3zEfCLiYvg6Qldi6l5jJxPBH+jYFHtTCS2s6HiSTpHCt8UMFWt+6/VPcZ+k0rzeaDsTLuB7kqbA/dXZscz1YMyj7LYCx2xliBB6H8l4ROrLPO3C6I+reriWZ/0f88J/c1hpjBt6H7ngVyAOt3XrPE5+EtegxiTimoDrHxlOjX1nPwOun3Uyg8TYNHUiMQU25CEmE2MljbhtL2k6qM0cN6svIojbYBAuLTR+maUAinaomcsoT/i77c/ss4XBVdJGIswcY8Z4buAWzmYjkEAejpllqE9Sfl+tKqr1SlH3hLI1sSssVTSe2hHM4TLaBUvljQ0fK7KjFHxu4FXaci2v/dxmlll/W2+gdkGBNQqKICfPXD7Wq3LwZPkYGyYypu8tJTBN8+BDhULAcsnKR731FZ/0gMFvcKGQwcCmJGkz22whK5dX5Ors+HXDBM18InK+IrmTCIq54boJgYoNNUVwfCpCM7Pz5jG4/JN6/WCHfN/3Dtw5j105+UrMd/nA75ffbA4svqZN9sUOv1rvZ42W+NLQEtdAiXOK5ofASFzDI9YAj/ijIyOuQRHXeIhflcrfCiXh74SC+LcBQPwbYR+uYQ+fJ5814mFZJt8v2OEa5/Bl4ByuIQ5fBsTh3xjd8AcENlxjGta5R16Mf79COMO/G5Lhjw9i+PfFL/wxoAshjZEkEVZ8TOO67SHz+mfmCgpfjIkJqY6WHo8lRdgdFZyNw4xTwhIo1YYEQpsXCTmUJZH0cdL0b8gLhaCcfODD30Y85rHZXmclWVVJKZCMl9YzpARInNDfX47w9t7+MnKqrS/bjJB6NClBSmg/NLO8a8p8U+9qrgcHO5iQvebbfdxu7uL9drPfIvvNVpzEO+2dpNXuL9S11UtC+8nfShh6rmXlQVPSJ1g130atqNXcbm23o9ZetL3TbLVarfZCcQ4nixrr6GZEoWxVHcxsDkuMTSDEZ1orKPAxdAa58b5gfkjvIDnbinFWUP4PPZMDLrL5WxoOBB4TfRRrkkZY42qLI/2UeS/eTJjmulgR7YP+aXB64hRLSQfFWhSFY0Vjg+ND4pEJM/iHegv0ZGaKtJVop7Jj0bgI5WMzMHwv1L6rWQWsB6hPlA1E9H1gcCEUomxIpIKyULjQBVGCO5CcsHAGD4eGPVjkcmTh4+nV5QnqXF39n6N/FtZkKHg2iXBKcV3pARtXWpPrCV4R6T0VmBcCBBgKn/gAQfU71JwpkcGd70pbw4JH2NXY9DSOb40YceGh2xYW+LaV+m/a+ptG1+zXEdQocRUOKcgfGYX+yVOewTJlkiBcEBq0oDVEe16iUvnk5r/Qxkc8JDEWCv0Mn97fQPPjRZjVqO0agaXI745nrQEIPpTa8muQCz4cd641oElZ+D+3Wj5OO6eka/TUN2bBn77jHQ+ZaSV5vz89n9taMuKuG5EKZC4KsFTPEH5hc4e7fnHh50NWbPr5ZF9gp7wILu6JlcLxbTSmShDtbG/Bt+UWHIqteZcpd/CwjOZ26x57e7BxeRuQxymAYJprCqx7X51vbz9TvJD/2gvP/NkjxXW656+1P/9HRtKgK7FEBMcjb+5zsy6mOzkpm3ztvfb+wUKCCSMLK1Yhq6/D+xQQW40y+jPnw5Sgs7O5kWFzacScDfQC1HekcxP3uqdG5LpnEECajGRKALawo+C6Z/rDX/fgFcF8PDjT55yRrTN+v/WRJDQbb32gw9F1T8Y4JchhTlOGOpMJYQl9QB2nPCzoRDu3JgvwE78Ygtz7YUARgsGlL01MElNSGGdS8bHxdWV0zU4eJgBdEo5awMdE6CeAjO6aOUjifsUsMMQZvzc/GN7Mz5rBksIwH3j+SgerUtNSHxdquZwvgwH70eGe5C961uyeZe/0Aj1E8P+KuCkJSekdEc4L7LBhSgQ6+efcEcBcEpA2Gtm00fodu0chdgvpq0X8TL+P+OAp/MzJiMrR/1sgT2mmkYkpqiXzmK2PJa1snmHr6ORQAnoB3dCVpcH6OsVpCp+2DhS6JWRiLmuze6DcV487fy3bLHdKCdrPasSH7ABQHh8YtvP5AqY7/pc2zJujmfenaJJiNeBiHKEPRJDNTb1rGGdN8jDCmYRM7NSGjY1eCdxca98Qq4OMPeMqnA8RFrEB2or5eAKJ0kkjx8xpIMLgNZUk+eM5AeAs0kAjmiSENZAgODH/ra+qhr3PGwBBVVEhtfmvDffZjQbaMJ9+BurezPrFPCE9//QcJVT71LU/g5tyRCwh8IRLOUiaHpOQYdB+Hi/aCN4W8wd0aVA3LBYIlfAXkuQFQIAk5Ye0OlNqexU+KSCN3tZ9+IJQZGQTvM6X1uZ5QdKnV6JQz/oY2Fmf85RgViXid+ZPAN1vIEIQHWgD36cZUOngG8rJ/UpkZEVbSv9E2bBXm+O+aRx3n1gx7y6i0n/UfttsBDyZpK4sboxZNsCxQVgB78ZhTlmwtSgYk4RAGSm5s9gHnYnecz996gKeS1UtzjjSc5LoYRJHE8EfpiuSvMIqq08vPw1kPPPeDqRUr8AgMzVMKR8OIYkYElCGAk9GNEZECC5kHoINR4XUzLCtCRdI+6vKzYfOCL4jKGM5+Cn1MH/w1fwr5SwBP6y+azMWj4h2cssLeHJ5+emy9+X86vJL9+rkuHf56dPVilbQPJ/W1Uyia7MgWKEZU+LUYMk6dhCR6IiLCRdhBHdJRhXB45o1hJ5ilWoCxuPC6gFT++uVw0RwbZFHuVbwgz5TO5x8/vDb728/vu38siJJ67tP4fE8DQ8es0ePywD+ha1j7hd9alw2cWIAr+EersTobzdb+v+u2tuH7dbhzjPw+b/Crj7bcxnfT9ylm13FhXO9Av1SlVkUj4qVzb9oRYOV860e0zXme84ZBiAc+H1iqvEKKOWFmmOo9CvAO2t7hvPUwoBi+xyCQH0ZS8cox7JpucJbH/TrklKvNmGgKJgOqcJp0ZjRHizUu+MhpizAn9Pf6FOm3QEL6hysT+UNgQtL8xX1v5zYtPe6nHMIeLwwjr5/wZub1x8EDDCzFQvfX5gb/e0VO7q5x6e17ZgobPqQjTAbPuL6mr95CH8YJnbw89o1zCbQg+RmrKfySP76zBGJboCLHM7RYrQjnPwbdIlrsAYOg3l9lJBiZIeDjGiW0+1RFbSEFpVsQu5obXHEYxjcIooZNWd7sISkl7yd+dsAzjLjPOS6+HHjG5CzfBNQiWycPUKnPk3donIYzSLCCJFpwtmw/mTeda0ki60RH5MtnOZr9GyZ6Il7ZsJlxVJ5tI6h1MO2FX1CLkUEN7henL2S29nMNd+YwYUynnme/u8z/M01pnVQKG2oBShr1AVi7SBDkg4iCMkoAi5bTdvrI45HlBEUTuVOysnZ++rT8vB2v7k/N552BWP9KWRQ1teQ591UO2q2hYXm51FezqhSKUEnLKF4UQdAsxRPsl6NCUBHF198pPzJtTlliszdF7iKD3t59oJ7bZHr7+RBQfVLYhTOhEtJ+ynJ0dX0jJvSX4IROjXE2JBX7mMYZMV+RlPI8tP2JE2t1ov15WSxjAfYPtuOcQqOC7DC8/KbRcRBHiZczAVsP0ixUoT531bm8prhSIJISiBnzcR4wSw2fWMWJ3VEcEJEhPu0ZxN2a9qLQaau24qdIM70zpin8B47wDFBrzrvTl+vgDNIt6qJpw8whcnoeuyMLUG63uF1GQjQNQhw8wO67bzLU06YEtOwa/HKUCutyPMJapA7NzGnes/D5kbrob0BcT8PgOt4eAay4hNcyB7u05qo//rRdetyRln2gD51V7AuNd6Udls9dVkuQfg316zLH2SDo72yK8wMV88VJs0D9jy0MhLEwmai+a7BmQWNgoc5howuMBBjOB4hO1l5kxS8gFsydU1o8hZ3BaRwSezQBrbcZZj0p0hm/abJ/fBDAvwhI1iN0E3IcfTTzVKawo8Tj+j2Ypq6kAZWND5HtCn/yGwwuO/6/iVUmrBAIEVLxyo2AVw9fDKPY/0sbrojzBhnyA6PYpzGWWoUoLdOV8nHIMVztQ1aRGPoXdu1GxlOKEy2ErJrzJktUR3mqy1FtOvK3+ODgSR1lR6W6DezrZaD5wNCuL0f9jh9mm43GUBHrIT8Gm/2EvV6qJUQfUeFynDamz/X61mWbolwO5/L6VopD4tvmwUYWH7bQB+Tb3Xhw2R/9YVvOF7+wrfjPMNmWvTQWUE6+fkttwrya9YXM6QvrTEAEqFnEElo/UirMB3y0wWQT1QG/C3DkiLpYITlPA00FmHFDY/kdNzn0NlqBEdyaaes7pZh7wvdt+br+vVDNMuaEfSAi9s6oU42O3o/3MJTY56HBQ+jWEoe07zRMw5efP3W94L6xEyIooEwEsS++rmhfYoMPBPPTlQa3Q9qZ0Ed+4Kb3uOpNP3ZlN4Edl1gGteZ2PZZB7B381iUz+cH1t8wFQOQHlnk4/zqfdd2v4YXWJzyIc+k7VzYscDLxAT/ukoQPEavOsfd1y7Fgrhl9qMCUdJ81NRHuecyaIYU4zQlCfrfx52rToR+54xEAcATlTkUcyaDcuL+1LeuV9ymY7tu0yjh9yzluNBUxZfpoA5DneMuPNJOJ9oIDfa8e6vlYnyIbo4OrydYja4Vv9Y0g7Pgz8+h5GPS85v0xkjgZua3fmT7JhyAMdgj5ZIm0E3+rQjdlCe8mW1IHnxTn5eQitKXZj+cfwDyq/LdkTdCNh/UP980zAN++OwIGw8ILDfUDxZx/ja/M6d/WFsm24WgYyymtvzt9Bi9+vn0+PWTz/Sb7VarvajVBPN8E17CHMRKPpZ5XAcIi3GyVxMnH4/34I5e9Fp2CBvtmujrfui0V0Jgnt1eA4nbe/srIXKvPU8wb0Ei99rbKyBSJoTUday63eOTk4uliKQsx4RbefGWHjvvB+hMQ3Ov5tafLXotKbPtvf2dtzuLqrMxHZM6Mw4+nn48Ma8oLrUozBg2MYNQySEunHnBB4UQFDJoj4WOhxQzDOXLWEo6BCwfuTUmCcVNeEUIf44eRmqc/uu0c94JDIQBjSlOzZvDf9kWkD7NIEK/avt7bFICMQMbDZjR5pR58erbxit+zDGXyqPDFli3TdUW3YPj+rbgR70Dw1WgDPFYQediuy1xGMjOd19rf7e18N5bMjeyIjXS5zRqJ8n2E11U3jU6K+czV7u1xTzoUO4uOoxYk+Nrk/hKy+Bcv8XdM37PakujAhcYJtgED0pU1pUvY83M2brzL6uqf+/s8DABtzGz6t7Fr8jELLjxSZC3+LxMzK3lN8qEfIuEwqOLL8VkQoXFkCjvG1cnFC6cTTiBcuYJZnXl3xp/FfAHYJqScd/IgZ6wctlpTZO6PsPmKouOJuQbVOp75oPfLsj7Bc5TiBbgVf9vzWk8ntm7YhbGMxndj3aig/1WK2q/2W3Pja1X5piOJzWGZTc7JhLr0PRMjgg0zkYXJ+aUog5DlgrUbELLRfgYCuhC+i8zfWcHlA2JmAjKlKlVAciWO63soPM9oIBPqH1y5wJxA9TGE9IEPnOdKTCTvh5TohG+I4jHcSYAV8c0vrg3/QqhTsJafAL78B5Qb2rhi5UywpqHWBUM0wEVhExBq2z1Uz7cMqAMTW1Lab22td1q72612lsQ66Js2LTppk0jnKYtBY+0zVqOybTi/betnXiXHGxvt/UPSYz3DvZ3ME529pNksPh+calnPTgqNZpA/pwsowm7F53T86vo5LeTxTm2hYl1s2mnWYbdDa/5AfDJRkzh508TYtBsUNfAHywojyXbR5jXDmggQZnx3goR6aBywtgtJiqpB4UioQ39z4rmjO39nbeL3u3Gcui9dBPxyhg4YCRqK0dOxylltws/j9bo08Mig2P7yuzghArAm7Q0l5Fj9McW5COrLXJ8NYLLRkDQ+AsEjUWOyxbURb/qzkSUjTOz2rjyugcnYn9VD86qpfi7N998UibfWdfNJ3h5Ca04vrN2m09I88X04Vioz+YTjP3V/Tdqb7A5J+8voBfHN+ms+YQ4ftDGHVUc/3C9NB9j8sdpolnF4Y/WPfMrPP5922Z+RTB/r36ZXxHG99Aos4qFdYfMb9ghs3IB1q0xv11rzMoF+MF7Yj7N8/fVDPMpXl6C6/39dMF8SpIvxu1eqP3lU5z91X73SvtezsvoC3Cyn9vw8inW/kYO83fZ4jJkREjVk4TMc9YedYVN6cosHCplSrtJQ9PowlbVgFPsW6NJOhyp0GoxlSuevFkONyEe0G43W3tX7TeH23uHu2+iVmshpNQh4VFM1bQuYOEjpzfLj9icKUHwAmhbQDNnimqPrBeX0kNXQvjVPW9aiLy4lKfsZ9+U1cydL2DpFdmqaT3OCwDPdrIy+VyoEeqAk7KAYjCcgC3Vo5LXtURH1lw77X6CNSqbLQuvgqG9rjNh6a7cOUeY4UXgNDXdgNxYshhKNA8J74WYVMXbhLMhVVli9FiKFfyjrIP+G22knG0couabnWi/vft2p9VAGylWG4dody/aa+0dtN+i/1lQJdVZMPlFEtF0ZeczqXmmWa6tPFS2VPWOpPpvQ4FZlmIRwsyrEZmiGGt/tM+zsAzxyHn1qtjgjgpTSxgTpl33hnlcTzkXNuDQ8DGDxHX68YO6jsceeMLY6w0Ue/O0WE6bFweayBVl0DhsDEWhQ8Idt+XUkz6XirNmssBLil7ACZcKp3Wd/M0LGN5o5tkyV1g0x1cBfhs6ReUZwzar1oOcjvHUwyHeMn7PoIMQ0qzARFyg308vQs8QIftYb3vM3NOEpFNTrumcScXdj2UhH+y2dhcIcWsBCzLUFleN6vUSZnhKuzY/L4DPGhBfk361hFeq188Z6ZMF97Q26v7krBZrY2QApJEe393PuSqSWTzSm/G0c94JPlfJob21tzpiCNYK3nqXEcZlr0NFgGszN+d0nvI0/6Fnt+fK02GKvbkQH/hD9kRvrna0He1EC+TIpfibmvwAQfAiLP4xFreUDSOV1lV3uHEl8GBAY3Sm2UQXgise8xQihNp6thTI6JpduriteRnMW/mFPf7QT+jXD6dXJ6Zd38+XJyfn5sfOx3cnl+bHy5PjUg8/+NICArL1Uz08TyhiVXvDzRq20PEy8BfVt9kiepfOwfpjb0RfP/YA7+AblS5w7Hd3F3DzbcJxXfGJ2U7GfuJN6XKdy8uWij97mUhHOFtANdfdKPiy0CM4pewWarZ4CABS1fHpyY3q3llsXW+QpLLlv7TVarXa2zsLqHVtWUhtawEqdlhHu3I/4pNDq4VZoEufIszYoH0syf4uIizmiVa2uRn6nguP+eGIRdyksXMm87u+SxSYrCcPoEIuyfBzRsTU/q5RbAQTczhDnCW+14WFUdEKB14vb9JJT//uJn+l5hO7iP1MuS0adMMz0Q9BYn5HhIOthO49ObSX75WiVdTlyc+9d6fnncv/NJx7pV6BrvH5XdY5anV++fzuqtPpdODf5j//WHbVDRLb1zrmuRTbyrU9cvW0WmfrldUb34zrcFq9nC68DIxFY8DUqr4JS2KXx5MMO0JSNkxzr8J+3u8Pk4n8Ssu3+3sD5Hzy20Xn/LjX/f21RbrJFyWngaq80gjwj2BcO6XF95cmdgwTwt7Vo3/8cnZ1CnPB2G44aH/iR7zDggJydkrYUI3MsPZpG3jNN7Me8/jXT5fHZi+f/Nz7rP9VID3YeMG+8i5dQmI6LlVmo1ckGqKbjfbGTQVs0+a/No4Or4XC14IkPaUm133KrsdTPJlE5IEs1CyzuNfK5Qar6cemMEuwSIpbwIDxWZ3igYJmmTa7ZAnGRnQ2j2glPHX6fUHujKMO96QratXzla6JD/88+7gED7dkWgMLH+gdaUJHfG2qQM0KHwDmYfnN/9P7q187lyfXefGSU/vnV9dHmRCEKfukcX06xkNi6ktOoCus3tmfYFJ5fU+ZJlRv2CUEUq4DWolE3udIS3lVt+mEC3lgzF4BVct7vbSMvMqokNX1Melnw+Ei0E1eaCHpdUXhTWaQtR5K22hxJmSMGSOiJxWeCyH0MWseotWa2M4vWyfHl7bLoQP5zKBz9CBL0ylKiDK9kcc4pTHlmQwLoKAn55fLs7ItvwBv1n9ehq9z433oVaBjaOkXmq3Ftui2rbpBLAB/BprpVaVKbC8Qz6uxZm3jyiL5Fxwwf4ca0/BoqiXxCbiFC50y182/Ff3/7H3tUiM7suD/eQqFT8R2M2uMbb5749wJGuh72KG72Yaec3fPnQC5SrY1lEvVJRXgE/tjX2Nfb59kQ5mSSvVhUzYYaLo7JuZgu0rKTKVSman88G3xqrluuu7TTIlYTEQm11GvN1+nig9poPCTq+NRMe9DMaE8Xtd0wUch32mdhmGKnzUf4V88udnyfuDJzY75WBpzQgPvuUmm2B3+qW1P8xf2+cQPtmMnfsrS6D9j4g/5V0iaW6cBeHPxqVuUVutWYKxfsyn+crfd3V/3ImwqzgmHx+LskqVRBym2KtPmCEa3EipLo1yTa0Fmgcs1a3mK8ElMpJgwElAJpr82Gid0SsBMNcUXT870mbAhUnQBIEtE07zgCyUF1IitDGLarWMHMSiFmDsOMYd9JKxufYVDXKFf34cQEdKAmXQ8DWfEFUtpRE7ObnbcmCwOImFina/+uMKChP+8Im9Pji8+kC8fDt2g/d3N/hrC5D+Yh2da1dzeLbjao6bKlQU3d/cA2BVttkj55fhm5XVf8+bXjsIufdRNnhe0dC1fUm2OeK06gemaFI29qI5uu9VJpggfEq6wSKhsawaOhSLshqVTPQWWIi29XxrcTpuwlIuQTDKJLTQHtnwRC9H0YTY4Kj/W4eEBI60kHrXyqGCoNtvR373e6rea24YphcrRq2K2M6wS6wkqUyQDttUvV57YUiJplRb26pcrTMRRJKFpXo7NAL1MgXFAOouiBgiX/A+Pn1l/MsQ6qF+/nGKpdSyxYbpNT0UGna9ziTr1GATq/OYWOY/JlUXtCkovQc0RVWgQmbJAxFKlGeiAEIfm132HGiY5Guj7nukdLMq6d1tbmxtYQeRv33413+PnX5RIllsnK3pewlq9+Rq7CwAnEoGdJZEM7g1yGjra1YgOHpOYqVuRXpOJiLkSKY9HKJGcNmvP5QHTos+wiKkBSKW/6BS0exKJkQlU0K9q6TpULMbKx74qia59qsblzumORybMsJ97zQ1LpW1WaAFtY/drhlGNsVBVybQUu+jRZvy8HCclVEpPeD16eVwzvBVQ5qhcIkgVgW1UEGSee/TMOD48YDxJa0jbWha+hS+f7u/Aoc+JmQBvbVUzNpa6X9LQf8vYytIUQLeCCcyGcgFCgBj+Yjy5dci6PalXqcT4lbPxb3A2ogLmVyD3Z+noM4YW1elY6HdBWqS56Y/5rh7sHaOLY8N2CvMNMuWeanuTIbKowrkRseZ8TNgkUTk8ADo+eWXeLpXXCvkQLrUURAANmLplXrtUaMx/K9CEWVYBQGuQpSy8XK2ZdgHO09GYgRy2k8K5gRO3gTBJwpzskNkAfypdSRV0V28sfBhcta2hEP51XQsqF/lflMU+6sBmAUKmWDqBoLskZQGXLJrazgERl4pE/LqQUCmz4ZDfuRHhmbda4L/b2MBH8ImOSEdrHXKRTu3tZJKk4o5PMPuWS+gtwydJNCWKXhfDLox6rNc8ogMWSbzl0DohHKK3LIoA+4vTI5nLuEB0suuagk0PSrnXvCODMVtd6OM5jD5bdMNxWrZJ8Gb76l2tsozwzjiYlySBZdFVbhs3ie00gdGf6Mj8ltEIdTHzDJhgxtjzojGjyJIBMy3YXcAS1GjGwvRlwxZGpW1l5EIHfCYUCMoLHRzKEED2Bse5UDDC76bxqAtRBfNFK3Qwc0DjWOTKaGEPtj0K5K6QMkIDFonbepFQLz+KMsanLfqNqFSdydSMgJsIpQiVyikMzk9jRinYvoCrNLk6TspZBpbZoK8ZqFcQVO3Chs/Bw4PFWD22PlM+Rgu9UvpMUinlUe4EqNn4VC6R0qbZXYnkEpB6gsOCDYcmzEarwcg2hhZv2cXp0VobnVQu+jVfhdxwA6Hbtq1AQHz6EsHbMjVukfK8uc8rf1KvGXDF932mwHky6zjJV6LZwQLfL8dgtvL0ihjrqxn+4dbJz1JwL6EU3M8qcHPI8d0WgPtZ++2Rar+9xrJvP2jFt5/F3uoo8erT1l97ibdXXd3tlRd2+1nT7X6a/Kjl3L7vSm4/i7g9XxG3n/Xbnq9+2w9Wuu2VVG37WbDtsXnhxdjKD6zV9iOUaXudFdp+rOJs329dNhuI36ERp6ty/7e0+gsTvGXSSVg7tWnxLxmsHSR8Qbi2SjNA1WZ/+PkBEH5HsX9acI3KJi34tU0Mn2u1o3/TzD3t/Gf8+xhCfYXyh0zZt4xDr7apyODOK5OMUPLx5OLLMTm4uPgvh3+HNlheCRyHgodup5J98OYP0vqP9YMRi1WLNM+CdEuzsuZEsC48rCxIbqLCvSPk4EBlHUjMIQM2pjdcpD713HXLRIQsYka1rBDPJ349xf1Ba4jvYORhldDn3e3t/sLkXaGO0SqXKfiuSAy3yhUiH4QfeBwuTOUkokoLq5XKGDfJ09Lbz9T6h5+pdfD7eSVV6uDPzOY9wZ/k4MjUWjk8wz9OeZyZ9KkJDT6f45+fMNIYPvhDfh4OecDI5s42PndOqXnD9u6L7+UIywb+uHUc4ehbL+TMhEsJuVWX1wD+SAs1NhbjEZ82ll0evicLDDf7zHEwFjCoroK1y6lSNLjuTLhKGfSutwNsgIzcWHh5Vpo1OTb39lp1W3DDuhXwCbnQhkVHIe6Yj9gfFT9cCBEVdm9MGm6j2pXTGFYXTE/SdDGU1oSCp1EHYKq6ReiQ/zkX4YKWBqO0C+FG5C2768zmU3xFblwcdLvd/gZZq1IMfqkjzCoPcj+J3PJqYyL5NKkwyMOJVKVRMWe/RKYnlrRZGr0kYvnDVwnXdJQiXVkwBj/402xNO9uDd6cdaDFy2rfkxkWvu71fw33w/QwKPe4efZTcsDmSd646v/A6zNCuVrYOh2IyoXEIlyHniEU8wmbRScrsdXx1jZ5JQDSm5z32y8ro2fzdGYSV2eCpZAUEpqPA8Gd9qPz1x3oYebvd3izR0el2G99czyDuCxQzsyXJggs031Rb8QKdiVuWno9Z1FxrrV+h5xEyjUntk3eWZr9iUi/2/vzlcIsRof9FcQXb7RSv60apyJJ3BLXqUht2zfTOK6sEofotbYfFWC8U8gClqUMhyVAEmSQCva92fEISW5eWK8miIZxJHEqqwb1DNCX0RvBQEh6vhyyBdEMaTSWXeag7gnDX2e7um1H9S7ohj2yAtqm8r5H6Sw1RVGrqTPk72lIo4Ml4Zd77c8wXNRcHttQGTonsGGap+xpLcvmkrojL0/PL48Oj344vv5wfXP5+cvHb5cHx+WWvv3d5+P7wEq/Sm27UIOIsVp1qvP2jp1gff1y3JSulonG4TiMRF69cBSSO5kEkCFslFiqTGTDPJFPwxzrk0EqsbUuuqihdBmMoViPhWigPNHGDQkoOJrXiHQJVkLlSbalyctLpNL4ZmwXJikh8ADUkxbBAa29yU1FsQq8ZyZLyhbcjBoA4by2WWoO89o5dBapMuE8e2oMVWSDi0Q+DRLkCcFWTMf5o4aK02sT+1dwTaeAcUznuTMLtFS3MYUFixSOtinOIjbPb/uPRNgn5iOFV5tHxF7d+5oLRUU8Mm2yZUqAVZmwJKCmicTX+Lz9rzwVf1QVaYdlVF1sFY1RWovthd+dw90P/cHv7/Yej3aO94733ex+23n94/6F7uH/cuJGBvyZyTHvPtijnvx30vvtV2T/e3N882t/sbe7t7e0d9ff2+js7h/2j/d52v7d11DvqHR4ev+83jrsqrU5+1DzL+vS3d+pXyNHwJr87f/gK5aPiSj3OvtnZ2/2ws7Nz0N3eOv7Q2z3o7h33P/R7O/3jg/dbh+8Pu0f9ne3j3tHu3u72++PdrfcfNg93e/3Dg/3+0cGHxiHeBkdMQljRotXEV3kZgLZsO0BgP4FqV3sQFSooeqtUcXnkKUlfhFDk8ABSl07iYUqxWlKWMnLB6KRNjg5/ddmyR4e/LpDLYSb/F91c1fGNQgCLDOUF/nFeCQXPQ61jjzFhfEoSlmpW0yx2fn66kevdhIxpHMoxva6Wfwq32PagtxfuDLa3g91ef7e/t7/Z7/eC/Z0B7TfvlWPI8RhZHkdUsQ3IhPB0ZKjQhpM0Sfrwd2ZNfsSbfrffW+/q/11AXsS7bnex3g0evg/O+lgU4XISyH3I9vZ3u4+BLBSJSlcZj3mgFe+ARpEWljE5/3RiZKpiUSRNMA9kEmKGzFhIBVJFCfzGOyutfIDwcaXYBF2feH+ojSmiRIf8jpX/CrHmN5RHdKBFggs0d+OOmKZ8wtEOvgqZFnDY+coUlaxPFlu4iqSlOcrK55TPFYmcS2JHlnsl8mSKv4EoPhJBNnEF5R9JEssswWY/l2hLryrIxJlVZpp63aFgxOM3YxZFos5gmWHB97d3Lv/98KO24Df3trQ9kz94fHg071G3Lq2l7J+fdQGery6AvwQ/elGAWlp8ZxUBanB4CekN31k5gBoqvpj8hqVqAdQg9Ny5DSsvBHAPzi8g1+FJqgDUkOGVJkf4mL66/P8ycq8n+d/H7LVl/s/A7cdN+59BkB8r538GEb6HhH8f9J/Z/k+Y7V8g/M9U/6dL9S8Q/pXn+dfj+n0l+dfh8BJM4O8nw7+Ogi/G/F0qvb8Oo+e2fx81t/8+BF+AsbtoYn8dSj+A4fpdpvSv0p6ZEcCYWzi2zeyI37DYXJO08UKTJknEAzqIqjfRkgVJf3snbWy5MKnoIALB3gDTgRARo3EdQu/xJzKMaAEtU/794vScxGwkFMf7qlsqvTacWvF0KpVKaSyhUbuJk40Ji0Ef0p+zOGZR4+0Wszt1aUNmn3QpXZzugMFXADcLO+TM1NVHG4vwYhuPk4NPB3n75Ld+pyBOYwphy1RqLXXCYiU3VCTXXWM1jcM6jjvzh87dWE2iX2iUxOsWxnUeyrVSiJTpyJIbDZG4ZSm0GKltf7XR6zRmupTJbLJShuOyFFwNDGfmhbYwDlvNXneo4JS5tDGb4X36y4z4NbAtGvFbRem5In5nQbIiEq8y4tdfi6XW4GVG/Bo4X03Er12m7zni11+T1xHx+5yr8tgRv6XVeSURvw1XKB/1O4z4NTiuNOL3fKHY3kpMb35GIKwVU+5JYnvN5P+imysLIqsP7sWJHy24d3N/a2urRwc727vbW6zf7+4Oeqw32NreHWzubPWaF3BCejzWFa5UdJJUYl1NYOdLCO718H2UW91FEH7y4F6D7GoDTc8bh5SWBHKNAKgEHa1MAPyMg3y+OEh/CX70OMhaWnxncZA1OLyES6DvLA6yhoov5iJoqTjIGoSe+x5o5XGQ9+D8Aq6GniQOsoYMr/Q6ycf01cVBlpF7PXGQPmavLQ5yBm4/bhzkDIL8WHGQM4jwPcRB+qD/jIN8wjjIAuF/xkE+XRxkgfCvPA6yHtfvKw6yDoeXYAJ/P3GQdRR8MebvUnGQdRg9t/37qHGQ9yH4AozdReMg61D6AQzX7zIOsnhN/9jQfkLVjCQ0dVcb9ro5oak08VrwvUj5iGvmw+i0moucTr+xc9yuxYrDAz9p6kf8TxZiCB1cYbvoQDhEfDTvQ9EWHp2JoGO7hMa2NnIdTlWMZuBTwOaNUdl5rjra7h8JjUGPtg2jAoHV/bWYUCkNWOcvBvIDfDhl5sIK7vdFos1zCNXDQShGglKI32sTmQVjCAWAlhFMKowNhbACM67eaTxgsHMpCamiA03sbxlLpx3ki5z7h8N9ure/1xvsBkG4Tf3argDsE5KuTB34jGVXJdZMTiJG2A2QKuLXzKeMiUcbMG05EiVGTFMELSR7c2dGptp6Th39xjQOI7S03CQ8VixdN3GTLLQklWXybQ2G+/3h5vbu7mBzK6Q7dDNg+/39sMu6bGt3c+cvNRxqysV6ZLY4PDGx7bSN2dV/h2MJpTEfjTURAWT93q1Ir8mEUZmlxqAEHnY8afjXLYXPxfaMKBG52x12d3Yp7Q7ofrc/2G1A1CxFOWbqEn/9cgofZ9cl/vrl1FYchmMw1LorFAFCm1BoUMwxSVOl7fSvX04l3lqaJy1Smi6DlNFrHo9IKG5jzU6CyGDMJqxNsLZTmyRUjc37gtgo24eUGsaBVyS/3xzB6JZ9sjTKZVGrWJaq5ViGkJOYSDFhEDCthZam84ROsZK2CWs/OdNU2NCk1fQOecoCFU3bzh1Bi6ihmd3RY4OPQ4/dxrBxd+dMbsG7MRJ6Dv3TlSmphZTzIUSENGDm6lrDGXHFUhqRk7ObHTcmi4NIGH/j1R9XsHZX/7wib0+OLz6QLx8O3aD93c3+GsLkP5i7Tqz7BYKFB5o+iYIdY/ahBdeNiGC/KZ+DNQXBXE6DDXtfFUdAXwANVk44jLnVUtpOXqO1mC3vUANegpDf0EbjRYyGuHuUt1QX1dG5JBB1IJkiXEstE3nd1nwZC6WPi3QK5drHcGoW3y8NbqdNWMpFSCaZVDDIQJ8IGj4WFk+UPIUBHx4w0krikVc1S7/e6ujvvLk+CWWClm+xZpzBC9QgDWd+2llIJXlrrVxF087oz7U2YO7GBLJRrdLHfvygY6y3rdGfrTbCgyO01qr8lBhnlmWiYUpHk2Y+66V46EykyijpRqwQuNHCTfDLlSdklEhapfW6+uUKr6hUQW+2QBv0HC5Z1ES7tTEp5ssn7glzMsReG/p0gY6kfKKlIo3hiJyKDAq75zJv6q21VMKP8uIxucrSqKPHu4KkKYg9BZmJ+5ZL8GTGGO3EQrQCQRm1ggjULTekFFka1Ge+2PycXBq929ra3JCMpsH4b99+Nd/j51+USAprY4XDi1+fN1/jiQi1KhXmEg3YVhLJWFygm6NXzc7nMYmxBSOZiJgroe0cFChiAIpQ6E7LAdOSy7AFrGTKqPQXmkIOGYnESLbdeQbNDhSLyb+0bHJ2hoklBgWksKF8vpgww3LuNTcslVrO3lLpAG0XFKRYqKpgWYpF9Ggzfi5wT0Kl9GTPo6cbmeHz1hFwgHVKMKjx4txbmkeNS3N48s8QolWaVqQLXiiiH+Sdsaxr4RC5LK3AsbVVvXDY2tosAAWm5irVDpjAMCv+OmCofeAvJm2vDgfH75qmJaaqnC9/g/MFdRPfA+PP0tEymxYVyFjod2EnpvnNGUZTeLB3jPaZ4hUdzDfIlHuq7U2GyKJ240aElAIaEzZJVA4PgI5PXpm3AxprKeKujTmkLMSKU8XIgKlbxooZmOpWoNJeOkQxKZOlLLxcrb1x4VmX+aQgaq0FpfFNEpY3nM4G+JO3jBVtzRsLHwYDrzUUwg88aukFaflflCUlan2GriFTLJ3wmIX6/Ay4ZJHJ96CQ+2fcFfmFtcyGQ37nRoRnIM313cYGPoJPdEQ6WuuQi3RqCg7TJEnFHZ9gCAeX2haRfJJEU6LA4qwqhHopIzpgkdTSJwJ1Cc6dWxZFgP3F6ZHMBU0gOtl1qyrCy3FZzsUGhu2q+OAcRp8tFuFgKSvXGChw9a5WPUR4ZxxRRcwsQ62Syd0kIMuNMozH/ZR8y2iEyoZ5JsZm9CCQcjlAo8hih857dhewBI/ssdBWjH4ti0OjWVd2cQdMdWqdG55dUYYA3IomnR2lE/weoNPS+YGUbRoHMwc0jkWubBV2TNujQG6BlxEasAjzV6obuH63FyWCT1t0V1CpOpOpGQFZHvc8larVKbsHzCgF2wxwlebax8kky5cyG/Q7Mhv0CmKlXdieOXgo3Y0qb0Po8zFa6AzRB4NKKY9yI7Vmm1LZ+BZUieQS0HgCYc6GQxZACoLW7JBRDPZv2cXp0VobvSHXsbiNNQlzuuf2BwjFtvU+gnjzt7a3SWoM9fK8uXPFa7YWiAnwwfct80HezxL3+Uo0E/zwfYFvMsnSFUYYfDXD1yjcPgToMTUuXvt5to8XuBBc/8bTazVHwmNUirWAoAORoeCER9FWg4517IY6U9h4FcHKc1ximttp/hjTGwaeGAYRHyL1XDqxSjmTRm2ESUCsiBQswxhe46GVFNYdTWNCISffWI94AniCcmIW7kHd6sY0HjHZWa008Jtfo7dXpNOc5KAKTxhEwYnhLF2OxuT06OBMk/YAmfnIDeWLgebV0g3ukIO0QsYuJjk1L5lkwNOH6iNH9zx+P1KN5xuZKwBtrTG4ZhgV+/EgGrBUkWMeS8V4vChJgNefjWdh9udmWiTBynoAV68RXWEmwN7055RTqdhkI4mo0gJ1Yd5GLFZ4sPiriJMtCqKXuf/oPPbV9ZE1NRygwUyKnUoLh9QQrvZRWsaExiKeTvifnu8Xye8+fpVsmEV6E17plzo8vNI8iB80gldO6QxEPMR1plHxYIzDGj0+kyxcnF3LjBrkaR6PyaT2VkHWZP+er/fWt9f7vfV+t7/V39rv9Xf3dtf7O/v9rf7+Vndrvb+53dvf3tnd21nvdReoeG1QrHLxskg+vng+H4vU2IQiJZEYeRe7dbSiHbakaE5FtLIsZ1eiCMM59EyEouqmeL7PjY5WQunNH61rPqAxvaThhMetNmmlDIzEeHSpB1yg8M+r05bcFbI1FH5IhTDH/oWqhDmAP5XCGqL8wGphmQjfq2JYxuNFqoY5kD+Vw4cohzkdX7F6mCP5YyuIOR1+CBXxOTQIP+7pJSoHzYNuHkFzsNC9VqWgiN+LPO+LID79UW7n/3lKzzylLYm+1wPYFTx/WWdrc0n3wIPXRen8CGeqoumIqR/SNWFQf6F+CQPdS9U7nsEpYSjyWpWPRSnwItWTRZF4kb4IA+FPFechjghDxO9VCWqO4QtTk57YBWGI8Ip1JT9Y6pKObCaPFzJF8m8bBE7hGDZ8KoaUfij5O2EYG0/JIBW3Xna1290XYzY12ShyLG6JPolicssGNjUYclf0UDwe5YH2piZA5kC1Qe4Pj3UKmZ72qcS4ma28xvxsLGJ2j+2yEoByklalDh3SlBeAWiA/6/lUudjjlssCt5Qx/Cj+5FFEN7Y7XfIW1+C/kcOzr2Y9yOdz0utf9jCE8yMN9Bf/sUYOkiRiv7PB37na2Olud3qd3raD8+3ff7v4eNrGd/6dBddizdYg2ej1O13yUQx4xDZ628e9rT1D5I2d7pbpGOVILTtDOuHRqhJoPp8THJ+8tZGfKQvHVLVJyAacxm0yTBkbyLBNbnkcilu5ViEgPlmBu1mG5cs0vT9j5Y14ZNRDaw7EfmKy6wCSQgUvVIIr3IUM81H8i96wMo2uWRqzVRltFRxwNgc2Fg6ht7P2xVZnq9Nd7/X661AnlAdl6F+gOffgFbZlBrz1nbWk/1GmhzUhnmo97Xxm7wYsVkK2STbIYpXN2680veWV/aoBW5mZIDH4/crMYyovgLVAFRuJlP+JT4gykjxWwi2uFsfmyBqkgoZQLZClgVb8QY5xJj0b4rN7XDIyFFEkbvXIps1gnisNmXBvXSmitXck4nF21yYTGgBFY36XJ2sYulbLRnw+J1ORvXmT6hOeQl4GpACYtCOTDBxxqdomzd/L88DSAm7IRCSZtqHCDjmLGJWMREyRTEJGBBlMNaFiPQONsTooTnV8eN7WVE1SkQjJCPfyA2kYQgvJakw/oNlUUxays9rqVxU+byqwet1Or3yArhZUr6zYPWqUPvQ9JfwmMgemUb//cXrwqYnirZ+zKjdN8xxOY0JOyV633+l9I4qO3so1TB5LaHDNlCt4JDH3g0rC4xGUMoFmG/gnjE+lFAE3xfv0ELFN7gbbHYx7jbXbmNRVFDaT4ZFoG026nfIJc9w7Gvs6LFIWiDTUw/F4FBlsFR1BmhlIhwzKQUB3S7t4YyyAoAH9ts7j9W+ExQFNZIZQyrZxPdRBRgp562qa8MDLdzPZFlDihboEfcliKVLylnVGHfK/GLtuk995yuSYptdrkH3Ob1g0Jc48A0dTSodQcLlECR7HLJ25qjgEwYcMcvkCS/LW5pGYUc1vRfzXZiA5Hz3Ez4y7KJZz0ENp9xcrzqOpk788dhJK4x7X8IpmdGx2xCw5FB2NQBaYIT8PbDcyj7kt93Z8LjenQA3/2cfNkI63fdcS1Gpxu8LUIbMOqZDLIGXgACvvMDMmQOCNN2tdhjxltzSKZJukwPyyjR4QGpIBjWgcsFQ+gv27MicsIHpyhIaFZpW8jLVblaocb3oWrdA8/pyYop6AAbieFsFBZEry8J4C6e40yKKYpXTAXcFZeyxUfph9PujjoTBQg8w2WjM1qaS52Y7TuWPqQWllqPCttCQEdKISQ6tAaPmfBmOuGLbxAgRVhV4UwpBknu97AYqjKbpite11Jw/eDv1bkiOwgvVc51/Pj9f0H9hfIYIH3aD5C7YYo0jJB7PP1wqZqnmz628ZjaZylNE07ODfUCT82y0bjFmUbAzFJVQGija0fhixcMT00BsFBC+trs1kZ6wmf/wPGMgBViRG/uw/12rrwtgaVzYXsapWvvmjZfFa4CY3iPThYpPIV8Ql0DOiMJGrs1qgggxEmmuihcXJfT1+ORvoIQItyYMbKTeqtXL/cd64sLcH8Qszsyu09L6oJyRsOXOySXfQ0wjOTH/aurdnbIrghnUmXKUMW8BribYxpN+AuaNfght2CQm3lx5w8jJImTar/jiEOvNuWl/ScoYn9vFdIqSWF4f/OPYx/GdlVU9ibUN9PifYpIb0O71+Z6ftl3MpksPYgl/ODhfo+s2gZcOqt4WVnd6tFOhHeHnK5ZylqW6JuiWq2RPHTUmwMj1FY24xNgLh7cnRmi0uYPpwFIpy1B2dBHO8O+TET8smWfGiz0xgBrW30lW6ls+Mpqx/O6bqkstLvQV4uGZ4vczjuWOgzOsnR/+sWaN1bHzU7XYbN7+Byp5sdWXLD0jKsKzabAFT0LKNtMFSqxOu+AiNJEcLuxiO+8PSupQJU78iwYivD3isvwWvcDDif9N//OrouNPrLUBGzXiXK2V+Y2uKlMiAxvWsWtsKq9ft7XUWYQo9fszSzg2LQ7Gqgu8XpljMrGMdQCAIQgWtCxbTQdS8u1EgUtYZ5H1x5iEzjAStPUbfnOthsGJESuORuUXtdrpa/+51O11T90X/SQbM3kJMhFREshuW+rUF32vFUpoRhbZRtZ4mJZNyAte2ILWTSHBliTJhKuWBJG+pUjS4JjcQ4pP7PbGs3x1X0zZJUn7DIzZipuqxietQLMWS0GttwicJDVQ+qh+locdw4+rXRikMq4cy8VYAk+kEC4WoZygBNUqXVdCBdddDEWQa5bWKfrrd2V5siVl8w1MR69Ea3X4+0Vof+2Ddt+g0nhJXtBK4xKxQmyyzQnC3z1Omx5cvYIkUmyQifUmrc2Egum9h4ApxQlWGhNYkDblXSKtdOK/tWgWPty8aUni1HnUw3z/ZhioF/0duML/99I+jtfywh6pjCjpaOxrBMgB/0viaxyNwZLdOxW2rTVofWcizSQu5ufUbH41bsATaOCM3fb2oTny6EYETZNlNCRGE+VwKpsrH2ux0TfWqKXgaQzbkcbEsrx4hf7iwRh4XwRNcEnEbsxC1FxrTEXqiPpx8Ob/ofE5H2EOHvIUvtPAkX8/Xsel/LOL1JBVD7plaXveaNrkdCy0MuLS1tJUgYxYlIPfB7y5ZAMypNVuQE1r7SkTs9YNTjE4koUEqJCrOtyKNwhksGt+EnZhL1RmJG/BUrBtRBOxaFQZ4hdKMVc2SrFC7cKteq2FA3SdNPRAU9hCk0AoO+q9HjmZJykXKlVkIkrIRTSHGwBMBy1GwosTraQI39T1eybvt7r7vjITGOYeljvBz76u41FpAhIcD3tSgJaI3lnVP6s1yV2rbLwutOX2/JcduH9GURGI0Ml0lyMXpOdHCFO97Qj7icBLahn15Fz5HERZkSut4ZMBjmnKtx5xvfDz5eFycLTZR7wMRwjNwgNJoKqGcMhRqt1AK8Ptfuz37u63m7vdAw8BYiR0u9NttqODtboMhIvBK/wDNka46MIwZcUzlmEnLb0fHX9ZZrE+NYhd+LWZczLppO6DfvILuL1Acv3AJM2D5ZbO7HcTbLQREv9yRY9rf3rlac+gd35hFpSoPxPX76VaczfaGKb9+k+0iKJYU2KIJ6eHXqTTuaL3axoFFrlQkO147qSvTPsKMCD8HEWexMgR9+F0JjWAD6+MGMhpWFS/qenKZvnnevKYO5tvzg09rHYzk0/NIckPTqT4RgtI2BbXBtgpFBcJbK3D5DKDXp96eEMWJK5o30dDcf/TpnPgYE/JWD2XLWEujrhcSRVi1M+ibv3pVvxtrH6aV97N0onSNKJfr4V7Tqn/xFv0O/+foTinLqDVvT2ngfgkdKRdbPWxI6RpOatWqTT5//bXUlh5aUM5ZabdXll3xF9OJ8qNmCi0V/sHZ7YJIPHfzyeU27kkcPADPF9CDcjG0S5y9IOqvtFdlLNQltKFpgE6Yn7dFe4FPGIEOPzwYV5RCbAUQiXjETAfvECpa39CIhzU+1353vbu73tsh3c13ve13m/v/tdt91zzfRyOE91SrxAh8D02w6e2vd/cAm967re67/vZi2Hjt5FfdG/zANdC3AUN4wa8qPffLWC7QfdvDJ8jSm1VtIrgA1+MjLiachUWRfiAwP3kN9b2W555lRrCbvCWLdV5U8Nc2arLdb3xF4BGB3SUibtZ0yutrUsD12AyRd7xgKZQeLy4aBjc0Q2hne3tz15mnIbsrRZqL4BLjy8oR6M0Rl/zPJos/C2lwUfA/3QWIt5YyoYE20MiAq6p23u9u7TV3s6ScRqtt3WuSJHEqe2cKR45j2/rTDVwmIICkYnHg+7OH5iYbSrjDiidjGmPX3TbhyosNRytWGU+DACMp0ooFXHskCYaMu6Hzrn4Vwm5vf3j/fv9w9+j4/Yfu/l53/6jXPzw8aN6X37ozVi7oToop04Um7hYIXyL8ziB0cjJhcBXkF6HHI9m6X8i/C3JK4xE5TKeJEiTig5Sm0w45Z8zdpI64GmcDiG8aiYjGo42R2BhEYrAxEr1Ob2tDpsFGAANsaJse/q8zEr+cbm7urp9ubld7Emm1fHtnfQExbBtwP4u5KZ29Oatn+sNb3jv8nsOcXN6atHC/BHOyLHqso0Zvnpn25PnFr7kO2ianvxb6+3v2Jvrywbp8tNV+MaZkAelFsXhuW3LWpiws3EOQegGGYwnHxmi8UiPQNsZfqabjZROhBxxUjwqbbc4Del3P/I4MGFxt0zgYixQ/rgc24tHc57zHZwog/BuMfWg7L5kzSb/u7ifs1QLchEaRaW4J7mcNaq3HHFKixkIqT1AjnWjEXfPKhKqxfdh7sAZA/e+IJSkL4NZiHW4O8hfhmgY+8WJ2FI1telYBPo1fR/EJ+9Pm388GD6PgSw9P+AjjMs3VQWF0pEhhWAGbxXyFHy7r+GYG6m59IOwGQgFGWQqLgpPV4deA9HqF/OfmogWDLrumc0fWxNXqPpMdHkvlOVHvpRG4JfBdYt8lPLTbIohEFuY74FB/tHEEKZkwRUOqaP2m+Gh+xWCQoPAqBBzm9ggNw0t44NIOqZ8MmJQYbObvkQLm8FKHT+jIq3s7627Kr3cy4et0EIS9/matZMlZ50SPTU6OXKAjImJpZRjnF3Kg1xAeElHos7AFVWPWQXgtFe6FdxZ71A4zl0W82S3olw0INh8ARwQ30sIwFMTWA6Foul08OCY0GPOYXXq53MuCYYby08KbQuHHh116UnJZUGaN1xSeJBUgYR/MIGagxfkjZaNcV1129sIgtTNbMReK4Br2kZFzR/ZzjVDA30CP0ud9FDFo/g1CDn/TEkuORaou8aTJ9SOrXuB8607GzVADHFhNqJDfzRcHK4hLPAehOpj7sY6MHinrX6kl54yptARdfDaQ6d6WXnDW0pvNJl1+OtMilvxCLj4ffX5HfhO3WpGa0ASrKfytAktBpSHz1Roy+3wi7oxCEDqWp7Wm8ZdZbGP4/Df7TGXok3gofO42hx+0Q7WSzmNo/X0tO5vT8fjw3M/Xtj07ZYcFsjOdRB3zHCYQ0hR9zbGI1/M3S3WIxaxGnY12xuylLNTYs0MMhIgYjRsuxzCnFaQy5WxSnVfIziDjUXXKKgc47aXV2zvqdfdbzcD5fE5gBj/CqB6QQISsdt/Mg0WqlKlg3BwYOwsWC42njmOvswFLY6YgeMJw6N/972rGzX932mhRtcwHJT5/zpfP+Uv3yugC0MtyY3ktEhHWC7CFxIJHm0SgK6667HqqrOY0WHamMxGSrydH9RPxpDJP4avmU5ycVWcAR0ZCg8cjWz5idTIRVo6nB05mS2LNmKxkOj58QjtgXZ6+nvH//Z//K00NrCpI5rT564PPNe/nywlNEh6PzLOtvzYUKh5O5hye0KQKMhQ2Rc/ki4Pbg60eeMkiSC96eaA7yOoBT1kS8YDKYsVU8mDuzcedsWlClkRiOik5Uh4+cT7ujInBxTrMokdH2Rt4xtT36L/LTuyGNfc5IR9CnqrCnsu20XxeeTTNYsUnbM0e7eYUzc/1M/dFDQTmx/xEd+6UuhM4H5s80vHL7pqaDmbuTh4fP8d8KE8jbmOWVibyAayskKUMvFpU6PI3ymiRunzw+xiDzPPC18LWqDhzEZoSkz4YnrpaDeU5C8UTirPW/hSLdFKKSqlFv2HJZfsvd0VCUfy/2J3yLxGJa07XaaZEyCUkv+Xb5r/jr+TI/DIl/nPE8wje65CtGcrXmw0cbshZVxXmuQ56rIu5bvftxUa+e3vJYwJZxNCB5hWOq4emsf+qESDHNBibMspjWihSYIL6AhqTASOMq3G+FiEJM6yIomiqssTyBA7Eoc77BOsjuHsJyAFJaEonTGmUU5MzCWvNFJjk2AEfvtAf2yYJH0CDTCsa6SGUxMimkzN8wggswsM2pMdAEmUBJEi5UhIoU09ckz2SpCLMgqZGeCMSQ5CdO2vMBNpMdFjPA2gFzFcA6I10lRXfejCt3QOUl7T/aDDhqC6mwpHM4yypD2GoeMnjegizdEZi2/Jwff1ySsbiFqPFEBCzKwDGeUsYZClrul+L7pgZ8Pw+ZrARc5rcUuk2mXFq0UyN9XllaxqlJBbKeSTKN8AtUxhkzGiq4JJ3ImKuRNoqSdwZwtI8PVMhmXl9CbOat4tXlrO1GO8iYtZKzpnTrqidFMVBrc39aJMUVqfsi515tM852Gce65CT+CdL3xEJCZdVxB7qEimgBQ1y/iUGprCfjSB2bNR5RkTDrFAhiTRTRC+EopFFEPL5mVR1Y81DJJO1aHgRurVzH9kjksdkwoNUSBaIOJQ1llgwZo2vAbI06lRemKXDz137A8zk0yMaEIrpyFcqSK7akGup/zNWSn/UBy/8La9qNprn726CSKFN0tKI/GY9RGLoOk2gKmJWXushhyjgIRE+HoFX1z7LiwvsXtLMf3JWg+UDHIQnZ3OhPPGhKkJi/WDtwniQB8wTW3k7sCEkmFkrRXTDQsITm7aZxwdkKVjGEBtS7xwo8L2pBxJW1mWZiyAs9ipSvQhWcgcQmQ3ZJDbzwlJCCShIWG7Y5fkTxiy4vixLgiUgOyBKXLPY6syQzi25lnU0ZiKT0ZTw+EZcs9A2mxri5BILL+dli2+hRJwt5EtOzvBKCR62h7qth3z06dzUF6suBATNJLQq9zSVLqF4RUNJzyfMlD0BtSfBUgTGnwpqPyjvWEEToxXwb4AZtBJ4SmvxLA69h+Frq+XF7E6BOAmziIX4ct09DjQbefjhhePg5PmOKRopbZLJDGrwGqOnlfEWxBC2zNV/q+YiAH9Z7LwpwneGQ4ADJK+zV9SuyGN6QspOGJj95OgxnBq1Q6N3z2ih4PbzlNCPZing+7LmaQI8sW5CON9zZgeuX4PCqK2zlEljsUJRfiqViWRkEw7pHsbOpYYzwT7N2Qb3stu2LA4TwWMl27C/pbe/uRqTq4kI4XyLrjqte/Tch2pqJ0eOyX2CFMikN+clrfJs6D8/d5YPkN4HfatwhQBPmPXkCGUAY/FM7exyIiuTl/SkOZOfsnikxoCmBiDHFdwF7I5LhQXFJzyKvEN75qG1pEyxZyOO1yatLGm1SSsUt7ERG8MI7yNahXdpPDXwamsyGIOw5bESxD4/4+iqwgyluQpu1wLMCvRaw61pVl2QmoOw0ZBZMm9UTYHlxtVvzhtZE+hyzKXKK0gTqLqpD/yw7NfMK6eGVdJVrpmK4IwtZ0OJE83REOWNDsXK5lqVcP630o9k3g4n9+1yMmunN5p3wT1P7t33pLGNVAVnWRlA5skB8rCleYhMIAvKBTJPNpA5m66Cx0wZQWbJiSWGr5cXZLbMWGKOsuxwCkc2mVAQFxWVA39p6O7KxyHftYaxuMyvHn359YUDDAWlzIKAsdALOnvIobDAxEPKI+Yi/Y1J6K35wdlHKMHCg4qSOWO9K4kNc/zGenRrhoKLoWBlQNWy+Bqyzx1bGqvbA/E3IRWJhLjOkoYg5mM0YMmcmN5EhWjE2TzzYv01j+10yf0fWZwHio74DYtn+UBStaD15zx+1lmCzWdgKQmFqltwp2k9OU1vwx/dAWk30zRWY6Z44EU8tM7dl5j81VSI+mPV02vGAnkTFs3B+3i30c2BM+dpcE1H7LJ4+3b/e1AF4mHi7UQPgS1LkfOgVwF4o+F8E2mIks+l3RXXG04aLsHzFJTCKHL0ppGgVROzogzfo1EPIjGoDAK1FKezkMVfsQphGQx/2MsJX/wSZsIneesCPQoxmVzF8aViVelQ3qvztthMb0jNZcW88A0v4rZW05yH+GymI3OVpiXV3jk3K7NpSBrJPCwpbr24iiXlsJL7iFdBYz4F5sFVFn7lqf4lsjRm0yfiniUsRyfu6KhMleJdFx3JXMYA+FrGGPya8YUzrNNU3B/ztRRJ5qE4YVIWs3AakFIqGlzf/0p+2ZYyFsuxUJcpG95/wE9jOuFBNbJqHvK3PFTjZY2e3/XL1psOV7I5yJqbE34HCTR1E48ZH43rPQMNZv4N3r536tqZB5GYZaveK0MOlEr5IDPhsmhfYURIyG94mNECHDhTh3yOoykEBxE4G/GMlVArgKs3aEhB0VMRM3LL3oTkW8ZS/XFRaaQnWUiO19FWAwoGDd4tRdM8BFGa8x3yowZYpZXFqkMORYqluLFJImBObIF3wrWWbAsDYEv+ej3O9us3RaQbanT5kPVLWUDvfXEKuCVWKQ1cvsnsINaEpZzFNekQC9y0HAykiDLFbPdHo0xBHn0+g4PO2O5FDPEfdkG9YbYIfExvTDMZc82Ftv6sU2W+XBgG9e6We3eIPaM1Yh9sBT7NI8MsIgnlsW3Isdpz1mVVPAYepzQdsefGJAyih2NyZHekQQX6eLKQsDhEdnmiVSkaAEsicyro8pDP0CWbwR9ES/s6gyzKJrhvIzoVmSJyzIcKWz3YvgVaIgxTqHNdtfXNtr8EofUQUQQDGCmBjnQ+wcMsL5wO5wBNGUkZjYy0KQxilDbzrlxS3Dzkijf2mix5KNVrpkVDnMwznorLZqvxmQbwE5peE6FPEQpNy7waNLNUv7Re27mX5SciFkrEpjcvj7VNLsEmB2RR1sMVxGzaz6I/abaXK/6bx7HI/M1cWr0yLis2y3KV22+4ct9bJXRuQSllodnLBqnCLkfOdBnlSiW+8/Xi4mzB+FczQj3NZ7le9TSL+a/ywGbSwPWq1XHvh6Ucr8ZPDhF/NrrTkKbqUqo0gVnGDByIcNqYjZ9CD6+7ACWonft2j0UeEHDBg64+MMR+2WckynlU5wMamYYe9RZaykKeskA94vWkrZnmhiZDEUXiFmGlKRTFhUpfrjGrNi5OqVSEQx9lc5XFsRKAMhHyQ5FiykhlRk0Up+xw6P5+G8+ySGnISumgZLZ7ksx2UTaiBVzV0hgFu53crmweTml2K65fDesv6vkv3W/o0SM6ZSlJ4bpBpTzBSL6mLn8bB7ncEfC/K3Rx7rABU7eMxaaO92CqQKQaenzLGDR/1ufgbcqVYrG25Cqj5bsDHjXZOihPDOQi7XiTQqsqERMapYxWJALxqs9Vu8l4NzP23yeh9OExzCfDYutKK1QQmQgcKlJ0AFCSpGzI79pgZ9cKAGIvIEPBcCQtBqa5PwKPUvDXg1YQFy9DS8skABA0MrUAWaHSgP8WjDwnNax2uZCsbspvwl+k4r0YxYZnhZDfmkMH/yEZf3ICWSEn6C3PLo0YWIoT5vKBNFHDpmEY3hD4kqdGYlQlBUqQeyTGCyay5fBLPJweh8wY3G13l5XxPsFdjLb/pSZ+jXDHY0DvTe+UgJvrwrlppL9ej3zlqhu3JPu/35WzmtOS1/HFNQLBoFLObljosiN9E404G63e5haKLum6miOtffBsDq5lFG1IxhL7AHfIueYn1Hwrw2ECAVecRuTi8MxbX0KVYpNEdchxHBq9GZqw5PK7MlrITRZB4YB4yWfBS+FiYxCrwLeH9YKAbtrQGFbBwrawnsLubaMGL2QYJyJdJCip9PiDLGNolm67oj+2XeBIv7RZYHbScvu+ai3V7nsmFR1EXI4JLe/eBfT4POTqpeyGFdhZcyia6714dcSSnHoQxazlUZG8L4VQNjpMBNdy279R/Hz49/NtfS7cNQ6ttWPUE3VWRJg3UUl0vLtHdDx0h56ev6wdWlEa/N3p7cwbTi3Z9EMmhHaOMuY2qjeIEgXSvxR+dOdY5Mcp6qViMfSLgV7qixxp0cJBih5jLHSUeX1ELmOhLkEmFNu0kdlpWrYS/juy29lzXbKrlMtL5vOYDOkN1two99Dt5B3irjrkmKYRZzbxo9jyzbHEG1lo3wx3VoWGb/dh6nfYuw+n+3PVFkEUZr7qkFOqHhHLZ5cvYxqHckyvH+3EqkiYIY+1eNGguskaWHGVgV/ewVaeB1lmsfU8YgoSEiq9zf02A/MQdZpHXeuRIiCPUe5sfvMR+89rQmKlLQ8mvtlwcvjxrKF4NW/WE3QGN56cYUJ6M6lqXBQLp00Wuf+T6Tk3JBo5chyMxRczMHhJHsMAcCOTL55b5QtLtBVZFAEN+eaxkwH+fwAAAP//75Qh3Q==" + return "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" } diff --git a/x-pack/heartbeat/monitors/browser/browser.go b/x-pack/heartbeat/monitors/browser/browser.go index bd269573643..d0dc11a328f 100644 --- a/x-pack/heartbeat/monitors/browser/browser.go +++ b/x-pack/heartbeat/monitors/browser/browser.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package browser diff --git a/x-pack/heartbeat/monitors/browser/config.go b/x-pack/heartbeat/monitors/browser/config.go index baecdda959d..b03aa6c8b43 100644 --- a/x-pack/heartbeat/monitors/browser/config.go +++ b/x-pack/heartbeat/monitors/browser/config.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package browser diff --git a/x-pack/heartbeat/monitors/browser/config_test.go b/x-pack/heartbeat/monitors/browser/config_test.go index 7d11fc47b45..8685e8d9797 100644 --- a/x-pack/heartbeat/monitors/browser/config_test.go +++ b/x-pack/heartbeat/monitors/browser/config_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package browser diff --git a/x-pack/heartbeat/monitors/browser/source/inline.go b/x-pack/heartbeat/monitors/browser/source/inline.go index 7c99ac01d84..cc3ac4f78b5 100644 --- a/x-pack/heartbeat/monitors/browser/source/inline.go +++ b/x-pack/heartbeat/monitors/browser/source/inline.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/inline_test.go b/x-pack/heartbeat/monitors/browser/source/inline_test.go index 1035a59f3bd..cb5725ad75c 100644 --- a/x-pack/heartbeat/monitors/browser/source/inline_test.go +++ b/x-pack/heartbeat/monitors/browser/source/inline_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/local.go b/x-pack/heartbeat/monitors/browser/source/local.go index e87567cb3a7..7455655d499 100644 --- a/x-pack/heartbeat/monitors/browser/source/local.go +++ b/x-pack/heartbeat/monitors/browser/source/local.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/local_test.go b/x-pack/heartbeat/monitors/browser/source/local_test.go index 271107cd418..c3a7f20a1c3 100644 --- a/x-pack/heartbeat/monitors/browser/source/local_test.go +++ b/x-pack/heartbeat/monitors/browser/source/local_test.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/offline.go b/x-pack/heartbeat/monitors/browser/source/offline.go index c124208a56b..4c3dd215f7d 100644 --- a/x-pack/heartbeat/monitors/browser/source/offline.go +++ b/x-pack/heartbeat/monitors/browser/source/offline.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/project.go b/x-pack/heartbeat/monitors/browser/source/project.go index 7caf3edcc2e..af6bd96dfdc 100644 --- a/x-pack/heartbeat/monitors/browser/source/project.go +++ b/x-pack/heartbeat/monitors/browser/source/project.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/project_test.go b/x-pack/heartbeat/monitors/browser/source/project_test.go index 09dda4b5146..2304a20f6a4 100644 --- a/x-pack/heartbeat/monitors/browser/source/project_test.go +++ b/x-pack/heartbeat/monitors/browser/source/project_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/source.go b/x-pack/heartbeat/monitors/browser/source/source.go index dbc442d7785..21be17b5621 100644 --- a/x-pack/heartbeat/monitors/browser/source/source.go +++ b/x-pack/heartbeat/monitors/browser/source/source.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/source_test.go b/x-pack/heartbeat/monitors/browser/source/source_test.go index adb09e57345..6aa6716152a 100644 --- a/x-pack/heartbeat/monitors/browser/source/source_test.go +++ b/x-pack/heartbeat/monitors/browser/source/source_test.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/unzip.go b/x-pack/heartbeat/monitors/browser/source/unzip.go index c9b48c5464d..d8a5f617302 100644 --- a/x-pack/heartbeat/monitors/browser/source/unzip.go +++ b/x-pack/heartbeat/monitors/browser/source/unzip.go @@ -2,8 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin -// +build linux darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/zipurl.go b/x-pack/heartbeat/monitors/browser/source/zipurl.go index d8c035000b2..748b5a8acbf 100644 --- a/x-pack/heartbeat/monitors/browser/source/zipurl.go +++ b/x-pack/heartbeat/monitors/browser/source/zipurl.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/source/zipurl_test.go b/x-pack/heartbeat/monitors/browser/source/zipurl_test.go index ca0d47b21b7..468e7282c83 100644 --- a/x-pack/heartbeat/monitors/browser/source/zipurl_test.go +++ b/x-pack/heartbeat/monitors/browser/source/zipurl_test.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package source diff --git a/x-pack/heartbeat/monitors/browser/sourcejob.go b/x-pack/heartbeat/monitors/browser/sourcejob.go index d8ca78b23e3..c62c50b3bb1 100644 --- a/x-pack/heartbeat/monitors/browser/sourcejob.go +++ b/x-pack/heartbeat/monitors/browser/sourcejob.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package browser diff --git a/x-pack/heartbeat/monitors/browser/sourcejob_test.go b/x-pack/heartbeat/monitors/browser/sourcejob_test.go index 69cd4f7ffa4..0e6127d354a 100644 --- a/x-pack/heartbeat/monitors/browser/sourcejob_test.go +++ b/x-pack/heartbeat/monitors/browser/sourcejob_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package browser diff --git a/x-pack/heartbeat/monitors/browser/synthexec/enrich.go b/x-pack/heartbeat/monitors/browser/synthexec/enrich.go index de78fd4bb00..627f97aebb8 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/enrich.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/enrich.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package synthexec @@ -24,10 +24,9 @@ import ( type enricher func(event *beat.Event, se *SynthEvent) error type streamEnricher struct { - je *journeyEnricher - journeyCount int - sFields stdfields.StdMonitorFields - checkGroup string + je *journeyEnricher + sFields stdfields.StdMonitorFields + checkGroup string } func newStreamEnricher(sFields stdfields.StdMonitorFields) *streamEnricher { @@ -39,15 +38,6 @@ func (senr *streamEnricher) enrich(event *beat.Event, se *SynthEvent) error { senr.je = newJourneyEnricher(senr) } - // TODO: Remove this when zip monitors are removed and we have 1:1 monitor / journey - if se != nil && se.Type == JourneyStart { - senr.journeyCount++ - if senr.journeyCount > 1 { - senr.checkGroup = makeUuid() - } - } - - eventext.MergeEventFields(event, map[string]interface{}{"monitor": map[string]interface{}{"check_group": senr.checkGroup}}) return senr.je.enrich(event, se) } diff --git a/x-pack/heartbeat/monitors/browser/synthexec/enrich_test.go b/x-pack/heartbeat/monitors/browser/synthexec/enrich_test.go index c02a953af1b..2f660b09642 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/enrich_test.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/enrich_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package synthexec @@ -20,7 +20,6 @@ import ( "github.com/elastic/beats/v7/libbeat/processors/add_data_stream" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/go-lookslike" - "github.com/elastic/go-lookslike/isdef" "github.com/elastic/go-lookslike/testslike" "github.com/elastic/go-lookslike/validator" ) @@ -103,7 +102,6 @@ func TestJourneyEnricher(t *testing.T) { "synthetics.type": "heartbeat/summary", "url": wrappers.URLFields(u), "monitor.duration.us": int64(journeyEnd.Timestamp().Sub(journeyStart.Timestamp()) / time.Microsecond), - "monitor.check_group": isdef.IsString, })) } return lookslike.Compose(v...) @@ -125,29 +123,9 @@ func TestJourneyEnricher(t *testing.T) { }) } - tests := []struct { - name string - IsLegacyBrowserSource bool - }{ - { - name: "legacy project monitor", - IsLegacyBrowserSource: true, - }, - { - name: "modern monitor", - IsLegacyBrowserSource: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - sFields.IsLegacyBrowserSource = tt.IsLegacyBrowserSource - - je := makeTestJourneyEnricher(sFields) - for _, se := range synthEvents { - check(t, se, je) - } - }) + je := makeTestJourneyEnricher(sFields) + for _, se := range synthEvents { + check(t, se, je) } } diff --git a/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer.go b/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer.go index f1fd358cec3..f3684398a51 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer_test.go b/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer_test.go index c3ffe580780..33f01b9c6b4 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer_test.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/execmultiplexer_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package synthexec @@ -16,7 +16,7 @@ func TestExecMultiplexer(t *testing.T) { em := NewExecMultiplexer() // Generate three fake journeys with three fake steps - var testEvents []*SynthEvent + testEvents := make([]*SynthEvent, 0, 3) time := float64(0) for jIdx := 0; jIdx < 3; jIdx++ { time++ // fake time to make events seem spaced out diff --git a/x-pack/heartbeat/monitors/browser/synthexec/synthexec.go b/x-pack/heartbeat/monitors/browser/synthexec/synthexec.go index f422f8b71bf..fbfb71526cc 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/synthexec.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/synthexec.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/synthexec_linux.go b/x-pack/heartbeat/monitors/browser/synthexec/synthexec_linux.go index f2c3ae8aaf6..c90f6083a0d 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/synthexec_linux.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/synthexec_linux.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/synthexec_test.go b/x-pack/heartbeat/monitors/browser/synthexec/synthexec_test.go index 7d54581f926..762b12358a7 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/synthexec_test.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/synthexec_test.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux +//go:build linux || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/synthtypes.go b/x-pack/heartbeat/monitors/browser/synthexec/synthtypes.go index e091914b0af..974a5317435 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/synthtypes.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/synthtypes.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/synthtypes_test.go b/x-pack/heartbeat/monitors/browser/synthexec/synthtypes_test.go index eac2957d878..b26868b5b69 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/synthtypes_test.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/synthtypes_test.go @@ -1,7 +1,7 @@ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package synthexec diff --git a/x-pack/heartbeat/monitors/browser/synthexec/testcmd/main.go b/x-pack/heartbeat/monitors/browser/synthexec/testcmd/main.go index 01f4bbb04a4..b4d241b19fe 100644 --- a/x-pack/heartbeat/monitors/browser/synthexec/testcmd/main.go +++ b/x-pack/heartbeat/monitors/browser/synthexec/testcmd/main.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package main diff --git a/x-pack/heartbeat/scenarios/basics_test.go b/x-pack/heartbeat/scenarios/basics_test.go index 06ebb39f15b..da19b2264f7 100644 --- a/x-pack/heartbeat/scenarios/basics_test.go +++ b/x-pack/heartbeat/scenarios/basics_test.go @@ -17,14 +17,22 @@ import ( _ "github.com/elastic/beats/v7/heartbeat/monitors/active/http" _ "github.com/elastic/beats/v7/heartbeat/monitors/active/icmp" _ "github.com/elastic/beats/v7/heartbeat/monitors/active/tcp" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer" + "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/summarizer/summarizertesthelper" "github.com/elastic/beats/v7/x-pack/heartbeat/scenarios/framework" ) +type CheckHistItem struct { + cg string + summary *summarizer.JobSummary +} + func TestSimpleScenariosBasicFields(t *testing.T) { - scenarioDB.RunAll(t, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { + t.Parallel() + runner := func(t *testing.T, mtr *framework.MonitorTestRun, err error) { require.GreaterOrEqual(t, len(mtr.Events()), 1) - lastCg := "" - for i, e := range mtr.Events() { + var checkHist []*CheckHistItem + for _, e := range mtr.Events() { testslike.Test(t, lookslike.MustCompile(map[string]interface{}{ "monitor": map[string]interface{}{ "id": mtr.StdFields.ID, @@ -34,20 +42,45 @@ func TestSimpleScenariosBasicFields(t *testing.T) { }, }), e.Fields) - // Ensure that all check groups are equal and don't change - cg, err := e.GetValue("monitor.check_group") + // Ensure that all check groups are equal and don't except across retries + cgIface, err := e.GetValue("monitor.check_group") require.NoError(t, err) - cgStr := cg.(string) - if i == 0 { - lastCg = cgStr - } else { - require.Equal(t, lastCg, cgStr) + cg := cgIface.(string) + + var summary *summarizer.JobSummary + summaryIface, err := e.GetValue("summary") + if err == nil { + summary = summaryIface.(*summarizer.JobSummary) + } + + var lastCheck *CheckHistItem + if len(checkHist) > 0 { + lastCheck = checkHist[len(checkHist)-1] + } + + curCheck := &CheckHistItem{cg: cg, summary: summary} + + checkHist = append(checkHist, curCheck) + + // If we have a prior check + if lastCheck != nil { + // If the last event was a summary, meaning this one is a retry + if lastCheck.summary != nil { + // then we expect a new check group + require.NotEqual(t, lastCheck.cg, curCheck.cg) + } else { + // If we're within the same check due to multiple continuations + // we expect equality + require.Equal(t, lastCheck.cg, curCheck.cg) + } } } - }) + } + scenarioDB.RunAllWithSeparateTwists(t, []*framework.Twist{TwistMaxAttempts(2)}, runner) } func TestLightweightUrls(t *testing.T) { + t.Parallel() scenarioDB.RunTag(t, "lightweight", func(t *testing.T, mtr *framework.MonitorTestRun, err error) { for _, e := range mtr.Events() { testslike.Test(t, lookslike.MustCompile(map[string]interface{}{ @@ -62,15 +95,13 @@ 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) { all := mtr.Events() lastEvent, firstEvents := all[len(all)-1], all[:len(all)-1] - testslike.Test(t, lookslike.MustCompile(map[string]interface{}{ - "summary": map[string]interface{}{ - "up": hbtestllext.IsUint16, - "down": hbtestllext.IsUint16, - }, - }), lastEvent.Fields) + testslike.Test(t, + summarizertesthelper.SummaryValidator(1, 0), + lastEvent.Fields) for _, e := range firstEvents { summary, _ := e.GetValue("summary") @@ -80,17 +111,25 @@ func TestLightweightSummaries(t *testing.T) { } func TestRunFromOverride(t *testing.T) { + t.Parallel() scenarioDB.RunAllWithATwist(t, TwistAddRunFrom, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { - for _, e := range mtr.Events() { - testslike.Test(t, lookslike.MustCompile(map[string]interface{}{ - "state": hbtestllext.IsMonitorStateInLocation(TestLocationDefault.ID), + for idx, e := range mtr.Events() { + stateIsDef := isdef.KeyMissing + isLast := idx+1 == len(mtr.Events()) + if isLast { + stateIsDef = hbtestllext.IsMonitorStateInLocation(TestLocationDefault.ID) + } + validator := lookslike.MustCompile(map[string]interface{}{ + "state": stateIsDef, "observer": map[string]interface{}{ "name": TestLocationDefault.ID, "geo": map[string]interface{}{ "name": TestLocationDefault.Geo.Name, }, }, - }), e.Fields) + }) + + testslike.Test(t, validator, e.Fields) } }) } diff --git a/x-pack/heartbeat/scenarios/browserscenarios.go b/x-pack/heartbeat/scenarios/browserscenarios.go index b36e9b07b49..0cfce6831f4 100644 --- a/x-pack/heartbeat/scenarios/browserscenarios.go +++ b/x-pack/heartbeat/scenarios/browserscenarios.go @@ -2,7 +2,7 @@ // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. -//go:build linux || darwin +//go:build linux || darwin || synthetics package scenarios diff --git a/x-pack/heartbeat/scenarios/framework/fakeloader.go b/x-pack/heartbeat/scenarios/framework/fakeloader.go index 8864989a92e..d5e1ee0a26a 100644 --- a/x-pack/heartbeat/scenarios/framework/fakeloader.go +++ b/x-pack/heartbeat/scenarios/framework/fakeloader.go @@ -5,8 +5,8 @@ package framework import ( + "fmt" "sync" - "time" "github.com/elastic/beats/v7/heartbeat/monitors/stdfields" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" @@ -16,40 +16,43 @@ import ( // without actually using ES type loaderDB struct { keysToState map[string]*monitorstate.State - mtx *sync.Mutex - lastTime time.Time + mtx sync.Mutex } func newLoaderDB() *loaderDB { return &loaderDB{ keysToState: map[string]*monitorstate.State{}, - mtx: &sync.Mutex{}, + mtx: sync.Mutex{}, } } -func (ldb loaderDB) AddState(sf stdfields.StdMonitorFields, state *monitorstate.State) { +func (ldb *loaderDB) AddState(sf stdfields.StdMonitorFields, state *monitorstate.State) { ldb.mtx.Lock() defer ldb.mtx.Unlock() - ldb.lastTime = time.Now() - - ldb.keysToState[monitorstate.LoaderDBKey(sf, ldb.lastTime, 0)] = state + key := keyFor(sf) + ldb.keysToState[key] = state } -func (ldb loaderDB) GetState(sf stdfields.StdMonitorFields) *monitorstate.State { +func (ldb *loaderDB) GetState(sf stdfields.StdMonitorFields) *monitorstate.State { ldb.mtx.Lock() defer ldb.mtx.Unlock() - found := ldb.keysToState[monitorstate.LoaderDBKey(sf, ldb.lastTime, 0)] + key := keyFor(sf) + found := ldb.keysToState[key] return found } -func (ldb loaderDB) StateLoader() monitorstate.StateLoader { - return func(sf stdfields.StdMonitorFields) (*monitorstate.State, error) { - ldb.mtx.Lock() - defer ldb.mtx.Unlock() +func keyFor(sf stdfields.StdMonitorFields) string { + rfid := "default" + if sf.RunFrom != nil { + rfid = sf.RunFrom.ID + } + return fmt.Sprintf("%s-%s", rfid, sf.ID) +} - found := ldb.keysToState[monitorstate.LoaderDBKey(sf, ldb.lastTime, 0)] - return found, nil +func (ldb *loaderDB) StateLoader() monitorstate.StateLoader { + return func(sf stdfields.StdMonitorFields) (*monitorstate.State, error) { + return ldb.GetState(sf), nil } } diff --git a/x-pack/heartbeat/scenarios/framework/framework.go b/x-pack/heartbeat/scenarios/framework/framework.go index 3bde2eed0f7..2a092bb73ef 100644 --- a/x-pack/heartbeat/scenarios/framework/framework.go +++ b/x-pack/heartbeat/scenarios/framework/framework.go @@ -26,7 +26,6 @@ import ( "github.com/elastic/beats/v7/heartbeat/monitors" "github.com/elastic/beats/v7/heartbeat/scheduler" "github.com/elastic/beats/v7/libbeat/beat" - "github.com/elastic/beats/v7/libbeat/publisher/pipeline" beatversion "github.com/elastic/beats/v7/libbeat/version" ) @@ -41,24 +40,32 @@ type Scenario struct { NumberOfRuns int } -type Twist func(Scenario) Scenario +type Twist struct { + Name string + Fn func(Scenario) Scenario +} -func MakeTwist(name string, fn Twist) Twist { - return func(s Scenario) Scenario { - newS := s.clone() - newS.Name = fmt.Sprintf("%s~<%s>", s.Name, name) - return fn(newS) +func MakeTwist(name string, fn func(Scenario) Scenario) *Twist { + return &Twist{ + Name: name, + Fn: func(s Scenario) Scenario { + newS := s.clone() + newS.Name = fmt.Sprintf("%s~<%s>", s.Name, name) + return fn(newS) + }, } } -func MultiTwist(twists ...Twist) Twist { - return func(s Scenario) Scenario { - res := s - for _, twist := range twists { - res = twist(res) - } - return res - } +func MultiTwist(twists ...*Twist) *Twist { + return MakeTwist( + "<~MULTI-TWIST~[", + func(s Scenario) Scenario { + res := s + for _, twist := range twists { + res = twist.Fn(res) + } + return res + }) } func (s Scenario) clone() Scenario { @@ -70,10 +77,10 @@ func (s Scenario) clone() Scenario { return copy } -func (s Scenario) Run(t *testing.T, twist Twist, callback func(t *testing.T, mtr *MonitorTestRun, err error)) { +func (s Scenario) Run(t *testing.T, twist *Twist, callback func(t *testing.T, mtr *MonitorTestRun, err error)) { runS := s if twist != nil { - runS = twist(s.clone()) + runS = twist.Fn(s.clone()) } cfgMap, rClose, err := runS.Runner(t) @@ -107,12 +114,13 @@ func (s Scenario) Run(t *testing.T, twist Twist, callback func(t *testing.T, mtr mtr.wait() events = append(events, mtr.Events()...) + sf = mtr.StdFields + conf = mtr.Config + if lse := LastState(events).State; lse != nil { loaderDB.AddState(mtr.StdFields, lse) } - sf = mtr.StdFields - conf = mtr.Config mtr.close() } @@ -144,14 +152,10 @@ func NewScenarioDB() *ScenarioDB { } func (sdb *ScenarioDB) Init() { - var prunedList []Scenario - browserCapable := os.Getenv("ELASTIC_SYNTHETICS_CAPABLE") == "true" - icmpCapable := os.Getenv("ELASTIC_ICMP_CAPABLE") == "true" sdb.initOnce.Do(func() { + var prunedList []Scenario + icmpCapable := os.Getenv("ELASTIC_ICMP_CAPABLE") == "true" for _, s := range sdb.All { - if s.Type == "browser" && !browserCapable { - continue - } if s.Type == "icmp" && !icmpCapable { continue } @@ -161,8 +165,8 @@ func (sdb *ScenarioDB) Init() { sdb.ByTag[t] = append(sdb.ByTag[t], s) } } + sdb.All = prunedList }) - sdb.All = prunedList } func (sdb *ScenarioDB) Add(s ...Scenario) { @@ -173,7 +177,16 @@ func (sdb *ScenarioDB) RunAll(t *testing.T, callback func(*testing.T, *MonitorTe sdb.RunAllWithATwist(t, nil, callback) } -func (sdb *ScenarioDB) RunAllWithATwist(t *testing.T, twist Twist, callback func(*testing.T, *MonitorTestRun, error)) { +// RunAllWithSeparateTwists runs a list of twists separately, but not chained together. +// This is helpful for building up a test matrix by composing twists. +func (sdb *ScenarioDB) RunAllWithSeparateTwists(t *testing.T, twists []*Twist, callback func(*testing.T, *MonitorTestRun, error)) { + twists = append(twists, nil) // we also run once with no twists + for _, twist := range twists { + sdb.RunAllWithATwist(t, twist, callback) + } +} + +func (sdb *ScenarioDB) RunAllWithATwist(t *testing.T, twist *Twist, callback func(*testing.T, *MonitorTestRun, error)) { sdb.Init() for _, s := range sdb.All { s.Run(t, twist, callback) @@ -184,7 +197,7 @@ func (sdb *ScenarioDB) RunTag(t *testing.T, tagName string, callback func(*testi sdb.RunTagWithATwist(t, tagName, nil, callback) } -func (sdb *ScenarioDB) RunTagWithATwist(t *testing.T, tagName string, twist Twist, callback func(*testing.T, *MonitorTestRun, error)) { +func (sdb *ScenarioDB) RunTagWithATwist(t *testing.T, tagName string, twist *Twist, callback func(*testing.T, *MonitorTestRun, error)) { sdb.Init() if len(sdb.ByTag[tagName]) < 1 { require.Failf(t, "no scenarios have tags matching %s", tagName) @@ -205,8 +218,10 @@ type MonitorTestRun struct { func runMonitorOnce(t *testing.T, monitorConfig mapstr.M, location *hbconfig.LocationWithID, stateLoader monitorstate.StateLoader) (mtr *MonitorTestRun, err error) { mtr = &MonitorTestRun{ - Config: monitorConfig, - StdFields: stdfields.StdMonitorFields{}, + Config: monitorConfig, + StdFields: stdfields.StdMonitorFields{ + RunFrom: location, + }, } // make a pipeline @@ -271,9 +286,8 @@ func setupFactoryAndSched(location *hbconfig.LocationWithID, stateLoader monitor AddTask: sched.Add, StateLoader: stateLoader, PluginsReg: plugin.GlobalPluginsReg, - PipelineClientFactory: func(pipeline beat.Pipeline) (pipeline.ISyncClient, error) { - c, _ := pipeline.Connect() - return monitors.SyncPipelineClientAdaptor{C: c}, nil + PipelineClientFactory: func(pipeline beat.Pipeline) (beat.Client, error) { + return pipeline.Connect() }, BeatRunFrom: location, }), diff --git a/x-pack/heartbeat/scenarios/scenarios.go b/x-pack/heartbeat/scenarios/scenarios.go index e67f5054805..fe0e1bbee16 100644 --- a/x-pack/heartbeat/scenarios/scenarios.go +++ b/x-pack/heartbeat/scenarios/scenarios.go @@ -5,55 +5,19 @@ package scenarios import ( - "context" "fmt" - "net/http" "net/http/httptest" "net/url" - "sync" "testing" - "time" - - "github.com/stretchr/testify/require" "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/elastic/beats/v7/heartbeat/hbtest" "github.com/elastic/beats/v7/x-pack/heartbeat/scenarios/framework" ) var scenarioDB = framework.NewScenarioDB() var testWs *httptest.Server -var testWsOnce = &sync.Once{} - -// Starting this thing up is expensive, let's just do it once -func startTestWebserver(t *testing.T) *httptest.Server { - testWsOnce.Do(func() { - testWs = httptest.NewServer(hbtest.HelloWorldHandler(200)) - var err error - for i := 0; i < 20; i++ { - var resp *http.Response - req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, testWs.URL, nil) - resp, err = http.DefaultClient.Do(req) - if err == nil { - resp.Body.Close() - if resp.StatusCode == 200 { - break - } - } - - time.Sleep(time.Millisecond * 250) - } - - if err != nil { - require.NoError(t, err, "could not retrieve successful response from test webserver") - } - }) - - return testWs -} - // Note, no browser scenarios here, those all go in browserscenarios.go // since they have different build tags func init() { diff --git a/x-pack/heartbeat/scenarios/stateloader_test.go b/x-pack/heartbeat/scenarios/stateloader_test.go index 79cd2abf0b4..e3ea54a0691 100644 --- a/x-pack/heartbeat/scenarios/stateloader_test.go +++ b/x-pack/heartbeat/scenarios/stateloader_test.go @@ -7,23 +7,39 @@ package scenarios import ( "testing" - "github.com/stretchr/testify/require" + "github.com/stretchr/testify/assert" "github.com/elastic/beats/v7/heartbeat/monitors/wrappers/monitorstate" + "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/x-pack/heartbeat/scenarios/framework" ) -var esIntegTwists = framework.MultiTwist(TwistAddRunFrom, TwistMultiRun(3)) +const numRuns = 2 + +var esIntegTwists = framework.MultiTwist(TwistAddRunFrom, TwistMultiRun(numRuns)) func TestStateContinuity(t *testing.T) { + t.Parallel() scenarioDB.RunAllWithATwist(t, esIntegTwists, func(t *testing.T, mtr *framework.MonitorTestRun, err error) { + events := mtr.Events() + var errors = []*beat.Event{} + var sout string + for _, e := range events { + if message, ok := e.GetValue("synthetics.payload.message"); ok == nil { + sout = sout + "\n" + message.(string) + } + if _, ok := e.GetValue("error"); ok == nil { + errors = append(errors, e) + } + } + lastSS := framework.LastState(mtr.Events()) - require.Equal(t, monitorstate.StatusUp, lastSS.State.Status) + assert.Equal(t, monitorstate.StatusUp, lastSS.State.Status, "monitor was unexpectedly down, synthetics console output: %s, errors", sout, errors) allSS := framework.AllStates(mtr.Events()) - require.Len(t, allSS, 3) + assert.Len(t, allSS, numRuns) - require.Equal(t, 3, lastSS.State.Checks) + assert.Equal(t, numRuns, lastSS.State.Checks) }) } diff --git a/x-pack/heartbeat/scenarios/testws.go b/x-pack/heartbeat/scenarios/testws.go new file mode 100644 index 00000000000..badfdb27236 --- /dev/null +++ b/x-pack/heartbeat/scenarios/testws.go @@ -0,0 +1,68 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package scenarios + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/heartbeat/hbtest" +) + +var testWsOnce = &sync.Once{} + +// Starting this thing up is expensive, let's just do it once +func startTestWebserver(t *testing.T) *httptest.Server { + testWsOnce.Do(func() { + testWs = httptest.NewServer(hbtest.HelloWorldHandler(200)) + + waitForWs(t, testWs.URL) + }) + + return testWs +} + +func StartStatefulTestWS(t *testing.T, statuses []int) *httptest.Server { + mtx := sync.Mutex{} + statusIdx := 0 + testWs = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + mtx.Lock() + defer mtx.Unlock() + + statusIdx++ + if statusIdx > len(statuses)-1 { + statusIdx = 0 + } + + status := statuses[statusIdx] + w.WriteHeader(status) + _, _ = w.Write([]byte(fmt.Sprintf("Status: %d", status))) + })) + + // wait for ws to become available + waitForWs(t, testWs.URL) + + return testWs +} + +func waitForWs(t *testing.T, url string) { + require.Eventuallyf( + t, + func() bool { + req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil) + resp, _ := http.DefaultClient.Do(req) + resp.Body.Close() + return resp.StatusCode == 200 + }, + 10*time.Second, 250*time.Millisecond, "could not start webserver", + ) +} diff --git a/x-pack/heartbeat/scenarios/twists.go b/x-pack/heartbeat/scenarios/twists.go index f612aa2c61f..3109b5e73d9 100644 --- a/x-pack/heartbeat/scenarios/twists.go +++ b/x-pack/heartbeat/scenarios/twists.go @@ -6,10 +6,12 @@ package scenarios import ( "fmt" + "testing" "github.com/elastic/beats/v7/heartbeat/config" "github.com/elastic/beats/v7/libbeat/processors/util" "github.com/elastic/beats/v7/x-pack/heartbeat/scenarios/framework" + "github.com/elastic/elastic-agent-libs/mapstr" ) var TestLocationDefault = TestLocationMpls @@ -27,9 +29,22 @@ var TwistAddRunFrom = framework.MakeTwist("add run_from", func(s framework.Scena return s }) -func TwistMultiRun(times int) framework.Twist { +func TwistMultiRun(times int) *framework.Twist { return framework.MakeTwist(fmt.Sprintf("run %d times", times), func(s framework.Scenario) framework.Scenario { s.NumberOfRuns = times return s }) } + +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") + origRunner := s.Runner + s.Runner = func(t *testing.T) (config mapstr.M, close func(), err error) { + config, close, err = origRunner(t) + config["max_attempts"] = maxAttempts + return config, close, err + } + return s + }) +} diff --git a/x-pack/libbeat/autodiscover/providers/aws/ec2/watch.go b/x-pack/libbeat/autodiscover/providers/aws/ec2/watch.go index 967833895bd..decc8159868 100644 --- a/x-pack/libbeat/autodiscover/providers/aws/ec2/watch.go +++ b/x-pack/libbeat/autodiscover/providers/aws/ec2/watch.go @@ -6,10 +6,9 @@ package ec2 import ( "context" + "fmt" "time" - "github.com/pkg/errors" - awsauto "github.com/elastic/beats/v7/x-pack/libbeat/autodiscover/providers/aws" "github.com/elastic/elastic-agent-libs/logp" ) @@ -61,7 +60,7 @@ func (w *watcher) forever() { case <-w.ticker.C: err := w.once() if err != nil { - logp.Error(errors.Wrap(err, "error while fetching AWS EC2s")) + logp.Error(fmt.Errorf("error while fetching AWS EC2s: %w", err)) } } } diff --git a/x-pack/libbeat/autodiscover/providers/aws/elb/provider.go b/x-pack/libbeat/autodiscover/providers/aws/elb/provider.go index b76d6050c32..ea44596e52a 100644 --- a/x-pack/libbeat/autodiscover/providers/aws/elb/provider.go +++ b/x-pack/libbeat/autodiscover/providers/aws/elb/provider.go @@ -44,7 +44,7 @@ func AutodiscoverBuilder( c *conf.C, keystore keystore.Keystore, ) (autodiscover.Provider, error) { - cfgwarn.Experimental("aws_elb autodiscover is experimental") + cfgwarn.Deprecate("", "aws_elb autodiscover is now deprecated and will be removed in a future release.") config := awsauto.DefaultConfig() err := c.Unpack(&config) @@ -80,7 +80,7 @@ func AutodiscoverBuilder( config.Regions = completeRegionsList } - var clients []autodiscoverElbClient + clients := make([]autodiscoverElbClient, 0, len(config.Regions)) for _, region := range config.Regions { awsCfg, err := awscommon.InitializeAWSConfig(awscommon.ConfigAWS{ AccessKeyID: config.AWSConfig.AccessKeyID, diff --git a/x-pack/libbeat/autodiscover/providers/aws/elb/provider_test.go b/x-pack/libbeat/autodiscover/providers/aws/elb/provider_test.go index 9d050765781..688323e26f2 100644 --- a/x-pack/libbeat/autodiscover/providers/aws/elb/provider_test.go +++ b/x-pack/libbeat/autodiscover/providers/aws/elb/provider_test.go @@ -5,12 +5,12 @@ package elb import ( + "errors" "sync" "testing" "time" "github.com/gofrs/uuid" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/x-pack/libbeat/common/cloudfoundry/doer.go b/x-pack/libbeat/common/cloudfoundry/doer.go index 21bd7edaeb8..f1e3218b71b 100644 --- a/x-pack/libbeat/common/cloudfoundry/doer.go +++ b/x-pack/libbeat/common/cloudfoundry/doer.go @@ -12,8 +12,6 @@ import ( "strconv" "strings" - "github.com/pkg/errors" - "github.com/elastic/elastic-agent-libs/logp" ) @@ -44,7 +42,7 @@ func (d *authTokenDoer) Do(r *http.Request) (*http.Response, error) { // The reason for writing an error here is that pushing the error upstream // is handled by loggregate library, which is beyond our reach. d.log.Errorf("error creating UAA Auth Token: %+v", err) - return nil, errors.Wrap(err, "error retrieving UUA token") + return nil, fmt.Errorf("error retrieving UUA token: %w", err) } r.Header.Set("Authorization", t) return d.httpClient.Do(r) diff --git a/x-pack/libbeat/common/cloudfoundry/hub.go b/x-pack/libbeat/common/cloudfoundry/hub.go index e6ab4ce76ca..07f1000e533 100644 --- a/x-pack/libbeat/common/cloudfoundry/hub.go +++ b/x-pack/libbeat/common/cloudfoundry/hub.go @@ -5,11 +5,11 @@ package cloudfoundry import ( + "fmt" "net/http" "strings" "github.com/cloudfoundry-community/go-cfclient" - "github.com/pkg/errors" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/transport/httpcommon" @@ -68,7 +68,7 @@ func (h *Hub) Client() (*cfclient.Client, error) { UserAgent: h.userAgent, }) if err != nil { - return nil, errors.Wrap(err, "error creating cloudfoundry client") + return nil, fmt.Errorf("error creating cloudfoundry client: %w", err) } if h.cfg.DopplerAddress != "" { cf.Endpoint.DopplerEndpoint = h.cfg.DopplerAddress @@ -131,7 +131,7 @@ func (h *Hub) DopplerConsumerFromClient(client *cfclient.Client, callbacks Doppl } tlsConfig, err := tlscommon.LoadTLSConfig(h.cfg.Transport.TLS) if err != nil { - return nil, errors.Wrap(err, "loading tls config") + return nil, fmt.Errorf("loading tls config: %w", err) } proxy := h.cfg.Transport.Proxy.ProxyFunc() diff --git a/x-pack/libbeat/management/generate.go b/x-pack/libbeat/management/generate.go index 6677bcfcf64..59537e06686 100644 --- a/x-pack/libbeat/management/generate.go +++ b/x-pack/libbeat/management/generate.go @@ -65,13 +65,43 @@ func (r *TransformRegister) Transform( // Public config transformation // =========== +// handleSimpleConfig perform the necessary checks and transformations in the raw +// config for the simple configuration case (no `streams` key in the config). +// +// Currently only the the `filestream` input is supported for the simple config. +func handleSimpleConfig(raw *proto.UnitExpectedConfig) (map[string]any, error) { + m := raw.Source.AsMap() + kind, ok := m["type"].(string) + if !ok { + return nil, fmt.Errorf("unexpected type for 'type', got %T", m["type"]) + } + if kind != "filestream" { + return nil, fmt.Errorf("the only supported type is 'filestream', got: %q", kind) + } + + return m, nil +} + // CreateInputsFromStreams breaks down the raw Expected config into an array of individual inputs/modules from the Streams values // that can later be formatted into the reloader's ConfigWithMetaData and sent to an indvidual beat/ // This also performs the basic task of inserting module-level add_field processors into the inputs/modules. func CreateInputsFromStreams(raw *proto.UnitExpectedConfig, defaultDataStreamType string, agentInfo *client.AgentInfo, defaultProcessors ...mapstr.M) ([]map[string]interface{}, error) { - // should this be an error? + // If there are no streams, we fall into the 'simple input config' case, + // this means the key configuration values are on the root level instead of + // an element in the `streams` array. if raw.GetStreams() == nil { - return []map[string]interface{}{}, nil + streamSource, err := handleSimpleConfig(raw) + if err != nil { + return []map[string]interface{}{}, err + } + + // Create stream rules with all the defaults and an empty streams struct. + streamSource, err = createStreamRules(raw, streamSource, &proto.Stream{}, defaultDataStreamType, agentInfo, defaultProcessors...) + if err != nil { + return nil, fmt.Errorf("error creating stream rules for a simple config (empty streams array): %w", err) + } + + return []map[string]interface{}{streamSource}, nil } inputs := make([]map[string]interface{}, len(raw.GetStreams())) diff --git a/x-pack/libbeat/management/input_reload_test.go b/x-pack/libbeat/management/input_reload_test.go deleted file mode 100644 index 972c42908f1..00000000000 --- a/x-pack/libbeat/management/input_reload_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License; -// you may not use this file except in compliance with the Elastic License. - -package management - -import ( - "fmt" - "sync" - "testing" - "time" - - "github.com/joeshaw/multierror" - "github.com/stretchr/testify/require" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - "github.com/elastic/beats/v7/libbeat/common" - "github.com/elastic/beats/v7/libbeat/common/reload" - "github.com/elastic/elastic-agent-client/v7/pkg/client" - "github.com/elastic/elastic-agent-client/v7/pkg/proto" -) - -func TestInputReload(t *testing.T) { - // Uncomment the line below to see the debug logs for this test - // logp.DevelopmentSetup(logp.WithLevel(logp.DebugLevel), logp.WithSelectors("*", "centralmgmt.V2-manager")) - r := reload.NewRegistry() - - output := &reloadable{} - r.MustRegisterOutput(output) - - reloadCallCount := 0 - inputs := &reloadableListMock{ - ReloadImpl: func(configs []*reload.ConfigWithMeta) error { - reloadCallCount++ - if reloadCallCount == 1 { - e1 := multierror.Errors{fmt.Errorf("%w", &common.ErrInputNotFinished{ - State: "", - File: "/tmp/foo.log", - })} - return e1.Err() - } - - return nil - }, - } - r.MustRegisterInput(inputs) - - configIdx := -1 - onObserved := func(observed *proto.CheckinObserved, currentIdx int) { - configIdx = currentIdx - } - - srv := mockSrv([][]*proto.UnitExpected{ - { - { - Id: "output-unit", - Type: proto.UnitType_OUTPUT, - ConfigStateIdx: 1, - State: proto.State_HEALTHY, - LogLevel: proto.UnitLogLevel_DEBUG, - Config: &proto.UnitExpectedConfig{ - Id: "default", - Type: "elasticsearch", - Name: "elasticsearch", - }, - }, - { - Id: "input-unit-1", - Type: proto.UnitType_INPUT, - ConfigStateIdx: 1, - State: proto.State_HEALTHY, - LogLevel: proto.UnitLogLevel_DEBUG, - Config: &proto.UnitExpectedConfig{ - Id: "log-input", - Type: "log", - Name: "log", - Streams: []*proto.Stream{ - { - Id: "log-input-1", - Source: requireNewStruct(t, map[string]interface{}{ - "paths": []interface{}{"/tmp/foo.log"}, - }), - }, - }, - }, - }, - }, - { - { - Id: "output-unit", - Type: proto.UnitType_OUTPUT, - ConfigStateIdx: 1, - State: proto.State_HEALTHY, - LogLevel: proto.UnitLogLevel_DEBUG, - Config: &proto.UnitExpectedConfig{ - Id: "default", - Type: "elasticsearch", - Name: "elasticsearch", - }, - }, - { - Id: "input-unit-1", - Type: proto.UnitType_INPUT, - ConfigStateIdx: 1, - State: proto.State_HEALTHY, - LogLevel: proto.UnitLogLevel_DEBUG, - Config: &proto.UnitExpectedConfig{ - Id: "log-input-2", - Type: "log", - Name: "log", - Streams: []*proto.Stream{ - { - Id: "log-input-2", - Source: requireNewStruct(t, map[string]interface{}{ - "paths": []interface{}{"/tmp/foo.log"}, - }), - }, - }, - }, - }, - }, - }, - []uint64{1, 1}, - []*proto.Features{ - nil, - nil, - }, - onObserved, - 500*time.Millisecond, - ) - require.NoError(t, srv.Start()) - defer srv.Stop() - - client := client.NewV2(fmt.Sprintf(":%d", srv.Port), "", client.VersionInfo{ - Name: "program", - Version: "v1.0.0", - Meta: map[string]string{ - "key": "value", - }, - }, grpc.WithTransportCredentials(insecure.NewCredentials())) - - m, err := NewV2AgentManagerWithClient( - &Config{ - Enabled: true, - }, - r, - client, - WithChangeDebounce(300*time.Millisecond), - WithForceReloadDebounce(800*time.Millisecond), - ) - require.NoError(t, err) - - mm := m.(*BeatV2Manager) - - err = m.Start() - require.NoError(t, err) - defer m.Stop() - - forceReloadStates := []bool{false, true, false} - forceReloadStateIdx := 0 - forceReloadLastState := true // starts on true so the first iteration is already a change - - eventuallyCheck := func() bool { - forceReload := mm.forceReload - // That detects a state change, we only count/advance steps - // on state changes - if forceReload != forceReloadLastState { - forceReloadLastState = forceReload - if forceReload == forceReloadStates[forceReloadStateIdx] { - // Set to the next state - forceReloadStateIdx++ - } - - // If we went through all states, then succeed - if forceReloadStateIdx == len(forceReloadStates) { - // If we went through all states - if configIdx == 1 { - return true - } - } - } - - return false - } - - require.Eventually(t, eventuallyCheck, 20*time.Second, 300*time.Millisecond, - "the expected changes on forceReload did not happen") -} - -type reloadableListMock struct { - mx sync.Mutex - configs []*reload.ConfigWithMeta - ReloadImpl func(configs []*reload.ConfigWithMeta) error -} - -func (r *reloadableListMock) Reload(configs []*reload.ConfigWithMeta) error { - r.mx.Lock() - defer r.mx.Unlock() - return r.ReloadImpl(configs) -} - -func (r *reloadableListMock) Configs() []*reload.ConfigWithMeta { - r.mx.Lock() - defer r.mx.Unlock() - return r.configs -} diff --git a/x-pack/libbeat/management/managerV2.go b/x-pack/libbeat/management/managerV2.go index 55a6f57fe23..fd38051efb3 100644 --- a/x-pack/libbeat/management/managerV2.go +++ b/x-pack/libbeat/management/managerV2.go @@ -21,6 +21,7 @@ import ( gproto "google.golang.org/protobuf/proto" "gopkg.in/yaml.v2" + "github.com/elastic/beats/v7/libbeat/cfgfile" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/features" "github.com/elastic/elastic-agent-client/v7/pkg/client" @@ -34,6 +35,8 @@ import ( "github.com/elastic/beats/v7/libbeat/version" ) +var errStoppingOnOutputChange = errors.New("stopping Beat on output change") + // diagnosticHandler is a wrapper type that's a bit of a hack, the compiler won't let us send the raw unit struct, // since there's a type disagreement with the `client.DiagnosticHook` argument, and due to licensing issues we can't import the agent client types into the reloader type diagnosticHandler struct { @@ -353,8 +356,11 @@ func (cm *BeatV2Manager) SetPayload(payload map[string]interface{}) { // updateStatuses updates the status for all units to match the status of the entire manager. // -// This is done because beats at the moment cannot manage different status per unit, something +// This is done because beats at the moment cannot fully manage different status per unit, something // that is new in the V2 control protocol but not supported in beats itself. +// +// Errors while starting/reloading inputs are already reported by unit, but +// the shutdown process is still not being handled by unit. func (cm *BeatV2Manager) updateStatuses() { status := getUnitState(cm.status) message := cm.message @@ -437,7 +443,11 @@ func (cm *BeatV2Manager) watchErrChan(ctx context.Context) { case <-ctx.Done(): return case err := <-cm.client.Errors(): - cm.logger.Errorf("elastic-agent-client error: %s", err) + // Don't print the context canceled errors that happen normally during shutdown, restart, etc + if !errors.Is(context.Canceled, err) { + cm.logger.Errorf("elastic-agent-client error: %s", err) + } + } } } @@ -539,7 +549,18 @@ func (cm *BeatV2Manager) reload(units map[unitKey]*client.Unit) { var outputUnit *client.Unit var inputUnits []*client.Unit var stoppingUnits []*client.Unit - var errs multierror.Errors + healthyInputs := map[string]*client.Unit{} + unitErrors := map[string][]error{} + + // as the very last action, set the state of the failed units + defer func() { + for _, unit := range units { + errs := unitErrors[unit.ID()] + if len(errs) != 0 { + unit.UpdateState(client.UnitStateFailed, errors.Join(errs...).Error(), nil) + } + } + }() for _, unit := range units { expected := unit.Expected() @@ -552,11 +573,11 @@ func (cm *BeatV2Manager) reload(units map[unitKey]*client.Unit) { // unit is expected to update its feature flags featuresCfg, err := features.NewConfigFromProto(expected.Features) if err != nil { - errs = append(errs, err) + unitErrors[unit.ID()] = append(unitErrors[unit.ID()], err) } if err := features.UpdateFromConfig(featuresCfg); err != nil { - errs = append(errs, err) + unitErrors[unit.ID()] = append(unitErrors[unit.ID()], err) } cm.lastBeatFeaturesCfg = featuresCfg @@ -578,6 +599,7 @@ func (cm *BeatV2Manager) reload(units map[unitKey]*client.Unit) { outputUnit = unit } else if unit.Type() == client.UnitTypeInput { inputUnits = append(inputUnits, unit) + healthyInputs[unit.ID()] = unit } else { cm.logger.Errorf("unit %s as an unknown type %+v", unit.ID(), unit.Type()) } @@ -589,34 +611,50 @@ func (cm *BeatV2Manager) reload(units map[unitKey]*client.Unit) { publisher.SetUnderAgentTrace(trace) // reload the output configuration - if err := cm.reloadOutput(outputUnit); err != nil { + restartBeat, err := cm.reloadOutput(outputUnit) + // The manager has already signalled the Beat to stop, + // there is nothing else to do. Trying to reload inputs + // will only lead to invalid state updates and possible + // race conditions. + if restartBeat { + return + } + if err != nil { // Output creation failed, there is no point in going any further - // because there is no output read the events. + // because there is no output to read events. // // Trying to start inputs will eventually lead them to deadlock // waiting for the output. Log input will deadlock when starting, // effectively blocking this manager. - err = fmt.Errorf("could not start output: %w", err) - outputUnit.UpdateState(client.UnitStateFailed, err.Error(), nil) - cm.status = lbmanagement.Failed - cm.message = err.Error() - - // If there are any other errors, set the status accordingly. - // If len(errs), then the there were no previous and the only - // error has been reported already. - if len(errs) > 0 { - errs = append(errs, err) - cm.message = fmt.Sprintf("%s", errs) + cm.logger.Errorw("could not start output", "error", err) + + msg := fmt.Sprintf("could not start output: %s", err) + if err := outputUnit.UpdateState(client.UnitStateFailed, msg, nil); err != nil { + cm.logger.Errorw("setting output state", "error", err) } + return } + if err := outputUnit.UpdateState(client.UnitStateHealthy, "Healthy", nil); err != nil { + cm.logger.Errorw("setting output state", "error", err) + } + // compute the input configuration // // in v2 only a single input type will be started per component, so we don't need to // worry about getting multiple re-loaders (we just need the one for the type) if err := cm.reloadInputs(inputUnits); err != nil { - errs = append(errs, err) + merror := &multierror.MultiError{} + if errors.As(err, &merror) { + for _, err := range merror.Errors { + unitErr := cfgfile.UnitError{} + if errors.As(err, &unitErr) { + unitErrors[unitErr.UnitID] = append(unitErrors[unitErr.UnitID], unitErr.Err) + delete(healthyInputs, unitErr.UnitID) + } + } + } } // report the stopping units as stopped @@ -624,60 +662,58 @@ func (cm *BeatV2Manager) reload(units map[unitKey]*client.Unit) { _ = unit.UpdateState(client.UnitStateStopped, "Stopped", nil) } - // any error during reload changes the whole state of the beat to failed - if len(errs) > 0 { - cm.status = lbmanagement.Failed - cm.message = fmt.Sprintf("%s", errs) - } - - // now update the statuses of all units - cm.mx.Lock() - status := getUnitState(cm.status) - message := cm.message - payload := cm.payload - cm.mx.Unlock() - for _, unit := range units { + // now update the statuses of all units that contain only healthy + // inputs. If there isn't an error with the inputs, we set the unit as + // healthy because there is no way to know more information about its inputs. + for _, unit := range healthyInputs { expected := unit.Expected() if expected.State == client.UnitStateStopped { // unit is expected to be stopping (don't adjust the state as the state is now managed by the // `reload` method and will be marked stopped in that code path) continue } - err := unit.UpdateState(status, message, payload) + + err := unit.UpdateState(client.UnitStateHealthy, "Healthy", nil) if err != nil { cm.logger.Errorf("Failed to update unit %s status: %s", unit.ID(), err) } } } -func (cm *BeatV2Manager) reloadOutput(unit *client.Unit) error { +// reloadOutput reload outputs, it returns a bool and an error. +// The bool, if set, indicates that the output reload requires an restart, +// in that case the error is always `nil`. +// +// In any other case, the bool is always false and the error will be non nil +// if any error has occurred. +func (cm *BeatV2Manager) reloadOutput(unit *client.Unit) (bool, error) { // Assuming that the output reloadable isn't a list, see createBeater() in cmd/instance/beat.go output := cm.registry.GetReloadableOutput() if output == nil { - return fmt.Errorf("failed to find beat reloadable type 'output'") + return false, fmt.Errorf("failed to find beat reloadable type 'output'") } if unit == nil { // output is being stopped err := output.Reload(nil) if err != nil { - return fmt.Errorf("failed to reload output: %w", err) + return false, fmt.Errorf("failed to reload output: %w", err) } cm.lastOutputCfg = nil cm.lastBeatOutputCfg = nil - return nil + return false, nil } expected := unit.Expected() if expected.Config == nil { // should not happen; hard stop - return fmt.Errorf("output unit has no config") + return false, fmt.Errorf("output unit has no config") } if cm.lastOutputCfg != nil && gproto.Equal(cm.lastOutputCfg, expected.Config) { // configuration for the output did not change; do nothing cm.logger.Debug("Skipped reloading output; configuration didn't change") - return nil + return false, nil } cm.logger.Debugf("Got output unit config '%s'", expected.Config.GetId()) @@ -686,21 +722,25 @@ func (cm *BeatV2Manager) reloadOutput(unit *client.Unit) error { cm.logger.Info("beat is restarting because output changed") _ = unit.UpdateState(client.UnitStateStopping, "Restarting", nil) cm.Stop() - return nil + return true, nil } reloadConfig, err := groupByOutputs(expected.Config) if err != nil { - return fmt.Errorf("failed to generate config for output: %w", err) + return false, fmt.Errorf("failed to generate config for output: %w", err) } + // Set those variables regardless of the outcome of output.Reload + // this ensures that if we're on a failed output state and a new + // output configuration is sent, the Beat will gracefully exit + cm.lastOutputCfg = expected.Config + cm.lastBeatOutputCfg = reloadConfig + err = output.Reload(reloadConfig) if err != nil { - return fmt.Errorf("failed to reload output: %w", err) + return false, fmt.Errorf("failed to reload output: %w", err) } - cm.lastOutputCfg = expected.Config - cm.lastBeatOutputCfg = reloadConfig - return nil + return false, nil } func (cm *BeatV2Manager) reloadInputs(inputUnits []*client.Unit) error { @@ -728,6 +768,7 @@ func (cm *BeatV2Manager) reloadInputs(inputUnits []*client.Unit) error { // we want to add the diagnostic handler that's specific to the unit, and not the gobal diagnostic handler for _, in := range inputCfg { in.DiagCallback = diagnosticHandler{client: unit, log: cm.logger.Named("diagnostic-manager")} + in.InputUnitID = unit.ID() } inputCfgs[unit.ID()] = expected.Config inputBeatCfgs = append(inputBeatCfgs, inputCfg...) diff --git a/x-pack/libbeat/management/managerV2_test.go b/x-pack/libbeat/management/managerV2_test.go index aa84bb9f8f0..9fe238605b4 100644 --- a/x-pack/libbeat/management/managerV2_test.go +++ b/x-pack/libbeat/management/managerV2_test.go @@ -8,9 +8,11 @@ import ( "errors" "fmt" "sync" + "sync/atomic" "testing" "time" + "github.com/joeshaw/multierror" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" "google.golang.org/grpc" @@ -21,8 +23,10 @@ import ( "github.com/elastic/elastic-agent-client/v7/pkg/proto" "github.com/elastic/elastic-agent-libs/logp" + "github.com/elastic/beats/v7/libbeat/cfgfile" "github.com/elastic/beats/v7/libbeat/common/reload" "github.com/elastic/beats/v7/libbeat/features" + "github.com/elastic/beats/v7/libbeat/tests/integration" ) func TestManagerV2(t *testing.T) { @@ -33,48 +37,48 @@ func TestManagerV2(t *testing.T) { inputs := &reloadableList{} r.MustRegisterInput(inputs) - configsSet := false - configsCleared := false - logLevelSet := false - fqdnEnabled := false - allStopped := false + configsSet := atomic.Bool{} + configsCleared := atomic.Bool{} + logLevelSet := atomic.Bool{} + fqdnEnabled := atomic.Bool{} + allStopped := atomic.Bool{} onObserved := func(observed *proto.CheckinObserved, currentIdx int) { if currentIdx == 1 { oCfg := output.Config() iCfgs := inputs.Configs() if oCfg != nil && len(iCfgs) == 3 { - configsSet = true - t.Logf("output and inputs configuration set") + configsSet.Store(true) + t.Log("output and inputs configuration set") } } else if currentIdx == 2 { oCfg := output.Config() iCfgs := inputs.Configs() if oCfg == nil || len(iCfgs) != 3 { // should not happen (config no longer set) - configsSet = false - t.Logf("output and inputs configuration cleared (should not happen)") + configsSet.Store(false) + t.Log("output and inputs configuration cleared (should not happen)") } } else { oCfg := output.Config() iCfgs := inputs.Configs() if oCfg == nil && len(iCfgs) == 0 { - configsCleared = true + configsCleared.Store(true) } if len(observed.Units) == 0 { - allStopped = true - t.Logf("output and inputs configuration cleared (stopping)") + allStopped.Store(true) + t.Log("output and inputs configuration cleared (stopping)") } } if logp.GetLevel() == zapcore.DebugLevel { - logLevelSet = true - t.Logf("debug log level set") + logLevelSet.Store(true) + t.Log("debug log level set") } - fqdnEnabled = features.FQDN() - t.Logf("FQDN feature flag set to %v", fqdnEnabled) + fqdnEnabled.Store(features.FQDN()) + t.Logf("FQDN feature flag set to %v", fqdnEnabled.Load()) } - srv := mockSrv([][]*proto.UnitExpected{ + srv := integration.NewMockServer([][]*proto.UnitExpected{ { { Id: "output-unit", @@ -99,7 +103,7 @@ func TestManagerV2(t *testing.T) { Streams: []*proto.Stream{ { Id: "system/metrics-system.filesystem-default-system-1", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "metricsets": []interface{}{"filesystem"}, "period": "1m", }), @@ -120,14 +124,14 @@ func TestManagerV2(t *testing.T) { Streams: []*proto.Stream{ { Id: "system/metrics-system.filesystem-default-system-2", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "metricsets": []interface{}{"filesystem"}, "period": "1m", }), }, { Id: "system/metrics-system.filesystem-default-system-3", - Source: requireNewStruct(t, map[string]interface{}{ + Source: integration.RequireNewStruct(t, map[string]interface{}{ "metricsets": []interface{}{"filesystem"}, "period": "1m", }), @@ -217,7 +221,7 @@ func TestManagerV2(t *testing.T) { defer m.Stop() require.Eventually(t, func() bool { - return configsSet && configsCleared && logLevelSet && fqdnEnabled && allStopped + return configsSet.Load() && configsCleared.Load() && logLevelSet.Load() && fqdnEnabled.Load() && allStopped.Load() }, 15*time.Second, 300*time.Millisecond) } @@ -241,7 +245,7 @@ func TestOutputError(t *testing.T) { } r.MustRegisterInput(inputs) - stateReached := false + stateReached := atomic.Bool{} units := []*proto.UnitExpected{ { Id: "output-unit", @@ -253,7 +257,7 @@ func TestOutputError(t *testing.T) { Id: "default", Type: "mock", Name: "mock", - Source: requireNewStruct(t, + Source: integration.RequireNewStruct(t, map[string]interface{}{ "Is": "this", "required?": "Yes!", @@ -280,7 +284,7 @@ func TestOutputError(t *testing.T) { Id: "default", Type: "mock", Name: "mock", - Source: requireNewStruct(t, + Source: integration.RequireNewStruct(t, map[string]interface{}{ "this": "is", "required": true, @@ -299,7 +303,7 @@ func TestOutputError(t *testing.T) { server := &mock.StubServerV2{ CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { if DoesStateMatch(observed, desiredState, 0) { - stateReached = true + stateReached.Store(true) } return &proto.CheckinExpected{ Units: units, @@ -344,61 +348,167 @@ func TestOutputError(t *testing.T) { defer m.Stop() require.Eventually(t, func() bool { - return stateReached + return stateReached.Load() }, 10*time.Second, 100*time.Millisecond, "desired state, output failed, was not reached") } -func mockSrv( - units [][]*proto.UnitExpected, - featuresIdxs []uint64, - features []*proto.Features, - observedCallback func(*proto.CheckinObserved, int), - delay time.Duration, -) *mock.StubServerV2 { - i := 0 - agentInfo := &proto.CheckinAgentInfo{ - Id: "elastic-agent-id", - Version: "8.6.0", - Snapshot: true, +func TestErrorPerUnit(t *testing.T) { + // Uncomment the line below to see the debug logs for this test + // logp.DevelopmentSetup(logp.WithLevel(logp.DebugLevel), logp.WithSelectors("*")) + + errorMessages := map[string]string{ + "input-unit1": "some error from input-unit1", + "input-unit2": "some error from input-unit2", } - return &mock.StubServerV2{ - CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { - if observedCallback != nil { - observedCallback(observed, i) + r := reload.NewRegistry() + + output := &mockOutput{ + ReloadFn: func(config *reload.ConfigWithMeta) error { + return nil + }, + } + r.MustRegisterOutput(output) + inputs := &mockReloadable{ + ReloadFn: func(configs []*reload.ConfigWithMeta) error { + errs := multierror.Errors{} + for _, input := range configs { + errs = append(errs, cfgfile.UnitError{ + UnitID: input.InputUnitID, + Err: errors.New(errorMessages[input.InputUnitID]), + }) } - matches := DoesStateMatch(observed, units[i], featuresIdxs[i]) - if !matches { - // send same set of units and features - return &proto.CheckinExpected{ - AgentInfo: agentInfo, - Units: units[i], - Features: features[i], - FeaturesIdx: featuresIdxs[i], + return errs.Err() + }, + } + r.MustRegisterInput(inputs) + + stateReached := atomic.Bool{} + + outputUnit := proto.UnitExpected{ + Id: "output-unit", + Type: proto.UnitType_OUTPUT, + State: proto.State_HEALTHY, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "default", + Type: "mock", + Name: "mock", + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "Is": "this", + "required?": "Yes!", + }), + }, + } + + inputUnit1 := proto.UnitExpected{ + Id: "input-unit1", + Type: proto.UnitType_INPUT, + State: proto.State_FAILED, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "input-unit-config-id", + Type: "filestream", + Name: "foo", + Streams: []*proto.Stream{ + { + Id: "filestream-id", + Source: integration.RequireNewStruct(t, map[string]interface{}{ + "id": "input-unit1", + }), + }, + }, + }, + } + inputUnit2 := proto.UnitExpected{ + Id: "input-unit2", + Type: proto.UnitType_INPUT, + State: proto.State_FAILED, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "input-unit-config-id", + Type: "filestream", + Name: "foo", + Streams: []*proto.Stream{ + { + Id: "filestream-id", + Source: integration.RequireNewStruct(t, map[string]interface{}{ + "id": "input-unit2", + }), + }, + }, + }, + } + + units := []*proto.UnitExpected{ + &outputUnit, + &inputUnit1, + &inputUnit2, + } + desiredState := []*proto.UnitExpected{ + &outputUnit, + &inputUnit1, + &inputUnit2, + } + + server := &mock.StubServerV2{ + CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { + if DoesStateMatch(observed, desiredState, 0) { + // Ensures the error messages are correctly set + failed := false + for _, unit := range observed.Units { + if unit.Type != proto.UnitType_INPUT { + continue + } + if unit.Message != errorMessages[unit.Id] { + t.Errorf("expecting error message %q, got %q", errorMessages[unit.Id], unit.Message) + failed = true + } + } + if !failed { + stateReached.Store(true) } - } - // delay sending next expected based on delay - if delay > 0 { - <-time.After(delay) - } - // send next set of units and features - i += 1 - if i >= len(units) { - // stay on last index - i = len(units) - 1 } return &proto.CheckinExpected{ - AgentInfo: agentInfo, - Units: units[i], - Features: features[i], - FeaturesIdx: featuresIdxs[i], + Units: units, } }, - ActionImpl: func(response *proto.ActionResponse) error { - // actions not tested here - return nil + ActionImpl: func(response *proto.ActionResponse) error { return nil }, + } + + if err := server.Start(); err != nil { + t.Fatalf("could not start mock Elastic-Agent server: %s", err) + } + defer server.Stop() + + client := client.NewV2( + fmt.Sprintf(":%d", server.Port), + "", + client.VersionInfo{}, + grpc.WithTransportCredentials(insecure.NewCredentials())) + + m, err := NewV2AgentManagerWithClient( + &Config{ + Enabled: true, }, - ActionsChan: make(chan *mock.PerformAction, 100), + r, + client, + ) + if err != nil { + t.Fatalf("could not instantiate ManagerV2: %s", err) } + + if err := m.Start(); err != nil { + t.Fatalf("could not start ManagerV2: %s", err) + } + defer m.Stop() + + require.Eventually(t, func() bool { + return stateReached.Load() + }, 10*time.Second, 100*time.Millisecond, "desired state, was not reached") } type reloadable struct { diff --git a/x-pack/libbeat/management/simple_input_config_test.go b/x-pack/libbeat/management/simple_input_config_test.go new file mode 100644 index 00000000000..ef88781a862 --- /dev/null +++ b/x-pack/libbeat/management/simple_input_config_test.go @@ -0,0 +1,157 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "fmt" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/elastic/beats/v7/libbeat/common/reload" + "github.com/elastic/beats/v7/libbeat/tests/integration" + "github.com/elastic/elastic-agent-client/v7/pkg/client" + "github.com/elastic/elastic-agent-client/v7/pkg/client/mock" + "github.com/elastic/elastic-agent-client/v7/pkg/proto" +) + +func TestSimpleInputConfig(t *testing.T) { + // Uncomment the line below to see the debug logs for this test + // logp.DevelopmentSetup(logp.WithLevel(logp.DebugLevel), logp.WithSelectors("*")) + r := reload.NewRegistry() + + output := &mockOutput{ + ReloadFn: func(config *reload.ConfigWithMeta) error { + return nil + }, + } + r.MustRegisterOutput(output) + inputs := &mockReloadable{ + ReloadFn: func(configs []*reload.ConfigWithMeta) error { + return nil + }, + } + r.MustRegisterInput(inputs) + + stateReached := atomic.Bool{} + units := []*proto.UnitExpected{ + { + Id: "output-unit", + Type: proto.UnitType_OUTPUT, + State: proto.State_HEALTHY, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "default", + Type: "mock", + Name: "mock", + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "Is": "this", + "required?": "Yes!", + }), + }, + }, + { + Id: "input-unit", + Type: proto.UnitType_INPUT, + State: proto.State_HEALTHY, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "the-id-in-the-input-config", + Type: "filestream", + // All fields get repeated here, including ID. + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "paths": []any{ + "/tmp/logfile.log", + }, + }, + ), + }, + }, + } + + desiredState := []*proto.UnitExpected{ + { + Id: "output-unit", + Type: proto.UnitType_OUTPUT, + State: proto.State_HEALTHY, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + Config: &proto.UnitExpectedConfig{ + Id: "default", + Type: "filestream", + Name: "mock", + Source: integration.RequireNewStruct(t, + map[string]interface{}{ + "this": "is", + "required": true, + }), + }, + }, + { + Id: "input-unit", + Type: proto.UnitType_INPUT, + State: proto.State_HEALTHY, + ConfigStateIdx: 1, + LogLevel: proto.UnitLogLevel_DEBUG, + }, + } + + server := &mock.StubServerV2{ + CheckinV2Impl: func(observed *proto.CheckinObserved) *proto.CheckinExpected { + // If the desired state has been reached, return nil + // so the manager can shutdown. + if stateReached.Load() { + return nil + } + + if DoesStateMatch(observed, desiredState, 0) { + stateReached.Store(true) + } + return &proto.CheckinExpected{ + Units: units, + } + }, + ActionImpl: func(response *proto.ActionResponse) error { return nil }, + } + + if err := server.Start(); err != nil { + t.Fatalf("could not start mock Elastic-Agent server: %s", err) + } + defer server.Stop() + + client := client.NewV2( + fmt.Sprintf(":%d", server.Port), + "", + client.VersionInfo{}, + grpc.WithTransportCredentials(insecure.NewCredentials())) + + m, err := NewV2AgentManagerWithClient( + &Config{ + Enabled: true, + }, + r, + client, + ) + if err != nil { + t.Fatalf("could not instantiate ManagerV2: %s", err) + } + + if err := m.Start(); err != nil { + t.Fatalf("could not start ManagerV2: %s", err) + } + defer m.Stop() + + require.Eventually(t, func() bool { + return stateReached.Load() + }, 10*time.Second, 100*time.Millisecond, "desired state, output failed, was not reached") +} diff --git a/x-pack/metricbeat/docker-compose.yml b/x-pack/metricbeat/docker-compose.yml index d8631f2053e..f7080b602fb 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.8.1}-1 + image: docker.elastic.co/integrations-ci/beats-kibana:${KIBANA_VERSION:-8.9.1}-1 build: context: ../../metricbeat/module/kibana/_meta args: - KIBANA_VERSION: ${KIBANA_VERSION:-8.8.1} + KIBANA_VERSION: ${KIBANA_VERSION:-8.9.1} depends_on: - elasticsearch ports: diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index 3d3fa585ff0..fa15aca7fb6 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -525,6 +525,7 @@ metricbeat.modules: hosts: ["http://localhost:9200"] #username: "elastic" #password: "changeme" + #api_key: "foo:bar" #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true diff --git a/x-pack/metricbeat/module/azure/app_insights/app_insights.go b/x-pack/metricbeat/module/azure/app_insights/app_insights.go index 6790810e2a2..637251be54f 100644 --- a/x-pack/metricbeat/module/azure/app_insights/app_insights.go +++ b/x-pack/metricbeat/module/azure/app_insights/app_insights.go @@ -5,10 +5,9 @@ package app_insights import ( + "fmt" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb/parse" "github.com/elastic/beats/v7/metricbeat/mb" @@ -56,7 +55,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } client, err := NewClient(config) if err != nil { - return nil, errors.Wrapf(err, "error initializing the monitor client: module azure - %s metricset", metricsetName) + return nil, fmt.Errorf("error initializing the monitor client: module azure - %s metricset: %w", metricsetName, err) } return &MetricSet{ BaseMetricSet: base, @@ -69,7 +68,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { results, err := m.client.GetMetricValues() if err != nil { - return errors.Wrap(err, "error retrieving metric values") + return fmt.Errorf("error retrieving metric values: %w", err) } events := EventsMapping(results, m.client.Config.ApplicationId, m.client.Config.Namespace) for _, event := range events { diff --git a/x-pack/metricbeat/module/azure/app_insights/client.go b/x-pack/metricbeat/module/azure/app_insights/client.go index 2efdf57ccea..d2bed8fbf0e 100644 --- a/x-pack/metricbeat/module/azure/app_insights/client.go +++ b/x-pack/metricbeat/module/azure/app_insights/client.go @@ -11,7 +11,6 @@ import ( "github.com/gofrs/uuid" "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" - "github.com/pkg/errors" "github.com/elastic/elastic-agent-libs/logp" ) @@ -62,7 +61,7 @@ func (client *Client) GetMetricValues() (insights.ListMetricsResultsItem, error) } id, err := uuid.NewV4() if err != nil { - return result, errors.Wrap(err, "could not generate identifier in client") + return result, fmt.Errorf("could not generate identifier in client: %w", err) } strId := id.String() bodyMetrics = append(bodyMetrics, insights.MetricsPostBodySchema{ID: &strId, Parameters: &bodyMetric}) @@ -72,7 +71,7 @@ func (client *Client) GetMetricValues() (insights.ListMetricsResultsItem, error) if err == nil { return result, nil } - return result, errors.Wrap(err, "could not retrieve app insights metrics from service") + return result, fmt.Errorf("could not retrieve app insights metrics from service: %w", err) } func calculateTimespan(duration time.Duration) *string { diff --git a/x-pack/metricbeat/module/azure/app_insights/client_test.go b/x-pack/metricbeat/module/azure/app_insights/client_test.go index ca62e9a82d2..4763c28da20 100644 --- a/x-pack/metricbeat/module/azure/app_insights/client_test.go +++ b/x-pack/metricbeat/module/azure/app_insights/client_test.go @@ -5,10 +5,10 @@ package app_insights import ( + "errors" "testing" "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) diff --git a/x-pack/metricbeat/module/azure/azure.go b/x-pack/metricbeat/module/azure/azure.go index 38db7f7c6d7..aa26a0c5705 100644 --- a/x-pack/metricbeat/module/azure/azure.go +++ b/x-pack/metricbeat/module/azure/azure.go @@ -7,8 +7,6 @@ package azure import ( "fmt" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" ) @@ -41,7 +39,7 @@ func NewMetricSet(base mb.BaseMetricSet) (*MetricSet, error) { var config Config err := base.Module().UnpackConfig(&config) if err != nil { - return nil, errors.Wrap(err, "error unpack raw module config using UnpackConfig") + return nil, fmt.Errorf("error unpack raw module config using UnpackConfig: %w", err) } //validate config based on metricset @@ -49,13 +47,13 @@ func NewMetricSet(base mb.BaseMetricSet) (*MetricSet, error) { case nativeMetricset: // resources must be configured for the monitor metricset if len(config.Resources) == 0 { - return nil, errors.Errorf("no resource options defined: module azure - %s metricset", metricsetName) + return nil, fmt.Errorf("no resource options defined: module azure - %s metricset", metricsetName) } default: // validate config resource options entered, no resource queries allowed for the compute_vm and compute_vm_scaleset metricsets for _, resource := range config.Resources { if resource.Query != "" { - return nil, errors.Errorf("error initializing the monitor client: module azure - %s metricset. No queries allowed, please select one of the allowed options", metricsetName) + return nil, fmt.Errorf("error initializing the monitor client: module azure - %s metricset. No queries allowed, please select one of the allowed options", metricsetName) } } // check for lightweight resources if no groups or ids have been entered, if not a new resource is created to check the entire subscription @@ -77,7 +75,7 @@ func NewMetricSet(base mb.BaseMetricSet) (*MetricSet, error) { // instantiate monitor client monitorClient, err := NewClient(config) if err != nil { - return nil, errors.Wrapf(err, "error initializing the monitor client: module azure - %s metricset", metricsetName) + return nil, fmt.Errorf("error initializing the monitor client: module azure - %s metricset: %w", metricsetName, err) } return &MetricSet{ BaseMetricSet: base, @@ -104,7 +102,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { results := m.Client.GetMetricValues(metrics, report) err := EventsMapping(results, m.Client, report) if err != nil { - return errors.Wrap(err, "error running EventsMapping") + return fmt.Errorf("error running EventsMapping: %w", err) } } return nil diff --git a/x-pack/metricbeat/module/azure/billing/billing.go b/x-pack/metricbeat/module/azure/billing/billing.go index a2968d71a6d..4777df5f217 100644 --- a/x-pack/metricbeat/module/azure/billing/billing.go +++ b/x-pack/metricbeat/module/azure/billing/billing.go @@ -127,11 +127,12 @@ func usageIntervalFrom(reference time.Time) (time.Time, time.Time) { // reference time. // // For example, if the reference time is 2007-01-09 09:41:00Z, the forecast period is: +// The forecast data is fetched from current day - 2 and for next 30 days. // -// 2007-01-01T00:00:00Z -> 2007-01-31:59:59Z +// 2007-01-07T00:00:00Z -> 2007-02-05:59:59Z func forecastIntervalFrom(reference time.Time) (time.Time, time.Time) { - referenceUTC := reference.UTC() - beginningOfMonth := time.Date(referenceUTC.Year(), referenceUTC.Month(), 1, 0, 0, 0, 0, time.UTC) - endOfMonth := beginningOfMonth.AddDate(0, 1, 0).Add(-1 * time.Second) - return beginningOfMonth, endOfMonth + referenceUTC := reference.UTC().Truncate(24 * time.Hour).Add((-48) * time.Hour) + forecastStartDate := time.Date(referenceUTC.Year(), referenceUTC.Month(), referenceUTC.Day(), 0, 0, 0, 0, time.UTC) + forecastEndDate := forecastStartDate.AddDate(0, 0, 0).Add(-1*time.Second).AddDate(0, 0, 30) + return forecastStartDate, forecastEndDate } diff --git a/x-pack/metricbeat/module/azure/billing/billing_test.go b/x-pack/metricbeat/module/azure/billing/billing_test.go index 65f4482cc5b..e8dc95119b4 100644 --- a/x-pack/metricbeat/module/azure/billing/billing_test.go +++ b/x-pack/metricbeat/module/azure/billing/billing_test.go @@ -32,9 +32,9 @@ func TestForecastPeriodFrom(t *testing.T) { referenceTime, err := time.Parse("2006-01-02 15:04:05", "2007-01-09 09:41:00") assert.NoError(t, err) - expectedStartTime, err := time.Parse("2006-01-02 15:04:05", "2007-01-01 00:00:00") + expectedStartTime, err := time.Parse("2006-01-02 15:04:05", "2007-01-07 00:00:00") assert.NoError(t, err) - expectedEndTime, err := time.Parse("2006-01-02 15:04:05", "2007-01-31 23:59:59") + expectedEndTime, err := time.Parse("2006-01-02 15:04:05", "2007-02-05 23:59:59") assert.NoError(t, err) actualStartTime, actualEndTime := forecastIntervalFrom(referenceTime) diff --git a/x-pack/metricbeat/module/azure/billing/data.go b/x-pack/metricbeat/module/azure/billing/data.go index 73d2da05dd2..bec33fcf185 100644 --- a/x-pack/metricbeat/module/azure/billing/data.go +++ b/x-pack/metricbeat/module/azure/billing/data.go @@ -60,6 +60,10 @@ func EventsMapping( "group": legacy.Properties.ResourceGroup, }, } + if len(legacy.Tags) > 0 { + _, _ = event.ModuleFields.Put("resource.tags", legacy.Tags) + } + event.MetricSetFields = mapstr.M{ // original fields "billing_period_id": legacy.ID, @@ -96,6 +100,10 @@ func EventsMapping( "group": strings.ToLower(*modern.Properties.ResourceGroup), }, } + if len(modern.Tags) > 0 { + _, _ = event.ModuleFields.Put("resource.tags", modern.Tags) + } + event.MetricSetFields = mapstr.M{ // original fields "billing_period_id": modern.ID, diff --git a/x-pack/metricbeat/module/azure/billing/data_test.go b/x-pack/metricbeat/module/azure/billing/data_test.go index 49a16fcd617..bf800821f1c 100644 --- a/x-pack/metricbeat/module/azure/billing/data_test.go +++ b/x-pack/metricbeat/module/azure/billing/data_test.go @@ -25,6 +25,8 @@ func TestEventMapping(t *testing.T) { name := "test" billingAccountId := "123" startDate := time.Time{} + tagName := "team" + tagValue := "obs-cloud-monitoring" // // Usage Details @@ -49,6 +51,9 @@ func TestEventMapping(t *testing.T) { ID: &ID, Kind: &kind, Properties: &props, + Tags: map[string]*string{ + tagName: &tagValue, + }, } // @@ -102,15 +107,23 @@ func TestEventMapping(t *testing.T) { // Check the results // for _, event := range events { - // if is an usage event if ok, _ := event.MetricSetFields.HasKey("department_name"); ok { + // + // The event is a usage detail + // val1, _ := event.MetricSetFields.GetValue("account_name") assert.Equal(t, val1, &name) val2, _ := event.MetricSetFields.GetValue("product") assert.Equal(t, val2, &name) val3, _ := event.MetricSetFields.GetValue("department_name") assert.Equal(t, val3, &name) + tags, _ := event.ModuleFields.GetValue("resource.tags") + assert.Equal(t, tags, map[string]*string{tagName: &tagValue}) + } else { + // + // The event is a forecast + // // Check the actual cost isActual, _ := event.MetricSetFields.HasKey("actual_cost") diff --git a/x-pack/metricbeat/module/azure/storage/storage.go b/x-pack/metricbeat/module/azure/storage/storage.go index 1869dea9294..2d2d1c50364 100644 --- a/x-pack/metricbeat/module/azure/storage/storage.go +++ b/x-pack/metricbeat/module/azure/storage/storage.go @@ -15,7 +15,7 @@ const defaultStorageAccountNamespace = "Microsoft.Storage/storageAccounts" var ( storageServiceNamespaces = []string{"/blobServices", "/tableServices", "/queueServices", "/fileServices"} - allowedDimensions = []string{"ResponseType", "ApiName"} + allowedDimensions = []string{"ResponseType", "ApiName", "GeoType", "Authentication", "BlobType", "Tier", "FileShare", "TransactionType"} ) // init registers the MetricSet with the central registry as soon as the program diff --git a/x-pack/metricbeat/module/enterprisesearch/health/data.go b/x-pack/metricbeat/module/enterprisesearch/health/data.go index c2620bff247..318f9fa0598 100644 --- a/x-pack/metricbeat/module/enterprisesearch/health/data.go +++ b/x-pack/metricbeat/module/enterprisesearch/health/data.go @@ -6,9 +6,10 @@ package health import ( "encoding/json" + "errors" + "fmt" "github.com/joeshaw/multierror" - "github.com/pkg/errors" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -125,7 +126,7 @@ func eventMapping(report mb.ReporterV2, input []byte, isXpack bool) error { event.MetricSetFields, err = schema.Apply(data) if err != nil { - errs = append(errs, errors.Wrap(err, "failure to apply health schema")) + errs = append(errs, fmt.Errorf("failure to apply health schema: %w", err)) } else { report.Event(event) } diff --git a/x-pack/metricbeat/module/enterprisesearch/health/health.go b/x-pack/metricbeat/module/enterprisesearch/health/health.go index d263314bf95..a8de3c90bc3 100644 --- a/x-pack/metricbeat/module/enterprisesearch/health/health.go +++ b/x-pack/metricbeat/module/enterprisesearch/health/health.go @@ -5,7 +5,7 @@ package health import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/helper" @@ -71,12 +71,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(report, content, m.XPackEnabled) if err != nil { - return errors.Wrap(err, "error converting event") + return fmt.Errorf("error converting event: %w", err) } return nil diff --git a/x-pack/metricbeat/module/enterprisesearch/stats/data.go b/x-pack/metricbeat/module/enterprisesearch/stats/data.go index ea20ded1745..cd1ebd13dc3 100644 --- a/x-pack/metricbeat/module/enterprisesearch/stats/data.go +++ b/x-pack/metricbeat/module/enterprisesearch/stats/data.go @@ -6,9 +6,10 @@ package stats import ( "encoding/json" + "errors" + "fmt" "github.com/joeshaw/multierror" - "github.com/pkg/errors" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -195,7 +196,7 @@ func eventMapping(report mb.ReporterV2, input []byte, isXpack bool) error { event.MetricSetFields, err = schema.Apply(data) if err != nil { - errs = append(errs, errors.Wrap(err, "failure to apply stats schema")) + errs = append(errs, fmt.Errorf("failure to apply stats schema: %w", err)) } else { report.Event(event) } diff --git a/x-pack/metricbeat/module/enterprisesearch/stats/stats.go b/x-pack/metricbeat/module/enterprisesearch/stats/stats.go index c59b3481af4..234a65d0d11 100644 --- a/x-pack/metricbeat/module/enterprisesearch/stats/stats.go +++ b/x-pack/metricbeat/module/enterprisesearch/stats/stats.go @@ -5,7 +5,7 @@ package stats import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/libbeat/common/cfgwarn" "github.com/elastic/beats/v7/metricbeat/helper" @@ -71,12 +71,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(report, content, m.XPackEnabled) if err != nil { - return errors.Wrap(err, "error converting event") + return fmt.Errorf("error converting event: %w", err) } return nil diff --git a/x-pack/metricbeat/module/gcp/metrics/compute/metadata.go b/x-pack/metricbeat/module/gcp/metrics/compute/metadata.go index 1db96f1d594..c215e471b45 100644 --- a/x-pack/metricbeat/module/gcp/metrics/compute/metadata.go +++ b/x-pack/metricbeat/module/gcp/metrics/compute/metadata.go @@ -154,9 +154,6 @@ func (s *metadataCollector) instance(ctx context.Context, instanceID string) (*c return computeInstance, nil } - // Remake the compute instances map to avoid having stale data. - s.computeInstances = make(map[uint64]*computepb.Instance) - return nil, nil } diff --git a/x-pack/metricbeat/module/iis/application_pool/reader.go b/x-pack/metricbeat/module/iis/application_pool/reader.go index 4ce1f240381..77d377a75d6 100644 --- a/x-pack/metricbeat/module/iis/application_pool/reader.go +++ b/x-pack/metricbeat/module/iis/application_pool/reader.go @@ -7,14 +7,13 @@ package application_pool import ( + "fmt" "strings" "github.com/elastic/beats/v7/metricbeat/helper/windows/pdh" "github.com/elastic/elastic-agent-libs/mapstr" "github.com/elastic/go-sysinfo" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/elastic-agent-libs/logp" ) @@ -77,7 +76,7 @@ func newReader(config Config) (*Reader, error) { err := r.initAppPools() if err != nil { - return nil, errors.Wrap(err, "error loading counters for existing app pools") + return nil, fmt.Errorf("error loading counters for existing app pools: %w", err) } return r, nil } @@ -86,7 +85,7 @@ func newReader(config Config) (*Reader, error) { func (r *Reader) initAppPools() error { apps, err := getApplicationPools(r.config.Names) if err != nil { - return errors.Wrap(err, "failed retrieving running worker processes") + return fmt.Errorf("failed retrieving running worker processes: %w", err) } r.applicationPools = apps if len(apps) == 0 { @@ -116,14 +115,14 @@ func (r *Reader) initAppPools() error { } for _, v := range childQueries { if err := r.query.AddCounter(v, "", "float", len(childQueries) > 1); err != nil { - return errors.Wrapf(err, `failed to add counter (query="%v")`, v) + return fmt.Errorf(`failed to add counter (query="%v"): %w`, v, err) } r.workerProcesses[v] = key } } err = r.query.RemoveUnusedCounters(newQueries) if err != nil { - return errors.Wrap(err, "failed removing unused counter values") + return fmt.Errorf("failed removing unused counter values: %w", err) } return nil } @@ -138,14 +137,14 @@ func (r *Reader) read() ([]mb.Event, error) { // Some counters, such as rate counters, require two counter values in order to compute a displayable value. In this case we must call PdhCollectQueryData twice before calling PdhGetFormattedCounterValue. // For more information, see Collecting Performance Data (https://docs.microsoft.com/en-us/windows/desktop/PerfCtrs/collecting-performance-data). if err := r.query.CollectData(); err != nil { - return nil, errors.Wrap(err, "failed querying counter values") + return nil, fmt.Errorf("failed querying counter values: %w", err) } // Get the values. values, err := r.query.GetFormattedCounterValues() if err != nil { r.close() - return nil, errors.Wrap(err, "failed formatting counter values") + return nil, fmt.Errorf("failed formatting counter values: %w", err) } var events []mb.Event eventGroup := r.mapEvents(values) diff --git a/x-pack/metricbeat/module/iis/test/integration.go b/x-pack/metricbeat/module/iis/test/integration.go index ede53c9406f..525bc3c1003 100644 --- a/x-pack/metricbeat/module/iis/test/integration.go +++ b/x-pack/metricbeat/module/iis/test/integration.go @@ -8,8 +8,10 @@ package test import ( + "errors" + "fmt" + "github.com/StackExchange/wmi" - "github.com/pkg/errors" ) // Service struct used to map Win32_Service @@ -37,7 +39,7 @@ func EnsureIISIsRunning() error { return errors.New("IIS is not not installed") } if ser[0].State != "Running" { - return errors.Errorf("IIS is installed but status is %s", ser[0].State) + return fmt.Errorf("IIS is installed but status is %s", ser[0].State) } return nil } diff --git a/x-pack/metricbeat/module/mssql/connection.go b/x-pack/metricbeat/module/mssql/connection.go index fa4c0fa36ae..ac328491ddb 100644 --- a/x-pack/metricbeat/module/mssql/connection.go +++ b/x-pack/metricbeat/module/mssql/connection.go @@ -6,24 +6,23 @@ package mssql import ( "database/sql" + "fmt" // Register driver. _ "github.com/denisenkom/go-mssqldb" - - "github.com/pkg/errors" ) // NewConnection returns a connection already established with MSSQL func NewConnection(uri string) (*sql.DB, error) { db, err := sql.Open("sqlserver", uri) if err != nil { - return nil, errors.Wrap(err, "could not create db instance") + return nil, fmt.Errorf("could not create db instance: %w", err) } // Check the connection before executing all queries to reduce the number // of connection errors that we might encounter. if err = db.Ping(); err != nil { - err = errors.Wrap(err, "error doing ping to db") + err = fmt.Errorf("error doing ping to db: %w", err) } return db, err diff --git a/x-pack/metricbeat/module/mssql/performance/data_integration_test.go b/x-pack/metricbeat/module/mssql/performance/data_integration_test.go index 498fdc1d0de..0d3d1d8fc78 100644 --- a/x-pack/metricbeat/module/mssql/performance/data_integration_test.go +++ b/x-pack/metricbeat/module/mssql/performance/data_integration_test.go @@ -5,11 +5,11 @@ package performance import ( + "errors" "net/url" "testing" _ "github.com/denisenkom/go-mssqldb" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" diff --git a/x-pack/metricbeat/module/mssql/transaction_log/transaction_log.go b/x-pack/metricbeat/module/mssql/transaction_log/transaction_log.go index 2fb7c43e0d2..821b5db5d08 100644 --- a/x-pack/metricbeat/module/mssql/transaction_log/transaction_log.go +++ b/x-pack/metricbeat/module/mssql/transaction_log/transaction_log.go @@ -8,8 +8,6 @@ import ( "database/sql" "fmt" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/x-pack/metricbeat/module/mssql" "github.com/elastic/elastic-agent-libs/logp" @@ -58,7 +56,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { db, err := mssql.NewConnection(base.HostData().URI) if err != nil { - return nil, errors.Wrap(err, "could not create connection to db") + return nil, fmt.Errorf("could not create connection to db: %w", err) } return &MetricSet{ @@ -131,7 +129,7 @@ func (m *MetricSet) getLogSpaceUsageForDb(dbName string) (mapstr.M, error) { &res.logSpaceInBytesSinceLastBackup); err != nil { // Because this query only returns a single result an error in the first scan is // probably a "data returned but not properly scanned" - err = errors.Wrap(err, "error scanning single result") + err = fmt.Errorf("error scanning single result: %w", err) return nil, err } @@ -156,7 +154,7 @@ func (m *MetricSet) getLogStats(db dbInfo) (mapstr.M, error) { if err := row.Scan(&res.databaseID, &res.sizeMB, &res.activeSizeMB, &res.backupTime, &res.sinceLastBackupMB, &res.sinceLastCheckpointMB, &res.recoverySizeMB); err != nil { // Because this query only returns a single result an error in the first scan is // probably a "data returned but not properly scanned" - err = errors.Wrap(err, "error scanning single result") + err = fmt.Errorf("error scanning single result: %w", err) return nil, err } @@ -189,14 +187,14 @@ func (m *MetricSet) getDbsNames() ([]dbInfo, error) { var rows *sql.Rows rows, err := m.db.Query("SELECT name, database_id FROM sys.databases") if err != nil { - return nil, errors.Wrap(err, "error doing query 'SELECT name, database_id FROM sys.databases'") + return nil, fmt.Errorf("error doing query 'SELECT name, database_id FROM sys.databases': %w", err) } defer closeRows(rows) for rows.Next() { var row dbInfo if err = rows.Scan(&row.name, &row.id); err != nil { - return nil, errors.Wrap(err, "error scanning row results") + return nil, fmt.Errorf("error scanning row results: %w", err) } res = append(res, row) diff --git a/x-pack/metricbeat/module/oracle/performance/buffer_cache_hit_ratio.go b/x-pack/metricbeat/module/oracle/performance/buffer_cache_hit_ratio.go index 0b0fb8ad41c..fc0db9d7859 100644 --- a/x-pack/metricbeat/module/oracle/performance/buffer_cache_hit_ratio.go +++ b/x-pack/metricbeat/module/oracle/performance/buffer_cache_hit_ratio.go @@ -7,8 +7,7 @@ package performance import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/x-pack/metricbeat/module/oracle" "github.com/elastic/elastic-agent-libs/mapstr" @@ -35,7 +34,7 @@ func (e *performanceExtractor) bufferCacheHitRatio(ctx context.Context) ([]buffe 1 - (physical_reads / (db_block_gets + consistent_gets)) "Hit Ratio" FROM V$BUFFER_POOL_STATISTICS`) if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]bufferCacheHitRatio, 0) diff --git a/x-pack/metricbeat/module/oracle/performance/cursors.go b/x-pack/metricbeat/module/oracle/performance/cursors.go index ebc5a1df61d..d29b16b7815 100644 --- a/x-pack/metricbeat/module/oracle/performance/cursors.go +++ b/x-pack/metricbeat/module/oracle/performance/cursors.go @@ -7,8 +7,7 @@ package performance import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/x-pack/metricbeat/module/oracle" "github.com/elastic/elastic-agent-libs/mapstr" @@ -56,7 +55,7 @@ func (e *performanceExtractor) cursorsByUsernameAndMachine(ctx context.Context) s.machine ORDER BY 1 DESC`) if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]cursorsByUsernameAndMachine, 0) diff --git a/x-pack/metricbeat/module/oracle/performance/data.go b/x-pack/metricbeat/module/oracle/performance/data.go index f24bfd86969..1004fac720a 100644 --- a/x-pack/metricbeat/module/oracle/performance/data.go +++ b/x-pack/metricbeat/module/oracle/performance/data.go @@ -6,8 +6,7 @@ package performance import ( "context" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/mb" ) @@ -17,19 +16,19 @@ func (m *MetricSet) extract(ctx context.Context, extractor performanceExtractMet out = &extractedData{} if out.bufferCacheHitRatios, err = extractor.bufferCacheHitRatio(ctx); err != nil { - return nil, errors.Wrap(err, "error getting buffer cache hit ratio") + return nil, fmt.Errorf("error getting buffer cache hit ratio: %w", err) } if out.libraryData, err = extractor.libraryCache(ctx); err != nil { - return nil, errors.Wrap(err, "error getting libraryCache data") + return nil, fmt.Errorf("error getting libraryCache data: %w", err) } if out.cursorsByUsernameAndMachine, err = extractor.cursorsByUsernameAndMachine(ctx); err != nil { - return nil, errors.Wrap(err, "error getting cursors by username and machine") + return nil, fmt.Errorf("error getting cursors by username and machine: %w", err) } if out.totalCursors, err = extractor.totalCursors(ctx); err != nil { - return nil, errors.Wrap(err, "error getting total cursors") + return nil, fmt.Errorf("error getting total cursors: %w", err) } return @@ -40,7 +39,7 @@ func (m *MetricSet) extract(ctx context.Context, extractor performanceExtractMet func (m *MetricSet) extractAndTransform(ctx context.Context) ([]mb.Event, error) { extractedMetricsData, err := m.extract(ctx, m.extractor) if err != nil { - return nil, errors.Wrap(err, "error extracting data") + return nil, fmt.Errorf("error extracting data: %w", err) } return m.transform(extractedMetricsData), nil diff --git a/x-pack/metricbeat/module/oracle/performance/library_cache.go b/x-pack/metricbeat/module/oracle/performance/library_cache.go index fec3b1b4a7f..fdb7a01abdf 100644 --- a/x-pack/metricbeat/module/oracle/performance/library_cache.go +++ b/x-pack/metricbeat/module/oracle/performance/library_cache.go @@ -7,8 +7,7 @@ package performance import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/x-pack/metricbeat/module/oracle" "github.com/elastic/elastic-agent-libs/mapstr" @@ -36,7 +35,7 @@ func (e *performanceExtractor) libraryCache(ctx context.Context) ([]libraryCache UNION SELECT 'io_reloads' "Ratio", (SUM(reloads) / SUM(pins)) FROM V$LIBRARYCACHE`) if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]libraryCache, 0) diff --git a/x-pack/metricbeat/module/oracle/tablespace/data.go b/x-pack/metricbeat/module/oracle/tablespace/data.go index 526c65e85b7..30c86d766da 100644 --- a/x-pack/metricbeat/module/oracle/tablespace/data.go +++ b/x-pack/metricbeat/module/oracle/tablespace/data.go @@ -6,12 +6,11 @@ package tablespace import ( "context" + "fmt" "github.com/elastic/beats/v7/x-pack/metricbeat/module/oracle" "github.com/elastic/elastic-agent-libs/mapstr" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/mb" ) @@ -21,15 +20,15 @@ func (m *MetricSet) extract(ctx context.Context, extractor tablespaceExtractMeth out = &extractedData{} if out.dataFiles, err = extractor.dataFilesData(ctx); err != nil { - return nil, errors.Wrap(err, "error getting data_files") + return nil, fmt.Errorf("error getting data_files: %w", err) } if out.tempFreeSpace, err = extractor.tempFreeSpaceData(ctx); err != nil { - return nil, errors.Wrap(err, "error getting temp_free_space") + return nil, fmt.Errorf("error getting temp_free_space: %w", err) } if out.freeSpace, err = extractor.usedAndFreeSpaceData(ctx); err != nil { - return nil, errors.Wrap(err, "error getting free space data") + return nil, fmt.Errorf("error getting free space data: %w", err) } return @@ -54,7 +53,7 @@ func (m *MetricSet) transform(in *extractedData) (out map[string]mapstr.M) { func (m *MetricSet) extractAndTransform(ctx context.Context) ([]mb.Event, error) { extractedMetricsData, err := m.extract(ctx, m.extractor) if err != nil { - return nil, errors.Wrap(err, "error extracting data") + return nil, fmt.Errorf("error extracting data: %w", err) } out := m.transform(extractedMetricsData) diff --git a/x-pack/metricbeat/module/oracle/tablespace/data_files.go b/x-pack/metricbeat/module/oracle/tablespace/data_files.go index 73df14b2ca1..be1eba9349d 100644 --- a/x-pack/metricbeat/module/oracle/tablespace/data_files.go +++ b/x-pack/metricbeat/module/oracle/tablespace/data_files.go @@ -8,8 +8,6 @@ import ( "context" "database/sql" "fmt" - - "github.com/pkg/errors" ) type dataFile struct { @@ -34,7 +32,7 @@ func (d *dataFile) eventKey() string { func (e *tablespaceExtractor) dataFilesData(ctx context.Context) ([]dataFile, error) { rows, err := e.db.QueryContext(ctx, "SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME, BYTES, STATUS, MAXBYTES, USER_BYTES, ONLINE_STATUS FROM SYS.DBA_DATA_FILES UNION SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME, BYTES, STATUS, MAXBYTES, USER_BYTES, STATUS AS ONLINE_STATUS FROM SYS.DBA_TEMP_FILES") if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]dataFile, 0) diff --git a/x-pack/metricbeat/module/oracle/tablespace/mocks_test.go b/x-pack/metricbeat/module/oracle/tablespace/mocks_test.go index a88b030a29f..12348236bcc 100644 --- a/x-pack/metricbeat/module/oracle/tablespace/mocks_test.go +++ b/x-pack/metricbeat/module/oracle/tablespace/mocks_test.go @@ -7,8 +7,7 @@ package tablespace import ( "context" "database/sql" - - "github.com/pkg/errors" + "errors" ) // happyMockExtractor is a tablespaceExtractMethods implementor that follow and ideal happy path on the entire set of data diff --git a/x-pack/metricbeat/module/oracle/tablespace/temp_free_space.go b/x-pack/metricbeat/module/oracle/tablespace/temp_free_space.go index 8bf50e24568..efc8401e2c0 100644 --- a/x-pack/metricbeat/module/oracle/tablespace/temp_free_space.go +++ b/x-pack/metricbeat/module/oracle/tablespace/temp_free_space.go @@ -7,8 +7,7 @@ package tablespace import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" ) type tempFreeSpace struct { @@ -29,7 +28,7 @@ func (d *tempFreeSpace) eventKey() string { func (e *tablespaceExtractor) tempFreeSpaceData(ctx context.Context) ([]tempFreeSpace, error) { rows, err := e.db.QueryContext(ctx, "SELECT TABLESPACE_NAME, TABLESPACE_SIZE, ALLOCATED_SPACE, FREE_SPACE FROM DBA_TEMP_FREE_SPACE") if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]tempFreeSpace, 0) diff --git a/x-pack/metricbeat/module/oracle/tablespace/used_and_free_space.go b/x-pack/metricbeat/module/oracle/tablespace/used_and_free_space.go index eec7197dbb4..b17b249808d 100644 --- a/x-pack/metricbeat/module/oracle/tablespace/used_and_free_space.go +++ b/x-pack/metricbeat/module/oracle/tablespace/used_and_free_space.go @@ -7,8 +7,7 @@ package tablespace import ( "context" "database/sql" - - "github.com/pkg/errors" + "fmt" ) type usedAndFreeSpace struct { @@ -28,7 +27,7 @@ func (d *usedAndFreeSpace) eventKey() string { func (e *tablespaceExtractor) usedAndFreeSpaceData(ctx context.Context) ([]usedAndFreeSpace, error) { rows, err := e.db.QueryContext(ctx, "SELECT b.tablespace_name, tbs_size used, a.free_space free FROM (SELECT tablespace_name, sum(bytes) AS free_space FROM dba_free_space GROUP BY tablespace_name) a, (SELECT tablespace_name, sum(bytes) AS tbs_size FROM dba_data_files GROUP BY tablespace_name) b WHERE a.tablespace_name(+)=b.tablespace_name") if err != nil { - return nil, errors.Wrap(err, "error executing query") + return nil, fmt.Errorf("error executing query: %w", err) } results := make([]usedAndFreeSpace, 0) diff --git a/x-pack/metricbeat/module/sql/_meta/docs.asciidoc b/x-pack/metricbeat/module/sql/_meta/docs.asciidoc index 9286e043d60..17175cb5878 100644 --- a/x-pack/metricbeat/module/sql/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/sql/_meta/docs.asciidoc @@ -1,5 +1,5 @@ The SQL module allows you to execute custom queries against an SQL database and -store the results in {es}. It also enables developing various SQL metrics integrations, using sql query as input. +store the results in {es}. It also enables the development of various SQL metrics integrations, using SQL query as input. This module supports the databases that you can monitor with {metricbeat}, including: @@ -23,20 +23,21 @@ fields: `driver`:: The driver can be any driver that has a {metricbeat} module, such as `mssql` or `postgres`. -`raw_data.enabled`:: Expects either true or false. By default false. Marking as true will generate event results in new field format. +`fetch_from_all_databases`:: Expects either `true` or `false` and it is by default set to `false`. Marking as `true` will enable execution `sql_queries` or `sql_query` for all databases in a server. Currently only `mssql` driver supports this feature. For other drivers, if enabled, "fetch from all databases feature is not supported for driver: " error would be logged. -Expects either `sql_queries` or `sql_query`. +`raw_data.enabled`:: Expects either `true` or `false` and it is by default set to `false`. Marking as `true` will generate event results in a new field format. -`sql_queries`:: Receives the list of queries to execute. `query` and `response_format` is repeated to get multiple query inputs. -`query`::: Expects sql query. -`response_format`::: Either `variables` or `table`: -`variables`:::: Expects a two-column table that looks like a key/value result. -The left column is considered a key and the right column the value. This mode -generates a single event on each fetch operation. -`table`:::: Expects any number of columns. This mode generates a single event for -each row. +Use `sql_queries` or `sql_query` depending on the use-case. -`sql_query`:: The single query you want to run. (`Backward Compatibility`). Also provide corresponding `sql_response_format`: either `variables` or `table` +`sql_queries`:: List of queries to execute. `query` and `response_format` fields are repeated to get multiple query inputs. + +`query`::: Single SQL query. + +`response_format`::: Either `variables` or `table`. +`variables`:::: Expects a two-column table that looks like a key-value result. The left column is considered a key and the right column is the value. This mode generates a single event on each fetch operation. +`table`:::: Expects any number of columns. This mode generates a single event for each row. + +`sql_query` (`Backward Compatibility`):: Single query you want to run. Also, provide corresponding `sql_response_format` (value: `variables` or `table`) similar to `sql_queries`'s `response_format`. [float] == Example @@ -44,7 +45,7 @@ each row. Examples of configurations in `sql.yml` to connect with supported databases are mentioned below. [float] -=== Example: capture Innodb-related metrics +=== Example: Capture Innodb-related metrics This `sql.yml` configuration shows how to capture Innodb-related metrics that result from the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL @@ -131,7 +132,7 @@ The example shown earlier generates this event: ---- [float] -=== Example: query PostgreSQL and generate a "table" result +=== Example: Query PostgreSQL and generate a "table" result This `sql.yml` configuration shows how to query PostgreSQL and generate a "table" result. This configuration generates a single event for each row @@ -219,7 +220,7 @@ for each row. For example, this event is created for the first row: ---- [float] -=== Example: get the buffer catch hit ratio in Oracle +=== Example: Get the buffer catch hit ratio in Oracle This `sql.yml` configuration shows how to get the buffer cache hit ratio: @@ -294,7 +295,7 @@ The example generates this event: ---- [float] -=== Example: get the buffer cache hit ratio for MSSQL +=== Example: Get the buffer cache hit ratio for MSSQL This `sql.yml` configuration gets the buffer cache hit ratio: @@ -344,7 +345,7 @@ The example generates this event: ---- [float] -=== Example: launch two or more queries. +=== Example: Launch two or more queries. To launch two or more queries, specify the full configuration for each query. @@ -408,14 +409,14 @@ The example generates this event: The response event is generated in new format "version": "8.0.0" }, "host": { - "name": "Muthu-mps" + "name": "mps" }, "agent": { "type": "metricbeat", "version": "8.3.0", "ephemeral_id": "8decc9eb-5ea5-47d8-8a22-fac507a5521b", "id": "6bbf5058-afed-44c6-aa05-775ee14a2da4", - "name": "Muthu-mps" + "name": "mps" } } ---- @@ -465,26 +466,26 @@ The example generates this event: By disabling the flag `raw_data.enabled`, whic "version": "8.0.0" }, "host": { - "name": "Muthu-mps" + "name": "mps" }, "agent": { "version": "8.3.0", "ephemeral_id": "bc09584b-62db-4b45-bfe9-6b7e8e982361", "id": "6bbf5058-afed-44c6-aa05-775ee14a2da4", - "name": "Muthu-mps", + "name": "mps", "type": "metricbeat" } } ---- [float] -=== Example: Merge multiple queries to single event. +=== Example: Merge multiple queries into a single event. -Multiple queries will create multiple events, one for each query. It may be preferrable to create a single event by combining the metrics together in a single event. +Multiple queries will create multiple events, one for each query. It may be preferable to create a single event by combining the metrics together in a single event. This feature can be enabled using the `merge_results` config. -However, such a merge is possible only if the table queries being merged, each produce a single row. +However, such a merge is possible only if the table queries are merged, each produces a single row. For example: @@ -513,7 +514,7 @@ This creates a combined event as below, where `blks_hit`, `blks_read`, `checkpoi { "@timestamp": "2022-07-21T07:07:06.747Z", "agent": { - "name": "Lalits-MBP-2", + "name": "MBP-2", "type": "metricbeat", "version": "8.4.0", "ephemeral_id": "b0867287-e56a-492f-b421-0ac870c426f9", @@ -544,6 +545,276 @@ This creates a combined event as below, where `blks_hit`, `blks_read`, `checkpoi } ---- +[float] +=== Example: Execute given queries for all database(s) present in a server + +Assuming a user could have 100s of databases on their server and then it becomes cumbersome to add them manually to the query. If `fetch_from_all_databases` is set to `true` then SQL module would fetch the databases names automatically and prefix +the database selector statement to the queries so that the queries can run against +the database provided. + +Currently, this feature only works with `mssql` driver. For example: + +[source,yaml] +---- +- module: sql + metricsets: + - query + period: 50s + hosts: ["sqlserver://:@"] + raw_data.enabled: true + + fetch_from_all_databases: true + + driver: "mssql" + sql_queries: + - query: SELECT DB_NAME() AS 'database_name'; + response_format: table +---- + +For an mssql instance, by default only four databases are present namely — `master`, `model`, `msdb`, `tempdb`. So, if `fetch_from_all_databases` is enabled then query `SELECT DB_NAME() AS 'database_name'` runs for each one of them i.e., there would be in total 4 documents (one each for 4 databases) for every scrape. + + +[source,json] +---- +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "service": { + "type": "sql", + "address": "localhost" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 40346375 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "sql": { + "metrics": { + "database_name": "master" + }, + "driver": "mssql", + "query": "USE [master]; SELECT DB_NAME() AS 'database_name';" + }, + "host": { + "os": { + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "", + "build": "" + }, + "name": "", + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "", + "architecture": "arm64" + }, + "agent": { + "name": "", + "type": "metricbeat", + "version": "8.10.0", + "ephemeral_id": "", + "id": "" + }, + "ecs": { + "version": "8.0.0" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "agent": { + "ephemeral_id": "", + "id": "", + "name": "", + "type": "metricbeat", + "version": "8.10.0" + }, + "event": { + "module": "sql", + "duration": 43147875, + "dataset": "sql.query" + }, + "metricset": { + "period": 50000, + "name": "query" + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "tempdb" + }, + "driver": "mssql", + "query": "USE [tempdb]; SELECT DB_NAME() AS 'database_name';" + }, + "ecs": { + "version": "8.0.0" + }, + "host": { + "name": "", + "architecture": "arm64", + "os": { + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "", + "build": "", + "type": "macos" + }, + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "host": { + "os": { + "build": "", + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS", + "kernel": "" + }, + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "", + "name": "", + "architecture": "arm64" + }, + "agent": { + "ephemeral_id": "", + "id": "", + "name": "", + "type": "metricbeat", + "version": "8.10.0" + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "model" + }, + "driver": "mssql", + "query": "USE [model]; SELECT DB_NAME() AS 'database_name';" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 46623125 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "ecs": { + "version": "8.0.0" + } +} +{ + "@timestamp": "2023-07-16T22:05:26.976Z", + "@metadata": { + "beat": "metricbeat", + "type": "_doc", + "version": "8.10.0" + }, + "host": { + "architecture": "arm64", + "os": { + "kernel": "", + "build": "", + "type": "macos", + "platform": "darwin", + "version": "13.3.1", + "family": "darwin", + "name": "macOS" + }, + "name": "", + "id": "", + "ip": [ + "" + ], + "mac": [ + "" + ], + "hostname": "" + }, + "agent": { + "type": "metricbeat", + "version": "8.10.0", + "ephemeral_id": "", + "id": "", + "name": "" + }, + "event": { + "dataset": "sql.query", + "module": "sql", + "duration": 49649250 + }, + "metricset": { + "name": "query", + "period": 50000 + }, + "service": { + "address": "localhost", + "type": "sql" + }, + "sql": { + "metrics": { + "database_name": "msdb" + }, + "driver": "mssql", + "query": "USE [msdb]; SELECT DB_NAME() AS 'database_name';" + }, + "ecs": { + "version": "8.0.0" + } +} +---- + + === Host Setup Some drivers require additional configuration to work. Find here instructions for these drivers. @@ -563,9 +834,9 @@ Also, add `ORACLE_HOME/bin` to the `PATH` environment variable. ===== Oracle Instant Client Installation -Oracle Instant Client enables development and deployment of applications that connect to Oracle Database. The Instant Client libraries provide the necessary network connectivity and advanced data features to make full use of Oracle Database. If you have OCI Oracle server which comes with these libraries pre-installed, you don't need a separate client installation. +Oracle Instant Client enables the development and deployment of applications that connect to the Oracle Database. The Instant Client libraries provide the necessary network connectivity and advanced data features to make full use of the Oracle Database. If you have an OCI Oracle server which comes with these libraries pre-installed, you don't need a separate client installation. -The OCI library install few Client Shared Libraries that must be referenced on the machine where Metricbeat is installed. Please follow https://docs.oracle.com/en/database/oracle/oracle-database/21/lacli/install-instant-client-using-zip.html#GUID-D3DCB4FB-D3CA-4C25-BE48-3A1FB5A22E84[this] link for OCI Instant Client set up. The OCI Instant Client is available with the Oracle Universal Installer, RPM file or ZIP file. Download links can be found https://www.oracle.com/database/technologies/instant-client/downloads.html[here]. +The OCI library installs a few Client Shared Libraries that must be referenced on the machine where Metricbeat is installed. Please follow https://docs.oracle.com/en/database/oracle/oracle-database/21/lacli/install-instant-client-using-zip.html#GUID-D3DCB4FB-D3CA-4C25-BE48-3A1FB5A22E84[this] link for OCI Instant Client set up. The OCI Instant Client is available with the Oracle Universal Installer, RPM file or ZIP file. Download links can be found at https://www.oracle.com/database/technologies/instant-client/downloads.html[here]. ===== Enable Oracle Listener @@ -600,7 +871,7 @@ The following two types of host configurations are supported: Note: If the password contains the backslash (`\`) character, it must be escaped with a backslash. For example, if the password is `my\_password`, it should be written as `my\\_password`. -Username and Password to connect to the database can be provided as values to `username` and `password` keys of `sql.yml`. +The username and password to connect to the database can be provided as values to `username` and `password` keys of `sql.yml`. [source,yml] ---- diff --git a/x-pack/metricbeat/module/sql/docker-compose.yml b/x-pack/metricbeat/module/sql/docker-compose.yml index fac50c274b1..184a340f1b5 100644 --- a/x-pack/metricbeat/module/sql/docker-compose.yml +++ b/x-pack/metricbeat/module/sql/docker-compose.yml @@ -15,3 +15,8 @@ services: extends: file: ../../../../x-pack/metricbeat/module/oracle/docker-compose.yml service: oracle + + mssql: + extends: + file: ../../../../x-pack/metricbeat/module/mssql/docker-compose.yml + service: mssql diff --git a/x-pack/metricbeat/module/sql/query/query.go b/x-pack/metricbeat/module/sql/query/query.go index e80c706b349..f521acbe133 100644 --- a/x-pack/metricbeat/module/sql/query/query.go +++ b/x-pack/metricbeat/module/sql/query/query.go @@ -6,6 +6,7 @@ package query import ( "context" + "errors" "fmt" "github.com/jmoiron/sqlx" @@ -44,12 +45,15 @@ type config struct { Driver string `config:"driver" validate:"nonzero,required"` - // Support either the previous query / or the new list of queries. - ResponseFormat string `config:"sql_response_format"` - Query string `config:"sql_query" ` + // Support either the query or list of queries. + ResponseFormat string `config:"sql_response_format"` + Query string `config:"sql_query"` + Queries []query `config:"sql_queries"` + MergeResults bool `config:"merge_results"` - Queries []query `config:"sql_queries" ` - MergeResults bool `config:"merge_results"` + // Support fetch response for given queries from all databases. + // NOTE: Currently, mssql driver only respects FetchFromAllDatabases. + FetchFromAllDatabases bool `config:"fetch_from_all_databases"` } // MetricSet holds any configuration or state information. It must implement @@ -82,7 +86,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return nil, fmt.Errorf("invalid sql_response_format value: %s", b.Config.ResponseFormat) } } else { - // Backword compartibility, if no value is provided + // Backward compatibility, if no value is provided. // This will ensure there is no braking change, as the previous code worked with no ResponseFormat b.Config.ResponseFormat = variableResponseFormat } @@ -104,76 +108,190 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return b, nil } -// Fetch methods implements the data gathering and data conversion to the right -// 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(). -// It calls m.fetchTableMode() or m.fetchVariableMode() depending on the response -// format of the query. -func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { - db, err := sql.NewDBClient(m.Config.Driver, m.HostData().URI, m.Logger()) - if err != nil { - return fmt.Errorf("could not open connection: %w", err) +// queryDBNames returns the query to list databases present in a server +// as per the driver name. If the given driver is not supported, queryDBNames +// returns an empty query. +func queryDBNames(driver string) string { + switch sql.SwitchDriverName(driver) { + // NOTE: Add support for other drivers in future as when the need arises. + // dbSelector function would also required to be modified in order to add + // support for a new driver. + case "mssql": + return "SELECT [name] FROM sys.databases WITH (NOLOCK) WHERE state = 0 AND HAS_DBACCESS([name]) = 1" + // case "mysql": + // return "SHOW DATABASES" + // case "godror": + // // NOTE: Requires necessary priviledges to access DBA_USERS + // // Ref: https://stackoverflow.com/a/3005623/5821408 + // return "SELECT * FROM DBA_USERS" + // case "postgres": + // return "SELECT datname FROM pg_database" } - defer db.Close() - queries := m.Config.Queries - if len(queries) == 0 { - one_query := query{Query: m.Config.Query, ResponseFormat: m.Config.ResponseFormat} - queries = append(queries, one_query) - } + return "" +} - merged := mapstr.M{} +// dbSelector returns the statement to select a named database to run the +// subsequent statements. If the given driver is not supported, dbSelector +// returns an empty statement. +func dbSelector(driver, dbName string) string { + switch sql.SwitchDriverName(driver) { + // NOTE: Add support for other drivers in future as when the need arises. + // queryDBNames function would also required to be modified in order to add + // support for a new driver. + // + case "mssql": + return fmt.Sprintf("USE [%s];", dbName) + } + return "" +} +func (m *MetricSet) fetch(ctx context.Context, db *sql.DbClient, reporter mb.ReporterV2, queries []query) (bool, error) { + var ok bool + merged := make(mapstr.M, 0) for _, q := range queries { if q.ResponseFormat == tableResponseFormat { // Table format mss, err := db.FetchTableMode(ctx, q.Query) if err != nil { - return fmt.Errorf("fetch table mode failed: %w", err) + return ok, fmt.Errorf("fetch table mode failed: %w", err) } for _, ms := range mss { if m.Config.MergeResults { if len(mss) > 1 { - return fmt.Errorf("can not merge query resulting with more than one rows: %s", q) + return ok, fmt.Errorf("cannot merge query resulting with more than one rows: %s", q) } else { for k, v := range ms { _, ok := merged[k] if ok { - m.Logger().Warn("overwriting duplicate metrics: ", k) + m.Logger().Warn("overwriting duplicate metrics:", k) } merged[k] = v } } } else { // Report immediately for non-merged cases. - m.reportEvent(ms, reporter, q.Query) + ok = m.reportEvent(ms, reporter, q.Query) } } } else { // Variable format ms, err := db.FetchVariableMode(ctx, q.Query) if err != nil { - return fmt.Errorf("fetch variable mode failed: %w", err) + return ok, fmt.Errorf("fetch variable mode failed: %w", err) } if m.Config.MergeResults { for k, v := range ms { _, ok := merged[k] if ok { - m.Logger().Warn("overwriting duplicate metrics: ", k) + m.Logger().Warn("overwriting duplicate metrics:", k) } merged[k] = v } } else { // Report immediately for non-merged cases. - m.reportEvent(ms, reporter, q.Query) + ok = m.reportEvent(ms, reporter, q.Query) } } } + if m.Config.MergeResults { // Report here for merged case. - m.reportEvent(merged, reporter, "") + ok = m.reportEvent(merged, reporter, "") + } + + return ok, nil +} + +// Fetch method implements the data gathering and data conversion to the right +// 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(). +// It calls m.fetchTableMode() or m.fetchVariableMode() depending on the response +// format of the query. +func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { + db, err := sql.NewDBClient(m.Config.Driver, m.HostData().URI, m.Logger()) + if err != nil { + return fmt.Errorf("cannot open connection: %w", err) + } + defer db.Close() + + queries := m.Config.Queries + if len(queries) == 0 { + one_query := query{Query: m.Config.Query, ResponseFormat: m.Config.ResponseFormat} + queries = append(queries, one_query) + } + + if !m.Config.FetchFromAllDatabases { + reported, err := m.fetch(ctx, db, reporter, queries) + if err != nil { + m.Logger().Warn("error while fetching:", err) + } + if !reported { + m.Logger().Debug("error trying to emit event") + } + return nil + } + + // NOTE: Only mssql driver is supported for now because: + // + // * Difference in queries to fetch the name of the databases + // * The statement to select a named database (for subsequent statements + // to be executed) may not be generic i.e, USE statement (e.g., USE ) + // works for MSSQL but not Oracle. + // + // TODO: Add the feature for other drivers when need arises. + validQuery := queryDBNames(m.Config.Driver) + if validQuery == "" { + return fmt.Errorf("fetch from all databases feature is not supported for driver: %s", m.Config.Driver) + } + + // Discover all databases in the server and execute given queries on each + // of the databases. + dbNames, err := db.FetchTableMode(ctx, queryDBNames(m.Config.Driver)) + if err != nil { + return fmt.Errorf("cannot fetch database names: %w", err) + } + + if len(dbNames) == 0 { + return errors.New("no database names found") + } + + qs := make([]query, 0, len(queries)) + + for i := range dbNames { + // Create a copy of the queries as query would be modified on every + // iteration. + qs = qs[:0] // empty slice + qs = append(qs, queries...) // copy queries + + val, err := dbNames[i].GetValue("name") + if err != nil { + m.Logger().Warn("error with database name:", err) + continue + } + dbName, ok := val.(string) + if !ok { + m.Logger().Warn("error with database name's type") + continue + } + + // Prefix dbSelector to the query based on the driver + // provided. + // Example: USE ; @command (or @query) + for i := range qs { + qs[i].Query = dbSelector(m.Config.Driver, dbName) + " " + qs[i].Query + } + + reported, err := m.fetch(ctx, db, reporter, qs) + if err != nil { + m.Logger().Warn("error while fetching:", err) + } + if !reported { + m.Logger().Debug("error trying to emit event") + return nil + } } return nil @@ -181,15 +299,15 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) error { // reportEvent using 'user' mode with keys under `sql.metrics.*` or using Raw data mode (module and metricset key spaces // provided by the user) -func (m *MetricSet) reportEvent(ms mapstr.M, reporter mb.ReporterV2, qry string) { +func (m *MetricSet) reportEvent(ms mapstr.M, reporter mb.ReporterV2, qry string) bool { + var ok bool if m.Config.RawData.Enabled { - // New usage. // Only driver & query field mapped. // metrics to be mapped by end user. if len(qry) > 0 { // set query. - reporter.Event(mb.Event{ + ok = reporter.Event(mb.Event{ ModuleFields: mapstr.M{ "metrics": ms, // Individual metric "driver": m.Config.Driver, @@ -197,19 +315,18 @@ func (m *MetricSet) reportEvent(ms mapstr.M, reporter mb.ReporterV2, qry string) }, }) } else { - reporter.Event(mb.Event{ + ok = reporter.Event(mb.Event{ // Do not set query. ModuleFields: mapstr.M{ "metrics": ms, // Individual metric "driver": m.Config.Driver, }, }) - } } else { - // Previous usage. Backword compartibility. + // Previous usage. Backward compatibility. // Supports field mapping. - reporter.Event(mb.Event{ + ok = reporter.Event(mb.Event{ ModuleFields: mapstr.M{ "driver": m.Config.Driver, "query": qry, @@ -217,6 +334,7 @@ func (m *MetricSet) reportEvent(ms mapstr.M, reporter mb.ReporterV2, qry string) }, }) } + return ok } // inferTypeFromMetrics to organize the output event into 'numeric', 'strings', 'floats' and 'boolean' values @@ -237,7 +355,7 @@ func inferTypeFromMetrics(ms mapstr.M) mapstr.M { case bool: boolMetrics[k] = v case nil: - //Ignore because a nil has no data type and thus cannot be indexed + // Ignore because a nil has no data type and thus cannot be indexed default: stringMetrics[k] = v } diff --git a/x-pack/metricbeat/module/sql/query/test_sql_mssql.py b/x-pack/metricbeat/module/sql/query/test_sql_mssql.py new file mode 100644 index 00000000000..c212830fe0c --- /dev/null +++ b/x-pack/metricbeat/module/sql/query/test_sql_mssql.py @@ -0,0 +1,59 @@ +import os +import sys +import unittest +import time +from xpack_metricbeat import XPackTest, metricbeat + + +class Test(XPackTest): + COMPOSE_SERVICES = ['mssql'] + + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_query_without_fetch_from_all_databases(self): + """ + SQL MSSQL custom query with fetch_from_all_databases=false + + 1 document will be received from the default selected database: 'master' in MSSQL. + """ + self.run_query_test(fetch_from_all_databases=False, expected_output_count=1) + + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_query_with_fetch_from_all_databases(self): + """ + SQL MSSQL custom query with fetch_from_all_databases=true + + 4 documents will be received, each corresponding to one of the four default databases in MSSQL. + """ + self.run_query_test(fetch_from_all_databases=True, expected_output_count=4) + + def run_query_test(self, fetch_from_all_databases: bool, expected_output_count: int) -> list: + self.render_config_template(modules=[{ + "name": "sql", + "metricsets": ["query"], + "hosts": ['sqlserver://{}:{}@{}'.format(self.get_username(), self.get_password(), self.compose_host())], + "period": "5s", + "additional_content": f""" + driver: mssql + fetch_from_all_databases: {str(fetch_from_all_databases).lower()} + sql_query: SELECT DB_NAME() AS 'database_name'; + sql_response_format: table""" + }]) + + proc = self.start_beat() + self.wait_until(lambda: self.output_lines() > 0) + proc.check_kill_and_wait() + self.assert_no_logged_warnings() + + output = self.read_output_json() + self.assertEqual(len(output), expected_output_count) + + for evt in output: + self.assert_fields_are_documented(evt) + self.assertIn("sql", evt.keys(), evt) + self.assertIn("query", evt["sql"].keys(), evt) + + def get_username(self): + return os.getenv('MSSQL_USERNAME', 'SA') + + def get_password(self): + return os.getenv('MSSQL_PASSWORD', '1234_asdf') diff --git a/x-pack/metricbeat/module/stan/_meta/Dockerfile b/x-pack/metricbeat/module/stan/_meta/Dockerfile index db00a41578f..3f707023d1a 100644 --- a/x-pack/metricbeat/module/stan/_meta/Dockerfile +++ b/x-pack/metricbeat/module/stan/_meta/Dockerfile @@ -2,7 +2,7 @@ ARG STAN_VERSION=0.15.1 FROM nats-streaming:$STAN_VERSION # build stage -FROM golang:1.19.10 AS build-env +FROM golang:1.20.7 AS build-env RUN apt-get install git mercurial gcc RUN git clone https://github.com/nats-io/stan.go.git /stan-go RUN cd /stan-go/examples/stan-bench && git checkout tags/v0.5.2 && go build . diff --git a/x-pack/metricbeat/module/stan/channels/channels.go b/x-pack/metricbeat/module/stan/channels/channels.go index d2824943ccc..ab3ef50fd9d 100644 --- a/x-pack/metricbeat/module/stan/channels/channels.go +++ b/x-pack/metricbeat/module/stan/channels/channels.go @@ -5,7 +5,7 @@ package channels import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -68,10 +68,10 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) (err error) { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } if err = eventsMapping(content, r); err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/x-pack/metricbeat/module/stan/channels/data.go b/x-pack/metricbeat/module/stan/channels/data.go index 9ac80ce63d4..25d5d51f392 100644 --- a/x-pack/metricbeat/module/stan/channels/data.go +++ b/x-pack/metricbeat/module/stan/channels/data.go @@ -6,8 +6,7 @@ package channels import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -66,12 +65,12 @@ type Channels struct { func eventMapping(content map[string]interface{}) (mb.Event, error) { fields, err := channelSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying channels schema") + return mb.Event{}, fmt.Errorf("error applying channels schema: %w", err) } moduleFields, err := moduleSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying module schema") + return mb.Event{}, fmt.Errorf("error applying module schema: %w", err) } event := mb.Event{ @@ -85,7 +84,7 @@ func eventMapping(content map[string]interface{}) (mb.Event, error) { func eventsMapping(content []byte, r mb.ReporterV2) error { channelsIn := Channels{} if err := json.Unmarshal(content, &channelsIn); err != nil { - return errors.Wrap(err, "error unmarshaling Nats streaming channels response to JSON") + return fmt.Errorf("error unmarshaling Nats streaming channels response to JSON: %w", err) } for _, ch := range channelsIn.Channels { @@ -109,7 +108,7 @@ func eventsMapping(content []byte, r mb.ReporterV2) error { } if evt, err = eventMapping(chWrapper); err != nil { - r.Error(errors.Wrap(err, "error mapping channel to its schema")) + r.Error(fmt.Errorf("error mapping channel to its schema: %w", err)) continue } if !r.Event(evt) { diff --git a/x-pack/metricbeat/module/stan/stats/data.go b/x-pack/metricbeat/module/stan/stats/data.go index 569a201f53d..d73549e2655 100644 --- a/x-pack/metricbeat/module/stan/stats/data.go +++ b/x-pack/metricbeat/module/stan/stats/data.go @@ -6,8 +6,7 @@ package stats import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -37,17 +36,17 @@ var ( func eventMapping(content []byte, r mb.ReporterV2) error { var streaming = make(map[string]interface{}) if err := json.Unmarshal(content, &streaming); err != nil { - return errors.Wrap(err, "error in streaming server mapping") + return fmt.Errorf("error in streaming server mapping: %w", err) } fields, err := clientsSchema.Apply(streaming) if err != nil { - return errors.Wrap(err, "error parsing Nats streaming server API response") + return fmt.Errorf("error parsing Nats streaming server API response: %w", err) } moduleFields, err := moduleSchema.Apply(streaming) if err != nil { - return errors.Wrap(err, "error applying module schema") + return fmt.Errorf("error applying module schema: %w", err) } event := mb.Event{ MetricSetFields: fields, diff --git a/x-pack/metricbeat/module/stan/stats/stats.go b/x-pack/metricbeat/module/stan/stats/stats.go index c83f27cb6e8..05a1c9760e2 100644 --- a/x-pack/metricbeat/module/stan/stats/stats.go +++ b/x-pack/metricbeat/module/stan/stats/stats.go @@ -5,7 +5,7 @@ package stats import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -66,11 +66,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) error { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } err = eventMapping(content, r) if err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/x-pack/metricbeat/module/stan/subscriptions/data.go b/x-pack/metricbeat/module/stan/subscriptions/data.go index 2135c68fca0..16f8c80ecc2 100644 --- a/x-pack/metricbeat/module/stan/subscriptions/data.go +++ b/x-pack/metricbeat/module/stan/subscriptions/data.go @@ -6,8 +6,7 @@ package subscriptions import ( "encoding/json" - - "github.com/pkg/errors" + "fmt" s "github.com/elastic/beats/v7/libbeat/common/schema" c "github.com/elastic/beats/v7/libbeat/common/schema/mapstriface" @@ -39,12 +38,12 @@ var ( func eventMapping(content map[string]interface{}) (mb.Event, error) { fields, err := subscriptionsSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying subscription schema") + return mb.Event{}, fmt.Errorf("error applying subscription schema: %w", err) } moduleFields, err := moduleSchema.Apply(content) if err != nil { - return mb.Event{}, errors.Wrap(err, "error applying module schema") + return mb.Event{}, fmt.Errorf("error applying module schema: %w", err) } event := mb.Event{ @@ -88,7 +87,7 @@ func eventsMapping(content []byte, r mb.ReporterV2) error { var err error channels := Channels{} if err = json.Unmarshal(content, &channels); err != nil { - return errors.Wrap(err, "error unmarshaling Nats streaming channels detailed response to JSON") + return fmt.Errorf("error unmarshaling Nats streaming channels detailed response to JSON: %w", err) } for _, ch := range channels.Channels { @@ -99,7 +98,7 @@ func eventsMapping(content []byte, r mb.ReporterV2) error { sub["cluster_id"] = channels.ClusterID evt, err = eventMapping(sub) if err != nil { - r.Error(errors.Wrap(err, "error mapping subscription event")) + r.Error(fmt.Errorf("error mapping subscription event: %w", err)) continue } diff --git a/x-pack/metricbeat/module/stan/subscriptions/subscriptions.go b/x-pack/metricbeat/module/stan/subscriptions/subscriptions.go index 428db923de1..457912b4a5f 100644 --- a/x-pack/metricbeat/module/stan/subscriptions/subscriptions.go +++ b/x-pack/metricbeat/module/stan/subscriptions/subscriptions.go @@ -5,7 +5,7 @@ package subscriptions import ( - "github.com/pkg/errors" + "fmt" "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" @@ -68,10 +68,10 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(r mb.ReporterV2) (err error) { content, err := m.http.FetchContent() if err != nil { - return errors.Wrap(err, "error in fetch") + return fmt.Errorf("error in fetch: %w", err) } if err = eventsMapping(content, r); err != nil { - return errors.Wrap(err, "error in mapping") + return fmt.Errorf("error in mapping: %w", err) } return nil diff --git a/x-pack/metricbeat/module/syncgateway/syncgateway.go b/x-pack/metricbeat/module/syncgateway/syncgateway.go index dfd2e16cb84..4d261faa190 100644 --- a/x-pack/metricbeat/module/syncgateway/syncgateway.go +++ b/x-pack/metricbeat/module/syncgateway/syncgateway.go @@ -6,11 +6,10 @@ package syncgateway import ( "encoding/json" + "fmt" "sync" "time" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" ) @@ -76,7 +75,7 @@ func (m *module) GetSyncgatewayResponse(http *helper.HTTP) (*SgResponse, error) input := SgResponse{} if err = json.Unmarshal(byt, &input); err != nil { - return nil, errors.Wrap(err, "error unmarshalling JSON of SyncGateway expvar response") + return nil, fmt.Errorf("error unmarshalling JSON of SyncGateway expvar response: %w", err) } m.expvarCache.cachedData = input diff --git a/x-pack/metricbeat/modules.d/activemq.yml.disabled b/x-pack/metricbeat/modules.d/activemq.yml.disabled index 33716db01c9..de0ecb7c79f 100644 --- a/x-pack/metricbeat/modules.d/activemq.yml.disabled +++ b/x-pack/metricbeat/modules.d/activemq.yml.disabled @@ -1,5 +1,5 @@ # Module: activemq -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-activemq.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-activemq.html - module: activemq metricsets: ['broker', 'queue', 'topic'] diff --git a/x-pack/metricbeat/modules.d/airflow.yml.disabled b/x-pack/metricbeat/modules.d/airflow.yml.disabled index 010b1daadd8..e874fcf7db0 100644 --- a/x-pack/metricbeat/modules.d/airflow.yml.disabled +++ b/x-pack/metricbeat/modules.d/airflow.yml.disabled @@ -1,5 +1,5 @@ # Module: airflow -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-airflow.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-airflow.html - module: airflow host: "localhost" diff --git a/x-pack/metricbeat/modules.d/aws.yml.disabled b/x-pack/metricbeat/modules.d/aws.yml.disabled index 3fc7c43a108..ddd36a4c326 100644 --- a/x-pack/metricbeat/modules.d/aws.yml.disabled +++ b/x-pack/metricbeat/modules.d/aws.yml.disabled @@ -1,5 +1,5 @@ # Module: aws -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-aws.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-aws.html - module: aws period: 1m diff --git a/x-pack/metricbeat/modules.d/awsfargate.yml.disabled b/x-pack/metricbeat/modules.d/awsfargate.yml.disabled index b2b91f06ee4..81c34f5759d 100644 --- a/x-pack/metricbeat/modules.d/awsfargate.yml.disabled +++ b/x-pack/metricbeat/modules.d/awsfargate.yml.disabled @@ -1,5 +1,5 @@ # Module: awsfargate -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-awsfargate.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-awsfargate.html - module: awsfargate period: 10s diff --git a/x-pack/metricbeat/modules.d/azure.yml.disabled b/x-pack/metricbeat/modules.d/azure.yml.disabled index 10d00e003cf..e42f064618a 100644 --- a/x-pack/metricbeat/modules.d/azure.yml.disabled +++ b/x-pack/metricbeat/modules.d/azure.yml.disabled @@ -1,5 +1,5 @@ # Module: azure -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-azure.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-azure.html - module: azure metricsets: diff --git a/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled b/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled index 22a600e51d8..e082545a78d 100644 --- a/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled +++ b/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled @@ -1,5 +1,5 @@ # Module: cloudfoundry -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-cloudfoundry.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-cloudfoundry.html - module: cloudfoundry metricsets: diff --git a/x-pack/metricbeat/modules.d/cockroachdb.yml.disabled b/x-pack/metricbeat/modules.d/cockroachdb.yml.disabled index 5b0a48e86bb..198fb66f8d8 100644 --- a/x-pack/metricbeat/modules.d/cockroachdb.yml.disabled +++ b/x-pack/metricbeat/modules.d/cockroachdb.yml.disabled @@ -1,5 +1,5 @@ # Module: cockroachdb -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-cockroachdb.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-cockroachdb.html - module: cockroachdb metricsets: ['status'] diff --git a/x-pack/metricbeat/modules.d/containerd.yml.disabled b/x-pack/metricbeat/modules.d/containerd.yml.disabled index f21b32139eb..20b03cd9e50 100644 --- a/x-pack/metricbeat/modules.d/containerd.yml.disabled +++ b/x-pack/metricbeat/modules.d/containerd.yml.disabled @@ -1,5 +1,5 @@ # Module: containerd -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-containerd.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-containerd.html - module: containerd metricsets: ["cpu", "memory", "blkio"] diff --git a/x-pack/metricbeat/modules.d/coredns.yml.disabled b/x-pack/metricbeat/modules.d/coredns.yml.disabled index 644a62bc4b7..60e8b71c32c 100644 --- a/x-pack/metricbeat/modules.d/coredns.yml.disabled +++ b/x-pack/metricbeat/modules.d/coredns.yml.disabled @@ -1,5 +1,5 @@ # Module: coredns -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-coredns.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-coredns.html - module: coredns metricsets: ["stats"] diff --git a/x-pack/metricbeat/modules.d/enterprisesearch-xpack.yml.disabled b/x-pack/metricbeat/modules.d/enterprisesearch-xpack.yml.disabled index e42dde843c2..0af7916573a 100644 --- a/x-pack/metricbeat/modules.d/enterprisesearch-xpack.yml.disabled +++ b/x-pack/metricbeat/modules.d/enterprisesearch-xpack.yml.disabled @@ -1,5 +1,5 @@ # Module: enterprisesearch -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-enterprisesearch.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-enterprisesearch.html - module: enterprisesearch xpack.enabled: true diff --git a/x-pack/metricbeat/modules.d/enterprisesearch.yml.disabled b/x-pack/metricbeat/modules.d/enterprisesearch.yml.disabled index 241791cc203..122e56b627b 100644 --- a/x-pack/metricbeat/modules.d/enterprisesearch.yml.disabled +++ b/x-pack/metricbeat/modules.d/enterprisesearch.yml.disabled @@ -1,5 +1,5 @@ # Module: enterprisesearch -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-enterprisesearch.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-enterprisesearch.html - module: enterprisesearch metricsets: ["health", "stats"] diff --git a/x-pack/metricbeat/modules.d/gcp.yml.disabled b/x-pack/metricbeat/modules.d/gcp.yml.disabled index 4a42e04b311..f79e1607a45 100644 --- a/x-pack/metricbeat/modules.d/gcp.yml.disabled +++ b/x-pack/metricbeat/modules.d/gcp.yml.disabled @@ -1,5 +1,5 @@ # Module: gcp -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-gcp.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-gcp.html - module: gcp metricsets: diff --git a/x-pack/metricbeat/modules.d/ibmmq.yml.disabled b/x-pack/metricbeat/modules.d/ibmmq.yml.disabled index a2fdf552f1c..43940532263 100644 --- a/x-pack/metricbeat/modules.d/ibmmq.yml.disabled +++ b/x-pack/metricbeat/modules.d/ibmmq.yml.disabled @@ -1,5 +1,5 @@ # Module: ibmmq -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-ibmmq.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-ibmmq.html - module: ibmmq metricsets: ['qmgr'] diff --git a/x-pack/metricbeat/modules.d/iis.yml.disabled b/x-pack/metricbeat/modules.d/iis.yml.disabled index f81d67eedff..19f348a2875 100644 --- a/x-pack/metricbeat/modules.d/iis.yml.disabled +++ b/x-pack/metricbeat/modules.d/iis.yml.disabled @@ -1,5 +1,5 @@ # Module: iis -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-iis.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-iis.html - module: iis metricsets: diff --git a/x-pack/metricbeat/modules.d/istio.yml.disabled b/x-pack/metricbeat/modules.d/istio.yml.disabled index 55c2a1d715a..ccb0884610a 100644 --- a/x-pack/metricbeat/modules.d/istio.yml.disabled +++ b/x-pack/metricbeat/modules.d/istio.yml.disabled @@ -1,5 +1,5 @@ # Module: istio -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-istio.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-istio.html # Istio mesh. To collect all Mixer-generated metrics. For versions of Istio prior to 1.5. - module: istio diff --git a/x-pack/metricbeat/modules.d/mssql.yml.disabled b/x-pack/metricbeat/modules.d/mssql.yml.disabled index 12eff0522ee..fbbb7bad8fc 100644 --- a/x-pack/metricbeat/modules.d/mssql.yml.disabled +++ b/x-pack/metricbeat/modules.d/mssql.yml.disabled @@ -1,5 +1,5 @@ # Module: mssql -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-mssql.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-mssql.html - module: mssql metricsets: diff --git a/x-pack/metricbeat/modules.d/oracle.yml.disabled b/x-pack/metricbeat/modules.d/oracle.yml.disabled index 99d59eb2c3a..445924b61ea 100644 --- a/x-pack/metricbeat/modules.d/oracle.yml.disabled +++ b/x-pack/metricbeat/modules.d/oracle.yml.disabled @@ -1,5 +1,5 @@ # Module: oracle -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-oracle.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-oracle.html # Module: oracle diff --git a/x-pack/metricbeat/modules.d/prometheus.yml.disabled b/x-pack/metricbeat/modules.d/prometheus.yml.disabled index d6e00936b2a..11cc449ba47 100644 --- a/x-pack/metricbeat/modules.d/prometheus.yml.disabled +++ b/x-pack/metricbeat/modules.d/prometheus.yml.disabled @@ -1,5 +1,5 @@ # Module: prometheus -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-prometheus.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-prometheus.html - module: prometheus period: 10s diff --git a/x-pack/metricbeat/modules.d/redisenterprise.yml.disabled b/x-pack/metricbeat/modules.d/redisenterprise.yml.disabled index c3121d7c2fb..350843a88e9 100644 --- a/x-pack/metricbeat/modules.d/redisenterprise.yml.disabled +++ b/x-pack/metricbeat/modules.d/redisenterprise.yml.disabled @@ -1,5 +1,5 @@ # Module: redisenterprise -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-redisenterprise.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-redisenterprise.html - module: redisenterprise metricsets: diff --git a/x-pack/metricbeat/modules.d/sql.yml.disabled b/x-pack/metricbeat/modules.d/sql.yml.disabled index 5663e03b1ef..f45644b0b11 100644 --- a/x-pack/metricbeat/modules.d/sql.yml.disabled +++ b/x-pack/metricbeat/modules.d/sql.yml.disabled @@ -1,5 +1,5 @@ # Module: sql -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-sql.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-sql.html - module: sql metricsets: diff --git a/x-pack/metricbeat/modules.d/stan.yml.disabled b/x-pack/metricbeat/modules.d/stan.yml.disabled index 0f93c0f5a0c..b3f19229874 100644 --- a/x-pack/metricbeat/modules.d/stan.yml.disabled +++ b/x-pack/metricbeat/modules.d/stan.yml.disabled @@ -1,5 +1,5 @@ # Module: stan -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-stan.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-stan.html - module: stan metricsets: ["stats", "subscriptions", "channels"] diff --git a/x-pack/metricbeat/modules.d/statsd.yml.disabled b/x-pack/metricbeat/modules.d/statsd.yml.disabled index ced946c242f..16712fd96b3 100644 --- a/x-pack/metricbeat/modules.d/statsd.yml.disabled +++ b/x-pack/metricbeat/modules.d/statsd.yml.disabled @@ -1,5 +1,5 @@ # Module: statsd -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-statsd.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-statsd.html - module: statsd host: "localhost" diff --git a/x-pack/metricbeat/modules.d/syncgateway.yml.disabled b/x-pack/metricbeat/modules.d/syncgateway.yml.disabled index 54c42a11809..f37b367c959 100644 --- a/x-pack/metricbeat/modules.d/syncgateway.yml.disabled +++ b/x-pack/metricbeat/modules.d/syncgateway.yml.disabled @@ -1,5 +1,5 @@ # Module: syncgateway -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-syncgateway.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-syncgateway.html - module: syncgateway metricsets: diff --git a/x-pack/metricbeat/modules.d/tomcat.yml.disabled b/x-pack/metricbeat/modules.d/tomcat.yml.disabled index 58a9a4038f7..623f5a888d5 100644 --- a/x-pack/metricbeat/modules.d/tomcat.yml.disabled +++ b/x-pack/metricbeat/modules.d/tomcat.yml.disabled @@ -1,5 +1,5 @@ # Module: tomcat -# Docs: https://www.elastic.co/guide/en/beats/metricbeat/master/metricbeat-module-tomcat.html +# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-tomcat.html - module: tomcat metricsets: ['threading', 'cache', 'memory', 'requests'] diff --git a/x-pack/osquerybeat/ext/osquery-extension/pkg/tables/elastic_file_analysis.go b/x-pack/osquerybeat/ext/osquery-extension/pkg/tables/elastic_file_analysis.go index f531a8d6233..d5616a039aa 100644 --- a/x-pack/osquerybeat/ext/osquery-extension/pkg/tables/elastic_file_analysis.go +++ b/x-pack/osquerybeat/ext/osquery-extension/pkg/tables/elastic_file_analysis.go @@ -17,8 +17,9 @@ import ( "strings" "syscall" - "github.com/elastic/beats/v7/x-pack/osquerybeat/internal/command" "github.com/osquery/osquery-go/plugin/table" + + "github.com/elastic/beats/v7/x-pack/osquerybeat/internal/command" ) func ExecuteStderr(ctx context.Context, name string, arg ...string) (out string, err error) { diff --git a/x-pack/osquerybeat/internal/distro/distro.go b/x-pack/osquerybeat/internal/distro/distro.go index 81ab5b8a6e8..d8d26536dbd 100644 --- a/x-pack/osquerybeat/internal/distro/distro.go +++ b/x-pack/osquerybeat/internal/distro/distro.go @@ -36,14 +36,14 @@ const ( osqueryCertsDarwinPath = "private/var/osquery/certs/" + osqueryCertsPEM osqueryCertsWindowsPath = "osquery/certs/" + osqueryCertsPEM - osqueryVersion = "5.7.0" + osqueryVersion = "5.8.2" osqueryMSIExt = ".msi" osqueryPkgExt = ".pkg" - osqueryDistroDarwinSHA256 = "6147f5632d7ae0bfb5c485f3b2211057179ceed18904b375007f23043408261f" - osqueryDistroLinuxSHA256 = "0e34979a795be205b2a1bdf0b85464a34951fe94b462bd7c23bd894e24baceef" - osqueryDistroLinuxARMSHA256 = "86826541444fe192b3a5f54d0e7d9f83375fc242c44e741fcd0766c8f933cac0" - osqueryDistroWindowsSHA256 = "0e54fec4b8b8a800e3bdd178a2473db9de25e53b8ea800775b7f9cc8c847be1c" + osqueryDistroDarwinSHA256 = "1fea8ac9b603851d2e76c5fc73138a468a3075a3002c8cb1fd7fff53b889c4dd" + osqueryDistroLinuxSHA256 = "5bb2647b45a423e68d7dbc16ab2316c3f512d0944a56e4662c7010b59cddc721" + osqueryDistroLinuxARMSHA256 = "e51620928210970abb51d6ec79235bafff73bd354bdb54eec6e5969072d3d115" + osqueryDistroWindowsSHA256 = "d319837d4e95d1e477c2126d383501180925a29f488ff1164fa16d2e576f96dd" ) type OSArch struct { diff --git a/x-pack/winlogbeat/module/powershell/ingest/powershell.yml b/x-pack/winlogbeat/module/powershell/ingest/powershell.yml index 2c3a3a3e85c..34f537bce36 100644 --- a/x-pack/winlogbeat/module/powershell/ingest/powershell.yml +++ b/x-pack/winlogbeat/module/powershell/ingest/powershell.yml @@ -232,7 +232,7 @@ processors: field: param3 source: |- def parseRawDetail(String raw) { - Pattern detailRegex = /^([^:(]+)\((.+)\)\:\s*(.+)?$/; + Pattern detailRegex = /^([^:(]+)\(([^)]+)\)\:\s*(.+)?$/; Pattern parameterBindingRegex = /name\=(.+);\s*value\=(.+)$/; def matcher = detailRegex.matcher(raw); diff --git a/x-pack/winlogbeat/module/powershell/ingest/powershell_operational.yml b/x-pack/winlogbeat/module/powershell/ingest/powershell_operational.yml index cb7830ed304..db36f6aed99 100644 --- a/x-pack/winlogbeat/module/powershell/ingest/powershell_operational.yml +++ b/x-pack/winlogbeat/module/powershell/ingest/powershell_operational.yml @@ -284,7 +284,7 @@ processors: field: Payload source: |- def parseRawDetail(String raw) { - Pattern detailRegex = /^(.+)\((.+)\)\:\s*(.+)?$/; + Pattern detailRegex = /^([^:(]+)\(([^)]+)\)\:\s*(.+)?$/; Pattern parameterBindingRegex = /name\=(.+);\s*value\=(.+)$/; def matcher = detailRegex.matcher(raw);