mirror of
https://github.com/prometheus/node_exporter.git
synced 2025-08-20 18:33:52 -07:00
Merge branch 'prometheus:master' into add-drm-chip
This commit is contained in:
commit
d45ed475ff
|
@ -7,10 +7,10 @@ executors:
|
||||||
# should also be updated.
|
# should also be updated.
|
||||||
golang:
|
golang:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/go:1.23
|
- image: cimg/go:1.24
|
||||||
arm:
|
arm:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/go:1.23
|
- image: cimg/go:1.24
|
||||||
resource_class: arm.medium
|
resource_class: arm.medium
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -42,7 +42,7 @@ jobs:
|
||||||
- run: git diff --exit-code
|
- run: git diff --exit-code
|
||||||
build:
|
build:
|
||||||
machine:
|
machine:
|
||||||
image: ubuntu-2204:current
|
image: ubuntu-2404:current
|
||||||
parallelism: 3
|
parallelism: 3
|
||||||
steps:
|
steps:
|
||||||
- prometheus/setup_environment
|
- prometheus/setup_environment
|
||||||
|
@ -68,9 +68,9 @@ jobs:
|
||||||
destination: /build
|
destination: /build
|
||||||
test_docker:
|
test_docker:
|
||||||
machine:
|
machine:
|
||||||
image: ubuntu-2204:current
|
image: ubuntu-2404:current
|
||||||
environment:
|
environment:
|
||||||
DOCKER_TEST_IMAGE_NAME: quay.io/prometheus/golang-builder:1.23-base
|
DOCKER_TEST_IMAGE_NAME: quay.io/prometheus/golang-builder:1.24-base
|
||||||
REPO_PATH: github.com/prometheus/node_exporter
|
REPO_PATH: github.com/prometheus/node_exporter
|
||||||
steps:
|
steps:
|
||||||
- prometheus/setup_environment
|
- prometheus/setup_environment
|
||||||
|
|
313
.github/workflows/bsd.yml
vendored
Normal file
313
.github/workflows/bsd.yml
vendored
Normal file
|
@ -0,0 +1,313 @@
|
||||||
|
name: bsd
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
GNU_TAR_VERSION: "1.35"
|
||||||
|
GO_VERSION_DRAGONFLY: "1.24.1"
|
||||||
|
GO_VERSION_FREEBSD: "123"
|
||||||
|
GO_VERSION_NETBSD: "1.24.1"
|
||||||
|
GO_VERSION_OPENBSD: "1.23.1"
|
||||||
|
GO_VERSION_SOLARIS: "1.24.1"
|
||||||
|
|
||||||
|
# To spin up one of the VMs below, see the "Debug Shell" section here: https://github.com/vmactions
|
||||||
|
jobs:
|
||||||
|
test_freebsd:
|
||||||
|
name: Run end-to-end tests on FreeBSD
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/freebsd-vm@8873d98fd1413b5977cb2f7348fe329775159892 # v1.1.9
|
||||||
|
with:
|
||||||
|
copyback: false
|
||||||
|
envs: 'GO_VERSION_FREEBSD GNU_TAR_VERSION'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
pkg update -f
|
||||||
|
pkg install -y \
|
||||||
|
bash \
|
||||||
|
git \
|
||||||
|
gmake \
|
||||||
|
gnugrep \
|
||||||
|
go${GO_VERSION_FREEBSD} \
|
||||||
|
gsed \
|
||||||
|
gtar \
|
||||||
|
python \
|
||||||
|
wget
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
ln -s $(which go${GO_VERSION_FREEBSD}) $(pwd)/bin/go
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
gmake test-e2e
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
test_openbsd:
|
||||||
|
name: Run end-to-end tests on OpenBSD
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/openbsd-vm@7ac70b6de6f33efc74a90c1964afa3bcf0ee4401 # v1.1.6
|
||||||
|
with:
|
||||||
|
copyback: false
|
||||||
|
envs: 'GO_VERSION_OPENBSD GNU_TAR_VERSION'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
pkg_add -u
|
||||||
|
pkg_add \
|
||||||
|
bash \
|
||||||
|
ggrep \
|
||||||
|
git \
|
||||||
|
gmake \
|
||||||
|
go-${GO_VERSION_OPENBSD} \
|
||||||
|
gsed \
|
||||||
|
gtar-${GNU_TAR_VERSION}p0-static \
|
||||||
|
python \
|
||||||
|
wget
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
make test-e2e
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
test_netbsd:
|
||||||
|
name: Run end-to-end tests on NetBSD
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/netbsd-vm@46a58bbf03682b4cb24142b97fa315ae52bed573 # v1.1.8
|
||||||
|
with:
|
||||||
|
copyback: false
|
||||||
|
envs: 'GO_VERSION_NETBSD GNU_TAR_VERSION'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
/usr/sbin/pkg_add -u
|
||||||
|
/usr/sbin/pkg_add \
|
||||||
|
git \
|
||||||
|
gmake \
|
||||||
|
grep \
|
||||||
|
gsed \
|
||||||
|
gtar-base-${GNU_TAR_VERSION}\
|
||||||
|
python312 \
|
||||||
|
wget
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
GOGZ="go${GO_VERSION_NETBSD}.netbsd-amd64.tar.gz"
|
||||||
|
wget https://go.dev/dl/${GOGZ}
|
||||||
|
gtar xzf ${GOGZ}
|
||||||
|
ln -s $(pwd)/go/bin/go $(pwd)/bin/go
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
make test-e2e
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
test_dragonfly:
|
||||||
|
name: Run end-to-end tests on DragonFly
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/dragonflybsd-vm@e3c420e8a2362c2496fca6e76a291abd46f5d8e7 # v1.1.0
|
||||||
|
with:
|
||||||
|
copyback: false
|
||||||
|
envs: 'GO_VERSION_DRAGONFLY'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
pkg update && pkg upgrade -y
|
||||||
|
pkg install -y \
|
||||||
|
bash \
|
||||||
|
git \
|
||||||
|
gmake \
|
||||||
|
gnugrep \
|
||||||
|
gsed \
|
||||||
|
gtar \
|
||||||
|
python3 \
|
||||||
|
wget
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
GOGZ="go${GO_VERSION_DRAGONFLY}.dragonfly-amd64.tar.gz"
|
||||||
|
wget https://go.dev/dl/${GOGZ}
|
||||||
|
gtar xzf ${GOGZ}
|
||||||
|
ln -s $(pwd)/go/bin/go $(pwd)/bin/go
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
ln -s $(which python3) $(pwd)/bin/python
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
gmake test-e2e
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
test_solaris:
|
||||||
|
name: Run end-to-end tests on Solaris
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/solaris-vm@cc8f82fa1a7cc746153ec3f71bf11f311f16e225 # v1.1.1
|
||||||
|
with:
|
||||||
|
copyback: false
|
||||||
|
envs: 'GO_VERSION_SOLARIS'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
pkg update
|
||||||
|
pkg install \
|
||||||
|
bash \
|
||||||
|
curl \
|
||||||
|
gcc \
|
||||||
|
git \
|
||||||
|
gnu-grep \
|
||||||
|
gnu-make \
|
||||||
|
gnu-sed \
|
||||||
|
gnu-tar
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
GOGZ="go${GO_VERSION_SOLARIS}.solaris-amd64.tar.gz"
|
||||||
|
wget https://go.dev/dl/${GOGZ}
|
||||||
|
gtar xzf ${GOGZ}
|
||||||
|
ln -s $(pwd)/go/bin/go $(pwd)/bin/go
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
|
||||||
|
echo ">> building promu as it is not shipped for Solaris"
|
||||||
|
git clone https://github.com/prometheus/promu.git
|
||||||
|
cd promu
|
||||||
|
go build .
|
||||||
|
cd -
|
||||||
|
|
||||||
|
mkdir -p $(go env GOPATH)/bin
|
||||||
|
ln -s $(pwd)/promu/promu $(go env GOPATH)/bin/promu
|
||||||
|
export PATH=$(go env GOPATH)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
make test-e2e
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
test_macos:
|
||||||
|
name: Run end-to-end tests on macOS
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
brew install \
|
||||||
|
bash \
|
||||||
|
curl \
|
||||||
|
git \
|
||||||
|
grep \
|
||||||
|
make \
|
||||||
|
gnu-sed \
|
||||||
|
gnu-tar \
|
||||||
|
go \
|
||||||
|
python3
|
||||||
|
- name: test-e2e
|
||||||
|
run: |
|
||||||
|
echo "::group::Setup prerequisites"
|
||||||
|
set -eu
|
||||||
|
mkdir bin
|
||||||
|
ln -s $(which ggrep) $(pwd)/bin/grep
|
||||||
|
ln -s $(which gmake) $(pwd)/bin/make
|
||||||
|
ln -s $(which gsed) $(pwd)/bin/sed
|
||||||
|
ln -s $(which gtar) $(pwd)/bin/tar
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Print environment information"
|
||||||
|
uname -a
|
||||||
|
echo "GOOS: $(go env GOOS)"
|
||||||
|
echo "GOARCH: $(go env GOARCH)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run End-to-End Tests"
|
||||||
|
git config --global --add safe.directory $(pwd)
|
||||||
|
make test-e2e
|
||||||
|
echo "::endgroup::"
|
4
.github/workflows/container_description.yml
vendored
4
.github/workflows/container_description.yml
vendored
|
@ -18,7 +18,7 @@ jobs:
|
||||||
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
||||||
steps:
|
steps:
|
||||||
- name: git checkout
|
- name: git checkout
|
||||||
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- name: Set docker hub repo name
|
- name: Set docker hub repo name
|
||||||
run: echo "DOCKER_REPO_NAME=$(make docker-repo-name)" >> $GITHUB_ENV
|
run: echo "DOCKER_REPO_NAME=$(make docker-repo-name)" >> $GITHUB_ENV
|
||||||
- name: Push README to Dockerhub
|
- name: Push README to Dockerhub
|
||||||
|
@ -40,7 +40,7 @@ jobs:
|
||||||
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
||||||
steps:
|
steps:
|
||||||
- name: git checkout
|
- name: git checkout
|
||||||
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- name: Set quay.io org name
|
- name: Set quay.io org name
|
||||||
run: echo "DOCKER_REPO=$(echo quay.io/${GITHUB_REPOSITORY_OWNER} | tr -d '-')" >> $GITHUB_ENV
|
run: echo "DOCKER_REPO=$(echo quay.io/${GITHUB_REPOSITORY_OWNER} | tr -d '-')" >> $GITHUB_ENV
|
||||||
- name: Set quay.io repo name
|
- name: Set quay.io repo name
|
||||||
|
|
10
.github/workflows/golangci-lint.yml
vendored
10
.github/workflows/golangci-lint.yml
vendored
|
@ -24,16 +24,16 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
|
uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
|
||||||
with:
|
with:
|
||||||
go-version: 1.23.x
|
go-version: 1.24.x
|
||||||
- name: Install snmp_exporter/generator dependencies
|
- name: Install snmp_exporter/generator dependencies
|
||||||
run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
|
run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
|
||||||
if: github.repository == 'prometheus/snmp_exporter'
|
if: github.repository == 'prometheus/snmp_exporter'
|
||||||
- name: Lint
|
- name: Lint
|
||||||
uses: golangci/golangci-lint-action@aaa42aa0628b4ae2578232a66b541047968fac86 # v6.1.0
|
uses: golangci/golangci-lint-action@55c2c1448f86e01eaae002a5a3a9624417608d84 # v6.5.2
|
||||||
with:
|
with:
|
||||||
args: --verbose
|
args: --verbose
|
||||||
version: v1.60.2
|
version: v1.64.6
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -27,6 +27,8 @@ dependencies-stamp
|
||||||
/.release
|
/.release
|
||||||
/.tarballs
|
/.tarballs
|
||||||
|
|
||||||
|
tools/tools
|
||||||
|
|
||||||
# Intellij
|
# Intellij
|
||||||
|
|
||||||
/.idea
|
/.idea
|
||||||
|
|
|
@ -1,17 +1,9 @@
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- depguard
|
- depguard
|
||||||
|
- goimports
|
||||||
- misspell
|
- misspell
|
||||||
- revive
|
- revive
|
||||||
disable:
|
|
||||||
# Disable soon to deprecated[1] linters that lead to false
|
|
||||||
# positives when build tags disable certain files[2]
|
|
||||||
# 1: https://github.com/golangci/golangci-lint/issues/1841
|
|
||||||
# 2: https://github.com/prometheus/node_exporter/issues/1545
|
|
||||||
- deadcode
|
|
||||||
- unused
|
|
||||||
- structcheck
|
|
||||||
- varcheck
|
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
go:
|
go:
|
||||||
# Whenever the Go version is updated here, .circle/config.yml and
|
# Whenever the Go version is updated here, .circle/config.yml and
|
||||||
# .promu.yml should also be updated.
|
# .promu.yml should also be updated.
|
||||||
version: 1.23
|
version: 1.24
|
||||||
cgo: true
|
cgo: true
|
||||||
repository:
|
repository:
|
||||||
path: github.com/prometheus/node_exporter
|
path: github.com/prometheus/node_exporter
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
go:
|
go:
|
||||||
# Whenever the Go version is updated here, .circle/config.yml and
|
# Whenever the Go version is updated here, .circle/config.yml and
|
||||||
# .promu-cgo.yml should also be updated.
|
# .promu-cgo.yml should also be updated.
|
||||||
version: 1.23
|
version: 1.24
|
||||||
repository:
|
repository:
|
||||||
path: github.com/prometheus/node_exporter
|
path: github.com/prometheus/node_exporter
|
||||||
build:
|
build:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
extends: default
|
extends: default
|
||||||
ignore: |
|
ignore: |
|
||||||
ui/react-app/node_modules
|
**/node_modules
|
||||||
|
|
||||||
rules:
|
rules:
|
||||||
braces:
|
braces:
|
||||||
|
|
32
CHANGELOG.md
32
CHANGELOG.md
|
@ -5,6 +5,38 @@
|
||||||
* [ENHANCEMENT]
|
* [ENHANCEMENT]
|
||||||
* [BUGFIX]
|
* [BUGFIX]
|
||||||
|
|
||||||
|
## 1.9.0 / 2025-02-17
|
||||||
|
|
||||||
|
* [CHANGE] meminfo: Convert linux implementation to use procfs lib #3049
|
||||||
|
* [CHANGE] Update logging to use Go log/slog #3097
|
||||||
|
* [FEATURE] filesystem: Add `node_filesystem_mount_info` metric #2970
|
||||||
|
* [FEATURE] btrfs: Add metrics for commit statistics #3010
|
||||||
|
* [FEATURE] interrupts: Add collector include/exclude filtering #3028
|
||||||
|
* [FEATURE] interrupts: Add "exclude zeros" filtering #3028
|
||||||
|
* [FEATURE] slabinfo: Add filters for slab name. #3041
|
||||||
|
* [FEATURE] pressure: add IRQ PSI metrics #3048
|
||||||
|
* [FEATURE] hwmon: Add include and exclude filter for sensors #3072
|
||||||
|
* [FEATURE] filesystem: Add NetBSD support #3082
|
||||||
|
* [FEATURE] netdev: Add ifAlias label #3087
|
||||||
|
* [FEATURE] hwmon: Add Support for GPU Clock Frequencies #3093
|
||||||
|
* [FEATURE] Add `exclude[]` URL parameter #3116
|
||||||
|
* [FEATURE] Add AIX support #3136
|
||||||
|
* [FEATURE] filesystem: Add fs-types/mount-points include flags #3171
|
||||||
|
* [FEATURE] netstat: Add collector for tcp packet counters for FreeBSD. #3177
|
||||||
|
* [ENHANCEMENT] ethtool: Add logging for filtering flags #2979
|
||||||
|
* [ENHANCEMENT] netstat: Add TCPRcvQDrop to default metrics #3021
|
||||||
|
* [ENHANCEMENT] diskstats: Add block device rotational #3022
|
||||||
|
* [ENHANCEMENT] cpu: Support CPU online status #3032
|
||||||
|
* [ENHANCEMENT] arp: optimize interface name resolution #3133
|
||||||
|
* [ENHANCEMENT] textfile: Allow specifiying multiple directory globs #3135
|
||||||
|
* [ENHANCEMENT] filesystem: Add reporting of purgeable space on MacOS #3206
|
||||||
|
* [ENHANCEMENT] ethtool: Skip full scan of NetClass directories #3239
|
||||||
|
* [BUGFIX] zfs: Prevent `procfs` integer underflow #2961
|
||||||
|
* [BUGFIX] pressure: Fix collection on systems that do not expose a full CPU stat #3054
|
||||||
|
* [BUGFIX] cpu: Fix FreeBSD 32-bit host support and plug memory leak #3083
|
||||||
|
* [BUGFIX] hwmon: Add safety check to hwmon read #3134
|
||||||
|
* [BUGFIX] zfs: Allow space in dataset name #3186
|
||||||
|
|
||||||
## 1.8.1 / 2024-05-16
|
## 1.8.1 / 2024-05-16
|
||||||
|
|
||||||
* [BUGFIX] Fix CPU seconds on Solaris #2963
|
* [BUGFIX] Fix CPU seconds on Solaris #2963
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -113,9 +113,13 @@ update_fixtures:
|
||||||
rm -vf collector/fixtures/udev/.unpacked
|
rm -vf collector/fixtures/udev/.unpacked
|
||||||
./ttar -C collector/fixtures -c -f collector/fixtures/udev.ttar udev
|
./ttar -C collector/fixtures -c -f collector/fixtures/udev.ttar udev
|
||||||
|
|
||||||
|
.PHONY: tools
|
||||||
|
tools:
|
||||||
|
@rm ./tools/tools >/dev/null 2>&1 || true
|
||||||
|
@$(GO) build -o tools ./tools/...
|
||||||
|
|
||||||
.PHONY: test-e2e
|
.PHONY: test-e2e
|
||||||
test-e2e: build collector/fixtures/sys/.unpacked collector/fixtures/udev/.unpacked
|
test-e2e: build collector/fixtures/sys/.unpacked collector/fixtures/udev/.unpacked tools
|
||||||
@echo ">> running end-to-end tests"
|
@echo ">> running end-to-end tests"
|
||||||
./end-to-end-test.sh
|
./end-to-end-test.sh
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_
|
||||||
SKIP_GOLANGCI_LINT :=
|
SKIP_GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT :=
|
GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT_OPTS ?=
|
GOLANGCI_LINT_OPTS ?=
|
||||||
GOLANGCI_LINT_VERSION ?= v1.60.2
|
GOLANGCI_LINT_VERSION ?= v1.64.6
|
||||||
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64.
|
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64.
|
||||||
# windows isn't included here because of the path separator being different.
|
# windows isn't included here because of the path separator being different.
|
||||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
# Node exporter
|
# Node exporter
|
||||||
|
|
||||||
[][circleci]
|
[][circleci]
|
||||||
[](https://buildkite.com/prometheus/node-exporter)
|

|
||||||
|

|
||||||
[][quay]
|
[][quay]
|
||||||
[][hub]
|
[][hub]
|
||||||
[][goreportcard]
|
[][goreportcard]
|
||||||
|
@ -99,8 +100,8 @@ cpu | flags | --collector.cpu.info.flags-include | N/A
|
||||||
diskstats | device | --collector.diskstats.device-include | --collector.diskstats.device-exclude
|
diskstats | device | --collector.diskstats.device-include | --collector.diskstats.device-exclude
|
||||||
ethtool | device | --collector.ethtool.device-include | --collector.ethtool.device-exclude
|
ethtool | device | --collector.ethtool.device-include | --collector.ethtool.device-exclude
|
||||||
ethtool | metrics | --collector.ethtool.metrics-include | N/A
|
ethtool | metrics | --collector.ethtool.metrics-include | N/A
|
||||||
filesystem | fs-types | N/A | --collector.filesystem.fs-types-exclude
|
filesystem | fs-types | --collector.filesystem.fs-types-include | --collector.filesystem.fs-types-exclude
|
||||||
filesystem | mount-points | N/A | --collector.filesystem.mount-points-exclude
|
filesystem | mount-points | --collector.filesystem.mount-points-include | --collector.filesystem.mount-points-exclude
|
||||||
hwmon | chip | --collector.hwmon.chip-include | --collector.hwmon.chip-exclude
|
hwmon | chip | --collector.hwmon.chip-include | --collector.hwmon.chip-exclude
|
||||||
hwmon | sensor | --collector.hwmon.sensor-include | --collector.hwmon.sensor-exclude
|
hwmon | sensor | --collector.hwmon.sensor-include | --collector.hwmon.sensor-exclude
|
||||||
interrupts | name | --collector.interrupts.name-include | --collector.interrupts.name-exclude
|
interrupts | name | --collector.interrupts.name-include | --collector.interrupts.name-exclude
|
||||||
|
|
|
@ -17,13 +17,11 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net"
|
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/jsimonetti/rtnetlink/v2"
|
"github.com/jsimonetti/rtnetlink/v2/rtnl"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
@ -76,44 +74,30 @@ func getTotalArpEntries(deviceEntries []procfs.ARPEntry) map[string]uint32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTotalArpEntriesRTNL() (map[string]uint32, error) {
|
func getTotalArpEntriesRTNL() (map[string]uint32, error) {
|
||||||
conn, err := rtnetlink.Dial(nil)
|
conn, err := rtnl.Dial(nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
neighbors, err := conn.Neigh.List()
|
// Neighbors will also contain IPv6 neighbors, but since this is purely an ARP collector,
|
||||||
|
// restrict to AF_INET.
|
||||||
|
neighbors, err := conn.Neighbours(nil, unix.AF_INET)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ifIndexEntries := make(map[uint32]uint32)
|
// Map of interface name to ARP neighbor count.
|
||||||
|
entries := make(map[string]uint32)
|
||||||
|
|
||||||
for _, n := range neighbors {
|
for _, n := range neighbors {
|
||||||
// Neighbors will also contain IPv6 neighbors, but since this is purely an ARP collector,
|
// Skip entries which have state NUD_NOARP to conform to output of /proc/net/arp.
|
||||||
// restrict to AF_INET. Also skip entries which have state NUD_NOARP to conform to output
|
if n.State&unix.NUD_NOARP == 0 {
|
||||||
// of /proc/net/arp.
|
entries[n.Interface.Name]++
|
||||||
if n.Family == unix.AF_INET && n.State&unix.NUD_NOARP == 0 {
|
|
||||||
ifIndexEntries[n.Index]++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enumEntries := make(map[string]uint32)
|
return entries, nil
|
||||||
|
|
||||||
// Convert interface indexes to names.
|
|
||||||
for ifIndex, entryCount := range ifIndexEntries {
|
|
||||||
iface, err := net.InterfaceByIndex(int(ifIndex))
|
|
||||||
if err != nil {
|
|
||||||
if errors.Unwrap(err).Error() == "no such network interface" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
enumEntries[iface.Name] = entryCount
|
|
||||||
}
|
|
||||||
|
|
||||||
return enumEntries, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *arpCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *arpCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
|
@ -30,22 +30,50 @@ import (
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
nodeCPUPhysicalSecondsDesc = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "physical_seconds_total"),
|
||||||
|
"Seconds the physical CPUs spent in each mode.",
|
||||||
|
[]string{"cpu", "mode"}, nil,
|
||||||
|
)
|
||||||
|
nodeCPUSRunQueueDesc = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "runqueue"),
|
||||||
|
"Length of the run queue.", []string{"cpu"}, nil,
|
||||||
|
)
|
||||||
|
nodeCPUFlagsDesc = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "flags"),
|
||||||
|
"CPU flags.",
|
||||||
|
[]string{"cpu", "flag"}, nil,
|
||||||
|
)
|
||||||
|
nodeCPUContextSwitchDesc = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "context_switches_total"),
|
||||||
|
"Number of context switches.",
|
||||||
|
[]string{"cpu"}, nil,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
type cpuCollector struct {
|
type cpuCollector struct {
|
||||||
cpu typedDesc
|
cpu typedDesc
|
||||||
|
cpuPhysical typedDesc
|
||||||
|
cpuRunQueue typedDesc
|
||||||
|
cpuFlags typedDesc
|
||||||
|
cpuContextSwitch typedDesc
|
||||||
|
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
tickPerSecond int64
|
tickPerSecond float64
|
||||||
|
purrTicksPerSecond float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tickPerSecond() (int64, error) {
|
func tickPerSecond() (float64, error) {
|
||||||
ticks, err := C.sysconf(C._SC_CLK_TCK)
|
ticks, err := C.sysconf(C._SC_CLK_TCK)
|
||||||
if ticks == -1 || err != nil {
|
if ticks == -1 || err != nil {
|
||||||
return 0, fmt.Errorf("failed to get clock ticks per second: %v", err)
|
return 0, fmt.Errorf("failed to get clock ticks per second: %v", err)
|
||||||
}
|
}
|
||||||
return int64(ticks), nil
|
return float64(ticks), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
@ -53,10 +81,22 @@ func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pconfig, err := perfstat.PartitionStat()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &cpuCollector{
|
return &cpuCollector{
|
||||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
|
cpuPhysical: typedDesc{nodeCPUPhysicalSecondsDesc, prometheus.CounterValue},
|
||||||
|
cpuRunQueue: typedDesc{nodeCPUSRunQueueDesc, prometheus.GaugeValue},
|
||||||
|
cpuFlags: typedDesc{nodeCPUFlagsDesc, prometheus.GaugeValue},
|
||||||
|
cpuContextSwitch: typedDesc{nodeCPUContextSwitchDesc, prometheus.CounterValue},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
tickPerSecond: ticks,
|
tickPerSecond: ticks,
|
||||||
|
purrTicksPerSecond: float64(pconfig.ProcessorMhz * 1e6),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,10 +107,26 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for n, stat := range stats {
|
for n, stat := range stats {
|
||||||
ch <- c.cpu.mustNewConstMetric(float64(stat.User/c.tickPerSecond), strconv.Itoa(n), "user")
|
// LPAR metrics
|
||||||
ch <- c.cpu.mustNewConstMetric(float64(stat.Sys/c.tickPerSecond), strconv.Itoa(n), "system")
|
ch <- c.cpu.mustNewConstMetric(float64(stat.User)/c.tickPerSecond, strconv.Itoa(n), "user")
|
||||||
ch <- c.cpu.mustNewConstMetric(float64(stat.Idle/c.tickPerSecond), strconv.Itoa(n), "idle")
|
ch <- c.cpu.mustNewConstMetric(float64(stat.Sys)/c.tickPerSecond, strconv.Itoa(n), "system")
|
||||||
ch <- c.cpu.mustNewConstMetric(float64(stat.Wait/c.tickPerSecond), strconv.Itoa(n), "wait")
|
ch <- c.cpu.mustNewConstMetric(float64(stat.Idle)/c.tickPerSecond, strconv.Itoa(n), "idle")
|
||||||
|
ch <- c.cpu.mustNewConstMetric(float64(stat.Wait)/c.tickPerSecond, strconv.Itoa(n), "wait")
|
||||||
|
|
||||||
|
// Physical CPU metrics
|
||||||
|
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PIdle)/c.purrTicksPerSecond, strconv.Itoa(n), "pidle")
|
||||||
|
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PUser)/c.purrTicksPerSecond, strconv.Itoa(n), "puser")
|
||||||
|
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PSys)/c.purrTicksPerSecond, strconv.Itoa(n), "psys")
|
||||||
|
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PWait)/c.purrTicksPerSecond, strconv.Itoa(n), "pwait")
|
||||||
|
|
||||||
|
// Run queue length
|
||||||
|
ch <- c.cpuRunQueue.mustNewConstMetric(float64(stat.RunQueue), strconv.Itoa(n))
|
||||||
|
|
||||||
|
// Flags
|
||||||
|
ch <- c.cpuFlags.mustNewConstMetric(float64(stat.SpurrFlag), strconv.Itoa(n), "spurr")
|
||||||
|
|
||||||
|
// Context switches
|
||||||
|
ch <- c.cpuContextSwitch.mustNewConstMetric(float64(stat.CSwitches), strconv.Itoa(n))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
@ -26,15 +27,17 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
"golang.org/x/exp/maps"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type cpuCollector struct {
|
type cpuCollector struct {
|
||||||
fs procfs.FS
|
procfs procfs.FS
|
||||||
|
sysfs sysfs.FS
|
||||||
cpu *prometheus.Desc
|
cpu *prometheus.Desc
|
||||||
cpuInfo *prometheus.Desc
|
cpuInfo *prometheus.Desc
|
||||||
cpuFrequencyHz *prometheus.Desc
|
cpuFrequencyHz *prometheus.Desc
|
||||||
|
@ -45,6 +48,7 @@ type cpuCollector struct {
|
||||||
cpuPackageThrottle *prometheus.Desc
|
cpuPackageThrottle *prometheus.Desc
|
||||||
cpuIsolated *prometheus.Desc
|
cpuIsolated *prometheus.Desc
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
|
cpuOnline *prometheus.Desc
|
||||||
cpuStats map[int64]procfs.CPUStat
|
cpuStats map[int64]procfs.CPUStat
|
||||||
cpuStatsMutex sync.Mutex
|
cpuStatsMutex sync.Mutex
|
||||||
isolatedCpus []uint16
|
isolatedCpus []uint16
|
||||||
|
@ -70,17 +74,17 @@ func init() {
|
||||||
|
|
||||||
// NewCPUCollector returns a new Collector exposing kernel/system statistics.
|
// NewCPUCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
pfs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sysfs, err := sysfs.NewFS(*sysPath)
|
sfs, err := sysfs.NewFS(*sysPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
isolcpus, err := sysfs.IsolatedCPUs()
|
isolcpus, err := sfs.IsolatedCPUs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !os.IsNotExist(err) {
|
if !os.IsNotExist(err) {
|
||||||
return nil, fmt.Errorf("Unable to get isolated cpus: %w", err)
|
return nil, fmt.Errorf("Unable to get isolated cpus: %w", err)
|
||||||
|
@ -89,7 +93,8 @@ func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
c := &cpuCollector{
|
c := &cpuCollector{
|
||||||
fs: fs,
|
procfs: pfs,
|
||||||
|
sysfs: sfs,
|
||||||
cpu: nodeCPUSecondsDesc,
|
cpu: nodeCPUSecondsDesc,
|
||||||
cpuInfo: prometheus.NewDesc(
|
cpuInfo: prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "info"),
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "info"),
|
||||||
|
@ -131,6 +136,11 @@ func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||||
"Whether each core is isolated, information from /sys/devices/system/cpu/isolated.",
|
"Whether each core is isolated, information from /sys/devices/system/cpu/isolated.",
|
||||||
[]string{"cpu"}, nil,
|
[]string{"cpu"}, nil,
|
||||||
),
|
),
|
||||||
|
cpuOnline: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "online"),
|
||||||
|
"CPUs that are online and being scheduled.",
|
||||||
|
[]string{"cpu"}, nil,
|
||||||
|
),
|
||||||
logger: logger,
|
logger: logger,
|
||||||
isolatedCpus: isolcpus,
|
isolatedCpus: isolcpus,
|
||||||
cpuStats: make(map[int64]procfs.CPUStat),
|
cpuStats: make(map[int64]procfs.CPUStat),
|
||||||
|
@ -177,12 +187,21 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if c.isolatedCpus != nil {
|
if c.isolatedCpus != nil {
|
||||||
c.updateIsolated(ch)
|
c.updateIsolated(ch)
|
||||||
}
|
}
|
||||||
return c.updateThermalThrottle(ch)
|
err := c.updateThermalThrottle(ch)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = c.updateOnline(ch)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateInfo reads /proc/cpuinfo
|
// updateInfo reads /proc/cpuinfo
|
||||||
func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error {
|
func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error {
|
||||||
info, err := c.fs.CPUInfo()
|
info, err := c.procfs.CPUInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -333,9 +352,31 @@ func (c *cpuCollector) updateIsolated(ch chan<- prometheus.Metric) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// updateOnline reads /sys/devices/system/cpu/cpu*/online through sysfs and exports online status metrics.
|
||||||
|
func (c *cpuCollector) updateOnline(ch chan<- prometheus.Metric) error {
|
||||||
|
cpus, err := c.sysfs.CPUs()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// No-op if the system does not support CPU online stats.
|
||||||
|
cpu0 := cpus[0]
|
||||||
|
if _, err := cpu0.Online(); err != nil && errors.Is(err, os.ErrNotExist) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
for _, cpu := range cpus {
|
||||||
|
setOnline := float64(0)
|
||||||
|
if online, _ := cpu.Online(); online {
|
||||||
|
setOnline = 1
|
||||||
|
}
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.cpuOnline, prometheus.GaugeValue, setOnline, cpu.Number())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// updateStat reads /proc/stat through procfs and exports CPU-related metrics.
|
// updateStat reads /proc/stat through procfs and exports CPU-related metrics.
|
||||||
func (c *cpuCollector) updateStat(ch chan<- prometheus.Metric) error {
|
func (c *cpuCollector) updateStat(ch chan<- prometheus.Metric) error {
|
||||||
stats, err := c.fs.Stat()
|
stats, err := c.procfs.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,15 @@ import (
|
||||||
"howett.net/plist"
|
"howett.net/plist"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
_IOC_OUT = uint(0x40000000)
|
||||||
|
_IOC_IN = uint(0x80000000)
|
||||||
|
_IOC_INOUT = (_IOC_IN | _IOC_OUT)
|
||||||
|
_IOCPARM_MASK = uint(0x1fff)
|
||||||
|
_IOCPARM_SHIFT = uint(16)
|
||||||
|
_IOCGROUP_SHIFT = uint(8)
|
||||||
|
)
|
||||||
|
|
||||||
type clockinfo struct {
|
type clockinfo struct {
|
||||||
hz int32 // clock frequency
|
hz int32 // clock frequency
|
||||||
tick int32 // micro-seconds per hz tick
|
tick int32 // micro-seconds per hz tick
|
||||||
|
@ -50,7 +59,7 @@ type cputime struct {
|
||||||
|
|
||||||
type plistref struct {
|
type plistref struct {
|
||||||
pref_plist unsafe.Pointer
|
pref_plist unsafe.Pointer
|
||||||
pref_len uint64
|
pref_len uint
|
||||||
}
|
}
|
||||||
|
|
||||||
type sysmonValues struct {
|
type sysmonValues struct {
|
||||||
|
@ -64,25 +73,19 @@ type sysmonProperty []sysmonValues
|
||||||
|
|
||||||
type sysmonProperties map[string]sysmonProperty
|
type sysmonProperties map[string]sysmonProperty
|
||||||
|
|
||||||
func readBytes(ptr unsafe.Pointer, length uint64) []byte {
|
func _IOC(inout uint, group byte, num uint, len uintptr) uint {
|
||||||
buf := make([]byte, length-1)
|
return ((inout) | ((uint(len) & _IOCPARM_MASK) << _IOCPARM_SHIFT) | (uint(group) << _IOCGROUP_SHIFT) | (num))
|
||||||
var i uint64
|
|
||||||
for ; i < length-1; i++ {
|
|
||||||
buf[i] = *(*byte)(unsafe.Pointer(uintptr(ptr) + uintptr(i)))
|
|
||||||
}
|
|
||||||
return buf
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ioctl(fd int, nr int64, typ byte, size uintptr, retptr unsafe.Pointer) error {
|
func _IOWR(group byte, num uint, len uintptr) uint {
|
||||||
|
return _IOC(_IOC_INOUT, group, num, len)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ioctl(fd int, nr uint, typ byte, size uintptr, retptr unsafe.Pointer) error {
|
||||||
_, _, errno := unix.Syscall(
|
_, _, errno := unix.Syscall(
|
||||||
unix.SYS_IOCTL,
|
unix.SYS_IOCTL,
|
||||||
uintptr(fd),
|
uintptr(fd),
|
||||||
// Some magicks derived from sys/ioccom.h.
|
uintptr(_IOWR(typ, nr, size)),
|
||||||
uintptr((0x40000000|0x80000000)|
|
|
||||||
((int64(size)&(1<<13-1))<<16)|
|
|
||||||
(int64(typ)<<8)|
|
|
||||||
nr,
|
|
||||||
),
|
|
||||||
uintptr(retptr),
|
uintptr(retptr),
|
||||||
)
|
)
|
||||||
if errno != 0 {
|
if errno != 0 {
|
||||||
|
@ -92,7 +95,7 @@ func ioctl(fd int, nr int64, typ byte, size uintptr, retptr unsafe.Pointer) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
func readSysmonProperties() (sysmonProperties, error) {
|
func readSysmonProperties() (sysmonProperties, error) {
|
||||||
fd, err := unix.Open(rootfsFilePath("/dev/sysmon"), unix.O_RDONLY, 0777)
|
fd, err := unix.Open(rootfsFilePath("/dev/sysmon"), unix.O_RDONLY, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -103,8 +106,8 @@ func readSysmonProperties() (sysmonProperties, error) {
|
||||||
if err = ioctl(fd, 0, 'E', unsafe.Sizeof(retptr), unsafe.Pointer(&retptr)); err != nil {
|
if err = ioctl(fd, 0, 'E', unsafe.Sizeof(retptr), unsafe.Pointer(&retptr)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer unix.Syscall(unix.SYS_MUNMAP, uintptr(retptr.pref_plist), uintptr(retptr.pref_len), uintptr(0))
|
||||||
bytes := readBytes(retptr.pref_plist, retptr.pref_len)
|
bytes := unsafe.Slice((*byte)(unsafe.Pointer(retptr.pref_plist)), retptr.pref_len-1)
|
||||||
|
|
||||||
var props sysmonProperties
|
var props sysmonProperties
|
||||||
if _, err = plist.Unmarshal(bytes, &props); err != nil {
|
if _, err = plist.Unmarshal(bytes, &props); err != nil {
|
||||||
|
@ -179,7 +182,7 @@ func getCPUTimes() ([]cputime, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ncpus := *(*int)(unsafe.Pointer(&ncpusb[0]))
|
ncpus := int(*(*uint32)(unsafe.Pointer(&ncpusb[0])))
|
||||||
|
|
||||||
if ncpus < 1 {
|
if ncpus < 1 {
|
||||||
return nil, errors.New("Invalid cpu number")
|
return nil, errors.New("Invalid cpu number")
|
||||||
|
@ -191,10 +194,10 @@ func getCPUTimes() ([]cputime, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for len(cpb) >= int(unsafe.Sizeof(int(0))) {
|
for len(cpb) >= int(unsafe.Sizeof(uint64(0))) {
|
||||||
t := *(*int)(unsafe.Pointer(&cpb[0]))
|
t := *(*uint64)(unsafe.Pointer(&cpb[0]))
|
||||||
times = append(times, float64(t)/cpufreq)
|
times = append(times, float64(t)/cpufreq)
|
||||||
cpb = cpb[unsafe.Sizeof(int(0)):]
|
cpb = cpb[unsafe.Sizeof(uint64(0)):]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
cpuVulerabilitiesCollector = "cpu_vulnerabilities"
|
cpuVulnerabilitiesCollectorSubsystem = "cpu_vulnerabilities"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
vulnerabilityDesc = prometheus.NewDesc(
|
vulnerabilityDesc = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, cpuVulerabilitiesCollector, "info"),
|
prometheus.BuildFQName(namespace, cpuVulnerabilitiesCollectorSubsystem, "info"),
|
||||||
"Details of each CPU vulnerability reported by sysfs. The value of the series is an int encoded state of the vulnerability. The same state is stored as a string in the label",
|
"Details of each CPU vulnerability reported by sysfs. The value of the series is an int encoded state of the vulnerability. The same state is stored as a string in the label",
|
||||||
[]string{"codename", "state", "mitigation"},
|
[]string{"codename", "state", "mitigation"},
|
||||||
nil,
|
nil,
|
||||||
|
@ -37,7 +37,7 @@ var (
|
||||||
type cpuVulnerabilitiesCollector struct{}
|
type cpuVulnerabilitiesCollector struct{}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector)
|
registerCollector(cpuVulnerabilitiesCollectorSubsystem, defaultDisabled, NewVulnerabilitySysfsCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewVulnerabilitySysfsCollector(logger *slog.Logger) (Collector, error) {
|
func NewVulnerabilitySysfsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
|
|
@ -18,10 +18,11 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"github.com/prometheus/procfs/sysfs"
|
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type cpuFreqCollector struct {
|
type cpuFreqCollector struct {
|
||||||
|
|
|
@ -30,11 +30,19 @@ type diskstatsCollector struct {
|
||||||
rbytes typedDesc
|
rbytes typedDesc
|
||||||
wbytes typedDesc
|
wbytes typedDesc
|
||||||
time typedDesc
|
time typedDesc
|
||||||
|
bsize typedDesc
|
||||||
|
qdepth typedDesc
|
||||||
|
|
||||||
|
rserv typedDesc
|
||||||
|
wserv typedDesc
|
||||||
|
|
||||||
|
xfers typedDesc
|
||||||
|
xrate typedDesc
|
||||||
|
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
|
|
||||||
tickPerSecond int64
|
tickPerSecond float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -57,6 +65,54 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
|
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
|
||||||
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
|
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
|
||||||
|
|
||||||
|
bsize: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "block_size_bytes"),
|
||||||
|
"Size of the block device in bytes.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
},
|
||||||
|
qdepth: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "queue_depth"),
|
||||||
|
"Number of requests in the queue.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
},
|
||||||
|
rserv: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "read_time_seconds_total"),
|
||||||
|
"The total time spent servicing read requests.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.CounterValue,
|
||||||
|
},
|
||||||
|
wserv: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "write_time_seconds_total"),
|
||||||
|
"The total time spent servicing write requests.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.CounterValue,
|
||||||
|
},
|
||||||
|
xfers: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "transfers_total"),
|
||||||
|
"The total number of transfers to/from disk.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.CounterValue,
|
||||||
|
},
|
||||||
|
xrate: typedDesc{
|
||||||
|
prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, diskSubsystem, "transfers_to_disk_total"),
|
||||||
|
"The total number of transfers from disk.",
|
||||||
|
diskLabelNames, nil,
|
||||||
|
),
|
||||||
|
prometheus.CounterValue,
|
||||||
|
},
|
||||||
deviceFilter: deviceFilter,
|
deviceFilter: deviceFilter,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
||||||
|
@ -76,7 +132,14 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
ch <- c.rbytes.mustNewConstMetric(float64(stat.Rblks*512), stat.Name)
|
ch <- c.rbytes.mustNewConstMetric(float64(stat.Rblks*512), stat.Name)
|
||||||
ch <- c.wbytes.mustNewConstMetric(float64(stat.Wblks*512), stat.Name)
|
ch <- c.wbytes.mustNewConstMetric(float64(stat.Wblks*512), stat.Name)
|
||||||
ch <- c.time.mustNewConstMetric(float64(stat.Time/c.tickPerSecond), stat.Name)
|
ch <- c.time.mustNewConstMetric(float64(stat.Time)/float64(c.tickPerSecond), stat.Name)
|
||||||
|
|
||||||
|
ch <- c.bsize.mustNewConstMetric(float64(stat.BSize), stat.Name)
|
||||||
|
ch <- c.qdepth.mustNewConstMetric(float64(stat.QDepth), stat.Name)
|
||||||
|
ch <- c.rserv.mustNewConstMetric(float64(stat.Rserv)/1e9, stat.Name)
|
||||||
|
ch <- c.wserv.mustNewConstMetric(float64(stat.Wserv)/1e9, stat.Name)
|
||||||
|
ch <- c.xfers.mustNewConstMetric(float64(stat.Xfers), stat.Name)
|
||||||
|
ch <- c.xrate.mustNewConstMetric(float64(stat.XRate), stat.Name)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
infoDesc: typedFactorDesc{
|
infoDesc: typedFactorDesc{
|
||||||
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"),
|
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"),
|
||||||
"Info of /sys/block/<block_device>.",
|
"Info of /sys/block/<block_device>.",
|
||||||
[]string{"device", "major", "minor", "path", "wwn", "model", "serial", "revision"},
|
[]string{"device", "major", "minor", "path", "wwn", "model", "serial", "revision", "rotational"},
|
||||||
nil,
|
nil,
|
||||||
), valueType: prometheus.GaugeValue,
|
), valueType: prometheus.GaugeValue,
|
||||||
},
|
},
|
||||||
|
@ -294,6 +294,12 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
serial = info[udevIDSerialShort]
|
serial = info[udevIDSerialShort]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
queueStats, err := c.fs.SysBlockDeviceQueueStats(dev)
|
||||||
|
// Block Device Queue stats may not exist for all devices.
|
||||||
|
if err != nil && !os.IsNotExist(err) {
|
||||||
|
c.logger.Debug("Failed to get block device queue stats", "device", dev, "err", err)
|
||||||
|
}
|
||||||
|
|
||||||
ch <- c.infoDesc.mustNewConstMetric(1.0, dev,
|
ch <- c.infoDesc.mustNewConstMetric(1.0, dev,
|
||||||
fmt.Sprint(stats.MajorNumber),
|
fmt.Sprint(stats.MajorNumber),
|
||||||
fmt.Sprint(stats.MinorNumber),
|
fmt.Sprint(stats.MinorNumber),
|
||||||
|
@ -302,6 +308,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
info[udevIDModel],
|
info[udevIDModel],
|
||||||
serial,
|
serial,
|
||||||
info[udevIDRevision],
|
info[udevIDRevision],
|
||||||
|
strconv.FormatUint(queueStats.Rotational, 2),
|
||||||
)
|
)
|
||||||
|
|
||||||
statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName
|
statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName
|
||||||
|
@ -391,15 +398,9 @@ func getUdevDeviceProperties(major, minor uint32) (udevInfo, error) {
|
||||||
|
|
||||||
line = strings.TrimPrefix(line, udevDevicePropertyPrefix)
|
line = strings.TrimPrefix(line, udevDevicePropertyPrefix)
|
||||||
|
|
||||||
/* TODO: After we drop support for Go 1.17, the condition below can be simplified to:
|
|
||||||
|
|
||||||
if name, value, found := strings.Cut(line, "="); found {
|
if name, value, found := strings.Cut(line, "="); found {
|
||||||
info[name] = value
|
info[name] = value
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
if fields := strings.SplitN(line, "=", 2); len(fields) == 2 {
|
|
||||||
info[fields[0]] = fields[1]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info, nil
|
return info, nil
|
||||||
|
|
|
@ -113,21 +113,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
||||||
node_disk_flush_requests_total{device="sdc"} 1555
|
node_disk_flush_requests_total{device="sdc"} 1555
|
||||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||||
# TYPE node_disk_info gauge
|
# TYPE node_disk_info gauge
|
||||||
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",rotational="0",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
||||||
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",rotational="1",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
||||||
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",rotational="0",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
||||||
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",rotational="0",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
||||||
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",serial="AAAABBBBCCCC1",wwn=""} 1
|
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",rotational="0",serial="AAAABBBBCCCC1",wwn=""} 1
|
||||||
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",serial="",wwn=""} 1
|
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
# HELP node_disk_io_now The number of I/Os currently in progress.
|
# HELP node_disk_io_now The number of I/Os currently in progress.
|
||||||
# TYPE node_disk_io_now gauge
|
# TYPE node_disk_io_now gauge
|
||||||
node_disk_io_now{device="dm-0"} 0
|
node_disk_io_now{device="dm-0"} 0
|
||||||
|
|
|
@ -372,7 +372,7 @@ func (c *ethtoolCollector) updateSpeeds(ch chan<- prometheus.Metric, prefix stri
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
netClass, err := c.fs.NetClass()
|
netClass, err := c.fs.NetClassDevices()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) {
|
if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) {
|
||||||
c.logger.Debug("Could not read netclass file", "err", err)
|
c.logger.Debug("Could not read netclass file", "err", err)
|
||||||
|
@ -385,7 +385,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
return fmt.Errorf("no network devices found")
|
return fmt.Errorf("no network devices found")
|
||||||
}
|
}
|
||||||
|
|
||||||
for device := range netClass {
|
for _, device := range netClass {
|
||||||
var stats map[string]uint64
|
var stats map[string]uint64
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -446,13 +446,14 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if stats == nil || len(stats) < 1 {
|
if len(stats) == 0 {
|
||||||
// No stats returned; device does not support ethtool stats.
|
// No stats returned; device does not support ethtool stats.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanitizing the metric names can lead to duplicate metric names. Therefore check for clashes beforehand.
|
// Sanitizing the metric names can lead to duplicate metric names. Therefore check for clashes beforehand.
|
||||||
metricFQNames := make(map[string]string)
|
metricFQNames := make(map[string]string)
|
||||||
|
renamedStats := make(map[string]uint64, len(stats))
|
||||||
for metric := range stats {
|
for metric := range stats {
|
||||||
metricName := SanitizeMetricName(metric)
|
metricName := SanitizeMetricName(metric)
|
||||||
if !c.metricsPattern.MatchString(metricName) {
|
if !c.metricsPattern.MatchString(metricName) {
|
||||||
|
@ -467,6 +468,8 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
metricFQNames[metricFQName] = ""
|
metricFQNames[metricFQName] = ""
|
||||||
} else {
|
} else {
|
||||||
metricFQNames[metricFQName] = metricName
|
metricFQNames[metricFQName] = metricName
|
||||||
|
// Later we'll go look for the stat with the "sanitized" metric name, so we can copy it there already
|
||||||
|
renamedStats[metricName] = stats[metric]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,7 +487,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
val := stats[metric]
|
val := renamedStats[metric]
|
||||||
|
|
||||||
// Check to see if this metric exists; if not then create it and store it in c.entries.
|
// Check to see if this metric exists; if not then create it and store it in c.entries.
|
||||||
entry := c.entryWithCreate(metric, metricFQName)
|
entry := c.entryWithCreate(metric, metricFQName)
|
||||||
|
|
|
@ -269,6 +269,7 @@ func NewEthtoolTestCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
|
||||||
func TestBuildEthtoolFQName(t *testing.T) {
|
func TestBuildEthtoolFQName(t *testing.T) {
|
||||||
testcases := map[string]string{
|
testcases := map[string]string{
|
||||||
|
"port.rx_errors": "node_ethtool_port_received_errors",
|
||||||
"rx_errors": "node_ethtool_received_errors",
|
"rx_errors": "node_ethtool_received_errors",
|
||||||
"Queue[0] AllocFails": "node_ethtool_queue_0_allocfails",
|
"Queue[0] AllocFails": "node_ethtool_queue_0_allocfails",
|
||||||
"Tx LPI entry count": "node_ethtool_transmitted_lpi_entry_count",
|
"Tx LPI entry count": "node_ethtool_transmitted_lpi_entry_count",
|
||||||
|
@ -292,6 +293,9 @@ node_ethtool_align_errors{device="eth0"} 0
|
||||||
# HELP node_ethtool_info A metric with a constant '1' value labeled by bus_info, device, driver, expansion_rom_version, firmware_version, version.
|
# HELP node_ethtool_info A metric with a constant '1' value labeled by bus_info, device, driver, expansion_rom_version, firmware_version, version.
|
||||||
# TYPE node_ethtool_info gauge
|
# TYPE node_ethtool_info gauge
|
||||||
node_ethtool_info{bus_info="0000:00:1f.6",device="eth0",driver="e1000e",expansion_rom_version="",firmware_version="0.5-4",version="5.11.0-22-generic"} 1
|
node_ethtool_info{bus_info="0000:00:1f.6",device="eth0",driver="e1000e",expansion_rom_version="",firmware_version="0.5-4",version="5.11.0-22-generic"} 1
|
||||||
|
# HELP node_ethtool_port_received_dropped Network interface port_rx_dropped
|
||||||
|
# TYPE node_ethtool_port_received_dropped untyped
|
||||||
|
node_ethtool_port_received_dropped{device="eth0"} 12028
|
||||||
# HELP node_ethtool_received_broadcast Network interface rx_broadcast
|
# HELP node_ethtool_received_broadcast Network interface rx_broadcast
|
||||||
# TYPE node_ethtool_received_broadcast untyped
|
# TYPE node_ethtool_received_broadcast untyped
|
||||||
node_ethtool_received_broadcast{device="eth0"} 5792
|
node_ethtool_received_broadcast{device="eth0"} 5792
|
||||||
|
|
|
@ -32,12 +32,12 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, stat := range fsStat {
|
for _, stat := range fsStat {
|
||||||
if c.excludedMountPointsPattern.MatchString(stat.MountPoint) {
|
if c.mountPointFilter.ignored(stat.MountPoint) {
|
||||||
c.logger.Debug("Ignoring mount point", "mountpoint", stat.MountPoint)
|
c.logger.Debug("Ignoring mount point", "mountpoint", stat.MountPoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fstype := stat.TypeString()
|
fstype := stat.TypeString()
|
||||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -53,9 +53,9 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
mountPoint: stat.MountPoint,
|
mountPoint: stat.MountPoint,
|
||||||
fsType: fstype,
|
fsType: fstype,
|
||||||
},
|
},
|
||||||
size: float64(stat.TotalBlocks / 512.0),
|
size: float64(stat.TotalBlocks * 512.0),
|
||||||
free: float64(stat.FreeBlocks / 512.0),
|
free: float64(stat.FreeBlocks * 512.0),
|
||||||
avail: float64(stat.FreeBlocks / 512.0), // AIX doesn't distinguish between free and available blocks.
|
avail: float64(stat.FreeBlocks * 512.0), // AIX doesn't distinguish between free and available blocks.
|
||||||
files: float64(stat.TotalInodes),
|
files: float64(stat.TotalInodes),
|
||||||
filesFree: float64(stat.FreeInodes),
|
filesFree: float64(stat.FreeInodes),
|
||||||
ro: ro,
|
ro: ro,
|
||||||
|
|
|
@ -11,9 +11,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
//go:build (darwin || dragonfly) && !nofilesystem
|
//go:build dragonfly && !nofilesystem
|
||||||
// +build darwin dragonfly
|
// +build dragonfly,!nofilesystem
|
||||||
// +build !nofilesystem
|
|
||||||
|
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
|
@ -48,14 +47,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
stats = []filesystemStats{}
|
stats = []filesystemStats{}
|
||||||
for i := 0; i < int(count); i++ {
|
for i := 0; i < int(count); i++ {
|
||||||
mountpoint := C.GoString(&mnt[i].f_mntonname[0])
|
mountpoint := C.GoString(&mnt[i].f_mntonname[0])
|
||||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
device := C.GoString(&mnt[i].f_mntfromname[0])
|
device := C.GoString(&mnt[i].f_mntfromname[0])
|
||||||
fstype := C.GoString(&mnt[i].f_fstypename[0])
|
fstype := C.GoString(&mnt[i].f_fstypename[0])
|
||||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"regexp"
|
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -36,7 +36,7 @@ var (
|
||||||
mountPointsExcludeSet bool
|
mountPointsExcludeSet bool
|
||||||
mountPointsExclude = kingpin.Flag(
|
mountPointsExclude = kingpin.Flag(
|
||||||
"collector.filesystem.mount-points-exclude",
|
"collector.filesystem.mount-points-exclude",
|
||||||
"Regexp of mount points to exclude for filesystem collector.",
|
"Regexp of mount points to exclude for filesystem collector. (mutually exclusive to mount-points-include)",
|
||||||
).Default(defMountPointsExcluded).PreAction(func(c *kingpin.ParseContext) error {
|
).Default(defMountPointsExcluded).PreAction(func(c *kingpin.ParseContext) error {
|
||||||
mountPointsExcludeSet = true
|
mountPointsExcludeSet = true
|
||||||
return nil
|
return nil
|
||||||
|
@ -45,11 +45,15 @@ var (
|
||||||
"collector.filesystem.ignored-mount-points",
|
"collector.filesystem.ignored-mount-points",
|
||||||
"Regexp of mount points to ignore for filesystem collector.",
|
"Regexp of mount points to ignore for filesystem collector.",
|
||||||
).Hidden().String()
|
).Hidden().String()
|
||||||
|
mountPointsInclude = kingpin.Flag(
|
||||||
|
"collector.filesystem.mount-points-include",
|
||||||
|
"Regexp of mount points to include for filesystem collector. (mutually exclusive to mount-points-exclude)",
|
||||||
|
).String()
|
||||||
|
|
||||||
fsTypesExcludeSet bool
|
fsTypesExcludeSet bool
|
||||||
fsTypesExclude = kingpin.Flag(
|
fsTypesExclude = kingpin.Flag(
|
||||||
"collector.filesystem.fs-types-exclude",
|
"collector.filesystem.fs-types-exclude",
|
||||||
"Regexp of filesystem types to exclude for filesystem collector.",
|
"Regexp of filesystem types to exclude for filesystem collector. (mutually exclusive to fs-types-include)",
|
||||||
).Default(defFSTypesExcluded).PreAction(func(c *kingpin.ParseContext) error {
|
).Default(defFSTypesExcluded).PreAction(func(c *kingpin.ParseContext) error {
|
||||||
fsTypesExcludeSet = true
|
fsTypesExcludeSet = true
|
||||||
return nil
|
return nil
|
||||||
|
@ -58,15 +62,20 @@ var (
|
||||||
"collector.filesystem.ignored-fs-types",
|
"collector.filesystem.ignored-fs-types",
|
||||||
"Regexp of filesystem types to ignore for filesystem collector.",
|
"Regexp of filesystem types to ignore for filesystem collector.",
|
||||||
).Hidden().String()
|
).Hidden().String()
|
||||||
|
fsTypesInclude = kingpin.Flag(
|
||||||
|
"collector.filesystem.fs-types-include",
|
||||||
|
"Regexp of filesystem types to exclude for filesystem collector. (mutually exclusive to fs-types-exclude)",
|
||||||
|
).String()
|
||||||
|
|
||||||
filesystemLabelNames = []string{"device", "mountpoint", "fstype", "device_error"}
|
filesystemLabelNames = []string{"device", "mountpoint", "fstype", "device_error"}
|
||||||
)
|
)
|
||||||
|
|
||||||
type filesystemCollector struct {
|
type filesystemCollector struct {
|
||||||
excludedMountPointsPattern *regexp.Regexp
|
mountPointFilter deviceFilter
|
||||||
excludedFSTypesPattern *regexp.Regexp
|
fsTypeFilter deviceFilter
|
||||||
sizeDesc, freeDesc, availDesc *prometheus.Desc
|
sizeDesc, freeDesc, availDesc *prometheus.Desc
|
||||||
filesDesc, filesFreeDesc *prometheus.Desc
|
filesDesc, filesFreeDesc *prometheus.Desc
|
||||||
|
purgeableDesc *prometheus.Desc
|
||||||
roDesc, deviceErrorDesc *prometheus.Desc
|
roDesc, deviceErrorDesc *prometheus.Desc
|
||||||
mountInfoDesc *prometheus.Desc
|
mountInfoDesc *prometheus.Desc
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
|
@ -80,6 +89,7 @@ type filesystemStats struct {
|
||||||
labels filesystemLabels
|
labels filesystemLabels
|
||||||
size, free, avail float64
|
size, free, avail float64
|
||||||
files, filesFree float64
|
files, filesFree float64
|
||||||
|
purgeable float64
|
||||||
ro, deviceError float64
|
ro, deviceError float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,29 +99,7 @@ func init() {
|
||||||
|
|
||||||
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
|
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
|
||||||
func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
||||||
if *oldMountPointsExcluded != "" {
|
const subsystem = "filesystem"
|
||||||
if !mountPointsExcludeSet {
|
|
||||||
logger.Warn("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude")
|
|
||||||
*mountPointsExclude = *oldMountPointsExcluded
|
|
||||||
} else {
|
|
||||||
return nil, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if *oldFSTypesExcluded != "" {
|
|
||||||
if !fsTypesExcludeSet {
|
|
||||||
logger.Warn("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude")
|
|
||||||
*fsTypesExclude = *oldFSTypesExcluded
|
|
||||||
} else {
|
|
||||||
return nil, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
subsystem := "filesystem"
|
|
||||||
logger.Info("Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
|
|
||||||
mountPointPattern := regexp.MustCompile(*mountPointsExclude)
|
|
||||||
logger.Info("Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude)
|
|
||||||
filesystemsTypesPattern := regexp.MustCompile(*fsTypesExclude)
|
|
||||||
|
|
||||||
sizeDesc := prometheus.NewDesc(
|
sizeDesc := prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, subsystem, "size_bytes"),
|
prometheus.BuildFQName(namespace, subsystem, "size_bytes"),
|
||||||
|
@ -143,6 +131,12 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
||||||
filesystemLabelNames, nil,
|
filesystemLabelNames, nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
purgeableDesc := prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, subsystem, "purgeable_bytes"),
|
||||||
|
"Filesystem space available including purgeable space (MacOS specific).",
|
||||||
|
filesystemLabelNames, nil,
|
||||||
|
)
|
||||||
|
|
||||||
roDesc := prometheus.NewDesc(
|
roDesc := prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, subsystem, "readonly"),
|
prometheus.BuildFQName(namespace, subsystem, "readonly"),
|
||||||
"Filesystem read-only status.",
|
"Filesystem read-only status.",
|
||||||
|
@ -162,14 +156,25 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mountPointFilter, err := newMountPointsFilter(logger)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to parse mount points filter flags: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fsTypeFilter, err := newFSTypeFilter(logger)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to parse fs types filter flags: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return &filesystemCollector{
|
return &filesystemCollector{
|
||||||
excludedMountPointsPattern: mountPointPattern,
|
mountPointFilter: mountPointFilter,
|
||||||
excludedFSTypesPattern: filesystemsTypesPattern,
|
fsTypeFilter: fsTypeFilter,
|
||||||
sizeDesc: sizeDesc,
|
sizeDesc: sizeDesc,
|
||||||
freeDesc: freeDesc,
|
freeDesc: freeDesc,
|
||||||
availDesc: availDesc,
|
availDesc: availDesc,
|
||||||
filesDesc: filesDesc,
|
filesDesc: filesDesc,
|
||||||
filesFreeDesc: filesFreeDesc,
|
filesFreeDesc: filesFreeDesc,
|
||||||
|
purgeableDesc: purgeableDesc,
|
||||||
roDesc: roDesc,
|
roDesc: roDesc,
|
||||||
deviceErrorDesc: deviceErrorDesc,
|
deviceErrorDesc: deviceErrorDesc,
|
||||||
mountInfoDesc: mountInfoDesc,
|
mountInfoDesc: mountInfoDesc,
|
||||||
|
@ -227,6 +232,70 @@ func (c *filesystemCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
c.mountInfoDesc, prometheus.GaugeValue,
|
c.mountInfoDesc, prometheus.GaugeValue,
|
||||||
1.0, s.labels.device, s.labels.major, s.labels.minor, s.labels.mountPoint,
|
1.0, s.labels.device, s.labels.major, s.labels.minor, s.labels.mountPoint,
|
||||||
)
|
)
|
||||||
|
if s.purgeable >= 0 {
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
c.purgeableDesc, prometheus.GaugeValue,
|
||||||
|
s.purgeable, s.labels.device, s.labels.mountPoint, s.labels.fsType, s.labels.deviceError,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newMountPointsFilter(logger *slog.Logger) (deviceFilter, error) {
|
||||||
|
if *oldMountPointsExcluded != "" {
|
||||||
|
if !mountPointsExcludeSet {
|
||||||
|
logger.Warn("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude")
|
||||||
|
*mountPointsExclude = *oldMountPointsExcluded
|
||||||
|
} else {
|
||||||
|
return deviceFilter{}, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if *mountPointsInclude != "" && !mountPointsExcludeSet {
|
||||||
|
logger.Debug("mount-points-exclude flag not set when mount-points-include flag is set, assuming include is desired")
|
||||||
|
*mountPointsExclude = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if *mountPointsExclude != "" && *mountPointsInclude != "" {
|
||||||
|
return deviceFilter{}, errors.New("--collector.filesystem.mount-points-exclude and --collector.filesystem.mount-points-include are mutually exclusive")
|
||||||
|
}
|
||||||
|
|
||||||
|
if *mountPointsExclude != "" {
|
||||||
|
logger.Info("Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
|
||||||
|
}
|
||||||
|
if *mountPointsInclude != "" {
|
||||||
|
logger.Info("Parsed flag --collector.filesystem.mount-points-include", "flag", *mountPointsInclude)
|
||||||
|
}
|
||||||
|
|
||||||
|
return newDeviceFilter(*mountPointsExclude, *mountPointsInclude), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newFSTypeFilter(logger *slog.Logger) (deviceFilter, error) {
|
||||||
|
if *oldFSTypesExcluded != "" {
|
||||||
|
if !fsTypesExcludeSet {
|
||||||
|
logger.Warn("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude")
|
||||||
|
*fsTypesExclude = *oldFSTypesExcluded
|
||||||
|
} else {
|
||||||
|
return deviceFilter{}, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if *fsTypesInclude != "" && !fsTypesExcludeSet {
|
||||||
|
logger.Debug("fs-types-exclude flag not set when fs-types-include flag is set, assuming include is desired")
|
||||||
|
*fsTypesExclude = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if *fsTypesExclude != "" && *fsTypesInclude != "" {
|
||||||
|
return deviceFilter{}, errors.New("--collector.filesystem.fs-types-exclude and --collector.filesystem.fs-types-include are mutually exclusive")
|
||||||
|
}
|
||||||
|
|
||||||
|
if *fsTypesExclude != "" {
|
||||||
|
logger.Info("Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude)
|
||||||
|
}
|
||||||
|
if *fsTypesInclude != "" {
|
||||||
|
logger.Info("Parsed flag --collector.filesystem.fs-types-include", "flag", *fsTypesInclude)
|
||||||
|
}
|
||||||
|
|
||||||
|
return newDeviceFilter(*fsTypesExclude, *fsTypesInclude), nil
|
||||||
|
}
|
||||||
|
|
|
@ -39,14 +39,14 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
|
||||||
stats := []filesystemStats{}
|
stats := []filesystemStats{}
|
||||||
for _, fs := range buf {
|
for _, fs := range buf {
|
||||||
mountpoint := unix.ByteSliceToString(fs.Mntonname[:])
|
mountpoint := unix.ByteSliceToString(fs.Mntonname[:])
|
||||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
device := unix.ByteSliceToString(fs.Mntfromname[:])
|
device := unix.ByteSliceToString(fs.Mntfromname[:])
|
||||||
fstype := unix.ByteSliceToString(fs.Fstypename[:])
|
fstype := unix.ByteSliceToString(fs.Fstypename[:])
|
||||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,12 +73,12 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for _, labels := range mps {
|
for _, labels := range mps {
|
||||||
if c.excludedMountPointsPattern.MatchString(labels.mountPoint) {
|
if c.mountPointFilter.ignored(labels.mountPoint) {
|
||||||
c.logger.Debug("Ignoring mount point", "mountpoint", labels.mountPoint)
|
c.logger.Debug("Ignoring mount point", "mountpoint", labels.mountPoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if c.excludedFSTypesPattern.MatchString(labels.fsType) {
|
if c.fsTypeFilter.ignored(labels.fsType) {
|
||||||
c.logger.Debug("Ignoring fs", "type", labels.fsType)
|
c.logger.Debug("Ignoring fs type", "type", labels.fsType)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
114
collector/filesystem_macos.go
Normal file
114
collector/filesystem_macos.go
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
// Copyright 2015 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build darwin && !nofilesystem
|
||||||
|
// +build darwin,!nofilesystem
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo CFLAGS: -x objective-c
|
||||||
|
#cgo LDFLAGS: -framework Foundation
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
Float64 purgeable(char *path) {
|
||||||
|
Float64 value = -1.0f;
|
||||||
|
|
||||||
|
@autoreleasepool {
|
||||||
|
NSError *error = nil;
|
||||||
|
NSString *str = [NSString stringWithUTF8String:path];
|
||||||
|
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:str];
|
||||||
|
|
||||||
|
NSDictionary *results = [fileURL resourceValuesForKeys:@[NSURLVolumeAvailableCapacityForImportantUsageKey] error:&error];
|
||||||
|
if (results) {
|
||||||
|
CFNumberRef tmp = CFDictionaryGetValue((CFDictionaryRef)results, NSURLVolumeAvailableCapacityForImportantUsageKey);
|
||||||
|
if (tmp != NULL) {
|
||||||
|
CFNumberGetValue(tmp, kCFNumberFloat64Type, &value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[fileURL release];
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/ucred.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
const (
|
||||||
|
defMountPointsExcluded = "^/(dev)($|/)"
|
||||||
|
defFSTypesExcluded = "^devfs$"
|
||||||
|
readOnly = 0x1 // MNT_RDONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expose filesystem fullness.
|
||||||
|
func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
|
var mntbuf *C.struct_statfs
|
||||||
|
count := C.getmntinfo(&mntbuf, C.MNT_NOWAIT)
|
||||||
|
if count == 0 {
|
||||||
|
return nil, errors.New("getmntinfo() failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
mnt := (*[1 << 20]C.struct_statfs)(unsafe.Pointer(mntbuf))
|
||||||
|
stats = []filesystemStats{}
|
||||||
|
for i := 0; i < int(count); i++ {
|
||||||
|
mountpoint := C.GoString(&mnt[i].f_mntonname[0])
|
||||||
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
|
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
device := C.GoString(&mnt[i].f_mntfromname[0])
|
||||||
|
fstype := C.GoString(&mnt[i].f_fstypename[0])
|
||||||
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var ro float64
|
||||||
|
if (mnt[i].f_flags & readOnly) != 0 {
|
||||||
|
ro = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
mountpointCString := C.CString(mountpoint)
|
||||||
|
defer C.free(unsafe.Pointer(mountpointCString))
|
||||||
|
|
||||||
|
stats = append(stats, filesystemStats{
|
||||||
|
labels: filesystemLabels{
|
||||||
|
device: device,
|
||||||
|
mountPoint: rootfsStripPrefix(mountpoint),
|
||||||
|
fsType: fstype,
|
||||||
|
},
|
||||||
|
size: float64(mnt[i].f_blocks) * float64(mnt[i].f_bsize),
|
||||||
|
free: float64(mnt[i].f_bfree) * float64(mnt[i].f_bsize),
|
||||||
|
avail: float64(mnt[i].f_bavail) * float64(mnt[i].f_bsize),
|
||||||
|
files: float64(mnt[i].f_files),
|
||||||
|
filesFree: float64(mnt[i].f_ffree),
|
||||||
|
purgeable: float64(C.purgeable(mountpointCString)),
|
||||||
|
ro: ro,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return stats, nil
|
||||||
|
}
|
|
@ -97,14 +97,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
stats = []filesystemStats{}
|
stats = []filesystemStats{}
|
||||||
for _, v := range mnt {
|
for _, v := range mnt {
|
||||||
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
||||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
c.logger.Debug("msg", "Ignoring mount point", "mountpoint", mountpoint)
|
c.logger.Debug("msg", "Ignoring mount point", "mountpoint", mountpoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
||||||
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
||||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
c.logger.Debug("msg", "Ignoring fs type", "type", fstype)
|
c.logger.Debug("msg", "Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,14 +41,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
stats = []filesystemStats{}
|
stats = []filesystemStats{}
|
||||||
for _, v := range mnt {
|
for _, v := range mnt {
|
||||||
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
||||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
||||||
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
||||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
# TYPE go_gc_duration_seconds summary
|
# TYPE go_gc_duration_seconds summary
|
||||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
# TYPE go_gc_gogc_percent gauge
|
# TYPE go_gc_gogc_percent gauge
|
||||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
# TYPE go_gc_gomemlimit_bytes gauge
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
# HELP go_goroutines Number of goroutines that currently exist.
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
# TYPE go_goroutines gauge
|
# TYPE go_goroutines gauge
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
# TYPE go_memstats_stack_sys_bytes gauge
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
# TYPE go_memstats_sys_bytes gauge
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
# 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. Sourced from /sched/gomaxprocs:threads
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
# TYPE go_sched_gomaxprocs_threads gauge
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
# HELP go_threads Number of OS threads created.
|
# HELP go_threads Number of OS threads created.
|
||||||
# TYPE go_threads gauge
|
# TYPE go_threads gauge
|
||||||
|
@ -488,21 +488,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
||||||
node_disk_flush_requests_total{device="sdc"} 1555
|
node_disk_flush_requests_total{device="sdc"} 1555
|
||||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||||
# TYPE node_disk_info gauge
|
# TYPE node_disk_info gauge
|
||||||
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",rotational="0",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
||||||
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",rotational="1",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
||||||
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",rotational="0",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
||||||
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",rotational="0",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
||||||
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",serial="AAAABBBBCCCC1",wwn=""} 1
|
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",rotational="0",serial="AAAABBBBCCCC1",wwn=""} 1
|
||||||
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",serial="",wwn=""} 1
|
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
# HELP node_disk_io_now The number of I/Os currently in progress.
|
# HELP node_disk_io_now The number of I/Os currently in progress.
|
||||||
# TYPE node_disk_io_now gauge
|
# TYPE node_disk_io_now gauge
|
||||||
node_disk_io_now{device="dm-0"} 0
|
node_disk_io_now{device="dm-0"} 0
|
||||||
|
@ -871,6 +871,10 @@ node_hwmon_fan_target_rpm{chip="nct6779",sensor="fan2"} 27000
|
||||||
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
||||||
# TYPE node_hwmon_fan_tolerance gauge
|
# TYPE node_hwmon_fan_tolerance gauge
|
||||||
node_hwmon_fan_tolerance{chip="nct6779",sensor="fan2"} 0
|
node_hwmon_fan_tolerance{chip="nct6779",sensor="fan2"} 0
|
||||||
|
# HELP node_hwmon_freq_freq_mhz Hardware monitor for GPU frequency in MHz
|
||||||
|
# TYPE node_hwmon_freq_freq_mhz gauge
|
||||||
|
node_hwmon_freq_freq_mhz{chip="hwmon4",sensor="mclk"} 300
|
||||||
|
node_hwmon_freq_freq_mhz{chip="hwmon4",sensor="sclk"} 214
|
||||||
# HELP node_hwmon_in_alarm Hardware sensor alarm status (in)
|
# HELP node_hwmon_in_alarm Hardware sensor alarm status (in)
|
||||||
# TYPE node_hwmon_in_alarm gauge
|
# TYPE node_hwmon_in_alarm gauge
|
||||||
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
||||||
|
@ -984,8 +988,10 @@ node_hwmon_pwm_weight_temp_step_tol{chip="nct6779",sensor="pwm1"} 0
|
||||||
# TYPE node_hwmon_sensor_label gauge
|
# TYPE node_hwmon_sensor_label gauge
|
||||||
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp1"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp1"} 1
|
||||||
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp2"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Left side ",sensor="fan1"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="mclk",sensor="freq2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Right side ",sensor="fan2"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="sclk",sensor="freq1"} 1
|
||||||
|
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Left side",sensor="fan1"} 1
|
||||||
|
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Right side",sensor="fan2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 0",sensor="temp2"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 0",sensor="temp2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 1",sensor="temp3"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 1",sensor="temp3"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
||||||
|
@ -1579,6 +1585,14 @@ node_md_blocks_synced{device="md6"} 1.6775552e+07
|
||||||
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||||
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||||
node_md_blocks_synced{device="md9"} 0
|
node_md_blocks_synced{device="md9"} 0
|
||||||
|
# HELP node_md_degraded Number of degraded disks on device.
|
||||||
|
# TYPE node_md_degraded gauge
|
||||||
|
node_md_degraded{device="md0"} 0
|
||||||
|
node_md_degraded{device="md1"} 0
|
||||||
|
node_md_degraded{device="md10"} 0
|
||||||
|
node_md_degraded{device="md4"} 0
|
||||||
|
node_md_degraded{device="md5"} 1
|
||||||
|
node_md_degraded{device="md6"} 1
|
||||||
# HELP node_md_disks Number of active/failed/spare disks of device.
|
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||||
# TYPE node_md_disks gauge
|
# TYPE node_md_disks gauge
|
||||||
node_md_disks{device="md0",state="active"} 2
|
node_md_disks{device="md0",state="active"} 2
|
||||||
|
@ -1651,6 +1665,14 @@ node_md_disks_required{device="md6"} 2
|
||||||
node_md_disks_required{device="md7"} 4
|
node_md_disks_required{device="md7"} 4
|
||||||
node_md_disks_required{device="md8"} 2
|
node_md_disks_required{device="md8"} 2
|
||||||
node_md_disks_required{device="md9"} 4
|
node_md_disks_required{device="md9"} 4
|
||||||
|
# HELP node_md_raid_disks Number of raid disks on device.
|
||||||
|
# TYPE node_md_raid_disks gauge
|
||||||
|
node_md_raid_disks{device="md0"} 2
|
||||||
|
node_md_raid_disks{device="md1"} 2
|
||||||
|
node_md_raid_disks{device="md10"} 4
|
||||||
|
node_md_raid_disks{device="md4"} 3
|
||||||
|
node_md_raid_disks{device="md5"} 3
|
||||||
|
node_md_raid_disks{device="md6"} 4
|
||||||
# HELP node_md_state Indicates the state of md-device.
|
# HELP node_md_state Indicates the state of md-device.
|
||||||
# TYPE node_md_state gauge
|
# TYPE node_md_state gauge
|
||||||
node_md_state{device="md0",state="active"} 1
|
node_md_state{device="md0",state="active"} 1
|
||||||
|
@ -4315,108 +4337,139 @@ node_zfs_zil_zil_itx_needcopy_count 0
|
||||||
# TYPE node_zfs_zpool_dataset_nread untyped
|
# TYPE node_zfs_zpool_dataset_nread untyped
|
||||||
node_zfs_zpool_dataset_nread{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nread{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nread{dataset="pool1/dataset1",zpool="pool1"} 28
|
node_zfs_zpool_dataset_nread{dataset="pool1/dataset1",zpool="pool1"} 28
|
||||||
|
node_zfs_zpool_dataset_nread{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nread{dataset="pool3/dataset with space",zpool="pool3"} 28
|
||||||
node_zfs_zpool_dataset_nread{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nread{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nread{dataset="poolz1/dataset1",zpool="poolz1"} 28
|
node_zfs_zpool_dataset_nread{dataset="poolz1/dataset1",zpool="poolz1"} 28
|
||||||
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
||||||
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nunlinked{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="pool1/dataset1",zpool="pool1"} 3
|
node_zfs_zpool_dataset_nunlinked{dataset="pool1/dataset1",zpool="pool1"} 3
|
||||||
|
node_zfs_zpool_dataset_nunlinked{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nunlinked{dataset="pool3/dataset with space",zpool="pool3"} 3
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nunlinked{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
node_zfs_zpool_dataset_nunlinked{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
||||||
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
||||||
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nunlinks{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="pool1/dataset1",zpool="pool1"} 3
|
node_zfs_zpool_dataset_nunlinks{dataset="pool1/dataset1",zpool="pool1"} 3
|
||||||
|
node_zfs_zpool_dataset_nunlinks{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nunlinks{dataset="pool3/dataset with space",zpool="pool3"} 3
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nunlinks{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
node_zfs_zpool_dataset_nunlinks{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
||||||
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
||||||
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nwritten{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="pool1/dataset1",zpool="pool1"} 12302
|
node_zfs_zpool_dataset_nwritten{dataset="pool1/dataset1",zpool="pool1"} 12302
|
||||||
|
node_zfs_zpool_dataset_nwritten{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nwritten{dataset="pool3/dataset with space",zpool="pool3"} 12302
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nwritten{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="poolz1/dataset1",zpool="poolz1"} 32806
|
node_zfs_zpool_dataset_nwritten{dataset="poolz1/dataset1",zpool="poolz1"} 32806
|
||||||
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
||||||
# TYPE node_zfs_zpool_dataset_reads untyped
|
# TYPE node_zfs_zpool_dataset_reads untyped
|
||||||
node_zfs_zpool_dataset_reads{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_reads{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_reads{dataset="pool1/dataset1",zpool="pool1"} 2
|
node_zfs_zpool_dataset_reads{dataset="pool1/dataset1",zpool="pool1"} 2
|
||||||
|
node_zfs_zpool_dataset_reads{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_reads{dataset="pool3/dataset with space",zpool="pool3"} 2
|
||||||
node_zfs_zpool_dataset_reads{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_reads{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_reads{dataset="poolz1/dataset1",zpool="poolz1"} 2
|
node_zfs_zpool_dataset_reads{dataset="poolz1/dataset1",zpool="poolz1"} 2
|
||||||
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
||||||
# TYPE node_zfs_zpool_dataset_writes untyped
|
# TYPE node_zfs_zpool_dataset_writes untyped
|
||||||
node_zfs_zpool_dataset_writes{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_writes{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_writes{dataset="pool1/dataset1",zpool="pool1"} 4
|
node_zfs_zpool_dataset_writes{dataset="pool1/dataset1",zpool="pool1"} 4
|
||||||
|
node_zfs_zpool_dataset_writes{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_writes{dataset="pool3/dataset with space",zpool="pool3"} 4
|
||||||
node_zfs_zpool_dataset_writes{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_writes{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_writes{dataset="poolz1/dataset1",zpool="poolz1"} 10
|
node_zfs_zpool_dataset_writes{dataset="poolz1/dataset1",zpool="poolz1"} 10
|
||||||
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
||||||
# TYPE node_zfs_zpool_nread untyped
|
# TYPE node_zfs_zpool_nread untyped
|
||||||
node_zfs_zpool_nread{zpool="pool1"} 1.88416e+06
|
node_zfs_zpool_nread{zpool="pool1"} 1.88416e+06
|
||||||
|
node_zfs_zpool_nread{zpool="pool3"} 1.88416e+06
|
||||||
node_zfs_zpool_nread{zpool="poolz1"} 2.82624e+06
|
node_zfs_zpool_nread{zpool="poolz1"} 2.82624e+06
|
||||||
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
||||||
# TYPE node_zfs_zpool_nwritten untyped
|
# TYPE node_zfs_zpool_nwritten untyped
|
||||||
node_zfs_zpool_nwritten{zpool="pool1"} 3.206144e+06
|
node_zfs_zpool_nwritten{zpool="pool1"} 3.206144e+06
|
||||||
|
node_zfs_zpool_nwritten{zpool="pool3"} 3.206144e+06
|
||||||
node_zfs_zpool_nwritten{zpool="poolz1"} 2.680501248e+09
|
node_zfs_zpool_nwritten{zpool="poolz1"} 2.680501248e+09
|
||||||
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
||||||
# TYPE node_zfs_zpool_rcnt untyped
|
# TYPE node_zfs_zpool_rcnt untyped
|
||||||
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
||||||
|
node_zfs_zpool_rcnt{zpool="pool3"} 0
|
||||||
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
||||||
# TYPE node_zfs_zpool_reads untyped
|
# TYPE node_zfs_zpool_reads untyped
|
||||||
node_zfs_zpool_reads{zpool="pool1"} 22
|
node_zfs_zpool_reads{zpool="pool1"} 22
|
||||||
|
node_zfs_zpool_reads{zpool="pool3"} 22
|
||||||
node_zfs_zpool_reads{zpool="poolz1"} 33
|
node_zfs_zpool_reads{zpool="poolz1"} 33
|
||||||
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
||||||
# TYPE node_zfs_zpool_rlentime untyped
|
# TYPE node_zfs_zpool_rlentime untyped
|
||||||
node_zfs_zpool_rlentime{zpool="pool1"} 1.04112268e+08
|
node_zfs_zpool_rlentime{zpool="pool1"} 1.04112268e+08
|
||||||
|
node_zfs_zpool_rlentime{zpool="pool3"} 1.04112268e+08
|
||||||
node_zfs_zpool_rlentime{zpool="poolz1"} 6.472105124093e+12
|
node_zfs_zpool_rlentime{zpool="poolz1"} 6.472105124093e+12
|
||||||
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
||||||
# TYPE node_zfs_zpool_rtime untyped
|
# TYPE node_zfs_zpool_rtime untyped
|
||||||
node_zfs_zpool_rtime{zpool="pool1"} 2.4168078e+07
|
node_zfs_zpool_rtime{zpool="pool1"} 2.4168078e+07
|
||||||
|
node_zfs_zpool_rtime{zpool="pool3"} 2.4168078e+07
|
||||||
node_zfs_zpool_rtime{zpool="poolz1"} 9.82909164e+09
|
node_zfs_zpool_rtime{zpool="poolz1"} 9.82909164e+09
|
||||||
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
||||||
# TYPE node_zfs_zpool_rupdate untyped
|
# TYPE node_zfs_zpool_rupdate untyped
|
||||||
node_zfs_zpool_rupdate{zpool="pool1"} 7.921048984922e+13
|
node_zfs_zpool_rupdate{zpool="pool1"} 7.921048984922e+13
|
||||||
|
node_zfs_zpool_rupdate{zpool="pool3"} 7.921048984922e+13
|
||||||
node_zfs_zpool_rupdate{zpool="poolz1"} 1.10734831944501e+14
|
node_zfs_zpool_rupdate{zpool="poolz1"} 1.10734831944501e+14
|
||||||
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
||||||
# TYPE node_zfs_zpool_state gauge
|
# TYPE node_zfs_zpool_state gauge
|
||||||
node_zfs_zpool_state{state="degraded",zpool="pool1"} 0
|
node_zfs_zpool_state{state="degraded",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="degraded",zpool="pool2"} 0
|
node_zfs_zpool_state{state="degraded",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="degraded",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="degraded",zpool="poolz1"} 1
|
node_zfs_zpool_state{state="degraded",zpool="poolz1"} 1
|
||||||
node_zfs_zpool_state{state="faulted",zpool="pool1"} 0
|
node_zfs_zpool_state{state="faulted",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="faulted",zpool="pool2"} 0
|
node_zfs_zpool_state{state="faulted",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="faulted",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="faulted",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="faulted",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="pool1"} 0
|
node_zfs_zpool_state{state="offline",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="pool2"} 0
|
node_zfs_zpool_state{state="offline",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="offline",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="offline",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="online",zpool="pool1"} 1
|
node_zfs_zpool_state{state="online",zpool="pool1"} 1
|
||||||
node_zfs_zpool_state{state="online",zpool="pool2"} 0
|
node_zfs_zpool_state{state="online",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="online",zpool="pool3"} 1
|
||||||
node_zfs_zpool_state{state="online",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="online",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="pool1"} 0
|
node_zfs_zpool_state{state="removed",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="pool2"} 0
|
node_zfs_zpool_state{state="removed",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="removed",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="removed",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="pool1"} 0
|
node_zfs_zpool_state{state="suspended",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="pool2"} 1
|
node_zfs_zpool_state{state="suspended",zpool="pool2"} 1
|
||||||
|
node_zfs_zpool_state{state="suspended",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="suspended",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="pool1"} 0
|
node_zfs_zpool_state{state="unavail",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="pool2"} 0
|
node_zfs_zpool_state{state="unavail",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="unavail",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="unavail",zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
||||||
# TYPE node_zfs_zpool_wcnt untyped
|
# TYPE node_zfs_zpool_wcnt untyped
|
||||||
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
||||||
|
node_zfs_zpool_wcnt{zpool="pool3"} 0
|
||||||
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
||||||
# TYPE node_zfs_zpool_wlentime untyped
|
# TYPE node_zfs_zpool_wlentime untyped
|
||||||
node_zfs_zpool_wlentime{zpool="pool1"} 1.04112268e+08
|
node_zfs_zpool_wlentime{zpool="pool1"} 1.04112268e+08
|
||||||
|
node_zfs_zpool_wlentime{zpool="pool3"} 1.04112268e+08
|
||||||
node_zfs_zpool_wlentime{zpool="poolz1"} 6.472105124093e+12
|
node_zfs_zpool_wlentime{zpool="poolz1"} 6.472105124093e+12
|
||||||
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
||||||
# TYPE node_zfs_zpool_writes untyped
|
# TYPE node_zfs_zpool_writes untyped
|
||||||
node_zfs_zpool_writes{zpool="pool1"} 132
|
node_zfs_zpool_writes{zpool="pool1"} 132
|
||||||
|
node_zfs_zpool_writes{zpool="pool3"} 132
|
||||||
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
||||||
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
||||||
# TYPE node_zfs_zpool_wtime untyped
|
# TYPE node_zfs_zpool_wtime untyped
|
||||||
node_zfs_zpool_wtime{zpool="pool1"} 7.155162e+06
|
node_zfs_zpool_wtime{zpool="pool1"} 7.155162e+06
|
||||||
|
node_zfs_zpool_wtime{zpool="pool3"} 7.155162e+06
|
||||||
node_zfs_zpool_wtime{zpool="poolz1"} 9.673715628e+09
|
node_zfs_zpool_wtime{zpool="poolz1"} 9.673715628e+09
|
||||||
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
||||||
# TYPE node_zfs_zpool_wupdate untyped
|
# TYPE node_zfs_zpool_wupdate untyped
|
||||||
node_zfs_zpool_wupdate{zpool="pool1"} 7.9210489694949e+13
|
node_zfs_zpool_wupdate{zpool="pool1"} 7.9210489694949e+13
|
||||||
|
node_zfs_zpool_wupdate{zpool="pool3"} 7.9210489694949e+13
|
||||||
node_zfs_zpool_wupdate{zpool="poolz1"} 1.10734831833266e+14
|
node_zfs_zpool_wupdate{zpool="poolz1"} 1.10734831833266e+14
|
||||||
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
||||||
# TYPE node_zoneinfo_high_pages gauge
|
# TYPE node_zoneinfo_high_pages gauge
|
||||||
|
|
291
collector/fixtures/e2e-output-darwin.txt
Normal file
291
collector/fixtures/e2e-output-darwin.txt
Normal file
|
@ -0,0 +1,291 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||||
|
# TYPE node_buddyinfo_blocks gauge
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||||
|
# HELP node_disk_read_errors_total The total number of read errors.
|
||||||
|
# TYPE node_disk_read_errors_total counter
|
||||||
|
node_disk_read_errors_total{device="disk0"} 0
|
||||||
|
# HELP node_disk_read_retries_total The total number of read retries.
|
||||||
|
# TYPE node_disk_read_retries_total counter
|
||||||
|
node_disk_read_retries_total{device="disk0"} 0
|
||||||
|
# HELP node_disk_write_errors_total The total number of write errors.
|
||||||
|
# TYPE node_disk_write_errors_total counter
|
||||||
|
node_disk_write_errors_total{device="disk0"} 0
|
||||||
|
# HELP node_disk_write_retries_total The total number of write retries.
|
||||||
|
# TYPE node_disk_write_retries_total counter
|
||||||
|
node_disk_write_retries_total{device="disk0"} 0
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_memory_swap_total_bytes Memory information field swap_total_bytes.
|
||||||
|
# TYPE node_memory_swap_total_bytes gauge
|
||||||
|
node_memory_swap_total_bytes 0
|
||||||
|
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||||
|
# TYPE node_memory_swap_used_bytes gauge
|
||||||
|
node_memory_swap_used_bytes 0
|
||||||
|
# HELP node_memory_total_bytes Memory information field total_bytes.
|
||||||
|
# TYPE node_memory_total_bytes gauge
|
||||||
|
node_memory_total_bytes 7.516192768e+09
|
||||||
|
# HELP node_network_noproto_total Network device statistic noproto.
|
||||||
|
# TYPE node_network_noproto_total counter
|
||||||
|
node_network_noproto_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||||
|
# TYPE node_network_receive_drop_total counter
|
||||||
|
node_network_receive_drop_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||||
|
# TYPE node_network_receive_errs_total counter
|
||||||
|
node_network_receive_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||||
|
# TYPE node_network_receive_packets_total counter
|
||||||
|
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||||
|
# TYPE node_network_transmit_bytes_total counter
|
||||||
|
# HELP node_network_transmit_colls_total Network device statistic transmit_colls.
|
||||||
|
# TYPE node_network_transmit_colls_total counter
|
||||||
|
node_network_transmit_colls_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||||
|
# TYPE node_network_transmit_errs_total counter
|
||||||
|
node_network_transmit_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||||
|
# TYPE node_network_transmit_packets_total counter
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 1
|
||||||
|
node_scrape_collector_success{collector="diskstats"} 1
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="meminfo"} 1
|
||||||
|
node_scrape_collector_success{collector="netdev"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="powersupplyclass"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="thermal"} 0
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
|
||||||
|
# TYPE process_cpu_seconds_total counter
|
||||||
|
# HELP process_max_fds Maximum number of open file descriptors.
|
||||||
|
# TYPE process_max_fds gauge
|
||||||
|
# HELP process_open_fds Number of open file descriptors.
|
||||||
|
# TYPE process_open_fds gauge
|
||||||
|
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
||||||
|
# TYPE process_resident_memory_bytes gauge
|
||||||
|
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
|
||||||
|
# TYPE process_start_time_seconds gauge
|
||||||
|
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
|
||||||
|
# TYPE process_virtual_memory_bytes gauge
|
||||||
|
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
|
||||||
|
# TYPE process_virtual_memory_max_bytes gauge
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
251
collector/fixtures/e2e-output-dragonfly.txt
Normal file
251
collector/fixtures/e2e-output-dragonfly.txt
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||||
|
# TYPE node_buddyinfo_blocks gauge
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||||
|
# TYPE node_network_receive_drop_total counter
|
||||||
|
node_network_receive_drop_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||||
|
# TYPE node_network_receive_errs_total counter
|
||||||
|
node_network_receive_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||||
|
# TYPE node_network_receive_packets_total counter
|
||||||
|
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||||
|
# TYPE node_network_transmit_bytes_total counter
|
||||||
|
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||||
|
# TYPE node_network_transmit_drop_total counter
|
||||||
|
node_network_transmit_drop_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||||
|
# TYPE node_network_transmit_errs_total counter
|
||||||
|
node_network_transmit_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||||
|
# TYPE node_network_transmit_packets_total counter
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 1
|
||||||
|
node_scrape_collector_success{collector="exec"} 1
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="meminfo"} 0
|
||||||
|
node_scrape_collector_success{collector="netdev"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
287
collector/fixtures/e2e-output-freebsd.txt
Normal file
287
collector/fixtures/e2e-output-freebsd.txt
Normal file
|
@ -0,0 +1,287 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||||
|
# TYPE node_buddyinfo_blocks gauge
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_memory_swap_in_bytes_total Bytes paged in from swap devices
|
||||||
|
# TYPE node_memory_swap_in_bytes_total counter
|
||||||
|
node_memory_swap_in_bytes_total 0
|
||||||
|
# HELP node_memory_swap_out_bytes_total Bytes paged out to swap devices
|
||||||
|
# TYPE node_memory_swap_out_bytes_total counter
|
||||||
|
node_memory_swap_out_bytes_total 0
|
||||||
|
# HELP node_memory_swap_size_bytes Total swap memory size
|
||||||
|
# TYPE node_memory_swap_size_bytes gauge
|
||||||
|
node_memory_swap_size_bytes 1.073741824e+09
|
||||||
|
# HELP node_memory_swap_used_bytes Currently allocated swap
|
||||||
|
# TYPE node_memory_swap_used_bytes gauge
|
||||||
|
node_memory_swap_used_bytes 0
|
||||||
|
# HELP node_memory_user_wired_bytes Locked in memory by user, mlock, etc
|
||||||
|
# TYPE node_memory_user_wired_bytes gauge
|
||||||
|
node_memory_user_wired_bytes 0
|
||||||
|
# HELP node_netisr_bindthreads netisr threads bound to CPUs
|
||||||
|
# TYPE node_netisr_bindthreads gauge
|
||||||
|
node_netisr_bindthreads 0
|
||||||
|
# HELP node_netisr_defaultqlimit netisr default queue limit
|
||||||
|
# TYPE node_netisr_defaultqlimit gauge
|
||||||
|
node_netisr_defaultqlimit 256
|
||||||
|
# HELP node_netisr_maxprot netisr maximum protocols
|
||||||
|
# TYPE node_netisr_maxprot gauge
|
||||||
|
node_netisr_maxprot 16
|
||||||
|
# HELP node_netisr_maxqlimit netisr maximum queue limit
|
||||||
|
# TYPE node_netisr_maxqlimit gauge
|
||||||
|
node_netisr_maxqlimit 10240
|
||||||
|
# HELP node_netisr_maxthreads netisr maximum thread count
|
||||||
|
# TYPE node_netisr_maxthreads gauge
|
||||||
|
node_netisr_maxthreads 1
|
||||||
|
# HELP node_netisr_numthreads netisr current thread count
|
||||||
|
# TYPE node_netisr_numthreads gauge
|
||||||
|
node_netisr_numthreads 1
|
||||||
|
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||||
|
# TYPE node_network_receive_drop_total counter
|
||||||
|
node_network_receive_drop_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||||
|
# TYPE node_network_receive_errs_total counter
|
||||||
|
node_network_receive_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||||
|
# TYPE node_network_receive_packets_total counter
|
||||||
|
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||||
|
# TYPE node_network_transmit_bytes_total counter
|
||||||
|
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||||
|
# TYPE node_network_transmit_drop_total counter
|
||||||
|
node_network_transmit_drop_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||||
|
# TYPE node_network_transmit_errs_total counter
|
||||||
|
node_network_transmit_errs_total{device="lo0"} 0
|
||||||
|
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||||
|
# TYPE node_network_transmit_packets_total counter
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 1
|
||||||
|
node_scrape_collector_success{collector="exec"} 1
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="meminfo"} 1
|
||||||
|
node_scrape_collector_success{collector="netdev"} 1
|
||||||
|
node_scrape_collector_success{collector="netisr"} 1
|
||||||
|
node_scrape_collector_success{collector="netstat"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
node_scrape_collector_success{collector="zfs"} 1
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
209
collector/fixtures/e2e-output-netbsd.txt
Normal file
209
collector/fixtures/e2e-output-netbsd.txt
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_memory_swap_size_bytes Memory information field swap_size_bytes.
|
||||||
|
# TYPE node_memory_swap_size_bytes gauge
|
||||||
|
node_memory_swap_size_bytes 6.442426368e+09
|
||||||
|
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||||
|
# TYPE node_memory_swap_used_bytes gauge
|
||||||
|
node_memory_swap_used_bytes 0
|
||||||
|
# HELP node_memory_swapped_in_pages_bytes_total Memory information field swapped_in_pages_bytes_total.
|
||||||
|
# TYPE node_memory_swapped_in_pages_bytes_total counter
|
||||||
|
node_memory_swapped_in_pages_bytes_total 0
|
||||||
|
# HELP node_memory_swapped_out_pages_bytes_total Memory information field swapped_out_pages_bytes_total.
|
||||||
|
# TYPE node_memory_swapped_out_pages_bytes_total counter
|
||||||
|
node_memory_swapped_out_pages_bytes_total 0
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 0
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="meminfo"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP process_open_fds Number of open file descriptors.
|
||||||
|
# TYPE process_open_fds gauge
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
276
collector/fixtures/e2e-output-openbsd.txt
Normal file
276
collector/fixtures/e2e-output-openbsd.txt
Normal file
|
@ -0,0 +1,276 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||||
|
# TYPE node_buddyinfo_blocks gauge
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_memory_swap_size_bytes Memory information field swap_size_bytes.
|
||||||
|
# TYPE node_memory_swap_size_bytes gauge
|
||||||
|
node_memory_swap_size_bytes 6.693941248e+09
|
||||||
|
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||||
|
# TYPE node_memory_swap_used_bytes gauge
|
||||||
|
node_memory_swap_used_bytes 0
|
||||||
|
# HELP node_memory_swapped_in_pages_bytes_total Memory information field swapped_in_pages_bytes_total.
|
||||||
|
# TYPE node_memory_swapped_in_pages_bytes_total counter
|
||||||
|
node_memory_swapped_in_pages_bytes_total 0
|
||||||
|
# HELP node_memory_swapped_out_pages_bytes_total Memory information field swapped_out_pages_bytes_total.
|
||||||
|
# TYPE node_memory_swapped_out_pages_bytes_total counter
|
||||||
|
node_memory_swapped_out_pages_bytes_total 0
|
||||||
|
# HELP node_network_noproto_total Network device statistic noproto.
|
||||||
|
# TYPE node_network_noproto_total counter
|
||||||
|
node_network_noproto_total{device="lo0"} 0
|
||||||
|
node_network_noproto_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||||
|
# TYPE node_network_receive_drop_total counter
|
||||||
|
node_network_receive_drop_total{device="lo0"} 0
|
||||||
|
node_network_receive_drop_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||||
|
# TYPE node_network_receive_errs_total counter
|
||||||
|
node_network_receive_errs_total{device="lo0"} 0
|
||||||
|
node_network_receive_errs_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||||
|
# TYPE node_network_receive_packets_total counter
|
||||||
|
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||||
|
# TYPE node_network_transmit_bytes_total counter
|
||||||
|
# HELP node_network_transmit_colls_total Network device statistic transmit_colls.
|
||||||
|
# TYPE node_network_transmit_colls_total counter
|
||||||
|
node_network_transmit_colls_total{device="lo0"} 0
|
||||||
|
node_network_transmit_colls_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||||
|
# TYPE node_network_transmit_drop_total counter
|
||||||
|
node_network_transmit_drop_total{device="lo0"} 0
|
||||||
|
node_network_transmit_drop_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||||
|
# TYPE node_network_transmit_errs_total counter
|
||||||
|
node_network_transmit_errs_total{device="lo0"} 0
|
||||||
|
node_network_transmit_errs_total{device="pflog0"} 0
|
||||||
|
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||||
|
# TYPE node_network_transmit_packets_total counter
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 1
|
||||||
|
node_scrape_collector_success{collector="diskstats"} 1
|
||||||
|
node_scrape_collector_success{collector="interrupts"} 1
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="meminfo"} 1
|
||||||
|
node_scrape_collector_success{collector="netdev"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
234
collector/fixtures/e2e-output-solaris.txt
Normal file
234
collector/fixtures/e2e-output-solaris.txt
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
|
# TYPE go_gc_gogc_percent gauge
|
||||||
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
# TYPE go_goroutines gauge
|
||||||
|
# HELP go_info Information about the Go environment.
|
||||||
|
# TYPE go_info gauge
|
||||||
|
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||||
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
|
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||||
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
|
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_frees_total counter
|
||||||
|
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||||
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
|
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||||
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
|
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
|
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||||
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
|
# TYPE go_memstats_heap_objects gauge
|
||||||
|
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||||
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
|
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||||
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
|
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||||
|
# TYPE go_memstats_mallocs_total counter
|
||||||
|
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||||
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||||
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||||
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
|
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||||
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
|
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||||
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
|
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
|
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||||
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
|
# HELP go_threads Number of OS threads created.
|
||||||
|
# TYPE go_threads gauge
|
||||||
|
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||||
|
# TYPE node_buddyinfo_blocks gauge
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||||
|
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||||
|
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||||
|
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||||
|
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||||
|
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||||
|
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||||
|
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||||
|
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||||
|
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||||
|
# TYPE node_exporter_build_info gauge
|
||||||
|
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||||
|
# TYPE node_os_info gauge
|
||||||
|
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||||
|
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||||
|
# TYPE node_os_version gauge
|
||||||
|
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||||
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
# TYPE node_scrape_collector_success gauge
|
||||||
|
node_scrape_collector_success{collector="boottime"} 1
|
||||||
|
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||||
|
node_scrape_collector_success{collector="cpu"} 0
|
||||||
|
node_scrape_collector_success{collector="cpufreq"} 1
|
||||||
|
node_scrape_collector_success{collector="loadavg"} 1
|
||||||
|
node_scrape_collector_success{collector="os"} 1
|
||||||
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
node_scrape_collector_success{collector="time"} 1
|
||||||
|
node_scrape_collector_success{collector="xfrm"} 1
|
||||||
|
node_scrape_collector_success{collector="zfs"} 0
|
||||||
|
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||||
|
# TYPE node_textfile_mtime_seconds gauge
|
||||||
|
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||||
|
# TYPE node_textfile_scrape_error gauge
|
||||||
|
node_textfile_scrape_error 0
|
||||||
|
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||||
|
# TYPE node_time_seconds gauge
|
||||||
|
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||||
|
# TYPE node_time_zone_offset_seconds gauge
|
||||||
|
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||||
|
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||||
|
node_xfrm_acquire_error_packets_total 24532
|
||||||
|
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||||
|
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||||
|
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||||
|
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||||
|
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||||
|
node_xfrm_in_buffer_error_packets_total 2
|
||||||
|
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||||
|
# TYPE node_xfrm_in_error_packets_total counter
|
||||||
|
node_xfrm_in_error_packets_total 1
|
||||||
|
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||||
|
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||||
|
node_xfrm_in_hdr_error_packets_total 4
|
||||||
|
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||||
|
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||||
|
node_xfrm_in_no_pols_packets_total 65432
|
||||||
|
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||||
|
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||||
|
node_xfrm_in_no_states_packets_total 3
|
||||||
|
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||||
|
node_xfrm_in_pol_block_packets_total 100
|
||||||
|
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||||
|
node_xfrm_in_pol_error_packets_total 10000
|
||||||
|
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||||
|
node_xfrm_in_state_expired_packets_total 7
|
||||||
|
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||||
|
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||||
|
node_xfrm_in_state_invalid_packets_total 55555
|
||||||
|
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||||
|
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_state_mismatch_packets_total 23451
|
||||||
|
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_in_state_mode_error_packets_total 100
|
||||||
|
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||||
|
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_in_state_proto_error_packets_total 40
|
||||||
|
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||||
|
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_in_state_seq_error_packets_total 6000
|
||||||
|
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||||
|
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||||
|
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||||
|
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||||
|
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_check_error_packets_total 555
|
||||||
|
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||||
|
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||||
|
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||||
|
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||||
|
# TYPE node_xfrm_out_error_packets_total counter
|
||||||
|
node_xfrm_out_error_packets_total 1e+06
|
||||||
|
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||||
|
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||||
|
node_xfrm_out_no_states_packets_total 869
|
||||||
|
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||||
|
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||||
|
node_xfrm_out_pol_block_packets_total 43456
|
||||||
|
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||||
|
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||||
|
node_xfrm_out_pol_dead_packets_total 7656
|
||||||
|
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||||
|
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||||
|
node_xfrm_out_pol_error_packets_total 1454
|
||||||
|
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||||
|
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||||
|
node_xfrm_out_state_expired_packets_total 565
|
||||||
|
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||||
|
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||||
|
node_xfrm_out_state_invalid_packets_total 28765
|
||||||
|
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||||
|
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||||
|
node_xfrm_out_state_mode_error_packets_total 8
|
||||||
|
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||||
|
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||||
|
node_xfrm_out_state_proto_error_packets_total 4542
|
||||||
|
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||||
|
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||||
|
node_xfrm_out_state_seq_error_packets_total 543
|
||||||
|
# HELP process_open_fds Number of open file descriptors.
|
||||||
|
# TYPE process_open_fds gauge
|
||||||
|
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||||
|
# TYPE promhttp_metric_handler_errors_total counter
|
||||||
|
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||||
|
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||||
|
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||||
|
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||||
|
promhttp_metric_handler_requests_in_flight 1
|
||||||
|
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||||
|
# TYPE promhttp_metric_handler_requests_total counter
|
||||||
|
promhttp_metric_handler_requests_total{code="200"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="500"} 0
|
||||||
|
promhttp_metric_handler_requests_total{code="503"} 0
|
||||||
|
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_1 untyped
|
||||||
|
testmetric1_1{foo="bar"} 10
|
||||||
|
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||||
|
# TYPE testmetric1_2 untyped
|
||||||
|
testmetric1_2{foo="baz"} 20
|
||||||
|
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_1 untyped
|
||||||
|
testmetric2_1{foo="bar"} 30
|
||||||
|
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||||
|
# TYPE testmetric2_2 untyped
|
||||||
|
testmetric2_2{foo="baz"} 40
|
|
@ -1,8 +1,8 @@
|
||||||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||||
# TYPE go_gc_duration_seconds summary
|
# TYPE go_gc_duration_seconds summary
|
||||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent
|
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||||
# TYPE go_gc_gogc_percent gauge
|
# TYPE go_gc_gogc_percent gauge
|
||||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes
|
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||||
# TYPE go_gc_gomemlimit_bytes gauge
|
# TYPE go_gc_gomemlimit_bytes gauge
|
||||||
# HELP go_goroutines Number of goroutines that currently exist.
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
# TYPE go_goroutines gauge
|
# TYPE go_goroutines gauge
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
# TYPE go_memstats_stack_sys_bytes gauge
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||||
# TYPE go_memstats_sys_bytes gauge
|
# TYPE go_memstats_sys_bytes gauge
|
||||||
# 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. Sourced from /sched/gomaxprocs:threads
|
# 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. Sourced from /sched/gomaxprocs:threads.
|
||||||
# TYPE go_sched_gomaxprocs_threads gauge
|
# TYPE go_sched_gomaxprocs_threads gauge
|
||||||
# HELP go_threads Number of OS threads created.
|
# HELP go_threads Number of OS threads created.
|
||||||
# TYPE go_threads gauge
|
# TYPE go_threads gauge
|
||||||
|
@ -510,21 +510,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
||||||
node_disk_flush_requests_total{device="sdc"} 1555
|
node_disk_flush_requests_total{device="sdc"} 1555
|
||||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||||
# TYPE node_disk_info gauge
|
# TYPE node_disk_info gauge
|
||||||
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-0",major="252",minor="0",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-1",major="252",minor="1",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",serial="",wwn=""} 1
|
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0",major="179",minor="0",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",serial="",wwn=""} 1
|
node_disk_info{device="mmcblk0p2",major="179",minor="2",model="",path="platform-df2969f3.mmc",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
node_disk_info{device="nvme0n1",major="259",minor="0",model="SAMSUNG EHFTF55LURSY-000Y9",path="pci-0000:02:00.0-nvme-1",revision="4NBTUY95",rotational="0",serial="S252B6CU1HG3M1",wwn="eui.p3vbbiejx5aae2r3"} 1
|
||||||
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
node_disk_info{device="sda",major="8",minor="0",model="TOSHIBA_KSDB4U86",path="pci-0000:3b:00.0-sas-phy7-lun-0",revision="0102",rotational="1",serial="2160A0D5FVGG",wwn="0x7c72382b8de36a64"} 1
|
||||||
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
node_disk_info{device="sdb",major="8",minor="16",model="SuperMicro_SSD",path="pci-0000:00:1f.2-ata-1",revision="0R",rotational="0",serial="SMC0E1B87ABBB16BD84E",wwn="0xe1b87abbb16bd84e"} 1
|
||||||
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
node_disk_info{device="sdc",major="8",minor="32",model="INTEL_SSDS9X9SI0",path="pci-0000:00:1f.2-ata-4",revision="0100",rotational="0",serial="3EWB5Y25CWQWA7EH1U",wwn="0x58907ddc573a5de"} 1
|
||||||
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",serial="AAAABBBBCCCC1",wwn=""} 1
|
node_disk_info{device="sr0",major="11",minor="0",model="Virtual_CDROM0",path="pci-0000:00:14.0-usb-0:1.1:1.0-scsi-0:0:0:0",revision="1.00",rotational="0",serial="AAAABBBBCCCC1",wwn=""} 1
|
||||||
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",serial="",wwn=""} 1
|
node_disk_info{device="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",revision="",rotational="0",serial="",wwn=""} 1
|
||||||
# HELP node_disk_io_now The number of I/Os currently in progress.
|
# HELP node_disk_io_now The number of I/Os currently in progress.
|
||||||
# TYPE node_disk_io_now gauge
|
# TYPE node_disk_io_now gauge
|
||||||
node_disk_io_now{device="dm-0"} 0
|
node_disk_io_now{device="dm-0"} 0
|
||||||
|
@ -893,6 +893,10 @@ node_hwmon_fan_target_rpm{chip="nct6779",sensor="fan2"} 27000
|
||||||
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
||||||
# TYPE node_hwmon_fan_tolerance gauge
|
# TYPE node_hwmon_fan_tolerance gauge
|
||||||
node_hwmon_fan_tolerance{chip="nct6779",sensor="fan2"} 0
|
node_hwmon_fan_tolerance{chip="nct6779",sensor="fan2"} 0
|
||||||
|
# HELP node_hwmon_freq_freq_mhz Hardware monitor for GPU frequency in MHz
|
||||||
|
# TYPE node_hwmon_freq_freq_mhz gauge
|
||||||
|
node_hwmon_freq_freq_mhz{chip="hwmon4",sensor="mclk"} 300
|
||||||
|
node_hwmon_freq_freq_mhz{chip="hwmon4",sensor="sclk"} 214
|
||||||
# HELP node_hwmon_in_alarm Hardware sensor alarm status (in)
|
# HELP node_hwmon_in_alarm Hardware sensor alarm status (in)
|
||||||
# TYPE node_hwmon_in_alarm gauge
|
# TYPE node_hwmon_in_alarm gauge
|
||||||
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
||||||
|
@ -1006,8 +1010,10 @@ node_hwmon_pwm_weight_temp_step_tol{chip="nct6779",sensor="pwm1"} 0
|
||||||
# TYPE node_hwmon_sensor_label gauge
|
# TYPE node_hwmon_sensor_label gauge
|
||||||
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp1"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp1"} 1
|
||||||
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp2"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="foosensor",sensor="temp2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Left side ",sensor="fan1"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="mclk",sensor="freq2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Right side ",sensor="fan2"} 1
|
node_hwmon_sensor_label{chip="hwmon4",label="sclk",sensor="freq1"} 1
|
||||||
|
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Left side",sensor="fan1"} 1
|
||||||
|
node_hwmon_sensor_label{chip="platform_applesmc_768",label="Right side",sensor="fan2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 0",sensor="temp2"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 0",sensor="temp2"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 1",sensor="temp3"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 1",sensor="temp3"} 1
|
||||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
||||||
|
@ -1601,6 +1607,14 @@ node_md_blocks_synced{device="md6"} 1.6775552e+07
|
||||||
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||||
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||||
node_md_blocks_synced{device="md9"} 0
|
node_md_blocks_synced{device="md9"} 0
|
||||||
|
# HELP node_md_degraded Number of degraded disks on device.
|
||||||
|
# TYPE node_md_degraded gauge
|
||||||
|
node_md_degraded{device="md0"} 0
|
||||||
|
node_md_degraded{device="md1"} 0
|
||||||
|
node_md_degraded{device="md10"} 0
|
||||||
|
node_md_degraded{device="md4"} 0
|
||||||
|
node_md_degraded{device="md5"} 1
|
||||||
|
node_md_degraded{device="md6"} 1
|
||||||
# HELP node_md_disks Number of active/failed/spare disks of device.
|
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||||
# TYPE node_md_disks gauge
|
# TYPE node_md_disks gauge
|
||||||
node_md_disks{device="md0",state="active"} 2
|
node_md_disks{device="md0",state="active"} 2
|
||||||
|
@ -1673,6 +1687,14 @@ node_md_disks_required{device="md6"} 2
|
||||||
node_md_disks_required{device="md7"} 4
|
node_md_disks_required{device="md7"} 4
|
||||||
node_md_disks_required{device="md8"} 2
|
node_md_disks_required{device="md8"} 2
|
||||||
node_md_disks_required{device="md9"} 4
|
node_md_disks_required{device="md9"} 4
|
||||||
|
# HELP node_md_raid_disks Number of raid disks on device.
|
||||||
|
# TYPE node_md_raid_disks gauge
|
||||||
|
node_md_raid_disks{device="md0"} 2
|
||||||
|
node_md_raid_disks{device="md1"} 2
|
||||||
|
node_md_raid_disks{device="md10"} 4
|
||||||
|
node_md_raid_disks{device="md4"} 3
|
||||||
|
node_md_raid_disks{device="md5"} 3
|
||||||
|
node_md_raid_disks{device="md6"} 4
|
||||||
# HELP node_md_state Indicates the state of md-device.
|
# HELP node_md_state Indicates the state of md-device.
|
||||||
# TYPE node_md_state gauge
|
# TYPE node_md_state gauge
|
||||||
node_md_state{device="md0",state="active"} 1
|
node_md_state{device="md0",state="active"} 1
|
||||||
|
@ -4337,108 +4359,139 @@ node_zfs_zil_zil_itx_needcopy_count 0
|
||||||
# TYPE node_zfs_zpool_dataset_nread untyped
|
# TYPE node_zfs_zpool_dataset_nread untyped
|
||||||
node_zfs_zpool_dataset_nread{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nread{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nread{dataset="pool1/dataset1",zpool="pool1"} 28
|
node_zfs_zpool_dataset_nread{dataset="pool1/dataset1",zpool="pool1"} 28
|
||||||
|
node_zfs_zpool_dataset_nread{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nread{dataset="pool3/dataset with space",zpool="pool3"} 28
|
||||||
node_zfs_zpool_dataset_nread{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nread{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nread{dataset="poolz1/dataset1",zpool="poolz1"} 28
|
node_zfs_zpool_dataset_nread{dataset="poolz1/dataset1",zpool="poolz1"} 28
|
||||||
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
||||||
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nunlinked{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="pool1/dataset1",zpool="pool1"} 3
|
node_zfs_zpool_dataset_nunlinked{dataset="pool1/dataset1",zpool="pool1"} 3
|
||||||
|
node_zfs_zpool_dataset_nunlinked{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nunlinked{dataset="pool3/dataset with space",zpool="pool3"} 3
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nunlinked{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinked{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
node_zfs_zpool_dataset_nunlinked{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
||||||
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
||||||
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nunlinks{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="pool1/dataset1",zpool="pool1"} 3
|
node_zfs_zpool_dataset_nunlinks{dataset="pool1/dataset1",zpool="pool1"} 3
|
||||||
|
node_zfs_zpool_dataset_nunlinks{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nunlinks{dataset="pool3/dataset with space",zpool="pool3"} 3
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nunlinks{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nunlinks{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
node_zfs_zpool_dataset_nunlinks{dataset="poolz1/dataset1",zpool="poolz1"} 14
|
||||||
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
||||||
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_nwritten{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="pool1/dataset1",zpool="pool1"} 12302
|
node_zfs_zpool_dataset_nwritten{dataset="pool1/dataset1",zpool="pool1"} 12302
|
||||||
|
node_zfs_zpool_dataset_nwritten{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_nwritten{dataset="pool3/dataset with space",zpool="pool3"} 12302
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_nwritten{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_nwritten{dataset="poolz1/dataset1",zpool="poolz1"} 32806
|
node_zfs_zpool_dataset_nwritten{dataset="poolz1/dataset1",zpool="poolz1"} 32806
|
||||||
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
||||||
# TYPE node_zfs_zpool_dataset_reads untyped
|
# TYPE node_zfs_zpool_dataset_reads untyped
|
||||||
node_zfs_zpool_dataset_reads{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_reads{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_reads{dataset="pool1/dataset1",zpool="pool1"} 2
|
node_zfs_zpool_dataset_reads{dataset="pool1/dataset1",zpool="pool1"} 2
|
||||||
|
node_zfs_zpool_dataset_reads{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_reads{dataset="pool3/dataset with space",zpool="pool3"} 2
|
||||||
node_zfs_zpool_dataset_reads{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_reads{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_reads{dataset="poolz1/dataset1",zpool="poolz1"} 2
|
node_zfs_zpool_dataset_reads{dataset="poolz1/dataset1",zpool="poolz1"} 2
|
||||||
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
||||||
# TYPE node_zfs_zpool_dataset_writes untyped
|
# TYPE node_zfs_zpool_dataset_writes untyped
|
||||||
node_zfs_zpool_dataset_writes{dataset="pool1",zpool="pool1"} 0
|
node_zfs_zpool_dataset_writes{dataset="pool1",zpool="pool1"} 0
|
||||||
node_zfs_zpool_dataset_writes{dataset="pool1/dataset1",zpool="pool1"} 4
|
node_zfs_zpool_dataset_writes{dataset="pool1/dataset1",zpool="pool1"} 4
|
||||||
|
node_zfs_zpool_dataset_writes{dataset="pool3",zpool="pool3"} 0
|
||||||
|
node_zfs_zpool_dataset_writes{dataset="pool3/dataset with space",zpool="pool3"} 4
|
||||||
node_zfs_zpool_dataset_writes{dataset="poolz1",zpool="poolz1"} 0
|
node_zfs_zpool_dataset_writes{dataset="poolz1",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_dataset_writes{dataset="poolz1/dataset1",zpool="poolz1"} 10
|
node_zfs_zpool_dataset_writes{dataset="poolz1/dataset1",zpool="poolz1"} 10
|
||||||
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
||||||
# TYPE node_zfs_zpool_nread untyped
|
# TYPE node_zfs_zpool_nread untyped
|
||||||
node_zfs_zpool_nread{zpool="pool1"} 1.88416e+06
|
node_zfs_zpool_nread{zpool="pool1"} 1.88416e+06
|
||||||
|
node_zfs_zpool_nread{zpool="pool3"} 1.88416e+06
|
||||||
node_zfs_zpool_nread{zpool="poolz1"} 2.82624e+06
|
node_zfs_zpool_nread{zpool="poolz1"} 2.82624e+06
|
||||||
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
||||||
# TYPE node_zfs_zpool_nwritten untyped
|
# TYPE node_zfs_zpool_nwritten untyped
|
||||||
node_zfs_zpool_nwritten{zpool="pool1"} 3.206144e+06
|
node_zfs_zpool_nwritten{zpool="pool1"} 3.206144e+06
|
||||||
|
node_zfs_zpool_nwritten{zpool="pool3"} 3.206144e+06
|
||||||
node_zfs_zpool_nwritten{zpool="poolz1"} 2.680501248e+09
|
node_zfs_zpool_nwritten{zpool="poolz1"} 2.680501248e+09
|
||||||
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
||||||
# TYPE node_zfs_zpool_rcnt untyped
|
# TYPE node_zfs_zpool_rcnt untyped
|
||||||
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
||||||
|
node_zfs_zpool_rcnt{zpool="pool3"} 0
|
||||||
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
||||||
# TYPE node_zfs_zpool_reads untyped
|
# TYPE node_zfs_zpool_reads untyped
|
||||||
node_zfs_zpool_reads{zpool="pool1"} 22
|
node_zfs_zpool_reads{zpool="pool1"} 22
|
||||||
|
node_zfs_zpool_reads{zpool="pool3"} 22
|
||||||
node_zfs_zpool_reads{zpool="poolz1"} 33
|
node_zfs_zpool_reads{zpool="poolz1"} 33
|
||||||
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
||||||
# TYPE node_zfs_zpool_rlentime untyped
|
# TYPE node_zfs_zpool_rlentime untyped
|
||||||
node_zfs_zpool_rlentime{zpool="pool1"} 1.04112268e+08
|
node_zfs_zpool_rlentime{zpool="pool1"} 1.04112268e+08
|
||||||
|
node_zfs_zpool_rlentime{zpool="pool3"} 1.04112268e+08
|
||||||
node_zfs_zpool_rlentime{zpool="poolz1"} 6.472105124093e+12
|
node_zfs_zpool_rlentime{zpool="poolz1"} 6.472105124093e+12
|
||||||
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
||||||
# TYPE node_zfs_zpool_rtime untyped
|
# TYPE node_zfs_zpool_rtime untyped
|
||||||
node_zfs_zpool_rtime{zpool="pool1"} 2.4168078e+07
|
node_zfs_zpool_rtime{zpool="pool1"} 2.4168078e+07
|
||||||
|
node_zfs_zpool_rtime{zpool="pool3"} 2.4168078e+07
|
||||||
node_zfs_zpool_rtime{zpool="poolz1"} 9.82909164e+09
|
node_zfs_zpool_rtime{zpool="poolz1"} 9.82909164e+09
|
||||||
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
||||||
# TYPE node_zfs_zpool_rupdate untyped
|
# TYPE node_zfs_zpool_rupdate untyped
|
||||||
node_zfs_zpool_rupdate{zpool="pool1"} 7.921048984922e+13
|
node_zfs_zpool_rupdate{zpool="pool1"} 7.921048984922e+13
|
||||||
|
node_zfs_zpool_rupdate{zpool="pool3"} 7.921048984922e+13
|
||||||
node_zfs_zpool_rupdate{zpool="poolz1"} 1.10734831944501e+14
|
node_zfs_zpool_rupdate{zpool="poolz1"} 1.10734831944501e+14
|
||||||
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
||||||
# TYPE node_zfs_zpool_state gauge
|
# TYPE node_zfs_zpool_state gauge
|
||||||
node_zfs_zpool_state{state="degraded",zpool="pool1"} 0
|
node_zfs_zpool_state{state="degraded",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="degraded",zpool="pool2"} 0
|
node_zfs_zpool_state{state="degraded",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="degraded",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="degraded",zpool="poolz1"} 1
|
node_zfs_zpool_state{state="degraded",zpool="poolz1"} 1
|
||||||
node_zfs_zpool_state{state="faulted",zpool="pool1"} 0
|
node_zfs_zpool_state{state="faulted",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="faulted",zpool="pool2"} 0
|
node_zfs_zpool_state{state="faulted",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="faulted",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="faulted",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="faulted",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="pool1"} 0
|
node_zfs_zpool_state{state="offline",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="pool2"} 0
|
node_zfs_zpool_state{state="offline",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="offline",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="offline",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="offline",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="online",zpool="pool1"} 1
|
node_zfs_zpool_state{state="online",zpool="pool1"} 1
|
||||||
node_zfs_zpool_state{state="online",zpool="pool2"} 0
|
node_zfs_zpool_state{state="online",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="online",zpool="pool3"} 1
|
||||||
node_zfs_zpool_state{state="online",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="online",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="pool1"} 0
|
node_zfs_zpool_state{state="removed",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="pool2"} 0
|
node_zfs_zpool_state{state="removed",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="removed",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="removed",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="removed",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="pool1"} 0
|
node_zfs_zpool_state{state="suspended",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="pool2"} 1
|
node_zfs_zpool_state{state="suspended",zpool="pool2"} 1
|
||||||
|
node_zfs_zpool_state{state="suspended",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="suspended",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="suspended",zpool="poolz1"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="pool1"} 0
|
node_zfs_zpool_state{state="unavail",zpool="pool1"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="pool2"} 0
|
node_zfs_zpool_state{state="unavail",zpool="pool2"} 0
|
||||||
|
node_zfs_zpool_state{state="unavail",zpool="pool3"} 0
|
||||||
node_zfs_zpool_state{state="unavail",zpool="poolz1"} 0
|
node_zfs_zpool_state{state="unavail",zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
||||||
# TYPE node_zfs_zpool_wcnt untyped
|
# TYPE node_zfs_zpool_wcnt untyped
|
||||||
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
||||||
|
node_zfs_zpool_wcnt{zpool="pool3"} 0
|
||||||
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
||||||
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
||||||
# TYPE node_zfs_zpool_wlentime untyped
|
# TYPE node_zfs_zpool_wlentime untyped
|
||||||
node_zfs_zpool_wlentime{zpool="pool1"} 1.04112268e+08
|
node_zfs_zpool_wlentime{zpool="pool1"} 1.04112268e+08
|
||||||
|
node_zfs_zpool_wlentime{zpool="pool3"} 1.04112268e+08
|
||||||
node_zfs_zpool_wlentime{zpool="poolz1"} 6.472105124093e+12
|
node_zfs_zpool_wlentime{zpool="poolz1"} 6.472105124093e+12
|
||||||
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
||||||
# TYPE node_zfs_zpool_writes untyped
|
# TYPE node_zfs_zpool_writes untyped
|
||||||
node_zfs_zpool_writes{zpool="pool1"} 132
|
node_zfs_zpool_writes{zpool="pool1"} 132
|
||||||
|
node_zfs_zpool_writes{zpool="pool3"} 132
|
||||||
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
||||||
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
||||||
# TYPE node_zfs_zpool_wtime untyped
|
# TYPE node_zfs_zpool_wtime untyped
|
||||||
node_zfs_zpool_wtime{zpool="pool1"} 7.155162e+06
|
node_zfs_zpool_wtime{zpool="pool1"} 7.155162e+06
|
||||||
|
node_zfs_zpool_wtime{zpool="pool3"} 7.155162e+06
|
||||||
node_zfs_zpool_wtime{zpool="poolz1"} 9.673715628e+09
|
node_zfs_zpool_wtime{zpool="poolz1"} 9.673715628e+09
|
||||||
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
||||||
# TYPE node_zfs_zpool_wupdate untyped
|
# TYPE node_zfs_zpool_wupdate untyped
|
||||||
node_zfs_zpool_wupdate{zpool="pool1"} 7.9210489694949e+13
|
node_zfs_zpool_wupdate{zpool="pool1"} 7.9210489694949e+13
|
||||||
|
node_zfs_zpool_wupdate{zpool="pool3"} 7.9210489694949e+13
|
||||||
node_zfs_zpool_wupdate{zpool="poolz1"} 1.10734831833266e+14
|
node_zfs_zpool_wupdate{zpool="poolz1"} 1.10734831833266e+14
|
||||||
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
||||||
# TYPE node_zoneinfo_high_pages gauge
|
# TYPE node_zoneinfo_high_pages gauge
|
||||||
|
|
|
@ -4,6 +4,7 @@ NIC statistics:
|
||||||
rx_packets: 1260062
|
rx_packets: 1260062
|
||||||
tx_errors: 0
|
tx_errors: 0
|
||||||
rx_errors: 0
|
rx_errors: 0
|
||||||
|
port.rx_dropped: 12028
|
||||||
rx_missed: 401
|
rx_missed: 401
|
||||||
align_errors: 0
|
align_errors: 0
|
||||||
tx_single_collisions: 0
|
tx_single_collisions: 0
|
||||||
|
|
3
collector/fixtures/proc/spl/kstat/zfs/pool3/io
Normal file
3
collector/fixtures/proc/spl/kstat/zfs/pool3/io
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
12 3 0x00 1 80 79205351707403 395818011156865
|
||||||
|
nread nwritten reads writes wtime wlentime wupdate rtime rlentime rupdate wcnt rcnt
|
||||||
|
1884160 3206144 22 132 7155162 104112268 79210489694949 24168078 104112268 79210489849220 0 0
|
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-1
Normal file
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-1
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
23 1 0x01 7 2160 221578688875 6665999035587
|
||||||
|
name type data
|
||||||
|
dataset_name 7 pool3
|
||||||
|
writes 4 0
|
||||||
|
nwritten 4 0
|
||||||
|
reads 4 0
|
||||||
|
nread 4 0
|
||||||
|
nunlinks 4 0
|
||||||
|
nunlinked 4 0
|
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-2
Normal file
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-2
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
24 1 0x01 7 2160 221611904716 7145015038451
|
||||||
|
name type data
|
||||||
|
dataset_name 7 pool3/dataset with space
|
||||||
|
writes 4 4
|
||||||
|
nwritten 4 12302
|
||||||
|
reads 4 2
|
||||||
|
nread 4 28
|
||||||
|
nunlinks 4 3
|
||||||
|
nunlinked 4 3
|
1
collector/fixtures/proc/spl/kstat/zfs/pool3/state
Normal file
1
collector/fixtures/proc/spl/kstat/zfs/pool3/state
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ONLINE
|
|
@ -2,6 +2,830 @@
|
||||||
Directory: sys
|
Directory: sys
|
||||||
Mode: 755
|
Mode: 755
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/sda
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/sda/queue
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/add_random
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/chunk_sectors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/dax
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/discard_granularity
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/discard_max_bytes
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/discard_max_hw_bytes
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/discard_zeroes_data
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/fua
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/hw_sector_size
|
||||||
|
Lines: 1
|
||||||
|
512
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/io_poll
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/io_poll_delay
|
||||||
|
Lines: 1
|
||||||
|
-1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/io_timeout
|
||||||
|
Lines: 1
|
||||||
|
30000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/sda/queue/iosched
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/back_seek_max
|
||||||
|
Lines: 1
|
||||||
|
16384
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/back_seek_penalty
|
||||||
|
Lines: 1
|
||||||
|
2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/fifo_expire_async
|
||||||
|
Lines: 1
|
||||||
|
250
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/fifo_expire_sync
|
||||||
|
Lines: 1
|
||||||
|
125
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/low_latency
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/max_budget
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/slice_idle
|
||||||
|
Lines: 1
|
||||||
|
8
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/slice_idle_us
|
||||||
|
Lines: 1
|
||||||
|
8000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/strict_guarantees
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iosched/timeout_sync
|
||||||
|
Lines: 1
|
||||||
|
125
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/iostats
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/logical_block_size
|
||||||
|
Lines: 1
|
||||||
|
512
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_discard_segments
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_hw_sectors_kb
|
||||||
|
Lines: 1
|
||||||
|
32767
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_integrity_segments
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_sectors_kb
|
||||||
|
Lines: 1
|
||||||
|
1280
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_segment_size
|
||||||
|
Lines: 1
|
||||||
|
65536
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/max_segments
|
||||||
|
Lines: 1
|
||||||
|
168
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/minimum_io_size
|
||||||
|
Lines: 1
|
||||||
|
512
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/nomerges
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/nr_requests
|
||||||
|
Lines: 1
|
||||||
|
64
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/nr_zones
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/optimal_io_size
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/physical_block_size
|
||||||
|
Lines: 1
|
||||||
|
512
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/read_ahead_kb
|
||||||
|
Lines: 1
|
||||||
|
128
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/rotational
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/rq_affinity
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/scheduler
|
||||||
|
Lines: 1
|
||||||
|
mq-deadline kyber [bfq] none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/wbt_lat_usec
|
||||||
|
Lines: 1
|
||||||
|
75000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/write_cache
|
||||||
|
Lines: 1
|
||||||
|
write back
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/write_same_max_bytes
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/write_zeroes_max_bytes
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/sda/queue/zoned
|
||||||
|
Lines: 1
|
||||||
|
none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
clean
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
524288
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0/md/dev-sdg
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/dev-sdg/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0/md/dev-sdh
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/dev-sdh/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md0/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md0/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
155f29ff-1716-4107-b362-52307ef86cac
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
clean
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/degraded
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1/md/dev-sdi
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/dev-sdi/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1/md/dev-sdj
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/dev-sdj/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md1/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/sync_action
|
||||||
|
Lines: 1
|
||||||
|
idle
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/sync_completed
|
||||||
|
Lines: 1
|
||||||
|
none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md1/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
0fbf5f2c-add2-43c2-bd78-a4be3ab709ef
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
clean
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
524288
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/degraded
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/dev-sdu
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/dev-sdu/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/dev-sdv
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/dev-sdv/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/dev-sdw
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/dev-sdw/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/dev-sdx
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/dev-sdx/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid10
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
4
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/rd2
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/rd2/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md10/md/rd3
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/rd3/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/sync_action
|
||||||
|
Lines: 1
|
||||||
|
idle
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/sync_completed
|
||||||
|
Lines: 1
|
||||||
|
none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md10/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
0c15f7e7-b159-4b1f-a5cd-a79b5c04b6f5
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
clean
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
524288
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/degraded
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/dev-sdk
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/dev-sdk/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/dev-sdl
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/dev-sdl/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/dev-sdm
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/dev-sdm/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid4
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
3
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md4/md/rd2
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/rd2/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/sync_action
|
||||||
|
Lines: 1
|
||||||
|
idle
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/sync_completed
|
||||||
|
Lines: 1
|
||||||
|
none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md4/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
67f415d5-2c0c-4b69-8e0d-7e20ef553457
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
clean
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
524288
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/degraded
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/dev-sdaa
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/dev-sdaa/state
|
||||||
|
Lines: 1
|
||||||
|
spare
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/dev-sdn
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/dev-sdn/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/dev-sdo
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/dev-sdo/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/dev-sdp
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/dev-sdp/state
|
||||||
|
Lines: 1
|
||||||
|
faulty
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid5
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
3
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md5/md/rd2
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/rd2/state
|
||||||
|
Lines: 1
|
||||||
|
faulty
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/sync_action
|
||||||
|
Lines: 1
|
||||||
|
idle
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/sync_completed
|
||||||
|
Lines: 1
|
||||||
|
none
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md5/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
7615b98d-f2ba-4d99-bee8-6202d8e130b9
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/array_state
|
||||||
|
Lines: 1
|
||||||
|
active
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/chunk_size
|
||||||
|
Lines: 1
|
||||||
|
524288
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/degraded
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/dev-sdq
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/dev-sdq/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/dev-sdr
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/dev-sdr/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/dev-sds
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/dev-sds/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/dev-sdt
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/dev-sdt/state
|
||||||
|
Lines: 1
|
||||||
|
spare
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/level
|
||||||
|
Lines: 1
|
||||||
|
raid6
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/metadata_version
|
||||||
|
Lines: 1
|
||||||
|
1.2
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/raid_disks
|
||||||
|
Lines: 1
|
||||||
|
4
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/rd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/rd0/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/rd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/rd1/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/rd2
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/rd2/state
|
||||||
|
Lines: 1
|
||||||
|
in_sync
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: sys/block/md6/md/rd3
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/rd3/state
|
||||||
|
Lines: 1
|
||||||
|
spare
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/sync_action
|
||||||
|
Lines: 1
|
||||||
|
recover
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/sync_completed
|
||||||
|
Lines: 1
|
||||||
|
1569888 / 2093056
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/block/md6/md/uuid
|
||||||
|
Lines: 1
|
||||||
|
5f529b25-6efd-46e4-99a2-31f6f597be6b
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: sys/bus
|
Directory: sys/bus
|
||||||
Mode: 755
|
Mode: 755
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -437,6 +1261,26 @@ Lines: 1
|
||||||
100000
|
100000
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/class/hwmon/hwmon4/freq1_input
|
||||||
|
Lines: 1
|
||||||
|
214000000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/class/hwmon/hwmon4/freq1_label
|
||||||
|
Lines: 1
|
||||||
|
sclk
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/class/hwmon/hwmon4/freq2_input
|
||||||
|
Lines: 1
|
||||||
|
300000000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: sys/class/hwmon/hwmon4/freq2_label
|
||||||
|
Lines: 1
|
||||||
|
mclk
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Path: sys/class/hwmon/hwmon5
|
Path: sys/class/hwmon/hwmon5
|
||||||
SymlinkTo: ../../devices/platform/bogus.0/hwmon/hwmon5/
|
SymlinkTo: ../../devices/platform/bogus.0/hwmon/hwmon5/
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -44,7 +44,7 @@ var (
|
||||||
hwmonSensorTypes = []string{
|
hwmonSensorTypes = []string{
|
||||||
"vrm", "beep_enable", "update_interval", "in", "cpu", "fan",
|
"vrm", "beep_enable", "update_interval", "in", "cpu", "fan",
|
||||||
"pwm", "temp", "curr", "power", "energy", "humidity",
|
"pwm", "temp", "curr", "power", "energy", "humidity",
|
||||||
"intrusion",
|
"intrusion", "freq",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -357,6 +357,15 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if sensorType == "freq" && element == "input" {
|
||||||
|
if label, ok := sensorData["label"]; ok {
|
||||||
|
sensorLabel := cleanMetricName(label)
|
||||||
|
desc := prometheus.NewDesc(name+"_freq_mhz", "Hardware monitor for GPU frequency in MHz", hwmonLabelDesc, nil)
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
desc, prometheus.GaugeValue, parsedValue/1000000.0, append(labels[:len(labels)-1], sensorLabel)...)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
// fallback, just dump the metric as is
|
// fallback, just dump the metric as is
|
||||||
|
|
||||||
desc := prometheus.NewDesc(name, "Hardware monitor "+sensorType+" element "+element, hwmonLabelDesc, nil)
|
desc := prometheus.NewDesc(name, "Hardware monitor "+sensorType+" element "+element, hwmonLabelDesc, nil)
|
||||||
|
|
|
@ -18,9 +18,10 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"log/slog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type interruptsCollector struct {
|
type interruptsCollector struct {
|
||||||
|
|
|
@ -21,6 +21,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/prometheus/node_exporter/collector/utils"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -49,7 +51,7 @@ func intr(idx _C_int) (itr interrupt, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dev := *(*[128]byte)(unsafe.Pointer(&buf[0]))
|
dev := *(*[128]byte)(unsafe.Pointer(&buf[0]))
|
||||||
itr.device = string(dev[:])
|
itr.device = utils.SafeBytesToString(dev[:])
|
||||||
|
|
||||||
mib[2] = KERN_INTRCNT_VECTOR
|
mib[2] = KERN_INTRCNT_VECTOR
|
||||||
buf, err = sysctl(mib[:])
|
buf, err = sysctl(mib[:])
|
||||||
|
|
|
@ -22,6 +22,8 @@ import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/prometheus/procfs/sysfs"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -98,17 +100,30 @@ var (
|
||||||
[]string{"device"},
|
[]string{"device"},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mdraidDisks = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "md", "raid_disks"),
|
||||||
|
"Number of raid disks on device.",
|
||||||
|
[]string{"device"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
mdraidDegradedDisksDesc = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "md", "degraded"),
|
||||||
|
"Number of degraded disks on device.",
|
||||||
|
[]string{"device"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
procFS, err := procfs.NewFS(*procPath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to open procfs: %w", err)
|
return fmt.Errorf("failed to open procfs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
mdStats, err := fs.MDStat()
|
mdStats, err := procFS.MDStat()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
c.logger.Debug("Not collecting mdstat, file does not exist", "file", *procPath)
|
c.logger.Debug("Not collecting mdstat, file does not exist", "file", *procPath)
|
||||||
|
@ -201,5 +216,34 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sysFS, err := sysfs.NewFS(*sysPath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to open sysfs: %w", err)
|
||||||
|
}
|
||||||
|
mdraids, err := sysFS.Mdraids()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
c.logger.Debug("Not collecting mdraids, file does not exist", "file", *sysPath)
|
||||||
|
return ErrNoData
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("error parsing mdraids: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mdraid := range mdraids {
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
mdraidDisks,
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
float64(mdraid.Disks),
|
||||||
|
mdraid.Device,
|
||||||
|
)
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
mdraidDegradedDisksDesc,
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
float64(mdraid.DegradedDisks),
|
||||||
|
mdraid.Device,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
294
collector/mdadm_linux_test.go
Normal file
294
collector/mdadm_linux_test.go
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build !nomdadm
|
||||||
|
// +build !nomdadm
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/client_golang/prometheus/testutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
type testMdadmCollector struct {
|
||||||
|
mc Collector
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c testMdadmCollector) Collect(ch chan<- prometheus.Metric) {
|
||||||
|
c.mc.Update(ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c testMdadmCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||||
|
prometheus.DescribeByCollect(c, ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTestMdadmCollector(logger *slog.Logger) (prometheus.Collector, error) {
|
||||||
|
mc, err := NewMdadmCollector(logger)
|
||||||
|
if err != nil {
|
||||||
|
return testMdadmCollector{}, err
|
||||||
|
}
|
||||||
|
return &testMdadmCollector{mc}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMdadmStats(t *testing.T) {
|
||||||
|
*sysPath = "fixtures/sys"
|
||||||
|
*procPath = "fixtures/proc"
|
||||||
|
testcase := `# HELP node_md_blocks Total number of blocks on device.
|
||||||
|
# TYPE node_md_blocks gauge
|
||||||
|
node_md_blocks{device="md0"} 248896
|
||||||
|
node_md_blocks{device="md00"} 4.186624e+06
|
||||||
|
node_md_blocks{device="md10"} 3.14159265e+08
|
||||||
|
node_md_blocks{device="md101"} 322560
|
||||||
|
node_md_blocks{device="md11"} 4.190208e+06
|
||||||
|
node_md_blocks{device="md12"} 3.886394368e+09
|
||||||
|
node_md_blocks{device="md120"} 2.095104e+06
|
||||||
|
node_md_blocks{device="md126"} 1.855870976e+09
|
||||||
|
node_md_blocks{device="md127"} 3.12319552e+08
|
||||||
|
node_md_blocks{device="md201"} 1.993728e+06
|
||||||
|
node_md_blocks{device="md219"} 7932
|
||||||
|
node_md_blocks{device="md3"} 5.853468288e+09
|
||||||
|
node_md_blocks{device="md4"} 4.883648e+06
|
||||||
|
node_md_blocks{device="md6"} 1.95310144e+08
|
||||||
|
node_md_blocks{device="md7"} 7.813735424e+09
|
||||||
|
node_md_blocks{device="md8"} 1.95310144e+08
|
||||||
|
node_md_blocks{device="md9"} 523968
|
||||||
|
# HELP node_md_blocks_synced Number of blocks synced on device.
|
||||||
|
# TYPE node_md_blocks_synced gauge
|
||||||
|
node_md_blocks_synced{device="md0"} 248896
|
||||||
|
node_md_blocks_synced{device="md00"} 4.186624e+06
|
||||||
|
node_md_blocks_synced{device="md10"} 3.14159265e+08
|
||||||
|
node_md_blocks_synced{device="md101"} 322560
|
||||||
|
node_md_blocks_synced{device="md11"} 0
|
||||||
|
node_md_blocks_synced{device="md12"} 3.886394368e+09
|
||||||
|
node_md_blocks_synced{device="md120"} 2.095104e+06
|
||||||
|
node_md_blocks_synced{device="md126"} 1.855870976e+09
|
||||||
|
node_md_blocks_synced{device="md127"} 3.12319552e+08
|
||||||
|
node_md_blocks_synced{device="md201"} 114176
|
||||||
|
node_md_blocks_synced{device="md219"} 7932
|
||||||
|
node_md_blocks_synced{device="md3"} 5.853468288e+09
|
||||||
|
node_md_blocks_synced{device="md4"} 4.883648e+06
|
||||||
|
node_md_blocks_synced{device="md6"} 1.6775552e+07
|
||||||
|
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||||
|
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||||
|
node_md_blocks_synced{device="md9"} 0
|
||||||
|
# HELP node_md_degraded Number of degraded disks on device.
|
||||||
|
# TYPE node_md_degraded gauge
|
||||||
|
node_md_degraded{device="md0"} 0
|
||||||
|
node_md_degraded{device="md1"} 0
|
||||||
|
node_md_degraded{device="md10"} 0
|
||||||
|
node_md_degraded{device="md4"} 0
|
||||||
|
node_md_degraded{device="md5"} 1
|
||||||
|
node_md_degraded{device="md6"} 1
|
||||||
|
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||||
|
# TYPE node_md_disks gauge
|
||||||
|
node_md_disks{device="md0",state="active"} 2
|
||||||
|
node_md_disks{device="md0",state="failed"} 0
|
||||||
|
node_md_disks{device="md0",state="spare"} 0
|
||||||
|
node_md_disks{device="md00",state="active"} 1
|
||||||
|
node_md_disks{device="md00",state="failed"} 0
|
||||||
|
node_md_disks{device="md00",state="spare"} 0
|
||||||
|
node_md_disks{device="md10",state="active"} 2
|
||||||
|
node_md_disks{device="md10",state="failed"} 0
|
||||||
|
node_md_disks{device="md10",state="spare"} 0
|
||||||
|
node_md_disks{device="md101",state="active"} 3
|
||||||
|
node_md_disks{device="md101",state="failed"} 0
|
||||||
|
node_md_disks{device="md101",state="spare"} 0
|
||||||
|
node_md_disks{device="md11",state="active"} 2
|
||||||
|
node_md_disks{device="md11",state="failed"} 1
|
||||||
|
node_md_disks{device="md11",state="spare"} 2
|
||||||
|
node_md_disks{device="md12",state="active"} 2
|
||||||
|
node_md_disks{device="md12",state="failed"} 0
|
||||||
|
node_md_disks{device="md12",state="spare"} 0
|
||||||
|
node_md_disks{device="md120",state="active"} 2
|
||||||
|
node_md_disks{device="md120",state="failed"} 0
|
||||||
|
node_md_disks{device="md120",state="spare"} 0
|
||||||
|
node_md_disks{device="md126",state="active"} 2
|
||||||
|
node_md_disks{device="md126",state="failed"} 0
|
||||||
|
node_md_disks{device="md126",state="spare"} 0
|
||||||
|
node_md_disks{device="md127",state="active"} 2
|
||||||
|
node_md_disks{device="md127",state="failed"} 0
|
||||||
|
node_md_disks{device="md127",state="spare"} 0
|
||||||
|
node_md_disks{device="md201",state="active"} 2
|
||||||
|
node_md_disks{device="md201",state="failed"} 0
|
||||||
|
node_md_disks{device="md201",state="spare"} 0
|
||||||
|
node_md_disks{device="md219",state="active"} 0
|
||||||
|
node_md_disks{device="md219",state="failed"} 0
|
||||||
|
node_md_disks{device="md219",state="spare"} 3
|
||||||
|
node_md_disks{device="md3",state="active"} 8
|
||||||
|
node_md_disks{device="md3",state="failed"} 0
|
||||||
|
node_md_disks{device="md3",state="spare"} 2
|
||||||
|
node_md_disks{device="md4",state="active"} 0
|
||||||
|
node_md_disks{device="md4",state="failed"} 1
|
||||||
|
node_md_disks{device="md4",state="spare"} 1
|
||||||
|
node_md_disks{device="md6",state="active"} 1
|
||||||
|
node_md_disks{device="md6",state="failed"} 1
|
||||||
|
node_md_disks{device="md6",state="spare"} 1
|
||||||
|
node_md_disks{device="md7",state="active"} 3
|
||||||
|
node_md_disks{device="md7",state="failed"} 1
|
||||||
|
node_md_disks{device="md7",state="spare"} 0
|
||||||
|
node_md_disks{device="md8",state="active"} 2
|
||||||
|
node_md_disks{device="md8",state="failed"} 0
|
||||||
|
node_md_disks{device="md8",state="spare"} 2
|
||||||
|
node_md_disks{device="md9",state="active"} 4
|
||||||
|
node_md_disks{device="md9",state="failed"} 2
|
||||||
|
node_md_disks{device="md9",state="spare"} 1
|
||||||
|
# HELP node_md_disks_required Total number of disks of device.
|
||||||
|
# TYPE node_md_disks_required gauge
|
||||||
|
node_md_disks_required{device="md0"} 2
|
||||||
|
node_md_disks_required{device="md00"} 1
|
||||||
|
node_md_disks_required{device="md10"} 2
|
||||||
|
node_md_disks_required{device="md101"} 3
|
||||||
|
node_md_disks_required{device="md11"} 2
|
||||||
|
node_md_disks_required{device="md12"} 2
|
||||||
|
node_md_disks_required{device="md120"} 2
|
||||||
|
node_md_disks_required{device="md126"} 2
|
||||||
|
node_md_disks_required{device="md127"} 2
|
||||||
|
node_md_disks_required{device="md201"} 2
|
||||||
|
node_md_disks_required{device="md219"} 0
|
||||||
|
node_md_disks_required{device="md3"} 8
|
||||||
|
node_md_disks_required{device="md4"} 0
|
||||||
|
node_md_disks_required{device="md6"} 2
|
||||||
|
node_md_disks_required{device="md7"} 4
|
||||||
|
node_md_disks_required{device="md8"} 2
|
||||||
|
node_md_disks_required{device="md9"} 4
|
||||||
|
# HELP node_md_raid_disks Number of raid disks on device.
|
||||||
|
# TYPE node_md_raid_disks gauge
|
||||||
|
node_md_raid_disks{device="md0"} 2
|
||||||
|
node_md_raid_disks{device="md1"} 2
|
||||||
|
node_md_raid_disks{device="md10"} 4
|
||||||
|
node_md_raid_disks{device="md4"} 3
|
||||||
|
node_md_raid_disks{device="md5"} 3
|
||||||
|
node_md_raid_disks{device="md6"} 4
|
||||||
|
# HELP node_md_state Indicates the state of md-device.
|
||||||
|
# TYPE node_md_state gauge
|
||||||
|
node_md_state{device="md0",state="active"} 1
|
||||||
|
node_md_state{device="md0",state="check"} 0
|
||||||
|
node_md_state{device="md0",state="inactive"} 0
|
||||||
|
node_md_state{device="md0",state="recovering"} 0
|
||||||
|
node_md_state{device="md0",state="resync"} 0
|
||||||
|
node_md_state{device="md00",state="active"} 1
|
||||||
|
node_md_state{device="md00",state="check"} 0
|
||||||
|
node_md_state{device="md00",state="inactive"} 0
|
||||||
|
node_md_state{device="md00",state="recovering"} 0
|
||||||
|
node_md_state{device="md00",state="resync"} 0
|
||||||
|
node_md_state{device="md10",state="active"} 1
|
||||||
|
node_md_state{device="md10",state="check"} 0
|
||||||
|
node_md_state{device="md10",state="inactive"} 0
|
||||||
|
node_md_state{device="md10",state="recovering"} 0
|
||||||
|
node_md_state{device="md10",state="resync"} 0
|
||||||
|
node_md_state{device="md101",state="active"} 1
|
||||||
|
node_md_state{device="md101",state="check"} 0
|
||||||
|
node_md_state{device="md101",state="inactive"} 0
|
||||||
|
node_md_state{device="md101",state="recovering"} 0
|
||||||
|
node_md_state{device="md101",state="resync"} 0
|
||||||
|
node_md_state{device="md11",state="active"} 0
|
||||||
|
node_md_state{device="md11",state="check"} 0
|
||||||
|
node_md_state{device="md11",state="inactive"} 0
|
||||||
|
node_md_state{device="md11",state="recovering"} 0
|
||||||
|
node_md_state{device="md11",state="resync"} 1
|
||||||
|
node_md_state{device="md12",state="active"} 1
|
||||||
|
node_md_state{device="md12",state="check"} 0
|
||||||
|
node_md_state{device="md12",state="inactive"} 0
|
||||||
|
node_md_state{device="md12",state="recovering"} 0
|
||||||
|
node_md_state{device="md12",state="resync"} 0
|
||||||
|
node_md_state{device="md120",state="active"} 1
|
||||||
|
node_md_state{device="md120",state="check"} 0
|
||||||
|
node_md_state{device="md120",state="inactive"} 0
|
||||||
|
node_md_state{device="md120",state="recovering"} 0
|
||||||
|
node_md_state{device="md120",state="resync"} 0
|
||||||
|
node_md_state{device="md126",state="active"} 1
|
||||||
|
node_md_state{device="md126",state="check"} 0
|
||||||
|
node_md_state{device="md126",state="inactive"} 0
|
||||||
|
node_md_state{device="md126",state="recovering"} 0
|
||||||
|
node_md_state{device="md126",state="resync"} 0
|
||||||
|
node_md_state{device="md127",state="active"} 1
|
||||||
|
node_md_state{device="md127",state="check"} 0
|
||||||
|
node_md_state{device="md127",state="inactive"} 0
|
||||||
|
node_md_state{device="md127",state="recovering"} 0
|
||||||
|
node_md_state{device="md127",state="resync"} 0
|
||||||
|
node_md_state{device="md201",state="active"} 0
|
||||||
|
node_md_state{device="md201",state="check"} 1
|
||||||
|
node_md_state{device="md201",state="inactive"} 0
|
||||||
|
node_md_state{device="md201",state="recovering"} 0
|
||||||
|
node_md_state{device="md201",state="resync"} 0
|
||||||
|
node_md_state{device="md219",state="active"} 0
|
||||||
|
node_md_state{device="md219",state="check"} 0
|
||||||
|
node_md_state{device="md219",state="inactive"} 1
|
||||||
|
node_md_state{device="md219",state="recovering"} 0
|
||||||
|
node_md_state{device="md219",state="resync"} 0
|
||||||
|
node_md_state{device="md3",state="active"} 1
|
||||||
|
node_md_state{device="md3",state="check"} 0
|
||||||
|
node_md_state{device="md3",state="inactive"} 0
|
||||||
|
node_md_state{device="md3",state="recovering"} 0
|
||||||
|
node_md_state{device="md3",state="resync"} 0
|
||||||
|
node_md_state{device="md4",state="active"} 0
|
||||||
|
node_md_state{device="md4",state="check"} 0
|
||||||
|
node_md_state{device="md4",state="inactive"} 1
|
||||||
|
node_md_state{device="md4",state="recovering"} 0
|
||||||
|
node_md_state{device="md4",state="resync"} 0
|
||||||
|
node_md_state{device="md6",state="active"} 0
|
||||||
|
node_md_state{device="md6",state="check"} 0
|
||||||
|
node_md_state{device="md6",state="inactive"} 0
|
||||||
|
node_md_state{device="md6",state="recovering"} 1
|
||||||
|
node_md_state{device="md6",state="resync"} 0
|
||||||
|
node_md_state{device="md7",state="active"} 1
|
||||||
|
node_md_state{device="md7",state="check"} 0
|
||||||
|
node_md_state{device="md7",state="inactive"} 0
|
||||||
|
node_md_state{device="md7",state="recovering"} 0
|
||||||
|
node_md_state{device="md7",state="resync"} 0
|
||||||
|
node_md_state{device="md8",state="active"} 0
|
||||||
|
node_md_state{device="md8",state="check"} 0
|
||||||
|
node_md_state{device="md8",state="inactive"} 0
|
||||||
|
node_md_state{device="md8",state="recovering"} 0
|
||||||
|
node_md_state{device="md8",state="resync"} 1
|
||||||
|
node_md_state{device="md9",state="active"} 0
|
||||||
|
node_md_state{device="md9",state="check"} 0
|
||||||
|
node_md_state{device="md9",state="inactive"} 0
|
||||||
|
node_md_state{device="md9",state="recovering"} 0
|
||||||
|
node_md_state{device="md9",state="resync"} 1
|
||||||
|
`
|
||||||
|
logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
||||||
|
Level: slog.LevelError,
|
||||||
|
AddSource: true,
|
||||||
|
}))
|
||||||
|
collector, err := NewMdadmCollector(logger)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
c, err := NewTestMdadmCollector(logger)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
reg := prometheus.NewRegistry()
|
||||||
|
reg.MustRegister(c)
|
||||||
|
|
||||||
|
sink := make(chan prometheus.Metric)
|
||||||
|
go func() {
|
||||||
|
err := collector.Update(sink)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
close(sink)
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = testutil.GatherAndCompare(reg, strings.NewReader(testcase))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,5 +43,9 @@ func (c *meminfoCollector) getMemInfo() (map[string]float64, error) {
|
||||||
"total_bytes": float64(stats.RealTotal * 4096),
|
"total_bytes": float64(stats.RealTotal * 4096),
|
||||||
"free_bytes": float64(stats.RealFree * 4096),
|
"free_bytes": float64(stats.RealFree * 4096),
|
||||||
"available_bytes": float64(stats.RealAvailable * 4096),
|
"available_bytes": float64(stats.RealAvailable * 4096),
|
||||||
|
"process_bytes": float64(stats.RealProcess * 4096),
|
||||||
|
"paging_space_total_bytes": float64(stats.PgSpTotal * 4096),
|
||||||
|
"paging_space_free_bytes": float64(stats.PgSpFree * 4096),
|
||||||
|
"page_scans_total": float64(stats.Scans),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,16 +32,20 @@ func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, err
|
||||||
|
|
||||||
for _, stat := range stats {
|
for _, stat := range stats {
|
||||||
netDev[stat.Name] = map[string]uint64{
|
netDev[stat.Name] = map[string]uint64{
|
||||||
"receive_packets": uint64(stat.RxPackets),
|
|
||||||
"transmit_packets": uint64(stat.TxPackets),
|
|
||||||
"receive_bytes": uint64(stat.RxBytes),
|
"receive_bytes": uint64(stat.RxBytes),
|
||||||
"transmit_bytes": uint64(stat.TxBytes),
|
|
||||||
"receive_errors": uint64(stat.RxErrors),
|
|
||||||
"transmit_errors": uint64(stat.TxErrors),
|
|
||||||
"receive_dropped": uint64(stat.RxPacketsDropped),
|
"receive_dropped": uint64(stat.RxPacketsDropped),
|
||||||
"transmit_dropped": uint64(stat.TxPacketsDropped),
|
"receive_errors": uint64(stat.RxErrors),
|
||||||
"receive_multicast": uint64(stat.RxMulticastPackets),
|
"receive_multicast": uint64(stat.RxMulticastPackets),
|
||||||
|
"receive_packets": uint64(stat.RxPackets),
|
||||||
|
"receive_collision_errors": uint64(stat.RxCollisionErrors),
|
||||||
|
"transmit_bytes": uint64(stat.TxBytes),
|
||||||
|
"transmit_dropped": uint64(stat.TxPacketsDropped),
|
||||||
|
"transmit_errors": uint64(stat.TxErrors),
|
||||||
"transmit_multicast": uint64(stat.TxMulticastPackets),
|
"transmit_multicast": uint64(stat.TxMulticastPackets),
|
||||||
|
"transmit_packets": uint64(stat.TxPackets),
|
||||||
|
"transmit_queue_overflow": uint64(stat.TxQueueOverflow),
|
||||||
|
"transmit_collision_single_errors": uint64(stat.TxSingleCollisionCount),
|
||||||
|
"transmit_collision_multiple_errors": uint64(stat.TxMultipleCollisionCount),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net"
|
"net"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -71,51 +72,107 @@ func getIfaceData(index int) (*ifMsghdr2, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = binary.Read(bytes.NewReader(rawData), binary.LittleEndian, &data)
|
err = binary.Read(bytes.NewReader(rawData), binary.LittleEndian, &data)
|
||||||
|
if err != nil {
|
||||||
|
return &data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
As of macOS Ventura 13.2.1, there’s a kernel bug which truncates traffic values at the 4GiB mark.
|
||||||
|
This is a workaround to fetch the interface traffic metrics using a sysctl call.
|
||||||
|
Apple wants to prevent fingerprinting by 3rdparty apps and might fix this bug in future which would break this implementation.
|
||||||
|
*/
|
||||||
|
mib := []int32{
|
||||||
|
unix.CTL_NET,
|
||||||
|
unix.AF_LINK,
|
||||||
|
0, // NETLINK_GENERIC: functions not specific to a type of iface
|
||||||
|
2, //IFMIB_IFDATA: per-interface data table
|
||||||
|
int32(index),
|
||||||
|
1, // IFDATA_GENERAL: generic stats for all kinds of ifaces
|
||||||
|
}
|
||||||
|
|
||||||
|
var mibData ifMibData
|
||||||
|
size := unsafe.Sizeof(mibData)
|
||||||
|
|
||||||
|
if _, _, errno := unix.Syscall6(
|
||||||
|
unix.SYS___SYSCTL,
|
||||||
|
uintptr(unsafe.Pointer(&mib[0])),
|
||||||
|
uintptr(len(mib)),
|
||||||
|
uintptr(unsafe.Pointer(&mibData)),
|
||||||
|
uintptr(unsafe.Pointer(&size)),
|
||||||
|
uintptr(unsafe.Pointer(nil)),
|
||||||
|
0,
|
||||||
|
); errno != 0 {
|
||||||
|
return &data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var ifdata ifData64
|
||||||
|
err = binary.Read(bytes.NewReader(mibData.Data[:]), binary.LittleEndian, &ifdata)
|
||||||
|
if err != nil {
|
||||||
|
return &data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Data.Ibytes = ifdata.Ibytes
|
||||||
|
data.Data.Obytes = ifdata.Obytes
|
||||||
return &data, err
|
return &data, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if.h#L220-L232
|
||||||
type ifMsghdr2 struct {
|
type ifMsghdr2 struct {
|
||||||
Msglen uint16
|
Msglen uint16 // to skip over non-understood messages
|
||||||
Version uint8
|
Version uint8 // future binary compatabilit
|
||||||
Type uint8
|
Type uint8 // message type
|
||||||
Addrs int32
|
Addrs int32 // like rtm_addrs
|
||||||
Flags int32
|
Flags int32 // value of if_flags
|
||||||
Index uint16
|
Index uint16 // index for associated ifp
|
||||||
_ [2]byte
|
_ [2]byte // padding for alignment
|
||||||
SndLen int32
|
SndLen int32 // instantaneous length of send queue
|
||||||
SndMaxlen int32
|
SndMaxlen int32 // maximum length of send queue
|
||||||
SndDrops int32
|
SndDrops int32 // number of drops in send queue
|
||||||
Timer int32
|
Timer int32 // time until if_watchdog called
|
||||||
Data ifData64
|
Data ifData64 // statistics and other data
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/apple/darwin-xnu/blob/main/bsd/net/if_var.h#L199-L231
|
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if_var.h#L207-L235
|
||||||
type ifData64 struct {
|
type ifData64 struct {
|
||||||
Type uint8
|
Type uint8 // ethernet, tokenring, etc
|
||||||
Typelen uint8
|
Typelen uint8 // Length of frame type id
|
||||||
Physical uint8
|
Physical uint8 // e.g., AUI, Thinnet, 10base-T, etc
|
||||||
Addrlen uint8
|
Addrlen uint8 // media address length
|
||||||
Hdrlen uint8
|
Hdrlen uint8 // media header length
|
||||||
Recvquota uint8
|
Recvquota uint8 // polling quota for receive intrs
|
||||||
Xmitquota uint8
|
Xmitquota uint8 // polling quota for xmit intrs
|
||||||
Unused1 uint8
|
Unused1 uint8 // for future use
|
||||||
Mtu uint32
|
Mtu uint32 // maximum transmission unit
|
||||||
Metric uint32
|
Metric uint32 // routing metric (external only)
|
||||||
Baudrate uint64
|
Baudrate uint64 // linespeed
|
||||||
Ipackets uint64
|
|
||||||
Ierrors uint64
|
// volatile statistics
|
||||||
Opackets uint64
|
Ipackets uint64 // packets received on interface
|
||||||
Oerrors uint64
|
Ierrors uint64 // input errors on interface
|
||||||
Collisions uint64
|
Opackets uint64 // packets sent on interface
|
||||||
Ibytes uint64
|
Oerrors uint64 // output errors on interface
|
||||||
Obytes uint64
|
Collisions uint64 // collisions on csma interfaces
|
||||||
Imcasts uint64
|
Ibytes uint64 // total number of octets received
|
||||||
Omcasts uint64
|
Obytes uint64 // total number of octets sent
|
||||||
Iqdrops uint64
|
Imcasts uint64 // packets received via multicast
|
||||||
Noproto uint64
|
Omcasts uint64 // packets sent via multicast
|
||||||
Recvtiming uint32
|
Iqdrops uint64 // dropped on input, this interface
|
||||||
Xmittiming uint32
|
Noproto uint64 // destined for unsupported protocol
|
||||||
Lastchange unix.Timeval32
|
Recvtiming uint32 // usec spent receiving when timing
|
||||||
|
Xmittiming uint32 // usec spent xmitting when timing
|
||||||
|
Lastchange unix.Timeval32 // time of last administrative change
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if_mib.h#L65-L74
|
||||||
|
type ifMibData struct {
|
||||||
|
Name [16]byte // name of interface
|
||||||
|
PCount uint32 // number of promiscuous listeners
|
||||||
|
Flags uint32 // interface flags
|
||||||
|
SendLength uint32 // instantaneous length of send queue
|
||||||
|
MaxSendLength uint32 // maximum length of send queue
|
||||||
|
SendDrops uint32 // number of drops in send queue
|
||||||
|
_ [4]uint32 // for future expansion
|
||||||
|
Data [128]byte // generic information and statistics
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNetDevLabels() (map[string]map[string]string, error) {
|
func getNetDevLabels() (map[string]map[string]string, error) {
|
||||||
|
|
86
collector/netinterface_aix.go
Normal file
86
collector/netinterface_aix.go
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
// Copyright 2025 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build !nonetinterface
|
||||||
|
// +build !nonetinterface
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type netinterfaceCollector struct {
|
||||||
|
logger *slog.Logger
|
||||||
|
collisions *prometheus.Desc
|
||||||
|
ibytes *prometheus.Desc
|
||||||
|
ipackets *prometheus.Desc
|
||||||
|
obytes *prometheus.Desc
|
||||||
|
opackets *prometheus.Desc
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
netinterfaceSubsystem = "netinterface"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("netinterface", defaultEnabled, NewNetinterfaceCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNetinterfaceCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
labels := []string{"interface"}
|
||||||
|
return &netinterfaceCollector{
|
||||||
|
logger: logger,
|
||||||
|
collisions: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "collisions_total"),
|
||||||
|
"Total number of CSMA collisions on the interface.", labels, nil,
|
||||||
|
),
|
||||||
|
ibytes: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "receive_bytes_total"),
|
||||||
|
"Total number of bytes received on the interface.", labels, nil,
|
||||||
|
),
|
||||||
|
ipackets: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "receive_packets_total"),
|
||||||
|
"Total number of packets received on the interface.", labels, nil,
|
||||||
|
),
|
||||||
|
obytes: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "transmit_bytes_total"),
|
||||||
|
"Total number of bytes transmitted on the interface.", labels, nil,
|
||||||
|
),
|
||||||
|
opackets: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "transmit_packets_total"),
|
||||||
|
"Total number of packets transmitted on the interface.", labels, nil,
|
||||||
|
),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netinterfaceCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
stats, err := perfstat.NetIfaceStat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, stat := range stats {
|
||||||
|
iface := stat.Name
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.collisions, prometheus.CounterValue, float64(stat.Collisions), iface)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.ibytes, prometheus.CounterValue, float64(stat.IBytes), iface)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.ipackets, prometheus.CounterValue, float64(stat.IPackets), iface)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.obytes, prometheus.CounterValue, float64(stat.OBytes), iface)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.opackets, prometheus.CounterValue, float64(stat.OPackets), iface)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
108
collector/netstat_freebsd.go
Normal file
108
collector/netstat_freebsd.go
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build freebsd
|
||||||
|
// +build freebsd
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <netinet/tcp_var.h>
|
||||||
|
#include <netinet/udp.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
var (
|
||||||
|
bsdNetstatTcpSendPacketsTotal = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "netstat", "tcp_transmit_packets_total"),
|
||||||
|
"TCP packets sent",
|
||||||
|
nil, nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
bsdNetstatTcpRecvPacketsTotal = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "netstat", "tcp_receive_packets_total"),
|
||||||
|
"TCP packets received",
|
||||||
|
nil, nil,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
type netStatCollector struct {
|
||||||
|
netStatMetric *prometheus.Desc
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("netstat", defaultEnabled, NewNetStatCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNetStatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
return &netStatCollector{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netStatCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||||
|
ch <- c.netStatMetric
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netStatCollector) Collect(ch chan<- prometheus.Metric) {
|
||||||
|
_ = c.Update(ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getData(queryString string) ([]byte, error) {
|
||||||
|
data, err := unix.SysctlRaw(queryString)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(data) < int(unsafe.Sizeof(C.struct_tcpstat{})) {
|
||||||
|
return nil, errors.New("Data Size mismatch")
|
||||||
|
}
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
|
tcpData, err := getData("net.inet.tcp.stats")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tcpStats := *(*C.struct_tcpstat)(unsafe.Pointer(&tcpData[0]))
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
bsdNetstatTcpSendPacketsTotal,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
float64(tcpStats.tcps_sndtotal),
|
||||||
|
)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
bsdNetstatTcpRecvPacketsTotal,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
float64(tcpStats.tcps_rcvtotal),
|
||||||
|
)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
77
collector/netstat_freebsd_test.go
Normal file
77
collector/netstat_freebsd_test.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build freebsd
|
||||||
|
// +build freebsd
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
"testing"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNetStatCollectorDescribe(t *testing.T) {
|
||||||
|
ch := make(chan *prometheus.Desc, 1)
|
||||||
|
collector := &netStatCollector{
|
||||||
|
netStatMetric: prometheus.NewDesc("dummy_metric", "dummy", nil, nil),
|
||||||
|
}
|
||||||
|
collector.Describe(ch)
|
||||||
|
desc := <-ch
|
||||||
|
|
||||||
|
if want, got := "dummy_metric", desc.String(); want != got {
|
||||||
|
t.Errorf("want %s, got %s", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetData(t *testing.T) {
|
||||||
|
data, err := getData("net.inet.tcp.stats")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("unexpected error:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, want := len(data), int(unsafe.Sizeof(unix.TCPStats{})); got < want {
|
||||||
|
t.Errorf("data length too small: want >= %d, got %d", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNetStatCollectorUpdate(t *testing.T) {
|
||||||
|
ch := make(chan prometheus.Metric, len(metrics))
|
||||||
|
collector := &netStatCollector{
|
||||||
|
netStatMetric: prometheus.NewDesc("netstat_metric", "NetStat Metric", nil, nil),
|
||||||
|
}
|
||||||
|
err := collector.Update(ch)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("unexpected error:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, want := len(ch), len(metrics); got != want {
|
||||||
|
t.Errorf("metric count mismatch: want %d, got %d", want, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
for range metrics {
|
||||||
|
<-ch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewNetStatCollector(t *testing.T) {
|
||||||
|
collector, err := NewNetStatCollector(nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("unexpected error:", err)
|
||||||
|
}
|
||||||
|
if collector == nil {
|
||||||
|
t.Fatal("collector is nil, want non-nil")
|
||||||
|
}
|
||||||
|
}
|
118
collector/partition_aix.go
Normal file
118
collector/partition_aix.go
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
// Copyright 2025 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build !nopartition
|
||||||
|
// +build !nopartition
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type partitionCollector struct {
|
||||||
|
logger *slog.Logger
|
||||||
|
entitledCapacity *prometheus.Desc
|
||||||
|
memoryMax *prometheus.Desc
|
||||||
|
memoryOnline *prometheus.Desc
|
||||||
|
cpuOnline *prometheus.Desc
|
||||||
|
cpuSys *prometheus.Desc
|
||||||
|
cpuPool *prometheus.Desc
|
||||||
|
powerSaveMode *prometheus.Desc
|
||||||
|
smtThreads *prometheus.Desc
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
partitionCollectorSubsystem = "partition"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("partition", defaultEnabled, NewPartitionCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPartitionCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
return &partitionCollector{
|
||||||
|
logger: logger,
|
||||||
|
entitledCapacity: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "entitled_capacity"),
|
||||||
|
"Entitled processor capacity of the partition in CPU units (e.g. 1.0 = one core).",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
memoryMax: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "memory_max"),
|
||||||
|
"Maximum memory of the partition in bytes.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
memoryOnline: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "memory_online"),
|
||||||
|
"Online memory of the partition in bytes.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
cpuOnline: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_online"),
|
||||||
|
"Number of online CPUs in the partition.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
cpuSys: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_sys"),
|
||||||
|
"Number of physical CPUs in the system.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
cpuPool: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_pool"),
|
||||||
|
"Number of physical CPUs in the pool.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
powerSaveMode: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "power_save_mode"),
|
||||||
|
"Power save mode of the partition (1 for enabled, 0 for disabled).",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
smtThreads: prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "smt_threads"),
|
||||||
|
"Number of SMT threads per core.",
|
||||||
|
nil, nil,
|
||||||
|
),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *partitionCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
stats, err := perfstat.PartitionStat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
powerSaveMode := 0.0
|
||||||
|
if stats.Conf.PowerSave {
|
||||||
|
powerSaveMode = 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.entitledCapacity, prometheus.GaugeValue, float64(stats.EntCapacity)/100.0)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.memoryMax, prometheus.GaugeValue, float64(stats.Mem.Max)*1024*1024)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.memoryOnline, prometheus.GaugeValue, float64(stats.Mem.Online)*1024*1024)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.cpuOnline, prometheus.GaugeValue, float64(stats.VCpus.Online))
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.cpuSys, prometheus.GaugeValue, float64(stats.NumProcessors.Online))
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.cpuPool, prometheus.GaugeValue, float64(stats.ActiveCpusInPool))
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.powerSaveMode, prometheus.GaugeValue, powerSaveMode)
|
||||||
|
ch <- prometheus.MustNewConstMetric(c.smtThreads, prometheus.GaugeValue, float64(stats.SmtThreads))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -27,8 +27,15 @@ import (
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
psiResourceCPU = "cpu"
|
||||||
|
psiResourceIO = "io"
|
||||||
|
psiResourceMemory = "memory"
|
||||||
|
psiResourceIRQ = "irq"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
psiResources = []string{"cpu", "io", "memory", "irq"}
|
psiResources = []string{psiResourceCPU, psiResourceIO, psiResourceMemory, psiResourceIRQ}
|
||||||
)
|
)
|
||||||
|
|
||||||
type pressureStatsCollector struct {
|
type pressureStatsCollector struct {
|
||||||
|
@ -93,13 +100,18 @@ func NewPressureStatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
|
||||||
// Update calls procfs.NewPSIStatsForResource for the different resources and updates the values
|
// Update calls procfs.NewPSIStatsForResource for the different resources and updates the values
|
||||||
func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
foundResources := 0
|
||||||
for _, res := range psiResources {
|
for _, res := range psiResources {
|
||||||
c.logger.Debug("collecting statistics for resource", "resource", res)
|
c.logger.Debug("collecting statistics for resource", "resource", res)
|
||||||
vals, err := c.fs.PSIStatsForResource(res)
|
vals, err := c.fs.PSIStatsForResource(res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) && res != psiResourceIRQ {
|
||||||
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel")
|
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel", "resource", res)
|
||||||
return ErrNoData
|
continue
|
||||||
|
}
|
||||||
|
if errors.Is(err, os.ErrNotExist) && res == psiResourceIRQ {
|
||||||
|
c.logger.Debug("IRQ pressure information is unavailable, you need a Linux kernel >= 6.1 and/or CONFIG_PSI enabled for your kernel", "resource", res)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if errors.Is(err, syscall.ENOTSUP) {
|
if errors.Is(err, syscall.ENOTSUP) {
|
||||||
c.logger.Debug("pressure information is disabled, add psi=1 kernel command line to enable it")
|
c.logger.Debug("pressure information is disabled, add psi=1 kernel command line to enable it")
|
||||||
|
@ -109,28 +121,35 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
// IRQ pressure does not have 'some' data.
|
// IRQ pressure does not have 'some' data.
|
||||||
// See https://github.com/torvalds/linux/blob/v6.9/include/linux/psi_types.h#L65
|
// See https://github.com/torvalds/linux/blob/v6.9/include/linux/psi_types.h#L65
|
||||||
if vals.Some == nil && res != "irq" {
|
if vals.Some == nil && res != psiResourceIRQ {
|
||||||
c.logger.Debug("pressure information returned no 'some' data")
|
c.logger.Debug("pressure information returned no 'some' data")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
if vals.Full == nil && res != "cpu" {
|
if vals.Full == nil && res != psiResourceCPU {
|
||||||
c.logger.Debug("pressure information returned no 'full' data")
|
c.logger.Debug("pressure information returned no 'full' data")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
switch res {
|
switch res {
|
||||||
case "cpu":
|
case psiResourceCPU:
|
||||||
ch <- prometheus.MustNewConstMetric(c.cpu, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.cpu, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||||
case "io":
|
case psiResourceIO:
|
||||||
ch <- prometheus.MustNewConstMetric(c.io, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.io, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||||
ch <- prometheus.MustNewConstMetric(c.ioFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.ioFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||||
case "memory":
|
case psiResourceMemory:
|
||||||
ch <- prometheus.MustNewConstMetric(c.mem, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.mem, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||||
ch <- prometheus.MustNewConstMetric(c.memFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.memFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||||
case "irq":
|
case psiResourceIRQ:
|
||||||
ch <- prometheus.MustNewConstMetric(c.irqFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
ch <- prometheus.MustNewConstMetric(c.irqFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||||
default:
|
default:
|
||||||
c.logger.Debug("did not account for resource", "resource", res)
|
c.logger.Debug("did not account for resource", "resource", res)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
foundResources++
|
||||||
|
}
|
||||||
|
|
||||||
|
if foundResources == 0 {
|
||||||
|
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel")
|
||||||
|
return ErrNoData
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -106,7 +106,7 @@ func (c *processCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
pidM, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
pidM, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to retrieve limit number of maximum pids alloved: %w", err)
|
return fmt.Errorf("unable to retrieve limit number of maximum pids allowed: %w", err)
|
||||||
}
|
}
|
||||||
ch <- prometheus.MustNewConstMetric(c.pidUsed, prometheus.GaugeValue, float64(pids))
|
ch <- prometheus.MustNewConstMetric(c.pidUsed, prometheus.GaugeValue, float64(pids))
|
||||||
ch <- prometheus.MustNewConstMetric(c.pidMax, prometheus.GaugeValue, float64(pidM))
|
ch <- prometheus.MustNewConstMetric(c.pidMax, prometheus.GaugeValue, float64(pidM))
|
||||||
|
|
|
@ -48,7 +48,7 @@ func TestReadProcessStatus(t *testing.T) {
|
||||||
}
|
}
|
||||||
maxPid, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
maxPid, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unable to retrieve limit number of maximum pids alloved %v\n", err)
|
t.Fatalf("Unable to retrieve limit number of maximum pids allowed %v\n", err)
|
||||||
}
|
}
|
||||||
if uint64(pids) > maxPid || pids == 0 {
|
if uint64(pids) > maxPid || pids == 0 {
|
||||||
t.Fatalf("Total running pids cannot be greater than %d or equals to 0", maxPid)
|
t.Fatalf("Total running pids cannot be greater than %d or equals to 0", maxPid)
|
||||||
|
|
|
@ -17,10 +17,11 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/prometheus-community/go-runit/runit"
|
"github.com/prometheus-community/go-runit/runit"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"log/slog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
|
var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
|
||||||
|
|
|
@ -17,9 +17,10 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/opencontainers/selinux/go-selinux"
|
"github.com/opencontainers/selinux/go-selinux"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"log/slog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type selinuxCollector struct {
|
type selinuxCollector struct {
|
||||||
|
|
|
@ -18,9 +18,10 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
"log/slog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type softirqsCollector struct {
|
type softirqsCollector struct {
|
||||||
|
|
|
@ -74,6 +74,7 @@ type systemdCollector struct {
|
||||||
socketCurrentConnectionsDesc *prometheus.Desc
|
socketCurrentConnectionsDesc *prometheus.Desc
|
||||||
socketRefusedConnectionsDesc *prometheus.Desc
|
socketRefusedConnectionsDesc *prometheus.Desc
|
||||||
systemdVersionDesc *prometheus.Desc
|
systemdVersionDesc *prometheus.Desc
|
||||||
|
virtualizationDesc *prometheus.Desc
|
||||||
// Use regexps for more flexibility than device_filter.go allows
|
// Use regexps for more flexibility than device_filter.go allows
|
||||||
systemdUnitIncludePattern *regexp.Regexp
|
systemdUnitIncludePattern *regexp.Regexp
|
||||||
systemdUnitExcludePattern *regexp.Regexp
|
systemdUnitExcludePattern *regexp.Regexp
|
||||||
|
@ -132,6 +133,9 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) {
|
||||||
systemdVersionDesc := prometheus.NewDesc(
|
systemdVersionDesc := prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, subsystem, "version"),
|
prometheus.BuildFQName(namespace, subsystem, "version"),
|
||||||
"Detected systemd version", []string{"version"}, nil)
|
"Detected systemd version", []string{"version"}, nil)
|
||||||
|
virtualizationDesc := prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, subsystem, "virtualization_info"),
|
||||||
|
"Detected virtualization technology", []string{"virtualization_type"}, nil)
|
||||||
|
|
||||||
if *oldSystemdUnitExclude != "" {
|
if *oldSystemdUnitExclude != "" {
|
||||||
if !systemdUnitExcludeSet {
|
if !systemdUnitExcludeSet {
|
||||||
|
@ -167,6 +171,7 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) {
|
||||||
socketCurrentConnectionsDesc: socketCurrentConnectionsDesc,
|
socketCurrentConnectionsDesc: socketCurrentConnectionsDesc,
|
||||||
socketRefusedConnectionsDesc: socketRefusedConnectionsDesc,
|
socketRefusedConnectionsDesc: socketRefusedConnectionsDesc,
|
||||||
systemdVersionDesc: systemdVersionDesc,
|
systemdVersionDesc: systemdVersionDesc,
|
||||||
|
virtualizationDesc: virtualizationDesc,
|
||||||
systemdUnitIncludePattern: systemdUnitIncludePattern,
|
systemdUnitIncludePattern: systemdUnitIncludePattern,
|
||||||
systemdUnitExcludePattern: systemdUnitExcludePattern,
|
systemdUnitExcludePattern: systemdUnitExcludePattern,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
@ -194,6 +199,14 @@ func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
systemdVersionFull,
|
systemdVersionFull,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
systemdVirtualization := c.getSystemdVirtualization(conn)
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
c.virtualizationDesc,
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
1.0,
|
||||||
|
systemdVirtualization,
|
||||||
|
)
|
||||||
|
|
||||||
allUnits, err := c.getAllUnits(conn)
|
allUnits, err := c.getAllUnits(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("couldn't get units: %w", err)
|
return fmt.Errorf("couldn't get units: %w", err)
|
||||||
|
@ -505,3 +518,19 @@ func (c *systemdCollector) getSystemdVersion(conn *dbus.Conn) (float64, string)
|
||||||
}
|
}
|
||||||
return v, version
|
return v, version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *systemdCollector) getSystemdVirtualization(conn *dbus.Conn) string {
|
||||||
|
virt, err := conn.GetManagerProperty("Virtualization")
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Debug("Could not get Virtualization property", "err", err)
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
virtStr := strings.Trim(virt, `"`)
|
||||||
|
if virtStr == "" {
|
||||||
|
// If no virtualization type is returned, assume it's bare metal.
|
||||||
|
return "none"
|
||||||
|
}
|
||||||
|
|
||||||
|
return virtStr
|
||||||
|
}
|
||||||
|
|
|
@ -253,10 +253,16 @@ func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mfHelp := make(map[string]*string)
|
||||||
for _, mf := range parsedFamilies {
|
for _, mf := range parsedFamilies {
|
||||||
if mf.Help == nil {
|
if mf.Help == nil {
|
||||||
|
if help, ok := mfHelp[*mf.Name]; ok {
|
||||||
|
mf.Help = help
|
||||||
|
continue
|
||||||
|
}
|
||||||
help := fmt.Sprintf("Metric read from %s", strings.Join(metricsNamesToFiles[*mf.Name], ", "))
|
help := fmt.Sprintf("Metric read from %s", strings.Join(metricsNamesToFiles[*mf.Name], ", "))
|
||||||
mf.Help = &help
|
mf.Help = &help
|
||||||
|
mfHelp[*mf.Name] = &help
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,8 @@ import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/prometheus/node_exporter/collector/utils"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -176,7 +178,7 @@ func mappingCFStringToString(s C.CFStringRef) string {
|
||||||
buf := make([]byte, maxBufLen)
|
buf := make([]byte, maxBufLen)
|
||||||
var usedBufLen C.CFIndex
|
var usedBufLen C.CFIndex
|
||||||
_ = C.CFStringGetBytes(s, C.CFRange{0, length}, C.kCFStringEncodingUTF8, C.UInt8(0), C.false, (*C.UInt8)(&buf[0]), maxBufLen, &usedBufLen)
|
_ = C.CFStringGetBytes(s, C.CFRange{0, length}, C.kCFStringEncodingUTF8, C.UInt8(0), C.false, (*C.UInt8)(&buf[0]), maxBufLen, &usedBufLen)
|
||||||
return string(buf[:usedBufLen])
|
return utils.SafeBytesToString(buf[:usedBufLen])
|
||||||
}
|
}
|
||||||
|
|
||||||
func mappingCFNumberLongToInt(n C.CFNumberRef) int {
|
func mappingCFNumberLongToInt(n C.CFNumberRef) int {
|
||||||
|
|
|
@ -18,8 +18,9 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
var unameDesc = prometheus.NewDesc(
|
var unameDesc = prometheus.NewDesc(
|
||||||
|
@ -49,11 +50,11 @@ type uname struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("uname", defaultEnabled, newUnameCollector)
|
registerCollector("uname", defaultEnabled, NewUnameCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUnameCollector returns new unameCollector.
|
// NewUnameCollector returns new unameCollector.
|
||||||
func newUnameCollector(logger *slog.Logger) (Collector, error) {
|
func NewUnameCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &unameCollector{logger}, nil
|
return &unameCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,11 @@
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
func SafeDereference[T any](s ...*T) []T {
|
func SafeDereference[T any](s ...*T) []T {
|
||||||
var resolved []T
|
var resolved []T
|
||||||
for _, v := range s {
|
for _, v := range s {
|
||||||
|
@ -25,3 +30,18 @@ func SafeDereference[T any](s ...*T) []T {
|
||||||
}
|
}
|
||||||
return resolved
|
return resolved
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SafeBytesToString takes a slice of bytes and sanitizes it for Prometheus label
|
||||||
|
// values.
|
||||||
|
// * Terminate the string at the first null byte.
|
||||||
|
// * Convert any invalid UTF-8 to "<22>".
|
||||||
|
func SafeBytesToString(b []byte) string {
|
||||||
|
var s string
|
||||||
|
zeroIndex := bytes.IndexByte(b, 0)
|
||||||
|
if zeroIndex == -1 {
|
||||||
|
s = string(b)
|
||||||
|
} else {
|
||||||
|
s = string(b[:zeroIndex])
|
||||||
|
}
|
||||||
|
return strings.ToValidUTF8(s, "<22>")
|
||||||
|
}
|
||||||
|
|
30
collector/utils/utils_test.go
Normal file
30
collector/utils/utils_test.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright 2025 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file ewcept 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 utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSafeBytesToString(t *testing.T) {
|
||||||
|
foo := []byte("foo\x00")
|
||||||
|
if want, got := SafeBytesToString(foo), "foo"; want != got {
|
||||||
|
t.Errorf("Expected: %s, Got: %s", want, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = []byte{115, 97, 110, 101, 253, 190, 214}
|
||||||
|
if want, got := SafeBytesToString(foo), "sane<6E>"; want != got {
|
||||||
|
t.Errorf("Expected: %s, Got: %s", want, got)
|
||||||
|
}
|
||||||
|
}
|
|
@ -301,7 +301,8 @@ func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, h
|
||||||
parseLine := false
|
parseLine := false
|
||||||
var zpoolName, datasetName string
|
var zpoolName, datasetName string
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
parts := strings.Fields(scanner.Text())
|
line := scanner.Text()
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
|
||||||
if !parseLine && len(parts) == 3 && parts[0] == "name" && parts[1] == "type" && parts[2] == "data" {
|
if !parseLine && len(parts) == 3 && parts[0] == "name" && parts[1] == "type" && parts[2] == "data" {
|
||||||
parseLine = true
|
parseLine = true
|
||||||
|
@ -315,7 +316,7 @@ func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, h
|
||||||
zpoolPathElements := strings.Split(zpoolPath, "/")
|
zpoolPathElements := strings.Split(zpoolPath, "/")
|
||||||
pathLen := len(zpoolPathElements)
|
pathLen := len(zpoolPathElements)
|
||||||
zpoolName = zpoolPathElements[pathLen-2]
|
zpoolName = zpoolPathElements[pathLen-2]
|
||||||
datasetName = parts[2]
|
datasetName = line[strings.Index(line, parts[2]):]
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,6 +315,55 @@ func TestZpoolParsing(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestZpoolObjsetParsingWithSpace(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
path string
|
||||||
|
expectedDataset string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
path: "fixtures/proc/spl/kstat/zfs/pool1/objset-1",
|
||||||
|
expectedDataset: "pool1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "fixtures/proc/spl/kstat/zfs/pool1/objset-2",
|
||||||
|
expectedDataset: "pool1/dataset1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "fixtures/proc/spl/kstat/zfs/pool3/objset-1",
|
||||||
|
expectedDataset: "pool3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "fixtures/proc/spl/kstat/zfs/pool3/objset-2",
|
||||||
|
expectedDataset: "pool3/dataset with space",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
c := zfsCollector{}
|
||||||
|
|
||||||
|
var handlerCalled bool
|
||||||
|
for _, test := range tests {
|
||||||
|
file, err := os.Open(test.path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
handlerCalled = false
|
||||||
|
err = c.parsePoolObjsetFile(file, test.path, func(poolName string, datasetName string, s zfsSysctl, v uint64) {
|
||||||
|
handlerCalled = true
|
||||||
|
if test.expectedDataset != datasetName {
|
||||||
|
t.Fatalf("Incorrectly parsed dataset name: expected: '%s', got: '%s'", test.expectedDataset, datasetName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
file.Close()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !handlerCalled {
|
||||||
|
t.Fatalf("Zpool parsing handler was not called for '%s'", test.path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestZpoolObjsetParsing(t *testing.T) {
|
func TestZpoolObjsetParsing(t *testing.T) {
|
||||||
zpoolPaths, err := filepath.Glob("fixtures/proc/spl/kstat/zfs/*/objset-*")
|
zpoolPaths, err := filepath.Glob("fixtures/proc/spl/kstat/zfs/*/objset-*")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
(
|
(
|
||||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpWarningThreshold)d
|
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpWarningThreshold)d
|
||||||
and
|
and
|
||||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[%(fsSpaceFillingUpPredictionWindow)s], 24*60*60) < 0
|
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[%(fsSpaceFillingUpPredictionWindow)s], %(nodeWarningWindowHours)s*60*60) < 0
|
||||||
and
|
and
|
||||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||||
)
|
)
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
severity: 'warning',
|
severity: 'warning',
|
||||||
},
|
},
|
||||||
annotations: {
|
annotations: {
|
||||||
summary: 'Filesystem is predicted to run out of space within the next 24 hours.',
|
summary: 'Filesystem is predicted to run out of space within the next %(nodeWarningWindowHours)s hours.' % $._config,
|
||||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up.',
|
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
(
|
(
|
||||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpCriticalThreshold)d
|
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpCriticalThreshold)d
|
||||||
and
|
and
|
||||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 4*60*60) < 0
|
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeCriticalWindowHours)s*60*60) < 0
|
||||||
and
|
and
|
||||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
severity: '%(nodeCriticalSeverity)s' % $._config,
|
severity: '%(nodeCriticalSeverity)s' % $._config,
|
||||||
},
|
},
|
||||||
annotations: {
|
annotations: {
|
||||||
summary: 'Filesystem is predicted to run out of space within the next 4 hours.',
|
summary: 'Filesystem is predicted to run out of space within the next %(nodeCriticalWindowHours)s hours.' % $._config,
|
||||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up fast.',
|
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up fast.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -86,7 +86,7 @@
|
||||||
(
|
(
|
||||||
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 40
|
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 40
|
||||||
and
|
and
|
||||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 24*60*60) < 0
|
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeWarningWindowHours)s*60*60) < 0
|
||||||
and
|
and
|
||||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||||
)
|
)
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
severity: 'warning',
|
severity: 'warning',
|
||||||
},
|
},
|
||||||
annotations: {
|
annotations: {
|
||||||
summary: 'Filesystem is predicted to run out of inodes within the next 24 hours.',
|
summary: 'Filesystem is predicted to run out of inodes within the next %(nodeWarningWindowHours)s hours.' % $._config,
|
||||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up.',
|
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -106,7 +106,7 @@
|
||||||
(
|
(
|
||||||
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 20
|
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 20
|
||||||
and
|
and
|
||||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 4*60*60) < 0
|
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeCriticalWindowHours)s*60*60) < 0
|
||||||
and
|
and
|
||||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||||
)
|
)
|
||||||
|
@ -116,7 +116,7 @@
|
||||||
severity: '%(nodeCriticalSeverity)s' % $._config,
|
severity: '%(nodeCriticalSeverity)s' % $._config,
|
||||||
},
|
},
|
||||||
annotations: {
|
annotations: {
|
||||||
summary: 'Filesystem is predicted to run out of inodes within the next 4 hours.',
|
summary: 'Filesystem is predicted to run out of inodes within the next %(nodeCriticalWindowHours)s hours.' % $._config,
|
||||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up fast.',
|
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up fast.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -191,7 +191,7 @@
|
||||||
||| % $._config,
|
||| % $._config,
|
||||||
annotations: {
|
annotations: {
|
||||||
summary: 'Number of conntrack are getting close to the limit.',
|
summary: 'Number of conntrack are getting close to the limit.',
|
||||||
description: '{{ $value | humanizePercentage }} of conntrack entries are used.',
|
description: '{{ $labels.instance }} {{ $value | humanizePercentage }} of conntrack entries are used.',
|
||||||
},
|
},
|
||||||
labels: {
|
labels: {
|
||||||
severity: 'warning',
|
severity: 'warning',
|
||||||
|
@ -312,7 +312,7 @@
|
||||||
{
|
{
|
||||||
alert: 'NodeCPUHighUsage',
|
alert: 'NodeCPUHighUsage',
|
||||||
expr: |||
|
expr: |||
|
||||||
sum without(mode) (avg without (cpu) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode!="idle"}[2m]))) * 100 > %(cpuHighUsageThreshold)d
|
sum without(mode) (avg without (cpu) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode!~"idle|iowait"}[2m]))) * 100 > %(cpuHighUsageThreshold)d
|
||||||
||| % $._config,
|
||| % $._config,
|
||||||
'for': '15m',
|
'for': '15m',
|
||||||
labels: {
|
labels: {
|
||||||
|
@ -407,6 +407,20 @@
|
||||||
description: 'Systemd service {{ $labels.name }} has entered failed state at {{ $labels.instance }}',
|
description: 'Systemd service {{ $labels.name }} has entered failed state at {{ $labels.instance }}',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
alert: 'NodeSystemdServiceCrashlooping',
|
||||||
|
expr: |||
|
||||||
|
increase(node_systemd_service_restart_total{%(nodeExporterSelector)s}[5m]) > 2
|
||||||
|
||| % $._config,
|
||||||
|
'for': '15m',
|
||||||
|
labels: {
|
||||||
|
severity: 'warning',
|
||||||
|
},
|
||||||
|
annotations: {
|
||||||
|
summary: 'Systemd service keeps restaring, possibly crash looping.',
|
||||||
|
description: 'Systemd service {{ $labels.name }} has being restarted too many times at {{ $labels.instance }} for the last 15 minutes. Please check if service is crash looping.',
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
alert: 'NodeBondingDegraded',
|
alert: 'NodeBondingDegraded',
|
||||||
expr: |||
|
expr: |||
|
||||||
|
|
|
@ -50,6 +50,16 @@
|
||||||
// 'NodeSystemSaturation' alert.
|
// 'NodeSystemSaturation' alert.
|
||||||
systemSaturationPerCoreThreshold: 2,
|
systemSaturationPerCoreThreshold: 2,
|
||||||
|
|
||||||
|
// Some of the alerts use predict_linear() to fire alerts ahead of time to
|
||||||
|
// prevent unrecoverable situations (eg. no more disk space). However, the
|
||||||
|
// node may have automatic processes (cronjobs) in place to prevent that
|
||||||
|
// within a certain time window, this may not align with the default time
|
||||||
|
// window of these alerts. This can cause these alerts to start flapping.
|
||||||
|
// By reducing the time window, the system gets more time to
|
||||||
|
// resolve this before problems occur.
|
||||||
|
nodeWarningWindowHours: '24',
|
||||||
|
nodeCriticalWindowHours: '4',
|
||||||
|
|
||||||
// Available disk space (%) thresholds on which to trigger the
|
// Available disk space (%) thresholds on which to trigger the
|
||||||
// 'NodeFilesystemSpaceFillingUp' alerts. These alerts fire if the disk
|
// 'NodeFilesystemSpaceFillingUp' alerts. These alerts fire if the disk
|
||||||
// usage grows in a way that it is predicted to run out in 4h or 1d
|
// usage grows in a way that it is predicted to run out in 4h or 1d
|
||||||
|
|
|
@ -1,201 +1,178 @@
|
||||||
local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
|
local grafana = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet';
|
||||||
local dashboard = grafana.dashboard;
|
local dashboard = grafana.dashboard;
|
||||||
local row = grafana.row;
|
local variable = dashboard.variable;
|
||||||
local prometheus = grafana.prometheus;
|
local row = grafana.panel.row;
|
||||||
local template = grafana.template;
|
local prometheus = grafana.query.prometheus;
|
||||||
local graphPanel = grafana.graphPanel;
|
|
||||||
|
local timeSeriesPanel = grafana.panel.timeSeries;
|
||||||
|
local tsOptions = timeSeriesPanel.options;
|
||||||
|
local tsStandardOptions = timeSeriesPanel.standardOptions;
|
||||||
|
local tsQueryOptions = timeSeriesPanel.queryOptions;
|
||||||
|
local tsCustom = timeSeriesPanel.fieldConfig.defaults.custom;
|
||||||
|
local tsLegend = tsOptions.legend;
|
||||||
|
|
||||||
local c = import '../config.libsonnet';
|
local c = import '../config.libsonnet';
|
||||||
|
|
||||||
local datasourceTemplate = {
|
local datasource = variable.datasource.new(
|
||||||
current: {
|
'datasource', 'prometheus'
|
||||||
text: 'default',
|
);
|
||||||
value: 'default',
|
|
||||||
},
|
local tsCommonPanelOptions =
|
||||||
hide: 0,
|
variable.query.withDatasourceFromVariable(datasource)
|
||||||
label: 'Data Source',
|
+ tsCustom.stacking.withMode('normal')
|
||||||
name: 'datasource',
|
+ tsCustom.withFillOpacity(100)
|
||||||
options: [],
|
+ tsCustom.withShowPoints('never')
|
||||||
query: 'prometheus',
|
+ tsLegend.withShowLegend(false)
|
||||||
refresh: 1,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
regex: '',
|
+ tsOptions.tooltip.withSort('desc');
|
||||||
type: 'datasource',
|
|
||||||
};
|
|
||||||
|
|
||||||
local CPUUtilisation =
|
local CPUUtilisation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'CPU Utilisation',
|
'CPU Utilisation',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
local CPUSaturation =
|
local CPUSaturation =
|
||||||
// TODO: Is this a useful panel? At least there should be some explanation how load
|
// TODO: Is this a useful panel? At least there should be some explanation how load
|
||||||
// average relates to the "CPU saturation" in the title.
|
// average relates to the "CPU saturation" in the title.
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'CPU Saturation (Load1 per CPU)',
|
'CPU Saturation (Load1 per CPU)',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
local memoryUtilisation =
|
local memoryUtilisation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Memory Utilisation',
|
'Memory Utilisation',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
local memorySaturation =
|
local memorySaturation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Memory Saturation (Major Page Faults)',
|
'Memory Saturation (Major Page Faults)',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='rds',
|
+ tsStandardOptions.withUnit('rds');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
local networkOverrides = tsStandardOptions.withOverrides(
|
||||||
legend_show=false,
|
[
|
||||||
) { tooltip+: { sort: 2 } };
|
tsStandardOptions.override.byRegexp.new('/Transmit/')
|
||||||
|
+ tsStandardOptions.override.byRegexp.withPropertiesFromOptions(
|
||||||
|
tsCustom.withTransform('negative-Y')
|
||||||
|
),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
local networkUtilisation =
|
local networkUtilisation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Network Utilisation (Bytes Receive/Transmit)',
|
'Network Utilisation (Bytes Receive/Transmit)',
|
||||||
datasource='$datasource',
|
|
||||||
span=6,
|
|
||||||
format='Bps',
|
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
)
|
)
|
||||||
.addSeriesOverride({ alias: '/Receive/', stack: 'A' })
|
+ tsCommonPanelOptions
|
||||||
.addSeriesOverride({ alias: '/Transmit/', stack: 'B', transform: 'negative-Y' })
|
+ tsStandardOptions.withUnit('Bps')
|
||||||
{ tooltip+: { sort: 2 } };
|
+ networkOverrides;
|
||||||
|
|
||||||
local networkSaturation =
|
local networkSaturation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Network Saturation (Drops Receive/Transmit)',
|
'Network Saturation (Drops Receive/Transmit)',
|
||||||
datasource='$datasource',
|
|
||||||
span=6,
|
|
||||||
format='Bps',
|
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
)
|
)
|
||||||
.addSeriesOverride({ alias: '/ Receive/', stack: 'A' })
|
+ tsCommonPanelOptions
|
||||||
.addSeriesOverride({ alias: '/ Transmit/', stack: 'B', transform: 'negative-Y' })
|
+ tsStandardOptions.withUnit('Bps')
|
||||||
{ tooltip+: { sort: 2 } };
|
+ networkOverrides;
|
||||||
|
|
||||||
local diskIOUtilisation =
|
local diskIOUtilisation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Disk IO Utilisation',
|
'Disk IO Utilisation',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
local diskIOSaturation =
|
local diskIOSaturation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Disk IO Saturation',
|
'Disk IO Saturation',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=6,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
local diskSpaceUtilisation =
|
local diskSpaceUtilisation =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new(
|
||||||
'Disk Space Utilisation',
|
'Disk Space Utilisation',
|
||||||
datasource='$datasource',
|
)
|
||||||
span=12,
|
+ tsCommonPanelOptions
|
||||||
format='percentunit',
|
+ tsStandardOptions.withUnit('percentunit');
|
||||||
stack=true,
|
|
||||||
fill=10,
|
|
||||||
legend_show=false,
|
|
||||||
) { tooltip+: { sort: 2 } };
|
|
||||||
|
|
||||||
{
|
{
|
||||||
_clusterTemplate:: template.new(
|
_clusterVariable::
|
||||||
name='cluster',
|
variable.query.new('cluster')
|
||||||
datasource='$datasource',
|
+ variable.query.withDatasourceFromVariable(datasource)
|
||||||
query='label_values(node_time_seconds, %s)' % $._config.clusterLabel,
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
current='',
|
$._config.clusterLabel,
|
||||||
hide=if $._config.showMultiCluster then '' else '2',
|
'node_time_seconds',
|
||||||
refresh=2,
|
)
|
||||||
includeAll=false,
|
+ (if $._config.showMultiCluster then variable.query.generalOptions.showOnDashboard.withLabelAndValue() else variable.query.generalOptions.showOnDashboard.withNothing())
|
||||||
sort=1
|
+ variable.query.refresh.onTime()
|
||||||
),
|
+ variable.query.selectionOptions.withIncludeAll(false)
|
||||||
|
+ variable.query.withSort(asc=true),
|
||||||
|
|
||||||
grafanaDashboards+:: {
|
grafanaDashboards+:: {
|
||||||
'node-rsrc-use.json':
|
'node-rsrc-use.json':
|
||||||
|
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sUSE Method / Node' % $._config.dashboardNamePrefix,
|
'%sUSE Method / Node' % $._config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=($._config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
graphTooltip='shared_crosshair',
|
|
||||||
uid=std.md5('node-rsrc-use.json')
|
|
||||||
)
|
)
|
||||||
.addTemplate(datasourceTemplate)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addTemplate($._clusterTemplate)
|
+ dashboard.withTags($._config.dashboardTags)
|
||||||
.addTemplate(
|
+ dashboard.withTimezone('utc')
|
||||||
template.new(
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withUid(std.md5('node-rsrc-use.json'))
|
||||||
|
+ dashboard.withVariables([
|
||||||
|
datasource,
|
||||||
|
$._clusterVariable,
|
||||||
|
variable.query.new('instance')
|
||||||
|
+ variable.query.withDatasourceFromVariable(datasource)
|
||||||
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
'instance',
|
'instance',
|
||||||
'$datasource',
|
'node_exporter_build_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config,
|
||||||
'label_values(node_exporter_build_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}, instance)' % $._config,
|
|
||||||
refresh='time',
|
|
||||||
sort=1
|
|
||||||
)
|
)
|
||||||
)
|
+ variable.query.refresh.onTime()
|
||||||
.addRow(
|
+ variable.query.withSort(asc=true),
|
||||||
|
])
|
||||||
|
+ dashboard.withPanels(
|
||||||
|
grafana.util.grid.makeGrid([
|
||||||
row.new('CPU')
|
row.new('CPU')
|
||||||
.addPanel(CPUUtilisation.addTarget(prometheus.target('instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Utilisation')))
|
+ row.withPanels([
|
||||||
.addPanel(CPUSaturation.addTarget(prometheus.target('instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Saturation')))
|
CPUUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Utilisation')]),
|
||||||
)
|
CPUSaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Saturation')]),
|
||||||
.addRow(
|
]),
|
||||||
row.new('Memory')
|
row.new('Memory')
|
||||||
.addPanel(memoryUtilisation.addTarget(prometheus.target('instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Utilisation')))
|
+ row.withPanels([
|
||||||
.addPanel(memorySaturation.addTarget(prometheus.target('instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Major page Faults')))
|
memoryUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Utilisation')]),
|
||||||
)
|
memorySaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Major page Faults')]),
|
||||||
.addRow(
|
]),
|
||||||
row.new('Network')
|
row.new('Network')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
networkUtilisation
|
networkUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target('instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Receive'))
|
prometheus.new('$datasource', 'instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Receive'),
|
||||||
.addTarget(prometheus.target('instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Transmit'))
|
prometheus.new('$datasource', 'instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Transmit'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
networkSaturation + tsQueryOptions.withTargets([
|
||||||
networkSaturation
|
prometheus.new('$datasource', 'instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Receive'),
|
||||||
.addTarget(prometheus.target('instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Receive'))
|
prometheus.new('$datasource', 'instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Transmit'),
|
||||||
.addTarget(prometheus.target('instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Transmit'))
|
]),
|
||||||
)
|
]),
|
||||||
)
|
|
||||||
.addRow(
|
|
||||||
row.new('Disk IO')
|
row.new('Disk IO')
|
||||||
.addPanel(diskIOUtilisation.addTarget(prometheus.target('instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{device}}')))
|
+ row.withPanels([
|
||||||
.addPanel(diskIOSaturation.addTarget(prometheus.target('instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{device}}')))
|
diskIOUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('{{device}}')]),
|
||||||
)
|
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('{{device}}')]),
|
||||||
.addRow(
|
]),
|
||||||
|
], panelWidth=12, panelHeight=7)
|
||||||
|
+ grafana.util.grid.makeGrid([
|
||||||
row.new('Disk Space')
|
row.new('Disk Space')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
diskSpaceUtilisation.addTarget(prometheus.target(
|
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sort_desc(1 -
|
sort_desc(1 -
|
||||||
(
|
(
|
||||||
|
@ -204,28 +181,33 @@ local diskSpaceUtilisation =
|
||||||
max without (mountpoint, fstype) (node_filesystem_size_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
max without (mountpoint, fstype) (node_filesystem_size_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||||
) != 0
|
) != 0
|
||||||
)
|
)
|
||||||
||| % $._config, legendFormat='{{device}}'
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{device}}'),
|
||||||
)
|
]),
|
||||||
|
]),
|
||||||
|
], panelWidth=24, panelHeight=7, startY=34),
|
||||||
),
|
),
|
||||||
|
|
||||||
'node-cluster-rsrc-use.json':
|
'node-cluster-rsrc-use.json':
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sUSE Method / Cluster' % $._config.dashboardNamePrefix,
|
'%sUSE Method / Cluster' % $._config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=($._config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
graphTooltip='shared_crosshair',
|
|
||||||
uid=std.md5('node-cluster-rsrc-use.json')
|
|
||||||
)
|
)
|
||||||
.addTemplate(datasourceTemplate)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addTemplate($._clusterTemplate)
|
+ dashboard.withTags($._config.dashboardTags)
|
||||||
.addRow(
|
+ dashboard.withTimezone('utc')
|
||||||
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withUid(std.md5('node-cluster-rsrc-use.json'))
|
||||||
|
+ dashboard.withVariables([
|
||||||
|
datasource,
|
||||||
|
$._clusterVariable,
|
||||||
|
])
|
||||||
|
+ dashboard.withPanels(
|
||||||
|
grafana.util.grid.makeGrid([
|
||||||
row.new('CPU')
|
row.new('CPU')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
CPUUtilisation
|
CPUUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
((
|
((
|
||||||
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
|
@ -233,79 +215,90 @@ local diskSpaceUtilisation =
|
||||||
instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
) != 0 )
|
) != 0 )
|
||||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||||
||| % $._config, legendFormat='{{ instance }}'
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
CPUSaturation + tsQueryOptions.withTargets([
|
||||||
CPUSaturation
|
prometheus.new(
|
||||||
.addTarget(prometheus.target(
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||||
) != 0
|
) != 0
|
||||||
||| % $._config, legendFormat='{{instance}}'
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||||
)
|
]),
|
||||||
)
|
]),
|
||||||
.addRow(
|
|
||||||
row.new('Memory')
|
row.new('Memory')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
memoryUtilisation
|
memoryUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||||
) != 0
|
) != 0
|
||||||
||| % $._config, legendFormat='{{instance}}',
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||||
)
|
]),
|
||||||
.addPanel(memorySaturation.addTarget(prometheus.target('instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config, legendFormat='{{instance}}')))
|
memorySaturation + tsQueryOptions.withTargets([
|
||||||
)
|
prometheus.new(
|
||||||
.addRow(
|
'$datasource',
|
||||||
|
'instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config
|
||||||
|
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
row.new('Network')
|
row.new('Network')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
networkUtilisation
|
networkUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target('instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Receive'))
|
prometheus.new(
|
||||||
.addTarget(prometheus.target('instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Transmit'))
|
'$datasource',
|
||||||
)
|
'instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||||
.addPanel(
|
) + prometheus.withLegendFormat('{{ instance }} Receive'),
|
||||||
networkSaturation
|
prometheus.new(
|
||||||
.addTarget(prometheus.target('instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Receive'))
|
'$datasource',
|
||||||
.addTarget(prometheus.target('instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Transmit'))
|
'instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||||
)
|
) + prometheus.withLegendFormat('{{ instance }} Transmit'),
|
||||||
)
|
]),
|
||||||
.addRow(
|
networkSaturation + tsQueryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|
'instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||||
|
) + prometheus.withLegendFormat('{{ instance }} Receive'),
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|
'instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||||
|
) + prometheus.withLegendFormat('{{ instance }} Transmit'),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
row.new('Disk IO')
|
row.new('Disk IO')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
diskIOUtilisation
|
diskIOUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
|
||||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||||
) != 0
|
||| % $._config
|
||||||
||| % $._config, legendFormat='{{instance}} {{device}}'
|
) + prometheus.withLegendFormat('{{ instance }} {{device}}'),
|
||||||
))
|
]),
|
||||||
)
|
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new(
|
||||||
.addPanel(
|
'$datasource',
|
||||||
diskIOSaturation
|
|
||||||
.addTarget(prometheus.target(
|
|
||||||
|||
|
|||
|
||||||
(
|
|
||||||
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||||
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||||
) != 0
|
||| % $._config
|
||||||
||| % $._config, legendFormat='{{instance}} {{device}}'
|
) + prometheus.withLegendFormat('{{ instance }} {{device}}')]),
|
||||||
))
|
]),
|
||||||
)
|
], panelWidth=12, panelHeight=7)
|
||||||
)
|
+ grafana.util.grid.makeGrid([
|
||||||
.addRow(
|
|
||||||
row.new('Disk Space')
|
row.new('Disk Space')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
diskSpaceUtilisation
|
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum without (device) (
|
sum without (device) (
|
||||||
max without (fstype, mountpoint) ((
|
max without (fstype, mountpoint) ((
|
||||||
|
@ -315,28 +308,34 @@ local diskSpaceUtilisation =
|
||||||
) != 0)
|
) != 0)
|
||||||
)
|
)
|
||||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"})))
|
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"})))
|
||||||
||| % $._config, legendFormat='{{instance}}'
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||||
)
|
]),
|
||||||
|
]),
|
||||||
|
], panelWidth=24, panelHeight=7, startY=34),
|
||||||
),
|
),
|
||||||
} +
|
} +
|
||||||
if $._config.showMultiCluster then {
|
if $._config.showMultiCluster then {
|
||||||
'node-multicluster-rsrc-use.json':
|
'node-multicluster-rsrc-use.json':
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sUSE Method / Multi-cluster' % $._config.dashboardNamePrefix,
|
'%sUSE Method / Multi-cluster' % $._config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=($._config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
graphTooltip='shared_crosshair',
|
|
||||||
uid=std.md5('node-multicluster-rsrc-use.json')
|
|
||||||
)
|
)
|
||||||
.addTemplate(datasourceTemplate)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addRow(
|
+ dashboard.withTags($._config.dashboardTags)
|
||||||
|
+ dashboard.withTimezone('utc')
|
||||||
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withUid(std.md5('node-multicluster-rsrc-use.json'))
|
||||||
|
+ dashboard.withVariables([
|
||||||
|
datasource,
|
||||||
|
])
|
||||||
|
+ dashboard.withPanels(
|
||||||
|
grafana.util.grid.makeGrid([
|
||||||
row.new('CPU')
|
row.new('CPU')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
CPUUtilisation
|
CPUUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum(
|
sum(
|
||||||
((
|
((
|
||||||
|
@ -346,112 +345,116 @@ local diskSpaceUtilisation =
|
||||||
) != 0)
|
) != 0)
|
||||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s}))
|
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s}))
|
||||||
) by (%(clusterLabel)s)
|
) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
CPUSaturation + tsQueryOptions.withTargets([
|
||||||
CPUSaturation
|
prometheus.new(
|
||||||
.addTarget(prometheus.target(
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}
|
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}
|
||||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}))
|
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}))
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||||
)
|
]),
|
||||||
)
|
]),
|
||||||
.addRow(
|
|
||||||
row.new('Memory')
|
row.new('Memory')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
memoryUtilisation
|
memoryUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}
|
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}
|
||||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}))
|
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}))
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
memorySaturation + tsQueryOptions.withTargets([
|
||||||
memorySaturation
|
prometheus.new(
|
||||||
.addTarget(prometheus.target(
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
|||
|
||||||
))
|
% $._config
|
||||||
)
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||||
)
|
]),
|
||||||
.addRow(
|
]),
|
||||||
row.new('Network')
|
row.new('Network')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
networkUtilisation
|
networkUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Receive' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Receive'),
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Transmit' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Transmit'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
networkSaturation + tsQueryOptions.withTargets([
|
||||||
networkSaturation
|
prometheus.new(
|
||||||
.addTarget(prometheus.target(
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Receive' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Receive'),
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
) != 0) by (%(clusterLabel)s)
|
) != 0) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Transmit' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Transmit'),
|
||||||
)
|
]),
|
||||||
)
|
]),
|
||||||
.addRow(
|
|
||||||
row.new('Disk IO')
|
row.new('Disk IO')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
diskIOUtilisation
|
diskIOUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||||
) != 0) by (%(clusterLabel)s, device)
|
) != 0) by (%(clusterLabel)s, device)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} {{device}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} {{device}}'),
|
||||||
)
|
]),
|
||||||
.addPanel(
|
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new(
|
||||||
diskIOSaturation
|
'$datasource',
|
||||||
.addTarget(prometheus.target(
|
|
||||||
|||
|
|||
|
||||||
sum((
|
sum((
|
||||||
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||||
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||||
) != 0) by (%(clusterLabel)s, device)
|
) != 0) by (%(clusterLabel)s, device)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} {{device}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} {{device}}')]),
|
||||||
)
|
]),
|
||||||
)
|
|
||||||
.addRow(
|
], panelWidth=12, panelHeight=7)
|
||||||
|
+ grafana.util.grid.makeGrid([
|
||||||
row.new('Disk Space')
|
row.new('Disk Space')
|
||||||
.addPanel(
|
+ row.withPanels([
|
||||||
diskSpaceUtilisation
|
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
sum (
|
sum (
|
||||||
sum without (device) (
|
sum without (device) (
|
||||||
|
@ -461,9 +464,11 @@ local diskSpaceUtilisation =
|
||||||
)
|
)
|
||||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s})))
|
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s})))
|
||||||
) by (%(clusterLabel)s)
|
) by (%(clusterLabel)s)
|
||||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||| % $._config
|
||||||
))
|
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||||
)
|
]),
|
||||||
|
]),
|
||||||
|
], panelWidth=24, panelHeight=7, startY=34),
|
||||||
),
|
),
|
||||||
} else {},
|
} else {},
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,20 +4,11 @@
|
||||||
{
|
{
|
||||||
"source": {
|
"source": {
|
||||||
"git": {
|
"git": {
|
||||||
"remote": "https://github.com/grafana/grafonnet-lib.git",
|
"remote": "https://github.com/grafana/grafonnet.git",
|
||||||
"subdir": "grafonnet"
|
"subdir": "gen/grafonnet-latest"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": "master"
|
"version": "main"
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": {
|
|
||||||
"git": {
|
|
||||||
"remote": "https://github.com/grafana/grafonnet-lib.git",
|
|
||||||
"subdir": "grafonnet-7.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"version": "master"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"legacyImports": false
|
"legacyImports": false
|
||||||
|
|
|
@ -1,76 +1,85 @@
|
||||||
local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
|
local grafana = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet';
|
||||||
local dashboard = grafana.dashboard;
|
local dashboard = grafana.dashboard;
|
||||||
local row = grafana.row;
|
local row = grafana.panel.row;
|
||||||
local prometheus = grafana.prometheus;
|
local prometheus = grafana.query.prometheus;
|
||||||
local template = grafana.template;
|
local variable = dashboard.variable;
|
||||||
local graphPanel = grafana.graphPanel;
|
|
||||||
local grafana70 = import 'github.com/grafana/grafonnet-lib/grafonnet-7.0/grafana.libsonnet';
|
local timeSeriesPanel = grafana.panel.timeSeries;
|
||||||
local gaugePanel = grafana70.panel.gauge;
|
local tsOptions = timeSeriesPanel.options;
|
||||||
local table = grafana70.panel.table;
|
local tsStandardOptions = timeSeriesPanel.standardOptions;
|
||||||
|
local tsQueryOptions = timeSeriesPanel.queryOptions;
|
||||||
|
local tsCustom = timeSeriesPanel.fieldConfig.defaults.custom;
|
||||||
|
|
||||||
|
local gaugePanel = grafana.panel.gauge;
|
||||||
|
local gaugeStep = gaugePanel.standardOptions.threshold.step;
|
||||||
|
|
||||||
|
local table = grafana.panel.table;
|
||||||
|
local tableStep = table.standardOptions.threshold.step;
|
||||||
|
local tableOverride = table.standardOptions.override;
|
||||||
|
local tableTransformation = table.queryOptions.transformation;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
new(config=null, platform=null, uid=null):: {
|
new(config=null, platform=null, uid=null):: {
|
||||||
|
|
||||||
local prometheusDatasourceTemplate = {
|
local prometheusDatasourceVariable = variable.datasource.new(
|
||||||
current: {
|
'datasource', 'prometheus'
|
||||||
text: 'default',
|
|
||||||
value: 'default',
|
|
||||||
},
|
|
||||||
hide: 0,
|
|
||||||
label: 'Data Source',
|
|
||||||
name: 'datasource',
|
|
||||||
options: [],
|
|
||||||
query: 'prometheus',
|
|
||||||
refresh: 1,
|
|
||||||
regex: '',
|
|
||||||
type: 'datasource',
|
|
||||||
},
|
|
||||||
|
|
||||||
local clusterTemplatePrototype =
|
|
||||||
template.new(
|
|
||||||
'cluster',
|
|
||||||
'$datasource',
|
|
||||||
'',
|
|
||||||
hide=if config.showMultiCluster then '' else '2',
|
|
||||||
refresh='time',
|
|
||||||
label='Cluster',
|
|
||||||
),
|
),
|
||||||
local clusterTemplate =
|
|
||||||
if platform == 'Darwin' then
|
|
||||||
clusterTemplatePrototype
|
|
||||||
{ query: 'label_values(node_uname_info{%(nodeExporterSelector)s, sysname="Darwin"}, %(clusterLabel)s)' % config }
|
|
||||||
else
|
|
||||||
clusterTemplatePrototype
|
|
||||||
{ query: 'label_values(node_uname_info{%(nodeExporterSelector)s, sysname!="Darwin"}, %(clusterLabel)s)' % config },
|
|
||||||
|
|
||||||
local instanceTemplatePrototype =
|
local clusterVariablePrototype =
|
||||||
template.new(
|
variable.query.new('cluster')
|
||||||
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
|
+ (if config.showMultiCluster then variable.query.generalOptions.showOnDashboard.withLabelAndValue() else variable.query.generalOptions.showOnDashboard.withNothing())
|
||||||
|
+ variable.query.refresh.onTime()
|
||||||
|
+ variable.query.generalOptions.withLabel('Cluster'),
|
||||||
|
|
||||||
|
local clusterVariable =
|
||||||
|
if platform == 'Darwin' then
|
||||||
|
clusterVariablePrototype
|
||||||
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
|
' %(clusterLabel)s' % config,
|
||||||
|
'node_uname_info{%(nodeExporterSelector)s, sysname="Darwin"}' % config,
|
||||||
|
)
|
||||||
|
else
|
||||||
|
clusterVariablePrototype
|
||||||
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
|
'%(clusterLabel)s' % config,
|
||||||
|
'node_uname_info{%(nodeExporterSelector)s, sysname!="Darwin"}' % config,
|
||||||
|
),
|
||||||
|
|
||||||
|
local instanceVariablePrototype =
|
||||||
|
variable.query.new('instance')
|
||||||
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
|
+ variable.query.refresh.onTime()
|
||||||
|
+ variable.query.generalOptions.withLabel('Instance'),
|
||||||
|
|
||||||
|
local instanceVariable =
|
||||||
|
if platform == 'Darwin' then
|
||||||
|
instanceVariablePrototype
|
||||||
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
'instance',
|
'instance',
|
||||||
'$datasource',
|
'node_uname_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster", sysname="Darwin"}' % config,
|
||||||
'',
|
)
|
||||||
refresh='time',
|
|
||||||
label='Instance',
|
|
||||||
),
|
|
||||||
local instanceTemplate =
|
|
||||||
if platform == 'Darwin' then
|
|
||||||
instanceTemplatePrototype
|
|
||||||
{ query: 'label_values(node_uname_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster", sysname="Darwin"}, instance)' % config }
|
|
||||||
else
|
else
|
||||||
instanceTemplatePrototype
|
instanceVariablePrototype
|
||||||
{ query: 'label_values(node_uname_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster", sysname!="Darwin"}, instance)' % config },
|
+ variable.query.queryTypes.withLabelValues(
|
||||||
|
'instance',
|
||||||
|
'node_uname_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster", sysname!="Darwin"}' % config,
|
||||||
|
),
|
||||||
|
|
||||||
local idleCPU =
|
local idleCPU =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('CPU Usage')
|
||||||
'CPU Usage',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withUnit('percentunit')
|
||||||
span=6,
|
+ tsCustom.stacking.withMode('normal')
|
||||||
format='percentunit',
|
+ tsStandardOptions.withMax(1)
|
||||||
max=1,
|
+ tsStandardOptions.withMin(0)
|
||||||
min=0,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
stack=true,
|
+ tsCustom.withFillOpacity(10)
|
||||||
)
|
+ tsCustom.withShowPoints('never')
|
||||||
.addTarget(prometheus.target(
|
+ tsQueryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
(1 - sum without (mode) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode=~"idle|iowait|steal", instance="$instance", %(clusterLabel)s="$cluster"}[$__rate_interval])))
|
(1 - sum without (mode) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode=~"idle|iowait|steal", instance="$instance", %(clusterLabel)s="$cluster"}[$__rate_interval])))
|
||||||
|
@ -78,36 +87,42 @@ local table = grafana70.panel.table;
|
||||||
count without (cpu, mode) (node_cpu_seconds_total{%(nodeExporterSelector)s, mode="idle", instance="$instance", %(clusterLabel)s="$cluster"})
|
count without (cpu, mode) (node_cpu_seconds_total{%(nodeExporterSelector)s, mode="idle", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||||
)
|
)
|
||||||
||| % config,
|
||| % config,
|
||||||
legendFormat='{{cpu}}',
|
)
|
||||||
intervalFactor=5,
|
+ prometheus.withLegendFormat('{{cpu}}')
|
||||||
)),
|
+ prometheus.withIntervalFactor(5),
|
||||||
|
]),
|
||||||
|
|
||||||
local systemLoad =
|
local systemLoad =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('Load Average')
|
||||||
'Load Average',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withUnit('short')
|
||||||
span=6,
|
+ tsStandardOptions.withMin(0)
|
||||||
format='short',
|
+ tsCustom.withFillOpacity(0)
|
||||||
min=0,
|
+ tsCustom.withShowPoints('never')
|
||||||
fill=0,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
)
|
+ tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target('node_load1{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='1m load average'))
|
prometheus.new('$datasource', 'node_load1{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('1m load average'),
|
||||||
.addTarget(prometheus.target('node_load5{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='5m load average'))
|
prometheus.new('$datasource', 'node_load5{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('5m load average'),
|
||||||
.addTarget(prometheus.target('node_load15{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='15m load average'))
|
prometheus.new('$datasource', 'node_load15{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('15m load average'),
|
||||||
.addTarget(prometheus.target('count(node_cpu_seconds_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", mode="idle"})' % config, legendFormat='logical cores')),
|
prometheus.new('$datasource', 'count(node_cpu_seconds_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", mode="idle"})' % config) + prometheus.withLegendFormat('logical cores'),
|
||||||
|
]),
|
||||||
|
|
||||||
local memoryGraphPanelPrototype =
|
local memoryGraphPanelPrototype =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('Memory Usage')
|
||||||
'Memory Usage',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withUnit('bytes')
|
||||||
span=9,
|
+ tsStandardOptions.withMin(0)
|
||||||
format='bytes',
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
min=0,
|
+ tsCustom.withFillOpacity(10)
|
||||||
),
|
+ tsCustom.withShowPoints('never'),
|
||||||
|
|
||||||
local memoryGraph =
|
local memoryGraph =
|
||||||
if platform == 'Linux' then
|
if platform == 'Linux' then
|
||||||
memoryGraphPanelPrototype { stack: true }
|
memoryGraphPanelPrototype
|
||||||
.addTarget(prometheus.target(
|
+ tsCustom.stacking.withMode('normal')
|
||||||
|
+ tsQueryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
node_memory_MemTotal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
node_memory_MemTotal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
||||||
|
@ -119,16 +134,19 @@ local table = grafana70.panel.table;
|
||||||
node_memory_Cached_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
node_memory_Cached_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
||||||
)
|
)
|
||||||
||| % config,
|
||| % config,
|
||||||
legendFormat='memory used'
|
) + prometheus.withLegendFormat('memory used'),
|
||||||
))
|
prometheus.new('$datasource', 'node_memory_Buffers_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('memory buffers'),
|
||||||
.addTarget(prometheus.target('node_memory_Buffers_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='memory buffers'))
|
prometheus.new('$datasource', 'node_memory_Cached_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('memory cached'),
|
||||||
.addTarget(prometheus.target('node_memory_Cached_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='memory cached'))
|
prometheus.new('$datasource', 'node_memory_MemFree_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('memory free'),
|
||||||
.addTarget(prometheus.target('node_memory_MemFree_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='memory free'))
|
])
|
||||||
else if platform == 'Darwin' then
|
else if platform == 'Darwin' then
|
||||||
// not useful to stack
|
// not useful to stack
|
||||||
memoryGraphPanelPrototype { stack: false }
|
memoryGraphPanelPrototype
|
||||||
.addTarget(prometheus.target('node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='Physical Memory'))
|
+ tsCustom.stacking.withMode('none')
|
||||||
.addTarget(prometheus.target(
|
+ tsQueryOptions.withTargets([
|
||||||
|
prometheus.new('$datasource', 'node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('Physical Memory'),
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
node_memory_internal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
node_memory_internal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
||||||
|
@ -136,50 +154,61 @@ local table = grafana70.panel.table;
|
||||||
node_memory_wired_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} +
|
node_memory_wired_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} +
|
||||||
node_memory_compressed_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
node_memory_compressed_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
||||||
)
|
)
|
||||||
||| % config, legendFormat='Memory Used'
|
||| % config
|
||||||
))
|
) + prometheus.withLegendFormat(
|
||||||
.addTarget(prometheus.target(
|
'Memory Used'
|
||||||
|
),
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
node_memory_internal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
node_memory_internal_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
||||||
node_memory_purgeable_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
node_memory_purgeable_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
||||||
)
|
)
|
||||||
||| % config, legendFormat='App Memory'
|
||| % config
|
||||||
))
|
) + prometheus.withLegendFormat(
|
||||||
.addTarget(prometheus.target('node_memory_wired_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='Wired Memory'))
|
'App Memory'
|
||||||
.addTarget(prometheus.target('node_memory_compressed_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='Compressed'))
|
),
|
||||||
|
prometheus.new('$datasource', 'node_memory_wired_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('Wired Memory'),
|
||||||
|
prometheus.new('$datasource', 'node_memory_compressed_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('Compressed'),
|
||||||
|
])
|
||||||
|
|
||||||
else if platform == 'AIX' then
|
else if platform == 'AIX' then
|
||||||
memoryGraphPanelPrototype { stack: false }
|
memoryGraphPanelPrototype
|
||||||
.addTarget(prometheus.target('node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config, legendFormat='Physical Memory'))
|
+ tsCustom.stacking.withMode('none')
|
||||||
.addTarget(prometheus.target(
|
+ tsQueryOptions.withTargets([
|
||||||
|
prometheus.new('$datasource', 'node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}' % config) + prometheus.withLegendFormat('Physical Memory'),
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
node_memory_total_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} -
|
||||||
node_memory_available_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
node_memory_available_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"}
|
||||||
)
|
)
|
||||||
||| % config, legendFormat='Memory Used'
|
||| % config
|
||||||
)),
|
) + prometheus.withLegendFormat('Memory Used'),
|
||||||
|
]),
|
||||||
|
|
||||||
|
|
||||||
// NOTE: avg() is used to circumvent a label change caused by a node_exporter rollout.
|
// NOTE: avg() is used to circumvent a label change caused by a node_exporter rollout.
|
||||||
local memoryGaugePanelPrototype =
|
local memoryGaugePanelPrototype =
|
||||||
gaugePanel.new(
|
gaugePanel.new('Memory Usage')
|
||||||
title='Memory Usage',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ gaugePanel.standardOptions.thresholds.withSteps([
|
||||||
)
|
gaugeStep.withColor('rgba(50, 172, 45, 0.97)'),
|
||||||
.addThresholdStep('rgba(50, 172, 45, 0.97)')
|
gaugeStep.withColor('rgba(237, 129, 40, 0.89)') + gaugeStep.withValue(80),
|
||||||
.addThresholdStep('rgba(237, 129, 40, 0.89)', 80)
|
gaugeStep.withColor('rgba(245, 54, 54, 0.9)') + gaugeStep.withValue(90),
|
||||||
.addThresholdStep('rgba(245, 54, 54, 0.9)', 90)
|
])
|
||||||
.setFieldConfig(max=100, min=0, unit='percent')
|
+ gaugePanel.standardOptions.withMax(100)
|
||||||
+ {
|
+ gaugePanel.standardOptions.withMin(0)
|
||||||
span: 3,
|
+ gaugePanel.standardOptions.withUnit('percent'),
|
||||||
},
|
|
||||||
|
|
||||||
local memoryGauge =
|
local memoryGauge =
|
||||||
if platform == 'Linux' then
|
if platform == 'Linux' then
|
||||||
memoryGaugePanelPrototype
|
memoryGaugePanelPrototype
|
||||||
|
+ gaugePanel.queryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
100 -
|
100 -
|
||||||
(
|
(
|
||||||
|
@ -188,11 +217,14 @@ local table = grafana70.panel.table;
|
||||||
* 100
|
* 100
|
||||||
)
|
)
|
||||||
||| % config,
|
||| % config,
|
||||||
))
|
),
|
||||||
|
])
|
||||||
|
|
||||||
else if platform == 'Darwin' then
|
else if platform == 'Darwin' then
|
||||||
memoryGaugePanelPrototype
|
memoryGaugePanelPrototype
|
||||||
.addTarget(prometheus.target(
|
+ gaugePanel.queryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
|
@ -206,10 +238,14 @@ local table = grafana70.panel.table;
|
||||||
*
|
*
|
||||||
100
|
100
|
||||||
||| % config
|
||| % config
|
||||||
))
|
),
|
||||||
|
])
|
||||||
|
|
||||||
else if platform == 'AIX' then
|
else if platform == 'AIX' then
|
||||||
memoryGaugePanelPrototype
|
memoryGaugePanelPrototype
|
||||||
.addTarget(prometheus.target(
|
+ gaugePanel.queryOptions.withTargets([
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|||
|
|||
|
||||||
100 -
|
100 -
|
||||||
(
|
(
|
||||||
|
@ -218,156 +254,94 @@ local table = grafana70.panel.table;
|
||||||
* 100
|
* 100
|
||||||
)
|
)
|
||||||
||| % config
|
||| % config
|
||||||
)),
|
),
|
||||||
|
]),
|
||||||
|
|
||||||
|
|
||||||
local diskIO =
|
local diskIO =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('Disk I/O')
|
||||||
'Disk I/O',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withMin(0)
|
||||||
span=6,
|
+ tsCustom.withFillOpacity(0)
|
||||||
min=0,
|
+ tsCustom.withShowPoints('never')
|
||||||
fill=0,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
)
|
+ tsQueryOptions.withTargets([
|
||||||
// TODO: Does it make sense to have those three in the same panel?
|
// TODO: Does it make sense to have those three in the same panel?
|
||||||
.addTarget(prometheus.target(
|
prometheus.new('$datasource', 'rate(node_disk_read_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config)
|
||||||
'rate(node_disk_read_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config,
|
+ prometheus.withLegendFormat('{{device}} read')
|
||||||
legendFormat='{{device}} read',
|
+ prometheus.withIntervalFactor(1),
|
||||||
intervalFactor=1,
|
prometheus.new('$datasource', 'rate(node_disk_written_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config)
|
||||||
))
|
+ prometheus.withLegendFormat('{{device}} written')
|
||||||
.addTarget(prometheus.target(
|
+ prometheus.withIntervalFactor(1),
|
||||||
'rate(node_disk_written_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config,
|
prometheus.new('$datasource', 'rate(node_disk_io_time_seconds_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config)
|
||||||
legendFormat='{{device}} written',
|
+ prometheus.withLegendFormat('{{device}} io time')
|
||||||
intervalFactor=1,
|
+ prometheus.withIntervalFactor(1),
|
||||||
))
|
])
|
||||||
.addTarget(prometheus.target(
|
+ tsStandardOptions.withOverrides(
|
||||||
'rate(node_disk_io_time_seconds_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(diskDeviceSelector)s}[$__rate_interval])' % config,
|
[
|
||||||
legendFormat='{{device}} io time',
|
tsStandardOptions.override.byRegexp.new('/ read| written/')
|
||||||
intervalFactor=1,
|
+ tsStandardOptions.override.byRegexp.withPropertiesFromOptions(
|
||||||
)) +
|
tsStandardOptions.withUnit('Bps')
|
||||||
{
|
),
|
||||||
seriesOverrides: [
|
tsStandardOptions.override.byRegexp.new('/ io time/')
|
||||||
{
|
+ tsStandardOptions.override.byRegexp.withPropertiesFromOptions(tsStandardOptions.withUnit('percentunit')),
|
||||||
alias: '/ read| written/',
|
]
|
||||||
yaxis: 1,
|
),
|
||||||
},
|
|
||||||
{
|
|
||||||
alias: '/ io time/',
|
|
||||||
yaxis: 2,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
yaxes: [
|
|
||||||
self.yaxe(format='Bps'),
|
|
||||||
self.yaxe(format='percentunit'),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
local diskSpaceUsage =
|
local diskSpaceUsage =
|
||||||
table.new(
|
table.new('Disk Space Usage')
|
||||||
title='Disk Space Usage',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ table.standardOptions.withUnit('decbytes')
|
||||||
)
|
+ table.standardOptions.thresholds.withSteps(
|
||||||
.setFieldConfig(unit='decbytes')
|
[
|
||||||
.addThresholdStep(color='green', value=null)
|
tableStep.withColor('green'),
|
||||||
.addThresholdStep(color='yellow', value=0.8)
|
tableStep.withColor('yellow') + gaugeStep.withValue(0.8),
|
||||||
.addThresholdStep(color='red', value=0.9)
|
tableStep.withColor('red') + gaugeStep.withValue(0.9),
|
||||||
.addTarget(prometheus.target(
|
|
||||||
|||
|
|
||||||
max by (mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(fsSelector)s, %(fsMountpointSelector)s})
|
|
||||||
||| % config,
|
|
||||||
legendFormat='',
|
|
||||||
instant=true,
|
|
||||||
format='table'
|
|
||||||
))
|
|
||||||
.addTarget(prometheus.target(
|
|
||||||
|||
|
|
||||||
max by (mountpoint) (node_filesystem_avail_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(fsSelector)s, %(fsMountpointSelector)s})
|
|
||||||
||| % config,
|
|
||||||
legendFormat='',
|
|
||||||
instant=true,
|
|
||||||
format='table'
|
|
||||||
))
|
|
||||||
.addOverride(
|
|
||||||
matcher={
|
|
||||||
id: 'byName',
|
|
||||||
options: 'Mounted on',
|
|
||||||
},
|
|
||||||
properties=[
|
|
||||||
{
|
|
||||||
id: 'custom.width',
|
|
||||||
value: 260,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.addOverride(
|
|
||||||
matcher={
|
|
||||||
id: 'byName',
|
|
||||||
options: 'Size',
|
|
||||||
},
|
|
||||||
properties=[
|
|
||||||
|
|
||||||
{
|
|
||||||
id: 'custom.width',
|
|
||||||
value: 93,
|
|
||||||
},
|
|
||||||
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.addOverride(
|
|
||||||
matcher={
|
|
||||||
id: 'byName',
|
|
||||||
options: 'Used',
|
|
||||||
},
|
|
||||||
properties=[
|
|
||||||
{
|
|
||||||
id: 'custom.width',
|
|
||||||
value: 72,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.addOverride(
|
|
||||||
matcher={
|
|
||||||
id: 'byName',
|
|
||||||
options: 'Available',
|
|
||||||
},
|
|
||||||
properties=[
|
|
||||||
{
|
|
||||||
id: 'custom.width',
|
|
||||||
value: 88,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
.addOverride(
|
|
||||||
matcher={
|
|
||||||
id: 'byName',
|
|
||||||
options: 'Used, %',
|
|
||||||
},
|
|
||||||
properties=[
|
|
||||||
{
|
|
||||||
id: 'unit',
|
|
||||||
value: 'percentunit',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'custom.displayMode',
|
|
||||||
value: 'gradient-gauge',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'max',
|
|
||||||
value: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'min',
|
|
||||||
value: 0,
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
+ { span: 6 }
|
+ table.queryOptions.withTargets([
|
||||||
+ {
|
prometheus.new(
|
||||||
transformations: [
|
'$datasource',
|
||||||
|
|||
|
||||||
|
max by (mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(fsSelector)s, %(fsMountpointSelector)s})
|
||||||
|
||| % config
|
||||||
|
)
|
||||||
|
+ prometheus.withLegendFormat('')
|
||||||
|
+ prometheus.withInstant()
|
||||||
|
+ prometheus.withFormat('table'),
|
||||||
|
prometheus.new(
|
||||||
|
'$datasource',
|
||||||
|
|||
|
||||||
|
max by (mountpoint) (node_filesystem_avail_bytes{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", %(fsSelector)s, %(fsMountpointSelector)s})
|
||||||
|
||| % config
|
||||||
|
)
|
||||||
|
+ prometheus.withLegendFormat('')
|
||||||
|
+ prometheus.withInstant()
|
||||||
|
+ prometheus.withFormat('table'),
|
||||||
|
])
|
||||||
|
+ table.standardOptions.withOverrides([
|
||||||
|
tableOverride.byName.new('Mounted on')
|
||||||
|
+ tableOverride.byName.withProperty('custom.width', 260),
|
||||||
|
tableOverride.byName.new('Size')
|
||||||
|
+ tableOverride.byName.withProperty('custom.width', 93),
|
||||||
|
tableOverride.byName.new('Used')
|
||||||
|
+ tableOverride.byName.withProperty('custom.width', 72),
|
||||||
|
tableOverride.byName.new('Available')
|
||||||
|
+ tableOverride.byName.withProperty('custom.width', 88),
|
||||||
|
tableOverride.byName.new('Used, %')
|
||||||
|
+ tableOverride.byName.withProperty('unit', 'percentunit')
|
||||||
|
+ tableOverride.byName.withPropertiesFromOptions(
|
||||||
|
table.fieldConfig.defaults.custom.withCellOptions(
|
||||||
|
{ type: 'gauge' },
|
||||||
|
)
|
||||||
|
)
|
||||||
|
+ tableOverride.byName.withProperty('max', 1)
|
||||||
|
+ tableOverride.byName.withProperty('min', 0),
|
||||||
|
])
|
||||||
|
+ table.queryOptions.withTransformations([
|
||||||
|
tableTransformation.withId('groupBy')
|
||||||
|
+ tableTransformation.withOptions(
|
||||||
{
|
{
|
||||||
id: 'groupBy',
|
|
||||||
options: {
|
|
||||||
fields: {
|
fields: {
|
||||||
'Value #A': {
|
'Value #A': {
|
||||||
aggregations: [
|
aggregations: [
|
||||||
|
@ -386,15 +360,12 @@ local table = grafana70.panel.table;
|
||||||
operation: 'groupby',
|
operation: 'groupby',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
},
|
),
|
||||||
|
tableTransformation.withId('merge'),
|
||||||
|
tableTransformation.withId('calculateField')
|
||||||
|
+ tableTransformation.withOptions(
|
||||||
{
|
{
|
||||||
id: 'merge',
|
|
||||||
options: {},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'calculateField',
|
|
||||||
options: {
|
|
||||||
alias: 'Used',
|
alias: 'Used',
|
||||||
binary: {
|
binary: {
|
||||||
left: 'Value #A (lastNotNull)',
|
left: 'Value #A (lastNotNull)',
|
||||||
|
@ -406,11 +377,11 @@ local table = grafana70.panel.table;
|
||||||
reduce: {
|
reduce: {
|
||||||
reducer: 'sum',
|
reducer: 'sum',
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
},
|
),
|
||||||
|
tableTransformation.withId('calculateField')
|
||||||
|
+ tableTransformation.withOptions(
|
||||||
{
|
{
|
||||||
id: 'calculateField',
|
|
||||||
options: {
|
|
||||||
alias: 'Used, %',
|
alias: 'Used, %',
|
||||||
binary: {
|
binary: {
|
||||||
left: 'Used',
|
left: 'Used',
|
||||||
|
@ -422,11 +393,11 @@ local table = grafana70.panel.table;
|
||||||
reduce: {
|
reduce: {
|
||||||
reducer: 'sum',
|
reducer: 'sum',
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
},
|
),
|
||||||
|
tableTransformation.withId('organize')
|
||||||
|
+ tableTransformation.withOptions(
|
||||||
{
|
{
|
||||||
id: 'organize',
|
|
||||||
options: {
|
|
||||||
excludeByName: {},
|
excludeByName: {},
|
||||||
indexByName: {},
|
indexByName: {},
|
||||||
renameByName: {
|
renameByName: {
|
||||||
|
@ -434,127 +405,131 @@ local table = grafana70.panel.table;
|
||||||
'Value #B (lastNotNull)': 'Available',
|
'Value #B (lastNotNull)': 'Available',
|
||||||
mountpoint: 'Mounted on',
|
mountpoint: 'Mounted on',
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
},
|
),
|
||||||
|
tableTransformation.withId('sortBy')
|
||||||
|
+ tableTransformation.withOptions(
|
||||||
{
|
{
|
||||||
id: 'sortBy',
|
|
||||||
options: {
|
|
||||||
fields: {},
|
fields: {},
|
||||||
sort: [
|
sort: [
|
||||||
{
|
{
|
||||||
field: 'Mounted on',
|
field: 'Mounted on',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
}
|
||||||
},
|
),
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
|
]),
|
||||||
|
|
||||||
local networkReceived =
|
local networkReceived =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('Network Received')
|
||||||
'Network Received',
|
+ timeSeriesPanel.panelOptions.withDescription('Network received (bits/s)')
|
||||||
description='Network received (bits/s)',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withUnit('bps')
|
||||||
span=6,
|
+ tsStandardOptions.withMin(0)
|
||||||
format='bps',
|
+ tsCustom.withFillOpacity(0)
|
||||||
min=0,
|
+ tsCustom.withShowPoints('never')
|
||||||
fill=0,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
)
|
+ tsQueryOptions.withTargets([
|
||||||
.addTarget(prometheus.target(
|
prometheus.new('$datasource', 'rate(node_network_receive_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", device!="lo"}[$__rate_interval]) * 8' % config)
|
||||||
'rate(node_network_receive_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", device!="lo"}[$__rate_interval]) * 8' % config,
|
+ prometheus.withLegendFormat('{{device}}')
|
||||||
legendFormat='{{device}}',
|
+ prometheus.withIntervalFactor(1),
|
||||||
intervalFactor=1,
|
]),
|
||||||
)),
|
|
||||||
|
|
||||||
local networkTransmitted =
|
local networkTransmitted =
|
||||||
graphPanel.new(
|
timeSeriesPanel.new('Network Transmitted')
|
||||||
'Network Transmitted',
|
+ timeSeriesPanel.panelOptions.withDescription('Network transmitted (bits/s)')
|
||||||
description='Network transmitted (bits/s)',
|
+ variable.query.withDatasourceFromVariable(prometheusDatasourceVariable)
|
||||||
datasource='$datasource',
|
+ tsStandardOptions.withUnit('bps')
|
||||||
span=6,
|
+ tsStandardOptions.withMin(0)
|
||||||
format='bps',
|
+ tsCustom.withFillOpacity(0)
|
||||||
min=0,
|
+ tsOptions.tooltip.withMode('multi')
|
||||||
fill=0,
|
+ tsQueryOptions.withTargets([
|
||||||
)
|
prometheus.new('$datasource', 'rate(node_network_transmit_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", device!="lo"}[$__rate_interval]) * 8' % config)
|
||||||
.addTarget(prometheus.target(
|
+ prometheus.withLegendFormat('{{device}}')
|
||||||
'rate(node_network_transmit_bytes_total{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster", device!="lo"}[$__rate_interval]) * 8' % config,
|
+ prometheus.withIntervalFactor(1),
|
||||||
legendFormat='{{device}}',
|
]),
|
||||||
intervalFactor=1,
|
|
||||||
)),
|
|
||||||
|
|
||||||
local cpuRow =
|
local cpuRow =
|
||||||
row.new('CPU')
|
row.new('CPU')
|
||||||
.addPanel(idleCPU)
|
+ row.withPanels([
|
||||||
.addPanel(systemLoad),
|
idleCPU,
|
||||||
|
systemLoad,
|
||||||
|
]),
|
||||||
|
|
||||||
local memoryRow =
|
local memoryRow = [
|
||||||
row.new('Memory')
|
row.new('Memory') + row.gridPos.withY(8),
|
||||||
.addPanel(memoryGraph)
|
memoryGraph + row.gridPos.withX(0) + row.gridPos.withY(9) + row.gridPos.withH(7) + row.gridPos.withW(18),
|
||||||
.addPanel(memoryGauge),
|
memoryGauge + row.gridPos.withX(18) + row.gridPos.withY(9) + row.gridPos.withH(7) + row.gridPos.withW(6),
|
||||||
|
],
|
||||||
|
|
||||||
local diskRow =
|
local diskRow =
|
||||||
row.new('Disk')
|
row.new('Disk')
|
||||||
.addPanel(diskIO)
|
+ row.withPanels([
|
||||||
.addPanel(diskSpaceUsage),
|
diskIO,
|
||||||
|
diskSpaceUsage,
|
||||||
|
]),
|
||||||
|
|
||||||
local networkRow =
|
local networkRow =
|
||||||
row.new('Network')
|
row.new('Network')
|
||||||
.addPanel(networkReceived)
|
+ row.withPanels([
|
||||||
.addPanel(networkTransmitted),
|
networkReceived,
|
||||||
|
networkTransmitted,
|
||||||
|
]),
|
||||||
|
|
||||||
local rows =
|
local panels =
|
||||||
[
|
grafana.util.grid.makeGrid([
|
||||||
cpuRow,
|
cpuRow,
|
||||||
memoryRow,
|
], panelWidth=12, panelHeight=7)
|
||||||
|
+ memoryRow
|
||||||
|
+ grafana.util.grid.makeGrid([
|
||||||
diskRow,
|
diskRow,
|
||||||
networkRow,
|
networkRow,
|
||||||
],
|
], panelWidth=12, panelHeight=7, startY=18),
|
||||||
|
|
||||||
local templates =
|
local variables =
|
||||||
[
|
[
|
||||||
prometheusDatasourceTemplate,
|
prometheusDatasourceVariable,
|
||||||
clusterTemplate,
|
clusterVariable,
|
||||||
instanceTemplate,
|
instanceVariable,
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
||||||
dashboard: if platform == 'Linux' then
|
dashboard: if platform == 'Linux' then
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sNodes' % config.dashboardNamePrefix,
|
'%sNodes' % config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=(config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
uid=std.md5(uid),
|
|
||||||
graphTooltip='shared_crosshair'
|
|
||||||
)
|
)
|
||||||
.addTemplates(templates)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addRows(rows)
|
+ dashboard.withTags(config.dashboardTags)
|
||||||
|
+ dashboard.withTimezone('utc')
|
||||||
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.withUid(std.md5(uid))
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withVariables(variables)
|
||||||
|
+ dashboard.withPanels(panels)
|
||||||
else if platform == 'Darwin' then
|
else if platform == 'Darwin' then
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sMacOS' % config.dashboardNamePrefix,
|
'%sMacOS' % config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=(config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
uid=std.md5(uid),
|
|
||||||
graphTooltip='shared_crosshair'
|
|
||||||
)
|
)
|
||||||
.addTemplates(templates)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addRows(rows)
|
+ dashboard.withTags(config.dashboardTags)
|
||||||
|
+ dashboard.withTimezone('utc')
|
||||||
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.withUid(std.md5(uid))
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withVariables(variables)
|
||||||
|
+ dashboard.withPanels(panels)
|
||||||
else if platform == 'AIX' then
|
else if platform == 'AIX' then
|
||||||
dashboard.new(
|
dashboard.new(
|
||||||
'%sAIX' % config.dashboardNamePrefix,
|
'%sAIX' % config.dashboardNamePrefix,
|
||||||
time_from='now-1h',
|
|
||||||
tags=(config.dashboardTags),
|
|
||||||
timezone='utc',
|
|
||||||
refresh='30s',
|
|
||||||
uid=std.md5(uid),
|
|
||||||
graphTooltip='shared_crosshair'
|
|
||||||
)
|
)
|
||||||
.addTemplates(templates)
|
+ dashboard.time.withFrom('now-1h')
|
||||||
.addRows(rows),
|
+ dashboard.withTags(config.dashboardTags)
|
||||||
|
+ dashboard.withTimezone('utc')
|
||||||
|
+ dashboard.withRefresh('30s')
|
||||||
|
+ dashboard.withUid(std.md5(uid))
|
||||||
|
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||||
|
+ dashboard.withVariables(variables)
|
||||||
|
+ dashboard.withPanels(panels),
|
||||||
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,38 @@
|
||||||
|
|
||||||
set -euf -o pipefail
|
set -euf -o pipefail
|
||||||
|
|
||||||
|
# Allow setting GOHOSTOS for debugging purposes.
|
||||||
|
GOHOSTOS=${GOHOSTOS:-$(go env GOHOSTOS)}
|
||||||
|
|
||||||
|
# Allow setting arch for debugging purposes.
|
||||||
|
arch=${arch:-$(uname -m)}
|
||||||
|
|
||||||
|
maybe_flag_search_scope() {
|
||||||
|
local collector=$1
|
||||||
|
os_aux_os=""
|
||||||
|
if [[ $GOHOSTOS =~ ^(freebsd|openbsd|netbsd|solaris|dragonfly)$ ]]; then
|
||||||
|
os_aux_os=" ${collector}_bsd.go"
|
||||||
|
fi
|
||||||
|
echo "${collector}_common.go ${collector}.go ${collector}_${GOHOSTOS}.go ${collector}_${GOHOSTOS}_${arch}.go${os_aux_os}"
|
||||||
|
}
|
||||||
|
|
||||||
|
supported_collectors() {
|
||||||
|
local collectors=$1
|
||||||
|
local supported=""
|
||||||
|
for collector in ${collectors}; do
|
||||||
|
for filename in $(maybe_flag_search_scope "${collector}"); do
|
||||||
|
file="collector/${filename}"
|
||||||
|
if ./tools/tools match ${file} > /dev/null 2>&1; then
|
||||||
|
if grep -h -E -o -- "registerCollector\(" ${file} > /dev/null 2>&1; then
|
||||||
|
supported="${supported} ${collector}"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo "${supported}" | tr ' ' '\n' | sort | uniq
|
||||||
|
}
|
||||||
|
|
||||||
enabled_collectors=$(cat << COLLECTORS
|
enabled_collectors=$(cat << COLLECTORS
|
||||||
arp
|
arp
|
||||||
bcache
|
bcache
|
||||||
|
@ -57,6 +89,8 @@ enabled_collectors=$(cat << COLLECTORS
|
||||||
zoneinfo
|
zoneinfo
|
||||||
COLLECTORS
|
COLLECTORS
|
||||||
)
|
)
|
||||||
|
supported_enabled_collectors=$(supported_collectors "${enabled_collectors}")
|
||||||
|
|
||||||
disabled_collectors=$(cat << COLLECTORS
|
disabled_collectors=$(cat << COLLECTORS
|
||||||
selinux
|
selinux
|
||||||
filesystem
|
filesystem
|
||||||
|
@ -64,6 +98,8 @@ disabled_collectors=$(cat << COLLECTORS
|
||||||
uname
|
uname
|
||||||
COLLECTORS
|
COLLECTORS
|
||||||
)
|
)
|
||||||
|
supported_disabled_collectors=$(supported_collectors "${disabled_collectors}")
|
||||||
|
|
||||||
cd "$(dirname $0)"
|
cd "$(dirname $0)"
|
||||||
|
|
||||||
port="$((10000 + (RANDOM % 10000)))"
|
port="$((10000 + (RANDOM % 10000)))"
|
||||||
|
@ -71,11 +107,9 @@ tmpdir=$(mktemp -d /tmp/node_exporter_e2e_test.XXXXXX)
|
||||||
|
|
||||||
skip_re="^(go_|node_exporter_build_info|node_scrape_collector_duration_seconds|process_|node_textfile_mtime_seconds|node_time_(zone|seconds)|node_network_(receive|transmit)_(bytes|packets)_total)"
|
skip_re="^(go_|node_exporter_build_info|node_scrape_collector_duration_seconds|process_|node_textfile_mtime_seconds|node_time_(zone|seconds)|node_network_(receive|transmit)_(bytes|packets)_total)"
|
||||||
|
|
||||||
arch="$(uname -m)"
|
|
||||||
|
|
||||||
case "${arch}" in
|
case "${arch}" in
|
||||||
aarch64|ppc64le) fixture='collector/fixtures/e2e-64k-page-output.txt' ;;
|
aarch64|ppc64le) fixture_metrics='collector/fixtures/e2e-64k-page-output.txt' ;;
|
||||||
*) fixture='collector/fixtures/e2e-output.txt' ;;
|
*) fixture_metrics='collector/fixtures/e2e-output.txt' ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Only test CPU info collection on x86_64.
|
# Only test CPU info collection on x86_64.
|
||||||
|
@ -109,7 +143,7 @@ do
|
||||||
*)
|
*)
|
||||||
echo "Usage: $0 [-k] [-u] [-v]"
|
echo "Usage: $0 [-k] [-u] [-v]"
|
||||||
echo " -k: keep temporary files and leave node_exporter running"
|
echo " -k: keep temporary files and leave node_exporter running"
|
||||||
echo " -u: update fixture"
|
echo " -u: update fixture_metrics"
|
||||||
echo " -v: verbose output"
|
echo " -v: verbose output"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
@ -122,37 +156,126 @@ then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
collector_flags=$(cat << FLAGS
|
||||||
|
${cpu_info_collector}
|
||||||
|
--collector.arp.device-exclude=nope
|
||||||
|
--collector.bcache.priorityStats
|
||||||
|
--collector.cpu.info.bugs-include=${cpu_info_bugs}
|
||||||
|
--collector.cpu.info.flags-include=${cpu_info_flags}
|
||||||
|
--collector.hwmon.chip-include=(applesmc|coretemp|hwmon4|nct6779)
|
||||||
|
--collector.netclass.ignore-invalid-speed
|
||||||
|
--collector.netclass.ignored-devices=(dmz|int)
|
||||||
|
--collector.netdev.device-include=lo
|
||||||
|
--collector.qdisc.device-include=(wlan0|eth0)
|
||||||
|
--collector.qdisc.fixtures=collector/fixtures/qdisc/
|
||||||
|
--collector.stat.softirq
|
||||||
|
--collector.sysctl.include-info=kernel.seccomp.actions_avail
|
||||||
|
--collector.sysctl.include=fs.file-nr
|
||||||
|
--collector.sysctl.include=fs.file-nr:total,current,max
|
||||||
|
--collector.sysctl.include=kernel.threads-max
|
||||||
|
--collector.textfile.directory=collector/fixtures/textfile/two_metric_files/
|
||||||
|
--collector.wifi.fixtures=collector/fixtures/wifi
|
||||||
|
--no-collector.arp.netlink
|
||||||
|
FLAGS
|
||||||
|
)
|
||||||
|
|
||||||
|
# Handle supported --[no-]collector.<name> flags. These are not hardcoded.
|
||||||
|
_filtered_collector_flags=""
|
||||||
|
for flag in ${collector_flags}; do
|
||||||
|
collector=$(echo "${flag}" | cut -d"." -f2)
|
||||||
|
# If the flag is associated with an enabled-by-default collector, include it.
|
||||||
|
enabled_by_default=0
|
||||||
|
for filename in $(maybe_flag_search_scope "${collector}") ; do
|
||||||
|
file="collector/${filename}"
|
||||||
|
if grep -h -E -o -- "registerCollector\(.*, defaultEnabled" ${file} > /dev/null 2>&1; then
|
||||||
|
_filtered_collector_flags="${_filtered_collector_flags} ${flag}"
|
||||||
|
enabled_by_default=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${enabled_by_default} -eq 1 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# If the flag is associated with an enabled-list collector, include it.
|
||||||
|
if echo "${supported_enabled_collectors} ${supported_disabled_collectors}" | grep -q -w "${collector}"; then
|
||||||
|
_filtered_collector_flags="${_filtered_collector_flags} ${flag}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Handle supported --[no-]collector.<name>.<collector> flags. These are hardcoded and matched by the expression below.
|
||||||
|
filtered_collector_flags=""
|
||||||
|
# Check flags of all supported collectors further down their sub-collectors (beyond the 2nd ".").
|
||||||
|
for flag in ${_filtered_collector_flags}; do
|
||||||
|
# Iterate through all possible files where the flag may be defined.
|
||||||
|
flag_collector="$(echo "${flag}" | cut -d"." -f2)"
|
||||||
|
for filename in $(maybe_flag_search_scope "${flag_collector}") ; do
|
||||||
|
file="collector/${filename}"
|
||||||
|
# Move to next iteration if the current file is not included under the build context.
|
||||||
|
if ! ./tools/tools match "$file" > /dev/null 2>&1; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Flag has the format: --[no-]collector.<name>.<collector>.
|
||||||
|
if [ -n "$(echo ${flag} | cut -d"." -f3)" ]; then
|
||||||
|
# Check if the flag is used in the file.
|
||||||
|
trimmed_flag=$(echo "${flag}" | tr -d "\"' " | cut -d"=" -f1 | cut -c 3-)
|
||||||
|
if [[ $trimmed_flag =~ ^no- ]]; then
|
||||||
|
trimmed_flag=$(echo $trimmed_flag | cut -c 4-)
|
||||||
|
fi
|
||||||
|
if grep -h -E -o -- "kingpin.Flag\(\"${trimmed_flag}" ${file} > /dev/null 2>&1; then
|
||||||
|
filtered_collector_flags="${filtered_collector_flags} ${flag}"
|
||||||
|
else
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Flag has the format: --[no-]collector.<name>.
|
||||||
|
else
|
||||||
|
# Flag is supported by the host.
|
||||||
|
filtered_collector_flags="${filtered_collector_flags} ${flag}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check for ignored flags.
|
||||||
|
ignored_flags=""
|
||||||
|
for flag in ${collector_flags}; do
|
||||||
|
flag=$(echo "${flag}" | tr -d " ")
|
||||||
|
if ! echo "${filtered_collector_flags}" | grep -q -F -- "${flag}" > /dev/null 2>&1; then
|
||||||
|
ignored_flags="${ignored_flags} ${flag}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "ENABLED COLLECTORS======="
|
||||||
|
echo "${supported_enabled_collectors:1}" | tr ' ' '\n' | sort
|
||||||
|
echo "========================="
|
||||||
|
|
||||||
|
echo "DISABLED COLLECTORS======"
|
||||||
|
echo "${supported_disabled_collectors:1}" | tr ' ' '\n' | sort
|
||||||
|
echo "========================="
|
||||||
|
|
||||||
|
echo "IGNORED FLAGS============"
|
||||||
|
echo "${ignored_flags:1}"| tr ' ' '\n' | sort | uniq
|
||||||
|
echo "========================="
|
||||||
|
|
||||||
./node_exporter \
|
./node_exporter \
|
||||||
--path.rootfs="collector/fixtures" \
|
--path.rootfs="collector/fixtures" \
|
||||||
--path.procfs="collector/fixtures/proc" \
|
--path.procfs="collector/fixtures/proc" \
|
||||||
--path.sysfs="collector/fixtures/sys" \
|
--path.sysfs="collector/fixtures/sys" \
|
||||||
--path.udev.data="collector/fixtures/udev/data" \
|
--path.udev.data="collector/fixtures/udev/data" \
|
||||||
$(for c in ${enabled_collectors}; do echo --collector.${c} ; done) \
|
$(for c in ${supported_enabled_collectors}; do echo --collector.${c} ; done) \
|
||||||
$(for c in ${disabled_collectors}; do echo --no-collector.${c} ; done) \
|
$(for c in ${supported_disabled_collectors}; do echo --no-collector.${c} ; done) \
|
||||||
--collector.textfile.directory="collector/fixtures/textfile/two_metric_files/" \
|
${filtered_collector_flags} \
|
||||||
--collector.wifi.fixtures="collector/fixtures/wifi" \
|
|
||||||
--collector.qdisc.fixtures="collector/fixtures/qdisc/" \
|
|
||||||
--collector.qdisc.device-include="(wlan0|eth0)" \
|
|
||||||
--collector.arp.device-exclude="nope" \
|
|
||||||
--no-collector.arp.netlink \
|
|
||||||
--collector.hwmon.chip-include="(applesmc|coretemp|hwmon4|nct6779)" \
|
|
||||||
--collector.netclass.ignored-devices="(dmz|int)" \
|
|
||||||
--collector.netclass.ignore-invalid-speed \
|
|
||||||
--collector.netdev.device-include="lo" \
|
|
||||||
--collector.bcache.priorityStats \
|
|
||||||
"${cpu_info_collector}" \
|
|
||||||
--collector.cpu.info.bugs-include="${cpu_info_bugs}" \
|
|
||||||
--collector.cpu.info.flags-include="${cpu_info_flags}" \
|
|
||||||
--collector.stat.softirq \
|
|
||||||
--collector.sysctl.include="kernel.threads-max" \
|
|
||||||
--collector.sysctl.include="fs.file-nr" \
|
|
||||||
--collector.sysctl.include="fs.file-nr:total,current,max" \
|
|
||||||
--collector.sysctl.include-info="kernel.seccomp.actions_avail" \
|
|
||||||
--web.listen-address "127.0.0.1:${port}" \
|
--web.listen-address "127.0.0.1:${port}" \
|
||||||
--log.level="debug" > "${tmpdir}/node_exporter.log" 2>&1 &
|
--log.level="debug" > "${tmpdir}/node_exporter.log" 2>&1 &
|
||||||
|
|
||||||
echo $! > "${tmpdir}/node_exporter.pid"
|
echo $! > "${tmpdir}/node_exporter.pid"
|
||||||
|
|
||||||
|
generated_metrics="${tmpdir}/e2e-output.txt"
|
||||||
|
for os in freebsd openbsd netbsd solaris dragonfly darwin; do
|
||||||
|
if [ "${GOHOSTOS}" = "${os}" ]; then
|
||||||
|
generated_metrics="${tmpdir}/e2e-output-${GOHOSTOS}.txt"
|
||||||
|
fixture_metrics="${fixture_metrics::-4}-${GOHOSTOS}.txt"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
finish() {
|
finish() {
|
||||||
if [ $? -ne 0 -o ${verbose} -ne 0 ]
|
if [ $? -ne 0 -o ${verbose} -ne 0 ]
|
||||||
then
|
then
|
||||||
|
@ -165,7 +288,7 @@ EOF
|
||||||
|
|
||||||
if [ ${update} -ne 0 ]
|
if [ ${update} -ne 0 ]
|
||||||
then
|
then
|
||||||
cp "${tmpdir}/e2e-output.txt" "${fixture}"
|
cp "${generated_metrics}" "${fixture_metrics}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ${keep} -eq 0 ]
|
if [ ${keep} -eq 0 ]
|
||||||
|
@ -195,8 +318,64 @@ get() {
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
||||||
get "127.0.0.1:${port}/metrics" | grep -E -v "${skip_re}" > "${tmpdir}/e2e-output.txt"
|
get "127.0.0.1:${port}/metrics" | grep --text -E -v "${skip_re}" > "${generated_metrics}"
|
||||||
|
|
||||||
|
# The following ignore-list is only applicable to the VMs used to run E2E tests on platforms for which containerized environments are not available.
|
||||||
|
# However, owing to this, there are some non-deterministic metrics that end up generating samples, unlike their containerized counterparts, for e.g., node_network_receive_bytes_total.
|
||||||
|
non_deterministic_metrics=$(cat << METRICS
|
||||||
|
node_boot_time_seconds
|
||||||
|
node_cpu_frequency_hertz
|
||||||
|
node_cpu_frequency_max_hertz
|
||||||
|
node_cpu_seconds_total
|
||||||
|
node_disk_io_time_seconds_total
|
||||||
|
node_disk_read_bytes_total
|
||||||
|
node_disk_read_sectors_total
|
||||||
|
node_disk_read_time_seconds_total
|
||||||
|
node_disk_reads_completed_total
|
||||||
|
node_disk_write_time_seconds_total
|
||||||
|
node_disk_writes_completed_total
|
||||||
|
node_disk_written_bytes_total
|
||||||
|
node_disk_written_sectors_total
|
||||||
|
node_exec_context_switches_total
|
||||||
|
node_exec_device_interrupts_total
|
||||||
|
node_exec_forks_total
|
||||||
|
node_exec_software_interrupts_total
|
||||||
|
node_exec_system_calls_total
|
||||||
|
node_exec_traps_total
|
||||||
|
node_interrupts_total
|
||||||
|
node_load1
|
||||||
|
node_load15
|
||||||
|
node_load5
|
||||||
|
node_memory_active_bytes
|
||||||
|
node_memory_buffer_bytes
|
||||||
|
node_memory_cache_bytes
|
||||||
|
node_memory_compressed_bytes
|
||||||
|
node_memory_free_bytes
|
||||||
|
node_memory_inactive_bytes
|
||||||
|
node_memory_internal_bytes
|
||||||
|
node_memory_laundry_bytes
|
||||||
|
node_memory_purgeable_bytes
|
||||||
|
node_memory_size_bytes
|
||||||
|
node_memory_swapped_in_bytes_total
|
||||||
|
node_memory_swapped_out_bytes_total
|
||||||
|
node_memory_wired_bytes
|
||||||
|
node_netstat_tcp_receive_packets_total
|
||||||
|
node_netstat_tcp_transmit_packets_total
|
||||||
|
node_network_receive_bytes_total
|
||||||
|
node_network_receive_multicast_total
|
||||||
|
node_network_transmit_multicast_total
|
||||||
|
METRICS
|
||||||
|
)
|
||||||
|
|
||||||
|
# Remove non-deterministic metrics from the generated metrics file (as we run their workflows in VMs).
|
||||||
|
for os in freebsd openbsd netbsd solaris dragonfly darwin; do
|
||||||
|
if [ "${GOHOSTOS}" = "${os}" ]; then
|
||||||
|
for metric in ${non_deterministic_metrics}; do
|
||||||
|
sed -i "/${metric}/d" "${generated_metrics}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
diff -u \
|
diff -u \
|
||||||
"${fixture}" \
|
"${fixture_metrics}" \
|
||||||
"${tmpdir}/e2e-output.txt"
|
"${generated_metrics}"
|
||||||
|
|
36
go.mod
36
go.mod
|
@ -1,6 +1,6 @@
|
||||||
module github.com/prometheus/node_exporter
|
module github.com/prometheus/node_exporter
|
||||||
|
|
||||||
go 1.22.0
|
go 1.23.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/alecthomas/kingpin/v2 v2.4.0
|
github.com/alecthomas/kingpin/v2 v2.4.0
|
||||||
|
@ -18,18 +18,18 @@ require (
|
||||||
github.com/mattn/go-xmlrpc v0.0.3
|
github.com/mattn/go-xmlrpc v0.0.3
|
||||||
github.com/mdlayher/ethtool v0.2.0
|
github.com/mdlayher/ethtool v0.2.0
|
||||||
github.com/mdlayher/netlink v1.7.2
|
github.com/mdlayher/netlink v1.7.2
|
||||||
github.com/mdlayher/wifi v0.2.0
|
github.com/mdlayher/wifi v0.5.0
|
||||||
github.com/opencontainers/selinux v1.11.0
|
github.com/opencontainers/selinux v1.11.1
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55
|
||||||
github.com/prometheus-community/go-runit v0.1.0
|
github.com/prometheus-community/go-runit v0.1.0
|
||||||
github.com/prometheus/client_golang v1.20.3
|
github.com/prometheus/client_golang v1.21.1
|
||||||
github.com/prometheus/client_model v0.6.1
|
github.com/prometheus/client_model v0.6.2
|
||||||
github.com/prometheus/common v0.59.1
|
github.com/prometheus/common v0.64.0
|
||||||
github.com/prometheus/exporter-toolkit v0.13.0
|
github.com/prometheus/exporter-toolkit v0.14.0
|
||||||
github.com/prometheus/procfs v0.15.1
|
github.com/prometheus/procfs v0.16.1
|
||||||
github.com/safchain/ethtool v0.4.1
|
github.com/safchain/ethtool v0.5.10
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
|
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
|
||||||
golang.org/x/sys v0.25.0
|
golang.org/x/sys v0.33.0
|
||||||
howett.net/plist v1.0.1
|
howett.net/plist v1.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,9 +38,9 @@ require (
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/dennwc/ioctl v1.0.0 // indirect
|
github.com/dennwc/ioctl v1.0.0 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
github.com/jpillora/backoff v1.0.0 // indirect
|
github.com/jpillora/backoff v1.0.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.9 // indirect
|
github.com/klauspost/compress v1.17.11 // indirect
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||||
github.com/mdlayher/genetlink v1.3.2 // indirect
|
github.com/mdlayher/genetlink v1.3.2 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.4.1 // indirect
|
||||||
|
@ -51,11 +51,11 @@ require (
|
||||||
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.6.0 // indirect
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
golang.org/x/crypto v0.26.0 // indirect
|
golang.org/x/crypto v0.38.0 // indirect
|
||||||
golang.org/x/net v0.28.0 // indirect
|
golang.org/x/net v0.40.0 // indirect
|
||||||
golang.org/x/oauth2 v0.22.0 // indirect
|
golang.org/x/oauth2 v0.30.0 // indirect
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
golang.org/x/sync v0.14.0 // indirect
|
||||||
golang.org/x/text v0.17.0 // indirect
|
golang.org/x/text v0.25.0 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
74
go.sum
74
go.sum
|
@ -24,8 +24,8 @@ github.com/ema/qdisc v1.0.0/go.mod h1:FhIc0fLYi7f+lK5maMsesDqwYojIOh3VfRs8EVd5YJ
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY=
|
github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY=
|
||||||
github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc=
|
github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc=
|
||||||
github.com/hodgesds/perf-utils v0.7.0 h1:7KlHGMuig4FRH5fNw68PV6xLmgTe7jKs9hgAcEAbioU=
|
github.com/hodgesds/perf-utils v0.7.0 h1:7KlHGMuig4FRH5fNw68PV6xLmgTe7jKs9hgAcEAbioU=
|
||||||
|
@ -39,8 +39,8 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
|
||||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
github.com/jsimonetti/rtnetlink/v2 v2.0.2 h1:ZKlbCujrIpp4/u3V2Ka0oxlf4BCkt6ojkvpy3nZoCBY=
|
github.com/jsimonetti/rtnetlink/v2 v2.0.2 h1:ZKlbCujrIpp4/u3V2Ka0oxlf4BCkt6ojkvpy3nZoCBY=
|
||||||
github.com/jsimonetti/rtnetlink/v2 v2.0.2/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE=
|
github.com/jsimonetti/rtnetlink/v2 v2.0.2/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE=
|
||||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
||||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
@ -61,66 +61,66 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U
|
||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||||
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
|
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
|
||||||
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
|
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
|
||||||
github.com/mdlayher/wifi v0.2.0 h1:vwbVyu5MWTiFNvOmWdvIx9veBlMVnEasZ90PhUi1DYU=
|
github.com/mdlayher/wifi v0.5.0 h1:TGZIcrhL6h3710amshpEJnMzLs74MrZOF+8qbm8Gx/I=
|
||||||
github.com/mdlayher/wifi v0.2.0/go.mod h1:yOfWhVZ4FFJxeHzAxDzt87Om9EkqqcCiY9Gi5gfSXwI=
|
github.com/mdlayher/wifi v0.5.0/go.mod h1:yfQs+5zr1eOIfdsWDcZonWdznnt/Iiz0/4772cfZuHk=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/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-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
|
github.com/opencontainers/selinux v1.11.1 h1:nHFvthhM0qY8/m+vfhJylliSshm8G1jJ2jDMcgULaH8=
|
||||||
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
github.com/opencontainers/selinux v1.11.1/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
github.com/prometheus-community/go-runit v0.1.0 h1:uTWEj/Fn2RoLdfg/etSqwzgYNOYPrARx1BHUN052tGA=
|
github.com/prometheus-community/go-runit v0.1.0 h1:uTWEj/Fn2RoLdfg/etSqwzgYNOYPrARx1BHUN052tGA=
|
||||||
github.com/prometheus-community/go-runit v0.1.0/go.mod h1:AvJ9Jo3gAFu2lbM4+qfjdpq30FfiLDJZKbQ015u08IQ=
|
github.com/prometheus-community/go-runit v0.1.0/go.mod h1:AvJ9Jo3gAFu2lbM4+qfjdpq30FfiLDJZKbQ015u08IQ=
|
||||||
github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4=
|
github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
|
||||||
github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||||
github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0=
|
github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
|
||||||
github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0=
|
github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
|
||||||
github.com/prometheus/exporter-toolkit v0.13.0 h1:lmA0Q+8IaXgmFRKw09RldZmZdnvu9wwcDLIXGmTPw1c=
|
github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg=
|
||||||
github.com/prometheus/exporter-toolkit v0.13.0/go.mod h1:2uop99EZl80KdXhv/MxVI2181fMcwlsumFOqBecGkG0=
|
github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA=
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
|
||||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/safchain/ethtool v0.4.1 h1:S6mEleTADqgynileXoiapt/nKnatyR6bmIHoF+h2ADo=
|
github.com/safchain/ethtool v0.5.10 h1:Im294gZtuf4pSGJRAOGKaASNi3wMeFaGaWuSaomedpc=
|
||||||
github.com/safchain/ethtool v0.4.1/go.mod h1:XLLnZmy4OCRTkksP/UiMjij96YmIsBfmBQcs7H6tA48=
|
github.com/safchain/ethtool v0.5.10/go.mod h1:w9jh2Lx7YBR4UwzLkzCmWl85UY0W2uZdd7/DckVE5+c=
|
||||||
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973 h1:GfSdC6wKfTGcgCS7BtzF5694Amne1pGCSTY252WhlEY=
|
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973 h1:GfSdC6wKfTGcgCS7BtzF5694Amne1pGCSTY252WhlEY=
|
||||||
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
|
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
||||||
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
||||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
|
||||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
|
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
|
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
|
||||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||||
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
|
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||||
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
|
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
|
||||||
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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 h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
|
79
tools/main.go
Normal file
79
tools/main.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"go/build"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
printHelpAndDie := func() {
|
||||||
|
fmt.Println(`
|
||||||
|
Usage: tools [command]`)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if len(os.Args) < 2 {
|
||||||
|
printHelpAndDie()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sub-commands.
|
||||||
|
matchCmd := flag.NewFlagSet("match", flag.ExitOnError)
|
||||||
|
switch os.Args[1] {
|
||||||
|
case "match":
|
||||||
|
err := matchCmd.Parse(os.Args[2:])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error parsing flags:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if matchCmd.NArg() != 1 {
|
||||||
|
fmt.Println("Usage: match [file]")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
file := matchCmd.Arg(0)
|
||||||
|
|
||||||
|
// For debugging purposes, allow overriding these.
|
||||||
|
goos, found := os.LookupEnv("GOHOSTOS")
|
||||||
|
if !found {
|
||||||
|
goos = runtime.GOOS
|
||||||
|
}
|
||||||
|
goarch, found := os.LookupEnv("GOARCH")
|
||||||
|
if !found {
|
||||||
|
goarch = runtime.GOARCH
|
||||||
|
}
|
||||||
|
ctx := build.Context{
|
||||||
|
GOOS: goos,
|
||||||
|
GOARCH: goarch,
|
||||||
|
}
|
||||||
|
abs, err := filepath.Abs(file)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
match, err := ctx.MatchFile(filepath.Dir(abs), filepath.Base(abs))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if match {
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
os.Exit(1)
|
||||||
|
default:
|
||||||
|
printHelpAndDie()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue