mirror of
https://github.com/prometheus/node_exporter.git
synced 2025-03-05 21:00:12 -08:00
Merge branch 'master' into cpu_netbsd_32bit
This commit is contained in:
commit
7c473373e2
|
@ -7,10 +7,10 @@ executors:
|
||||||
# should also be updated.
|
# should also be updated.
|
||||||
golang:
|
golang:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/go:1.22
|
- image: cimg/go:1.23
|
||||||
arm:
|
arm:
|
||||||
machine:
|
docker:
|
||||||
image: ubuntu-2204:current
|
- image: cimg/go:1.23
|
||||||
resource_class: arm.medium
|
resource_class: arm.medium
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -25,7 +25,7 @@ jobs:
|
||||||
test-arm:
|
test-arm:
|
||||||
executor: arm
|
executor: arm
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- prometheus/setup_environment
|
||||||
- run: uname -a
|
- run: uname -a
|
||||||
- run: make test-e2e
|
- run: make test-e2e
|
||||||
test_mixins:
|
test_mixins:
|
||||||
|
@ -70,7 +70,7 @@ jobs:
|
||||||
machine:
|
machine:
|
||||||
image: ubuntu-2204:current
|
image: ubuntu-2204:current
|
||||||
environment:
|
environment:
|
||||||
DOCKER_TEST_IMAGE_NAME: quay.io/prometheus/golang-builder:1.22-base
|
DOCKER_TEST_IMAGE_NAME: quay.io/prometheus/golang-builder:1.23-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.23.3"
|
||||||
|
GO_VERSION_FREEBSD: "123"
|
||||||
|
GO_VERSION_NETBSD: "1.23.3"
|
||||||
|
GO_VERSION_OPENBSD: "1.23.1"
|
||||||
|
GO_VERSION_SOLARIS: "1.23.3"
|
||||||
|
|
||||||
|
# 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@v4
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/freebsd-vm@v1
|
||||||
|
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@v4
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/openbsd-vm@v1
|
||||||
|
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@v4
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/netbsd-vm@v1
|
||||||
|
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@v4
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/dragonflybsd-vm@v1
|
||||||
|
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@v4
|
||||||
|
- name: test-e2e
|
||||||
|
uses: vmactions/solaris-vm@v1
|
||||||
|
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@v4
|
||||||
|
- 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@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0
|
||||||
with:
|
with:
|
||||||
go-version: 1.22.x
|
go-version: 1.23.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@a4f60bb28d35aeee14e6880718e0c85ff1882e64 # v6.0.1
|
uses: golangci/golangci-lint-action@ec5d18412c0aeab7936cb16880d708ba2a64e1ae # v6.2.0
|
||||||
with:
|
with:
|
||||||
args: --verbose
|
args: --verbose
|
||||||
version: v1.59.1
|
version: v1.63.4
|
||||||
|
|
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:
|
||||||
|
@ -32,8 +24,6 @@ linters-settings:
|
||||||
exclude-functions:
|
exclude-functions:
|
||||||
# Used in HTTP handlers, any error is handled by the server itself.
|
# Used in HTTP handlers, any error is handled by the server itself.
|
||||||
- (net/http.ResponseWriter).Write
|
- (net/http.ResponseWriter).Write
|
||||||
# Never check for logger errors.
|
|
||||||
- (github.com/go-kit/log.Logger).Log
|
|
||||||
revive:
|
revive:
|
||||||
rules:
|
rules:
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter
|
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter
|
||||||
|
|
|
@ -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.22
|
version: 1.23
|
||||||
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.22
|
version: 1.23
|
||||||
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:
|
||||||
|
|
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.59.1
|
GOLANGCI_LINT_VERSION ?= v1.63.4
|
||||||
# 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))
|
||||||
|
@ -275,3 +275,9 @@ $(1)_precheck:
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
govulncheck: install-govulncheck
|
||||||
|
govulncheck ./...
|
||||||
|
|
||||||
|
install-govulncheck:
|
||||||
|
command -v govulncheck > /dev/null || go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||||
|
|
18
README.md
18
README.md
|
@ -99,8 +99,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
|
||||||
|
@ -339,13 +339,21 @@ mv /path/to/directory/role.prom.$$ /path/to/directory/role.prom
|
||||||
|
|
||||||
The `node_exporter` will expose all metrics from enabled collectors by default. This is the recommended way to collect metrics to avoid errors when comparing metrics of different families.
|
The `node_exporter` will expose all metrics from enabled collectors by default. This is the recommended way to collect metrics to avoid errors when comparing metrics of different families.
|
||||||
|
|
||||||
For advanced use the `node_exporter` can be passed an optional list of collectors to filter metrics. The `collect[]` parameter may be used multiple times. In Prometheus configuration you can use this syntax under the [scrape config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#<scrape_config>).
|
For advanced use the `node_exporter` can be passed an optional list of collectors to filter metrics. The parameters `collect[]` and `exclude[]` can be used multiple times (but cannot be combined). In Prometheus configuration you can use this syntax under the [scrape config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#<scrape_config>).
|
||||||
|
|
||||||
|
Collect only `cpu` and `meminfo` collector metrics:
|
||||||
```
|
```
|
||||||
params:
|
params:
|
||||||
collect[]:
|
collect[]:
|
||||||
- foo
|
- cpu
|
||||||
- bar
|
- meminfo
|
||||||
|
```
|
||||||
|
|
||||||
|
Collect all enabled collector metrics but exclude `netdev`:
|
||||||
|
```
|
||||||
|
params:
|
||||||
|
exclude[]:
|
||||||
|
- netdev
|
||||||
```
|
```
|
||||||
|
|
||||||
This can be useful for having different Prometheus servers collect specific metrics from nodes.
|
This can be useful for having different Prometheus servers collect specific metrics from nodes.
|
||||||
|
|
|
@ -17,13 +17,11 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
"github.com/jsimonetti/rtnetlink/v2/rtnl"
|
||||||
"github.com/jsimonetti/rtnetlink"
|
|
||||||
"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"
|
||||||
|
@ -39,7 +37,7 @@ type arpCollector struct {
|
||||||
fs procfs.FS
|
fs procfs.FS
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
entries *prometheus.Desc
|
entries *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -47,7 +45,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewARPCollector returns a new Collector exposing ARP stats.
|
// NewARPCollector returns a new Collector exposing ARP stats.
|
||||||
func NewARPCollector(logger log.Logger) (Collector, error) {
|
func NewARPCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, 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)
|
||||||
|
@ -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 {
|
||||||
|
|
|
@ -18,9 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/bcache"
|
"github.com/prometheus/procfs/bcache"
|
||||||
)
|
)
|
||||||
|
@ -36,12 +36,12 @@ func init() {
|
||||||
// A bcacheCollector is a Collector which gathers metrics from Linux bcache.
|
// A bcacheCollector is a Collector which gathers metrics from Linux bcache.
|
||||||
type bcacheCollector struct {
|
type bcacheCollector struct {
|
||||||
fs bcache.FS
|
fs bcache.FS
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBcacheCollector returns a newly allocated bcacheCollector.
|
// NewBcacheCollector returns a newly allocated bcacheCollector.
|
||||||
// It exposes a number of Linux bcache statistics.
|
// It exposes a number of Linux bcache statistics.
|
||||||
func NewBcacheCollector(logger log.Logger) (Collector, error) {
|
func NewBcacheCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := bcache.NewFS(*sysPath)
|
fs, err := bcache.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)
|
||||||
|
|
|
@ -19,18 +19,17 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bondingCollector struct {
|
type bondingCollector struct {
|
||||||
slaves, active typedDesc
|
slaves, active typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -39,7 +38,7 @@ func init() {
|
||||||
|
|
||||||
// NewBondingCollector returns a newly allocated bondingCollector.
|
// NewBondingCollector returns a newly allocated bondingCollector.
|
||||||
// It exposes the number of configured and active slave of linux bonding interfaces.
|
// It exposes the number of configured and active slave of linux bonding interfaces.
|
||||||
func NewBondingCollector(logger log.Logger) (Collector, error) {
|
func NewBondingCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &bondingCollector{
|
return &bondingCollector{
|
||||||
slaves: typedDesc{prometheus.NewDesc(
|
slaves: typedDesc{prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, "bonding", "slaves"),
|
prometheus.BuildFQName(namespace, "bonding", "slaves"),
|
||||||
|
@ -61,7 +60,7 @@ func (c *bondingCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
bondingStats, err := readBondingStats(statusfile)
|
bondingStats, err := readBondingStats(statusfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "Not collecting bonding, file does not exist", "file", statusfile)
|
c.logger.Debug("Not collecting bonding, file does not exist", "file", statusfile)
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -18,13 +18,13 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
"log/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bootTimeCollector struct {
|
type bootTimeCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -32,7 +32,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// newBootTimeCollector returns a new Collector exposing system boot time on BSD systems.
|
// newBootTimeCollector returns a new Collector exposing system boot time on BSD systems.
|
||||||
func newBootTimeCollector(logger log.Logger) (Collector, error) {
|
func newBootTimeCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &bootTimeCollector{
|
return &bootTimeCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -17,21 +17,21 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/illumos/go-kstat"
|
"github.com/illumos/go-kstat"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"log/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bootTimeCollector struct {
|
type bootTimeCollector struct {
|
||||||
boottime typedDesc
|
boottime typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("boottime", defaultEnabled, newBootTimeCollector)
|
registerCollector("boottime", defaultEnabled, newBootTimeCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBootTimeCollector(logger log.Logger) (Collector, error) {
|
func newBootTimeCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &bootTimeCollector{
|
return &bootTimeCollector{
|
||||||
boottime: typedDesc{
|
boottime: typedDesc{
|
||||||
prometheus.NewDesc(
|
prometheus.NewDesc(
|
||||||
|
|
|
@ -18,13 +18,12 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
dennwc "github.com/dennwc/btrfs"
|
dennwc "github.com/dennwc/btrfs"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/btrfs"
|
"github.com/prometheus/procfs/btrfs"
|
||||||
)
|
)
|
||||||
|
@ -32,7 +31,7 @@ import (
|
||||||
// A btrfsCollector is a Collector which gathers metrics from Btrfs filesystems.
|
// A btrfsCollector is a Collector which gathers metrics from Btrfs filesystems.
|
||||||
type btrfsCollector struct {
|
type btrfsCollector struct {
|
||||||
fs btrfs.FS
|
fs btrfs.FS
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -40,7 +39,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBtrfsCollector returns a new Collector exposing Btrfs statistics.
|
// NewBtrfsCollector returns a new Collector exposing Btrfs statistics.
|
||||||
func NewBtrfsCollector(logger log.Logger) (Collector, error) {
|
func NewBtrfsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := btrfs.NewFS(*sysPath)
|
fs, err := btrfs.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)
|
||||||
|
@ -62,8 +61,8 @@ func (c *btrfsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
ioctlStatsMap, err := c.getIoctlStats()
|
ioctlStatsMap, err := c.getIoctlStats()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
level.Debug(c.logger).Log(
|
c.logger.Debug(
|
||||||
"msg", "Error querying btrfs device stats with ioctl",
|
"Error querying btrfs device stats with ioctl",
|
||||||
"err", err)
|
"err", err)
|
||||||
ioctlStatsMap = make(map[string]*btrfsIoctlFsStats)
|
ioctlStatsMap = make(map[string]*btrfsIoctlFsStats)
|
||||||
}
|
}
|
||||||
|
@ -129,8 +128,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Failed to open this mount point, maybe we didn't have permission
|
// Failed to open this mount point, maybe we didn't have permission
|
||||||
// maybe we'll find another mount point for this FS later.
|
// maybe we'll find another mount point for this FS later.
|
||||||
level.Debug(c.logger).Log(
|
c.logger.Debug(
|
||||||
"msg", "Error inspecting btrfs mountpoint",
|
"Error inspecting btrfs mountpoint",
|
||||||
"mountPoint", mountPath,
|
"mountPoint", mountPath,
|
||||||
"err", err)
|
"err", err)
|
||||||
continue
|
continue
|
||||||
|
@ -141,8 +140,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Failed to get the FS info for some reason,
|
// Failed to get the FS info for some reason,
|
||||||
// perhaps it'll work with a different mount point
|
// perhaps it'll work with a different mount point
|
||||||
level.Debug(c.logger).Log(
|
c.logger.Debug(
|
||||||
"msg", "Error querying btrfs filesystem",
|
"Error querying btrfs filesystem",
|
||||||
"mountPoint", mountPath,
|
"mountPoint", mountPath,
|
||||||
"err", err)
|
"err", err)
|
||||||
continue
|
continue
|
||||||
|
@ -156,8 +155,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
|
||||||
|
|
||||||
deviceStats, err := c.getIoctlDeviceStats(fs, &fsInfo)
|
deviceStats, err := c.getIoctlDeviceStats(fs, &fsInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
level.Debug(c.logger).Log(
|
c.logger.Debug(
|
||||||
"msg", "Error querying btrfs device stats",
|
"Error querying btrfs device stats",
|
||||||
"mountPoint", mountPath,
|
"mountPoint", mountPath,
|
||||||
"err", err)
|
"err", err)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -18,10 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -33,7 +32,7 @@ const (
|
||||||
type buddyinfoCollector struct {
|
type buddyinfoCollector struct {
|
||||||
fs procfs.FS
|
fs procfs.FS
|
||||||
desc *prometheus.Desc
|
desc *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -41,7 +40,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBuddyinfoCollector returns a new Collector exposing buddyinfo stats.
|
// NewBuddyinfoCollector returns a new Collector exposing buddyinfo stats.
|
||||||
func NewBuddyinfoCollector(logger log.Logger) (Collector, error) {
|
func NewBuddyinfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
desc := prometheus.NewDesc(
|
desc := prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, buddyInfoSubsystem, "blocks"),
|
prometheus.BuildFQName(namespace, buddyInfoSubsystem, "blocks"),
|
||||||
"Count of free blocks according to size.",
|
"Count of free blocks according to size.",
|
||||||
|
@ -62,7 +61,7 @@ func (c *buddyinfoCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
return fmt.Errorf("couldn't get buddyinfo: %w", err)
|
return fmt.Errorf("couldn't get buddyinfo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
level.Debug(c.logger).Log("msg", "Set node_buddy", "buddyInfo", buddyInfo)
|
c.logger.Debug("Set node_buddy", "buddyInfo", buddyInfo)
|
||||||
for _, entry := range buddyInfo {
|
for _, entry := range buddyInfo {
|
||||||
for size, value := range entry.Sizes {
|
for size, value := range entry.Sizes {
|
||||||
ch <- prometheus.MustNewConstMetric(
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
|
|
@ -18,8 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -30,7 +30,7 @@ type cgroupSummaryCollector struct {
|
||||||
fs procfs.FS
|
fs procfs.FS
|
||||||
cgroups *prometheus.Desc
|
cgroups *prometheus.Desc
|
||||||
enabled *prometheus.Desc
|
enabled *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -38,7 +38,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCgroupSummaryCollector returns a new Collector exposing a summary of cgroups.
|
// NewCgroupSummaryCollector returns a new Collector exposing a summary of cgroups.
|
||||||
func NewCgroupSummaryCollector(logger log.Logger) (Collector, error) {
|
func NewCgroupSummaryCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, 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)
|
||||||
|
|
|
@ -17,12 +17,11 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -50,14 +49,14 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
factories = make(map[string]func(logger log.Logger) (Collector, error))
|
factories = make(map[string]func(logger *slog.Logger) (Collector, error))
|
||||||
initiatedCollectorsMtx = sync.Mutex{}
|
initiatedCollectorsMtx = sync.Mutex{}
|
||||||
initiatedCollectors = make(map[string]Collector)
|
initiatedCollectors = make(map[string]Collector)
|
||||||
collectorState = make(map[string]*bool)
|
collectorState = make(map[string]*bool)
|
||||||
forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled
|
forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerCollector(collector string, isDefaultEnabled bool, factory func(logger log.Logger) (Collector, error)) {
|
func registerCollector(collector string, isDefaultEnabled bool, factory func(logger *slog.Logger) (Collector, error)) {
|
||||||
var helpDefaultState string
|
var helpDefaultState string
|
||||||
if isDefaultEnabled {
|
if isDefaultEnabled {
|
||||||
helpDefaultState = "enabled"
|
helpDefaultState = "enabled"
|
||||||
|
@ -78,7 +77,7 @@ func registerCollector(collector string, isDefaultEnabled bool, factory func(log
|
||||||
// NodeCollector implements the prometheus.Collector interface.
|
// NodeCollector implements the prometheus.Collector interface.
|
||||||
type NodeCollector struct {
|
type NodeCollector struct {
|
||||||
Collectors map[string]Collector
|
Collectors map[string]Collector
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// DisableDefaultCollectors sets the collector state to false for all collectors which
|
// DisableDefaultCollectors sets the collector state to false for all collectors which
|
||||||
|
@ -104,7 +103,7 @@ func collectorFlagAction(collector string) func(ctx *kingpin.ParseContext) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNodeCollector creates a new NodeCollector.
|
// NewNodeCollector creates a new NodeCollector.
|
||||||
func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, error) {
|
func NewNodeCollector(logger *slog.Logger, filters ...string) (*NodeCollector, error) {
|
||||||
f := make(map[string]bool)
|
f := make(map[string]bool)
|
||||||
for _, filter := range filters {
|
for _, filter := range filters {
|
||||||
enabled, exist := collectorState[filter]
|
enabled, exist := collectorState[filter]
|
||||||
|
@ -126,7 +125,7 @@ func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, err
|
||||||
if collector, ok := initiatedCollectors[key]; ok {
|
if collector, ok := initiatedCollectors[key]; ok {
|
||||||
collectors[key] = collector
|
collectors[key] = collector
|
||||||
} else {
|
} else {
|
||||||
collector, err := factories[key](log.With(logger, "collector", key))
|
collector, err := factories[key](logger.With("collector", key))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -156,7 +155,7 @@ func (n NodeCollector) Collect(ch chan<- prometheus.Metric) {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func execute(name string, c Collector, ch chan<- prometheus.Metric, logger log.Logger) {
|
func execute(name string, c Collector, ch chan<- prometheus.Metric, logger *slog.Logger) {
|
||||||
begin := time.Now()
|
begin := time.Now()
|
||||||
err := c.Update(ch)
|
err := c.Update(ch)
|
||||||
duration := time.Since(begin)
|
duration := time.Since(begin)
|
||||||
|
@ -164,13 +163,13 @@ func execute(name string, c Collector, ch chan<- prometheus.Metric, logger log.L
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if IsNoDataError(err) {
|
if IsNoDataError(err) {
|
||||||
level.Debug(logger).Log("msg", "collector returned no data", "name", name, "duration_seconds", duration.Seconds(), "err", err)
|
logger.Debug("collector returned no data", "name", name, "duration_seconds", duration.Seconds(), "err", err)
|
||||||
} else {
|
} else {
|
||||||
level.Error(logger).Log("msg", "collector failed", "name", name, "duration_seconds", duration.Seconds(), "err", err)
|
logger.Error("collector failed", "name", name, "duration_seconds", duration.Seconds(), "err", err)
|
||||||
}
|
}
|
||||||
success = 0
|
success = 0
|
||||||
} else {
|
} else {
|
||||||
level.Debug(logger).Log("msg", "collector succeeded", "name", name, "duration_seconds", duration.Seconds())
|
logger.Debug("collector succeeded", "name", name, "duration_seconds", duration.Seconds())
|
||||||
success = 1
|
success = 1
|
||||||
}
|
}
|
||||||
ch <- prometheus.MustNewConstMetric(scrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), name)
|
ch <- prometheus.MustNewConstMetric(scrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), name)
|
||||||
|
|
|
@ -19,10 +19,9 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -38,7 +37,7 @@ type conntrackCollector struct {
|
||||||
drop *prometheus.Desc
|
drop *prometheus.Desc
|
||||||
earlyDrop *prometheus.Desc
|
earlyDrop *prometheus.Desc
|
||||||
searchRestart *prometheus.Desc
|
searchRestart *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type conntrackStatistics struct {
|
type conntrackStatistics struct {
|
||||||
|
@ -57,7 +56,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConntrackCollector returns a new Collector exposing conntrack stats.
|
// NewConntrackCollector returns a new Collector exposing conntrack stats.
|
||||||
func NewConntrackCollector(logger log.Logger) (Collector, error) {
|
func NewConntrackCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &conntrackCollector{
|
return &conntrackCollector{
|
||||||
current: prometheus.NewDesc(
|
current: prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, "", "nf_conntrack_entries"),
|
prometheus.BuildFQName(namespace, "", "nf_conntrack_entries"),
|
||||||
|
@ -154,7 +153,7 @@ func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
func (c *conntrackCollector) handleErr(err error) error {
|
func (c *conntrackCollector) handleErr(err error) error {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "conntrack probably not loaded")
|
c.logger.Debug("conntrack probably not loaded")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return fmt.Errorf("failed to retrieve conntrack stats: %w", err)
|
return fmt.Errorf("failed to retrieve conntrack stats: %w", err)
|
||||||
|
|
76
collector/cpu_aix.go
Normal file
76
collector/cpu_aix.go
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
// 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 !nocpu
|
||||||
|
// +build !nocpu
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <unistd.h> // Include the standard Unix header
|
||||||
|
#include <errno.h> // For errno
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type cpuCollector struct {
|
||||||
|
cpu typedDesc
|
||||||
|
logger *slog.Logger
|
||||||
|
tickPerSecond int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
func tickPerSecond() (int64, error) {
|
||||||
|
ticks, err := C.sysconf(C._SC_CLK_TCK)
|
||||||
|
if ticks == -1 || err != nil {
|
||||||
|
return 0, fmt.Errorf("failed to get clock ticks per second: %v", err)
|
||||||
|
}
|
||||||
|
return int64(ticks), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
ticks, err := tickPerSecond()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &cpuCollector{
|
||||||
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
|
logger: logger,
|
||||||
|
tickPerSecond: ticks,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cpuCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
stats, err := perfstat.CpuStat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for n, stat := range stats {
|
||||||
|
ch <- c.cpu.mustNewConstMetric(float64(stat.User/c.tickPerSecond), strconv.Itoa(n), "user")
|
||||||
|
ch <- c.cpu.mustNewConstMetric(float64(stat.Sys/c.tickPerSecond), strconv.Itoa(n), "system")
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -23,10 +23,10 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ const ClocksPerSec = float64(C.CLK_TCK)
|
||||||
|
|
||||||
type statCollector struct {
|
type statCollector struct {
|
||||||
cpu *prometheus.Desc
|
cpu *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -61,7 +61,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCPUCollector returns a new Collector exposing CPU stats.
|
// NewCPUCollector returns a new Collector exposing CPU stats.
|
||||||
func NewCPUCollector(logger log.Logger) (Collector, error) {
|
func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &statCollector{
|
return &statCollector{
|
||||||
cpu: nodeCPUSecondsDesc,
|
cpu: nodeCPUSecondsDesc,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -18,10 +18,10 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ const maxCPUTimesLen = C.MAXCPU * C.CPUSTATES
|
||||||
|
|
||||||
type statCollector struct {
|
type statCollector struct {
|
||||||
cpu *prometheus.Desc
|
cpu *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -86,7 +86,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStatCollector returns a new Collector exposing CPU stats.
|
// NewStatCollector returns a new Collector exposing CPU stats.
|
||||||
func NewStatCollector(logger log.Logger) (Collector, error) {
|
func NewStatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &statCollector{
|
return &statCollector{
|
||||||
cpu: nodeCPUSecondsDesc,
|
cpu: nodeCPUSecondsDesc,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -18,12 +18,11 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -85,7 +84,7 @@ func getCPUTimes() ([]cputime, error) {
|
||||||
type statCollector struct {
|
type statCollector struct {
|
||||||
cpu typedDesc
|
cpu typedDesc
|
||||||
temp typedDesc
|
temp typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -93,7 +92,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStatCollector returns a new Collector exposing CPU stats.
|
// NewStatCollector returns a new Collector exposing CPU stats.
|
||||||
func NewStatCollector(logger log.Logger) (Collector, error) {
|
func NewStatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &statCollector{
|
return &statCollector{
|
||||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
temp: typedDesc{prometheus.NewDesc(
|
temp: typedDesc{prometheus.NewDesc(
|
||||||
|
@ -134,11 +133,11 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == unix.ENOENT {
|
if err == unix.ENOENT {
|
||||||
// No temperature information for this CPU
|
// No temperature information for this CPU
|
||||||
level.Debug(c.logger).Log("msg", "no temperature information for CPU", "cpu", cpu)
|
c.logger.Debug("no temperature information for CPU", "cpu", cpu)
|
||||||
} else {
|
} else {
|
||||||
// Unexpected error
|
// Unexpected error
|
||||||
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
|
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
|
||||||
level.Error(c.logger).Log("msg", "failed to query CPU temperature for CPU", "cpu", cpu, "err", err)
|
c.logger.Error("failed to query CPU temperature for CPU", "cpu", cpu, "err", err)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,9 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
@ -25,17 +27,17 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"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,7 +47,8 @@ type cpuCollector struct {
|
||||||
cpuCoreThrottle *prometheus.Desc
|
cpuCoreThrottle *prometheus.Desc
|
||||||
cpuPackageThrottle *prometheus.Desc
|
cpuPackageThrottle *prometheus.Desc
|
||||||
cpuIsolated *prometheus.Desc
|
cpuIsolated *prometheus.Desc
|
||||||
logger log.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,27 +73,28 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCPUCollector returns a new Collector exposing kernel/system statistics.
|
// NewCPUCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewCPUCollector(logger log.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)
|
||||||
}
|
}
|
||||||
level.Debug(logger).Log("msg", "Could not open isolated file", "error", err)
|
logger.Debug("Could not open isolated file", "error", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
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"),
|
||||||
|
@ -132,6 +136,11 @@ func NewCPUCollector(logger log.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),
|
||||||
|
@ -146,7 +155,7 @@ func NewCPUCollector(logger log.Logger) (Collector, error) {
|
||||||
func (c *cpuCollector) compileIncludeFlags(flagsIncludeFlag, bugsIncludeFlag *string) error {
|
func (c *cpuCollector) compileIncludeFlags(flagsIncludeFlag, bugsIncludeFlag *string) error {
|
||||||
if (*flagsIncludeFlag != "" || *bugsIncludeFlag != "") && !*enableCPUInfo {
|
if (*flagsIncludeFlag != "" || *bugsIncludeFlag != "") && !*enableCPUInfo {
|
||||||
*enableCPUInfo = true
|
*enableCPUInfo = true
|
||||||
level.Info(c.logger).Log("msg", "--collector.cpu.info has been set to `true` because you set the following flags, like --collector.cpu.info.flags-include and --collector.cpu.info.bugs-include")
|
c.logger.Info("--collector.cpu.info has been set to `true` because you set the following flags, like --collector.cpu.info.flags-include and --collector.cpu.info.bugs-include")
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
@ -178,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
|
||||||
}
|
}
|
||||||
|
@ -205,7 +223,7 @@ func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
cpuFreqEnabled, ok := collectorState["cpufreq"]
|
cpuFreqEnabled, ok := collectorState["cpufreq"]
|
||||||
if !ok || cpuFreqEnabled == nil {
|
if !ok || cpuFreqEnabled == nil {
|
||||||
level.Debug(c.logger).Log("msg", "cpufreq key missing or nil value in collectorState map")
|
c.logger.Debug("cpufreq key missing or nil value in collectorState map")
|
||||||
} else if !*cpuFreqEnabled {
|
} else if !*cpuFreqEnabled {
|
||||||
for _, cpu := range info {
|
for _, cpu := range info {
|
||||||
ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz,
|
ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz,
|
||||||
|
@ -269,12 +287,12 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
|
||||||
|
|
||||||
// topology/physical_package_id
|
// topology/physical_package_id
|
||||||
if physicalPackageID, err = readUintFromFile(filepath.Join(cpu, "topology", "physical_package_id")); err != nil {
|
if physicalPackageID, err = readUintFromFile(filepath.Join(cpu, "topology", "physical_package_id")); err != nil {
|
||||||
level.Debug(c.logger).Log("msg", "CPU is missing physical_package_id", "cpu", cpu)
|
c.logger.Debug("CPU is missing physical_package_id", "cpu", cpu)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// topology/core_id
|
// topology/core_id
|
||||||
if coreID, err = readUintFromFile(filepath.Join(cpu, "topology", "core_id")); err != nil {
|
if coreID, err = readUintFromFile(filepath.Join(cpu, "topology", "core_id")); err != nil {
|
||||||
level.Debug(c.logger).Log("msg", "CPU is missing core_id", "cpu", cpu)
|
c.logger.Debug("CPU is missing core_id", "cpu", cpu)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +310,7 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
|
||||||
if coreThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "core_throttle_count")); err == nil {
|
if coreThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "core_throttle_count")); err == nil {
|
||||||
packageCoreThrottles[physicalPackageID][coreID] = coreThrottleCount
|
packageCoreThrottles[physicalPackageID][coreID] = coreThrottleCount
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU is missing core_throttle_count", "cpu", cpu)
|
c.logger.Debug("CPU is missing core_throttle_count", "cpu", cpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +320,7 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
|
||||||
if packageThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "package_throttle_count")); err == nil {
|
if packageThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "package_throttle_count")); err == nil {
|
||||||
packageThrottles[physicalPackageID] = packageThrottleCount
|
packageThrottles[physicalPackageID] = packageThrottleCount
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU is missing package_throttle_count", "cpu", cpu)
|
c.logger.Debug("CPU is missing package_throttle_count", "cpu", cpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -334,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
|
||||||
}
|
}
|
||||||
|
@ -380,68 +420,68 @@ func (c *cpuCollector) updateCPUStats(newStats map[int64]procfs.CPUStat) {
|
||||||
|
|
||||||
// If idle jumps backwards by more than X seconds, assume we had a hotplug event and reset the stats for this CPU.
|
// If idle jumps backwards by more than X seconds, assume we had a hotplug event and reset the stats for this CPU.
|
||||||
if (cpuStats.Idle - n.Idle) >= jumpBackSeconds {
|
if (cpuStats.Idle - n.Idle) >= jumpBackSeconds {
|
||||||
level.Debug(c.logger).Log("msg", jumpBackDebugMessage, "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
|
c.logger.Debug(jumpBackDebugMessage, "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
|
||||||
cpuStats = procfs.CPUStat{}
|
cpuStats = procfs.CPUStat{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Idle >= cpuStats.Idle {
|
if n.Idle >= cpuStats.Idle {
|
||||||
cpuStats.Idle = n.Idle
|
cpuStats.Idle = n.Idle
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU Idle counter jumped backwards", "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
|
c.logger.Debug("CPU Idle counter jumped backwards", "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.User >= cpuStats.User {
|
if n.User >= cpuStats.User {
|
||||||
cpuStats.User = n.User
|
cpuStats.User = n.User
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU User counter jumped backwards", "cpu", i, "old_value", cpuStats.User, "new_value", n.User)
|
c.logger.Debug("CPU User counter jumped backwards", "cpu", i, "old_value", cpuStats.User, "new_value", n.User)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Nice >= cpuStats.Nice {
|
if n.Nice >= cpuStats.Nice {
|
||||||
cpuStats.Nice = n.Nice
|
cpuStats.Nice = n.Nice
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU Nice counter jumped backwards", "cpu", i, "old_value", cpuStats.Nice, "new_value", n.Nice)
|
c.logger.Debug("CPU Nice counter jumped backwards", "cpu", i, "old_value", cpuStats.Nice, "new_value", n.Nice)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.System >= cpuStats.System {
|
if n.System >= cpuStats.System {
|
||||||
cpuStats.System = n.System
|
cpuStats.System = n.System
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU System counter jumped backwards", "cpu", i, "old_value", cpuStats.System, "new_value", n.System)
|
c.logger.Debug("CPU System counter jumped backwards", "cpu", i, "old_value", cpuStats.System, "new_value", n.System)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Iowait >= cpuStats.Iowait {
|
if n.Iowait >= cpuStats.Iowait {
|
||||||
cpuStats.Iowait = n.Iowait
|
cpuStats.Iowait = n.Iowait
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU Iowait counter jumped backwards", "cpu", i, "old_value", cpuStats.Iowait, "new_value", n.Iowait)
|
c.logger.Debug("CPU Iowait counter jumped backwards", "cpu", i, "old_value", cpuStats.Iowait, "new_value", n.Iowait)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.IRQ >= cpuStats.IRQ {
|
if n.IRQ >= cpuStats.IRQ {
|
||||||
cpuStats.IRQ = n.IRQ
|
cpuStats.IRQ = n.IRQ
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU IRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.IRQ, "new_value", n.IRQ)
|
c.logger.Debug("CPU IRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.IRQ, "new_value", n.IRQ)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.SoftIRQ >= cpuStats.SoftIRQ {
|
if n.SoftIRQ >= cpuStats.SoftIRQ {
|
||||||
cpuStats.SoftIRQ = n.SoftIRQ
|
cpuStats.SoftIRQ = n.SoftIRQ
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU SoftIRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.SoftIRQ, "new_value", n.SoftIRQ)
|
c.logger.Debug("CPU SoftIRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.SoftIRQ, "new_value", n.SoftIRQ)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Steal >= cpuStats.Steal {
|
if n.Steal >= cpuStats.Steal {
|
||||||
cpuStats.Steal = n.Steal
|
cpuStats.Steal = n.Steal
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU Steal counter jumped backwards", "cpu", i, "old_value", cpuStats.Steal, "new_value", n.Steal)
|
c.logger.Debug("CPU Steal counter jumped backwards", "cpu", i, "old_value", cpuStats.Steal, "new_value", n.Steal)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Guest >= cpuStats.Guest {
|
if n.Guest >= cpuStats.Guest {
|
||||||
cpuStats.Guest = n.Guest
|
cpuStats.Guest = n.Guest
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU Guest counter jumped backwards", "cpu", i, "old_value", cpuStats.Guest, "new_value", n.Guest)
|
c.logger.Debug("CPU Guest counter jumped backwards", "cpu", i, "old_value", cpuStats.Guest, "new_value", n.Guest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.GuestNice >= cpuStats.GuestNice {
|
if n.GuestNice >= cpuStats.GuestNice {
|
||||||
cpuStats.GuestNice = n.GuestNice
|
cpuStats.GuestNice = n.GuestNice
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "CPU GuestNice counter jumped backwards", "cpu", i, "old_value", cpuStats.GuestNice, "new_value", n.GuestNice)
|
c.logger.Debug("CPU GuestNice counter jumped backwards", "cpu", i, "old_value", cpuStats.GuestNice, "new_value", n.GuestNice)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.cpuStats[i] = cpuStats
|
c.cpuStats[i] = cpuStats
|
||||||
|
|
|
@ -17,10 +17,11 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ func makeTestCPUCollector(s map[int64]procfs.CPUStat) *cpuCollector {
|
||||||
dup := make(map[int64]procfs.CPUStat, len(s))
|
dup := make(map[int64]procfs.CPUStat, len(s))
|
||||||
copyStats(dup, s)
|
copyStats(dup, s)
|
||||||
return &cpuCollector{
|
return &cpuCollector{
|
||||||
logger: log.NewNopLogger(),
|
logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
|
||||||
cpuStats: dup,
|
cpuStats: dup,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"log/slog"
|
||||||
"math"
|
"math"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -25,8 +26,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
@ -217,7 +216,7 @@ func getCPUTimes() ([]cputime, error) {
|
||||||
type statCollector struct {
|
type statCollector struct {
|
||||||
cpu typedDesc
|
cpu typedDesc
|
||||||
temp typedDesc
|
temp typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -225,7 +224,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStatCollector returns a new Collector exposing CPU stats.
|
// NewStatCollector returns a new Collector exposing CPU stats.
|
||||||
func NewStatCollector(logger log.Logger) (Collector, error) {
|
func NewStatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &statCollector{
|
return &statCollector{
|
||||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
temp: typedDesc{prometheus.NewDesc(
|
temp: typedDesc{prometheus.NewDesc(
|
||||||
|
@ -272,7 +271,7 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if temp, ok := cpuTemperatures[cpu]; ok {
|
if temp, ok := cpuTemperatures[cpu]; ok {
|
||||||
ch <- c.temp.mustNewConstMetric(temp, lcpu)
|
ch <- c.temp.mustNewConstMetric(temp, lcpu)
|
||||||
} else {
|
} else {
|
||||||
level.Debug(c.logger).Log("msg", "no temperature information for CPU", "cpu", cpu)
|
c.logger.Debug("no temperature information for CPU", "cpu", cpu)
|
||||||
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
|
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,10 +17,10 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -45,14 +45,14 @@ const (
|
||||||
|
|
||||||
type cpuCollector struct {
|
type cpuCollector struct {
|
||||||
cpu typedDesc
|
cpu typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("cpu", defaultEnabled, NewCPUCollector)
|
registerCollector("cpu", defaultEnabled, NewCPUCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCPUCollector(logger log.Logger) (Collector, error) {
|
func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &cpuCollector{
|
return &cpuCollector{
|
||||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/illumos/go-kstat"
|
"github.com/illumos/go-kstat"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
@ -29,14 +29,14 @@ import "C"
|
||||||
|
|
||||||
type cpuCollector struct {
|
type cpuCollector struct {
|
||||||
cpu typedDesc
|
cpu typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCpuCollector(logger log.Logger) (Collector, error) {
|
func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &cpuCollector{
|
return &cpuCollector{
|
||||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -15,8 +15,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,7 @@ func init() {
|
||||||
registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector)
|
registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewVulnerabilitySysfsCollector(logger log.Logger) (Collector, error) {
|
func NewVulnerabilitySysfsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &cpuVulnerabilitiesCollector{}, nil
|
return &cpuVulnerabilitiesCollector{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,15 +18,16 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-kit/log"
|
"log/slog"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type cpuFreqCollector struct {
|
type cpuFreqCollector struct {
|
||||||
fs sysfs.FS
|
fs sysfs.FS
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -34,7 +35,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCPUFreqCollector returns a new Collector exposing kernel/system statistics.
|
// NewCPUFreqCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewCPUFreqCollector(logger log.Logger) (Collector, error) {
|
func NewCPUFreqCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, 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)
|
||||||
|
|
|
@ -18,9 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/illumos/go-kstat"
|
"github.com/illumos/go-kstat"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
@ -29,14 +29,14 @@ import (
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
type cpuFreqCollector struct {
|
type cpuFreqCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("cpufreq", defaultEnabled, NewCpuFreqCollector)
|
registerCollector("cpufreq", defaultEnabled, NewCpuFreqCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCpuFreqCollector(logger log.Logger) (Collector, error) {
|
func NewCpuFreqCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &cpuFreqCollector{
|
return &cpuFreqCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -19,8 +19,8 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ type devstatCollector struct {
|
||||||
bytesDesc *prometheus.Desc
|
bytesDesc *prometheus.Desc
|
||||||
transfersDesc *prometheus.Desc
|
transfersDesc *prometheus.Desc
|
||||||
blocksDesc *prometheus.Desc
|
blocksDesc *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -106,7 +106,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDevstatCollector returns a new Collector exposing Device stats.
|
// NewDevstatCollector returns a new Collector exposing Device stats.
|
||||||
func NewDevstatCollector(logger log.Logger) (Collector, error) {
|
func NewDevstatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &devstatCollector{
|
return &devstatCollector{
|
||||||
bytesDesc: prometheus.NewDesc(
|
bytesDesc: prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, devstatSubsystem, "bytes_total"),
|
prometheus.BuildFQName(namespace, devstatSubsystem, "bytes_total"),
|
||||||
|
|
|
@ -19,10 +19,10 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"sync"
|
"sync"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ type devstatCollector struct {
|
||||||
duration typedDesc
|
duration typedDesc
|
||||||
busyTime typedDesc
|
busyTime typedDesc
|
||||||
blocks typedDesc
|
blocks typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -51,7 +51,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDevstatCollector returns a new Collector exposing Device stats.
|
// NewDevstatCollector returns a new Collector exposing Device stats.
|
||||||
func NewDevstatCollector(logger log.Logger) (Collector, error) {
|
func NewDevstatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &devstatCollector{
|
return &devstatCollector{
|
||||||
devinfo: &C.struct_devinfo{},
|
devinfo: &C.struct_devinfo{},
|
||||||
bytes: typedDesc{prometheus.NewDesc(
|
bytes: typedDesc{prometheus.NewDesc(
|
||||||
|
|
82
collector/diskstats_aix.go
Normal file
82
collector/diskstats_aix.go
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
// 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 !nodiskstats
|
||||||
|
// +build !nodiskstats
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
const diskstatsDefaultIgnoredDevices = ""
|
||||||
|
|
||||||
|
type diskstatsCollector struct {
|
||||||
|
rbytes typedDesc
|
||||||
|
wbytes typedDesc
|
||||||
|
time typedDesc
|
||||||
|
|
||||||
|
deviceFilter deviceFilter
|
||||||
|
logger *slog.Logger
|
||||||
|
|
||||||
|
tickPerSecond int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("diskstats", defaultEnabled, NewDiskstatsCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
||||||
|
func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
ticks, err := tickPerSecond()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &diskstatsCollector{
|
||||||
|
rbytes: typedDesc{readBytesDesc, prometheus.CounterValue},
|
||||||
|
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
|
||||||
|
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
|
||||||
|
|
||||||
|
deviceFilter: deviceFilter,
|
||||||
|
logger: logger,
|
||||||
|
|
||||||
|
tickPerSecond: ticks,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
stats, err := perfstat.DiskStat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, stat := range stats {
|
||||||
|
if c.deviceFilter.ignored(stat.Name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ch <- c.rbytes.mustNewConstMetric(float64(stat.Rblks*512), stat.Name)
|
||||||
|
ch <- c.wbytes.mustNewConstMetric(float64(stat.Wblks*512), stat.Name)
|
||||||
|
ch <- c.time.mustNewConstMetric(float64(stat.Time/c.tickPerSecond), stat.Name)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -11,18 +11,17 @@
|
||||||
// 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 !nodiskstats && (openbsd || linux || darwin)
|
//go:build !nodiskstats && (openbsd || linux || darwin || aix)
|
||||||
// +build !nodiskstats
|
// +build !nodiskstats
|
||||||
// +build openbsd linux darwin
|
// +build openbsd linux darwin aix
|
||||||
|
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -93,10 +92,10 @@ var (
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
func newDiskstatsDeviceFilter(logger log.Logger) (deviceFilter, error) {
|
func newDiskstatsDeviceFilter(logger *slog.Logger) (deviceFilter, error) {
|
||||||
if *oldDiskstatsDeviceExclude != "" {
|
if *oldDiskstatsDeviceExclude != "" {
|
||||||
if !diskstatsDeviceExcludeSet {
|
if !diskstatsDeviceExcludeSet {
|
||||||
level.Warn(logger).Log("msg", "--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude")
|
logger.Warn("--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude")
|
||||||
*diskstatsDeviceExclude = *oldDiskstatsDeviceExclude
|
*diskstatsDeviceExclude = *oldDiskstatsDeviceExclude
|
||||||
} else {
|
} else {
|
||||||
return deviceFilter{}, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive")
|
return deviceFilter{}, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive")
|
||||||
|
@ -108,11 +107,11 @@ func newDiskstatsDeviceFilter(logger log.Logger) (deviceFilter, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if *diskstatsDeviceExclude != "" {
|
if *diskstatsDeviceExclude != "" {
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude)
|
logger.Info("Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude)
|
||||||
}
|
}
|
||||||
|
|
||||||
if *diskstatsDeviceInclude != "" {
|
if *diskstatsDeviceInclude != "" {
|
||||||
level.Info(logger).Log("msg", "Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude)
|
logger.Info("Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude)
|
||||||
}
|
}
|
||||||
|
|
||||||
return newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude), nil
|
return newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude), nil
|
||||||
|
|
|
@ -18,8 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/lufia/iostat"
|
"github.com/lufia/iostat"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
@ -35,7 +35,7 @@ type diskstatsCollector struct {
|
||||||
descs []typedDescFunc
|
descs []typedDescFunc
|
||||||
|
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -43,7 +43,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
||||||
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
|
func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
var diskLabelNames = []string{"device"}
|
var diskLabelNames = []string{"device"}
|
||||||
|
|
||||||
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
||||||
|
|
|
@ -19,12 +19,11 @@ package collector
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/blockdevice"
|
"github.com/prometheus/procfs/blockdevice"
|
||||||
)
|
)
|
||||||
|
@ -85,7 +84,7 @@ type diskstatsCollector struct {
|
||||||
filesystemInfoDesc typedFactorDesc
|
filesystemInfoDesc typedFactorDesc
|
||||||
deviceMapperInfoDesc typedFactorDesc
|
deviceMapperInfoDesc typedFactorDesc
|
||||||
ataDescs map[string]typedFactorDesc
|
ataDescs map[string]typedFactorDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
getUdevDeviceProperties func(uint32, uint32) (udevInfo, error)
|
getUdevDeviceProperties func(uint32, uint32) (udevInfo, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +94,7 @@ func init() {
|
||||||
|
|
||||||
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
||||||
// Docs from https://www.kernel.org/doc/Documentation/iostats.txt
|
// Docs from https://www.kernel.org/doc/Documentation/iostats.txt
|
||||||
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
|
func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
var diskLabelNames = []string{"device"}
|
var diskLabelNames = []string{"device"}
|
||||||
fs, err := blockdevice.NewFS(*procPath, *sysPath)
|
fs, err := blockdevice.NewFS(*procPath, *sysPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -113,7 +112,7 @@ func NewDiskstatsCollector(logger log.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,
|
||||||
},
|
},
|
||||||
|
@ -262,7 +261,7 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
|
||||||
|
|
||||||
// Only enable getting device properties from udev if the directory is readable.
|
// Only enable getting device properties from udev if the directory is readable.
|
||||||
if stat, err := os.Stat(*udevDataPath); err != nil || !stat.IsDir() {
|
if stat, err := os.Stat(*udevDataPath); err != nil || !stat.IsDir() {
|
||||||
level.Error(logger).Log("msg", "Failed to open directory, disabling udev device properties", "path", *udevDataPath)
|
logger.Error("Failed to open directory, disabling udev device properties", "path", *udevDataPath)
|
||||||
} else {
|
} else {
|
||||||
collector.getUdevDeviceProperties = getUdevDeviceProperties
|
collector.getUdevDeviceProperties = getUdevDeviceProperties
|
||||||
}
|
}
|
||||||
|
@ -284,7 +283,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber)
|
info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
level.Debug(c.logger).Log("msg", "Failed to parse udev info", "err", err)
|
c.logger.Debug("Failed to parse udev info", "err", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is usually the serial printed on the disk label.
|
// This is usually the serial printed on the disk label.
|
||||||
|
@ -295,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),
|
||||||
|
@ -303,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
|
||||||
|
@ -355,14 +361,14 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
for attr, desc := range c.ataDescs {
|
for attr, desc := range c.ataDescs {
|
||||||
str, ok := info[attr]
|
str, ok := info[attr]
|
||||||
if !ok {
|
if !ok {
|
||||||
level.Debug(c.logger).Log("msg", "Udev attribute does not exist", "attribute", attr)
|
c.logger.Debug("Udev attribute does not exist", "attribute", attr)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if value, err := strconv.ParseFloat(str, 64); err == nil {
|
if value, err := strconv.ParseFloat(str, 64); err == nil {
|
||||||
ch <- desc.mustNewConstMetric(value, dev)
|
ch <- desc.mustNewConstMetric(value, dev)
|
||||||
} else {
|
} else {
|
||||||
level.Error(c.logger).Log("msg", "Failed to parse ATA value", "err", err)
|
c.logger.Error("Failed to parse ATA value", "err", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/client_golang/prometheus/testutil"
|
"github.com/prometheus/client_golang/prometheus/testutil"
|
||||||
)
|
)
|
||||||
|
@ -39,7 +39,7 @@ func (c testDiskStatsCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||||
prometheus.DescribeByCollect(c, ch)
|
prometheus.DescribeByCollect(c, ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTestDiskStatsCollector(logger log.Logger) (prometheus.Collector, error) {
|
func NewTestDiskStatsCollector(logger *slog.Logger) (prometheus.Collector, error) {
|
||||||
dsc, err := NewDiskstatsCollector(logger)
|
dsc, err := NewDiskstatsCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return testDiskStatsCollector{}, err
|
return testDiskStatsCollector{}, err
|
||||||
|
@ -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
|
||||||
|
@ -317,7 +317,7 @@ node_disk_written_bytes_total{device="sr0"} 0
|
||||||
node_disk_written_bytes_total{device="vda"} 1.0938236928e+11
|
node_disk_written_bytes_total{device="vda"} 1.0938236928e+11
|
||||||
`
|
`
|
||||||
|
|
||||||
logger := log.NewLogfmtLogger(os.Stderr)
|
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
|
||||||
collector, err := NewDiskstatsCollector(logger)
|
collector, err := NewDiskstatsCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
|
@ -18,9 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -41,7 +41,7 @@ type diskstatsCollector struct {
|
||||||
time typedDesc
|
time typedDesc
|
||||||
|
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -49,7 +49,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
||||||
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
|
func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
|
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
|
||||||
|
|
|
@ -18,9 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -52,7 +52,7 @@ type diskstatsCollector struct {
|
||||||
time typedDesc
|
time typedDesc
|
||||||
|
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -60,7 +60,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
|
||||||
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
|
func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
deviceFilter, err := newDiskstatsDeviceFilter(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
|
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
|
||||||
|
|
|
@ -19,11 +19,10 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
@ -38,7 +37,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDMICollector returns a new Collector exposing DMI information.
|
// NewDMICollector returns a new Collector exposing DMI information.
|
||||||
func NewDMICollector(logger log.Logger) (Collector, error) {
|
func NewDMICollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, 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)
|
||||||
|
@ -47,7 +46,7 @@ func NewDMICollector(logger log.Logger) (Collector, error) {
|
||||||
dmi, err := fs.DMIClass()
|
dmi, err := fs.DMIClass()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(logger).Log("msg", "Platform does not support Desktop Management Interface (DMI) information", "err", err)
|
logger.Debug("Platform does not support Desktop Management Interface (DMI) information", "err", err)
|
||||||
dmi = &sysfs.DMIClass{}
|
dmi = &sysfs.DMIClass{}
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("failed to read Desktop Management Interface (DMI) information: %w", err)
|
return nil, fmt.Errorf("failed to read Desktop Management Interface (DMI) information: %w", err)
|
||||||
|
|
|
@ -20,12 +20,11 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -79,14 +78,14 @@ type drbdCollector struct {
|
||||||
numerical map[string]drbdNumericalMetric
|
numerical map[string]drbdNumericalMetric
|
||||||
stringPair map[string]drbdStringPairMetric
|
stringPair map[string]drbdStringPairMetric
|
||||||
connected *prometheus.Desc
|
connected *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("drbd", defaultDisabled, newDRBDCollector)
|
registerCollector("drbd", defaultDisabled, newDRBDCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDRBDCollector(logger log.Logger) (Collector, error) {
|
func newDRBDCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &drbdCollector{
|
return &drbdCollector{
|
||||||
numerical: map[string]drbdNumericalMetric{
|
numerical: map[string]drbdNumericalMetric{
|
||||||
"ns": newDRBDNumericalMetric(
|
"ns": newDRBDNumericalMetric(
|
||||||
|
@ -191,7 +190,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
file, err := os.Open(statsFile)
|
file, err := os.Open(statsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "stats file does not exist, skipping", "file", statsFile, "err", err)
|
c.logger.Debug("stats file does not exist, skipping", "file", statsFile, "err", err)
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,7 +207,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
kv := strings.Split(field, ":")
|
kv := strings.Split(field, ":")
|
||||||
if len(kv) != 2 {
|
if len(kv) != 2 {
|
||||||
level.Debug(c.logger).Log("msg", "skipping invalid key:value pair", "field", field)
|
c.logger.Debug("skipping invalid key:value pair", "field", field)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +273,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
level.Debug(c.logger).Log("msg", "unhandled key-value pair", "key", kv[0], "value", kv[1])
|
c.logger.Debug("unhandled key-value pair", "key", kv[0], "value", kv[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
return scanner.Err()
|
return scanner.Err()
|
||||||
|
|
|
@ -18,8 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
@ -30,7 +30,7 @@ const (
|
||||||
|
|
||||||
type drmCollector struct {
|
type drmCollector struct {
|
||||||
fs sysfs.FS
|
fs sysfs.FS
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
CardInfo *prometheus.Desc
|
CardInfo *prometheus.Desc
|
||||||
GPUBusyPercent *prometheus.Desc
|
GPUBusyPercent *prometheus.Desc
|
||||||
MemoryGTTSize *prometheus.Desc
|
MemoryGTTSize *prometheus.Desc
|
||||||
|
@ -46,7 +46,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDrmCollector returns a new Collector exposing /sys/class/drm/card?/device stats.
|
// NewDrmCollector returns a new Collector exposing /sys/class/drm/card?/device stats.
|
||||||
func NewDrmCollector(logger log.Logger) (Collector, error) {
|
func NewDrmCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, 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)
|
||||||
|
|
|
@ -18,10 +18,10 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ type edacCollector struct {
|
||||||
ueCount *prometheus.Desc
|
ueCount *prometheus.Desc
|
||||||
csRowCECount *prometheus.Desc
|
csRowCECount *prometheus.Desc
|
||||||
csRowUECount *prometheus.Desc
|
csRowUECount *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -47,7 +47,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEdacCollector returns a new Collector exposing edac stats.
|
// NewEdacCollector returns a new Collector exposing edac stats.
|
||||||
func NewEdacCollector(logger log.Logger) (Collector, error) {
|
func NewEdacCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &edacCollector{
|
return &edacCollector{
|
||||||
ceCount: prometheus.NewDesc(
|
ceCount: prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, edacSubsystem, "correctable_errors_total"),
|
prometheus.BuildFQName(namespace, edacSubsystem, "correctable_errors_total"),
|
||||||
|
|
|
@ -18,8 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -28,7 +28,7 @@ type entropyCollector struct {
|
||||||
fs procfs.FS
|
fs procfs.FS
|
||||||
entropyAvail *prometheus.Desc
|
entropyAvail *prometheus.Desc
|
||||||
entropyPoolSize *prometheus.Desc
|
entropyPoolSize *prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -36,7 +36,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEntropyCollector returns a new Collector exposing entropy stats.
|
// NewEntropyCollector returns a new Collector exposing entropy stats.
|
||||||
func NewEntropyCollector(logger log.Logger) (Collector, error) {
|
func NewEntropyCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, 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)
|
||||||
|
|
|
@ -23,6 +23,7 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -31,8 +32,6 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
"github.com/safchain/ethtool"
|
"github.com/safchain/ethtool"
|
||||||
|
@ -79,13 +78,13 @@ type ethtoolCollector struct {
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
infoDesc *prometheus.Desc
|
infoDesc *prometheus.Desc
|
||||||
metricsPattern *regexp.Regexp
|
metricsPattern *regexp.Regexp
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeEthtoolCollector is the internal constructor for EthtoolCollector.
|
// makeEthtoolCollector is the internal constructor for EthtoolCollector.
|
||||||
// This allows NewEthtoolTestCollector to override its .ethtool interface
|
// This allows NewEthtoolTestCollector to override its .ethtool interface
|
||||||
// for testing.
|
// for testing.
|
||||||
func makeEthtoolCollector(logger log.Logger) (*ethtoolCollector, error) {
|
func makeEthtoolCollector(logger *slog.Logger) (*ethtoolCollector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, 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)
|
||||||
|
@ -97,13 +96,13 @@ func makeEthtoolCollector(logger log.Logger) (*ethtoolCollector, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if *ethtoolDeviceInclude != "" {
|
if *ethtoolDeviceInclude != "" {
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.device-include", "flag", *ethtoolDeviceInclude)
|
logger.Info("Parsed flag --collector.ethtool.device-include", "flag", *ethtoolDeviceInclude)
|
||||||
}
|
}
|
||||||
if *ethtoolDeviceExclude != "" {
|
if *ethtoolDeviceExclude != "" {
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.device-exclude", "flag", *ethtoolDeviceExclude)
|
logger.Info("Parsed flag --collector.ethtool.device-exclude", "flag", *ethtoolDeviceExclude)
|
||||||
}
|
}
|
||||||
if *ethtoolIncludedMetrics != "" {
|
if *ethtoolIncludedMetrics != "" {
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.metrics-include", "flag", *ethtoolIncludedMetrics)
|
logger.Info("Parsed flag --collector.ethtool.metrics-include", "flag", *ethtoolIncludedMetrics)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pre-populate some common ethtool metrics.
|
// Pre-populate some common ethtool metrics.
|
||||||
|
@ -223,7 +222,7 @@ func buildEthtoolFQName(metric string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEthtoolCollector returns a new Collector exposing ethtool stats.
|
// NewEthtoolCollector returns a new Collector exposing ethtool stats.
|
||||||
func NewEthtoolCollector(logger log.Logger) (Collector, error) {
|
func NewEthtoolCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return makeEthtoolCollector(logger)
|
return makeEthtoolCollector(logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,10 +372,10 @@ 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) {
|
||||||
level.Debug(c.logger).Log("msg", "Could not read netclass file", "err", err)
|
c.logger.Debug("Could not read netclass file", "err", err)
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return fmt.Errorf("could not get net class info: %w", err)
|
return fmt.Errorf("could not get net class info: %w", err)
|
||||||
|
@ -386,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
|
||||||
|
|
||||||
|
@ -405,12 +404,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
} else {
|
} else {
|
||||||
if errno, ok := err.(syscall.Errno); ok {
|
if errno, ok := err.(syscall.Errno); ok {
|
||||||
if err == unix.EOPNOTSUPP {
|
if err == unix.EOPNOTSUPP {
|
||||||
level.Debug(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Debug("ethtool link info error", "err", err, "device", device, "errno", uint(errno))
|
||||||
} else if errno != 0 {
|
} else if errno != 0 {
|
||||||
level.Error(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Error("ethtool link info error", "err", err, "device", device, "errno", uint(errno))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
level.Error(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device)
|
c.logger.Error("ethtool link info error", "err", err, "device", device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,12 +421,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
} else {
|
} else {
|
||||||
if errno, ok := err.(syscall.Errno); ok {
|
if errno, ok := err.(syscall.Errno); ok {
|
||||||
if err == unix.EOPNOTSUPP {
|
if err == unix.EOPNOTSUPP {
|
||||||
level.Debug(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Debug("ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
|
||||||
} else if errno != 0 {
|
} else if errno != 0 {
|
||||||
level.Error(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Error("ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
level.Error(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device)
|
c.logger.Error("ethtool driver info error", "err", err, "device", device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,12 +437,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errno, ok := err.(syscall.Errno); ok {
|
if errno, ok := err.(syscall.Errno); ok {
|
||||||
if err == unix.EOPNOTSUPP {
|
if err == unix.EOPNOTSUPP {
|
||||||
level.Debug(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Debug("ethtool stats error", "err", err, "device", device, "errno", uint(errno))
|
||||||
} else if errno != 0 {
|
} else if errno != 0 {
|
||||||
level.Error(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device, "errno", uint(errno))
|
c.logger.Error("ethtool stats error", "err", err, "device", device, "errno", uint(errno))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
level.Error(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device)
|
c.logger.Error("ethtool stats error", "err", err, "device", device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +461,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
metricFQName := buildEthtoolFQName(metricName)
|
metricFQName := buildEthtoolFQName(metricName)
|
||||||
existingMetric, exists := metricFQNames[metricFQName]
|
existingMetric, exists := metricFQNames[metricFQName]
|
||||||
if exists {
|
if exists {
|
||||||
level.Debug(c.logger).Log("msg", "dropping duplicate metric name", "device", device,
|
c.logger.Debug("dropping duplicate metric name", "device", device,
|
||||||
"metricFQName", metricFQName, "metric1", existingMetric, "metric2", metricName)
|
"metricFQName", metricFQName, "metric1", existingMetric, "metric2", metricName)
|
||||||
// Keep the metricName as "deleted" in the dict in case there are 3 duplicates.
|
// Keep the metricName as "deleted" in the dict in case there are 3 duplicates.
|
||||||
metricFQNames[metricFQName] = ""
|
metricFQNames[metricFQName] = ""
|
||||||
|
|
|
@ -19,6 +19,8 @@ package collector
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -26,7 +28,6 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/client_golang/prometheus/testutil"
|
"github.com/prometheus/client_golang/prometheus/testutil"
|
||||||
"github.com/safchain/ethtool"
|
"github.com/safchain/ethtool"
|
||||||
|
@ -49,7 +50,7 @@ func (c testEthtoolCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||||
prometheus.DescribeByCollect(c, ch)
|
prometheus.DescribeByCollect(c, ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTestEthtoolCollector(logger log.Logger) (prometheus.Collector, error) {
|
func NewTestEthtoolCollector(logger *slog.Logger) (prometheus.Collector, error) {
|
||||||
dsc, err := NewEthtoolTestCollector(logger)
|
dsc, err := NewEthtoolTestCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return testEthtoolCollector{}, err
|
return testEthtoolCollector{}, err
|
||||||
|
@ -255,7 +256,7 @@ func (e *EthtoolFixture) LinkInfo(intf string) (ethtool.EthtoolCmd, error) {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEthtoolTestCollector(logger log.Logger) (Collector, error) {
|
func NewEthtoolTestCollector(logger *slog.Logger) (Collector, error) {
|
||||||
collector, err := makeEthtoolCollector(logger)
|
collector, err := makeEthtoolCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -370,7 +371,7 @@ node_network_supported_speed_bytes{device="eth0",duplex="half",mode="10baseT"} 1
|
||||||
`
|
`
|
||||||
*sysPath = "fixtures/sys"
|
*sysPath = "fixtures/sys"
|
||||||
|
|
||||||
logger := log.NewLogfmtLogger(os.Stderr)
|
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
|
||||||
collector, err := NewEthtoolTestCollector(logger)
|
collector, err := NewEthtoolTestCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
|
@ -18,13 +18,13 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"log/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type execCollector struct {
|
type execCollector struct {
|
||||||
sysctls []bsdSysctl
|
sysctls []bsdSysctl
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -32,7 +32,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewExecCollector returns a new Collector exposing system execution statistics.
|
// NewExecCollector returns a new Collector exposing system execution statistics.
|
||||||
func NewExecCollector(logger log.Logger) (Collector, error) {
|
func NewExecCollector(logger *slog.Logger) (Collector, error) {
|
||||||
// From sys/vm/vm_meter.c:
|
// From sys/vm/vm_meter.c:
|
||||||
// All are of type CTLTYPE_UINT.
|
// All are of type CTLTYPE_UINT.
|
||||||
//
|
//
|
||||||
|
|
|
@ -18,10 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/node_exporter/collector/utils"
|
"github.com/prometheus/node_exporter/collector/utils"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
|
@ -32,7 +31,7 @@ const maxUint64 = ^uint64(0)
|
||||||
type fibrechannelCollector struct {
|
type fibrechannelCollector struct {
|
||||||
fs sysfs.FS
|
fs sysfs.FS
|
||||||
metricDescs map[string]*prometheus.Desc
|
metricDescs map[string]*prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
subsystem string
|
subsystem string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFibreChannelCollector returns a new Collector exposing FibreChannel stats.
|
// NewFibreChannelCollector returns a new Collector exposing FibreChannel stats.
|
||||||
func NewFibreChannelCollector(logger log.Logger) (Collector, error) {
|
func NewFibreChannelCollector(logger *slog.Logger) (Collector, error) {
|
||||||
var i fibrechannelCollector
|
var i fibrechannelCollector
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -99,7 +98,7 @@ func (c *fibrechannelCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
hosts, err := c.fs.FibreChannelClass()
|
hosts, err := c.fs.FibreChannelClass()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
level.Debug(c.logger).Log("msg", "fibrechannel statistics not found, skipping")
|
c.logger.Debug("fibrechannel statistics not found, skipping")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return fmt.Errorf("error obtaining FibreChannel class info: %s", err)
|
return fmt.Errorf("error obtaining FibreChannel class info: %s", err)
|
||||||
|
|
|
@ -20,10 +20,10 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type fileFDStatCollector struct {
|
type fileFDStatCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -40,7 +40,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFileFDStatCollector returns a new Collector exposing file-nr stats.
|
// NewFileFDStatCollector returns a new Collector exposing file-nr stats.
|
||||||
func NewFileFDStatCollector(logger log.Logger) (Collector, error) {
|
func NewFileFDStatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &fileFDStatCollector{logger}, nil
|
return &fileFDStatCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
65
collector/filesystem_aix.go
Normal file
65
collector/filesystem_aix.go
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
// 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 !nofilesystem
|
||||||
|
// +build !nofilesystem
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defMountPointsExcluded = "^/(dev|aha)($|/)"
|
||||||
|
defFSTypesExcluded = "^procfs$"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expose filesystem fullness.
|
||||||
|
func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
|
fsStat, err := perfstat.FileSystemStat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, stat := range fsStat {
|
||||||
|
if c.mountPointFilter.ignored(stat.MountPoint) {
|
||||||
|
c.logger.Debug("Ignoring mount point", "mountpoint", stat.MountPoint)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fstype := stat.TypeString()
|
||||||
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ro := 0.0
|
||||||
|
if stat.Flags&perfstat.VFS_READONLY != 0 {
|
||||||
|
ro = 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
stats = append(stats, filesystemStats{
|
||||||
|
labels: filesystemLabels{
|
||||||
|
device: stat.Device,
|
||||||
|
mountPoint: stat.MountPoint,
|
||||||
|
fsType: fstype,
|
||||||
|
},
|
||||||
|
size: float64(stat.TotalBlocks / 512.0),
|
||||||
|
free: float64(stat.FreeBlocks / 512.0),
|
||||||
|
avail: float64(stat.FreeBlocks / 512.0), // AIX doesn't distinguish between free and available blocks.
|
||||||
|
files: float64(stat.TotalInodes),
|
||||||
|
filesFree: float64(stat.FreeInodes),
|
||||||
|
ro: ro,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return stats, nil
|
||||||
|
}
|
|
@ -11,17 +11,14 @@
|
||||||
// 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
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -50,15 +47,15 @@ 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) {
|
||||||
level.Debug(c.logger).Log("msg", "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) {
|
||||||
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,18 @@
|
||||||
// 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 !nofilesystem && (linux || freebsd || openbsd || darwin || dragonfly)
|
//go:build !nofilesystem && (linux || freebsd || netbsd || openbsd || darwin || dragonfly || aix)
|
||||||
// +build !nofilesystem
|
// +build !nofilesystem
|
||||||
// +build linux freebsd openbsd darwin dragonfly
|
// +build linux freebsd netbsd openbsd darwin dragonfly aix
|
||||||
|
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -37,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
|
||||||
|
@ -46,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
|
||||||
|
@ -59,18 +62,23 @@ 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 log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type filesystemLabels struct {
|
type filesystemLabels struct {
|
||||||
|
@ -81,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,30 +98,8 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
|
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
|
||||||
func NewFilesystemCollector(logger log.Logger) (Collector, error) {
|
func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
||||||
if *oldMountPointsExcluded != "" {
|
const subsystem = "filesystem"
|
||||||
if !mountPointsExcludeSet {
|
|
||||||
level.Warn(logger).Log("msg", "--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 {
|
|
||||||
level.Warn(logger).Log("msg", "--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"
|
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
|
|
||||||
mountPointPattern := regexp.MustCompile(*mountPointsExclude)
|
|
||||||
level.Info(logger).Log("msg", "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"),
|
||||||
|
@ -144,6 +131,12 @@ func NewFilesystemCollector(logger log.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.",
|
||||||
|
@ -163,14 +156,25 @@ func NewFilesystemCollector(logger log.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,
|
||||||
|
@ -228,6 +232,71 @@ 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 != nil {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -40,20 +39,20 @@ 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) {
|
||||||
level.Debug(c.logger).Log("msg", "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) {
|
||||||
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fs.Flags & unix.MNT_IGNORE) != 0 {
|
if (fs.Flags & unix.MNT_IGNORE) != 0 {
|
||||||
level.Debug(c.logger).Log("msg", "Ignoring mount flagged as ignore", "mountpoint", mountpoint)
|
c.logger.Debug("Ignoring mount flagged as ignore", "mountpoint", mountpoint)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,14 +21,13 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -74,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) {
|
||||||
level.Debug(c.logger).Log("msg", "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) {
|
||||||
level.Debug(c.logger).Log("msg", "Ignoring fs", "type", labels.fsType)
|
c.logger.Debug("Ignoring fs type", "type", labels.fsType)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +89,7 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
|
||||||
labels: labels,
|
labels: labels,
|
||||||
deviceError: 1,
|
deviceError: 1,
|
||||||
})
|
})
|
||||||
level.Debug(c.logger).Log("msg", "Mount point is in an unresponsive state", "mountpoint", labels.mountPoint)
|
c.logger.Debug("Mount point is in an unresponsive state", "mountpoint", labels.mountPoint)
|
||||||
stuckMountsMtx.Unlock()
|
stuckMountsMtx.Unlock()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -128,14 +127,14 @@ func (c *filesystemCollector) processStat(labels filesystemLabels) filesystemSta
|
||||||
|
|
||||||
// If the mount has been marked as stuck, unmark it and log it's recovery.
|
// If the mount has been marked as stuck, unmark it and log it's recovery.
|
||||||
if _, ok := stuckMounts[labels.mountPoint]; ok {
|
if _, ok := stuckMounts[labels.mountPoint]; ok {
|
||||||
level.Debug(c.logger).Log("msg", "Mount point has recovered, monitoring will resume", "mountpoint", labels.mountPoint)
|
c.logger.Debug("Mount point has recovered, monitoring will resume", "mountpoint", labels.mountPoint)
|
||||||
delete(stuckMounts, labels.mountPoint)
|
delete(stuckMounts, labels.mountPoint)
|
||||||
}
|
}
|
||||||
stuckMountsMtx.Unlock()
|
stuckMountsMtx.Unlock()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
labels.deviceError = err.Error()
|
labels.deviceError = err.Error()
|
||||||
level.Debug(c.logger).Log("msg", "Error on statfs() system call", "rootfs", rootfsFilePath(labels.mountPoint), "err", err)
|
c.logger.Debug("Error on statfs() system call", "rootfs", rootfsFilePath(labels.mountPoint), "err", err)
|
||||||
return filesystemStats{
|
return filesystemStats{
|
||||||
labels: labels,
|
labels: labels,
|
||||||
deviceError: 1,
|
deviceError: 1,
|
||||||
|
@ -157,7 +156,7 @@ func (c *filesystemCollector) processStat(labels filesystemLabels) filesystemSta
|
||||||
// stuckMountWatcher listens on the given success channel and if the channel closes
|
// stuckMountWatcher listens on the given success channel and if the channel closes
|
||||||
// then the watcher does nothing. If instead the timeout is reached, the
|
// then the watcher does nothing. If instead the timeout is reached, the
|
||||||
// mount point that is being watched is marked as stuck.
|
// mount point that is being watched is marked as stuck.
|
||||||
func stuckMountWatcher(mountPoint string, success chan struct{}, logger log.Logger) {
|
func stuckMountWatcher(mountPoint string, success chan struct{}, logger *slog.Logger) {
|
||||||
mountCheckTimer := time.NewTimer(*mountTimeout)
|
mountCheckTimer := time.NewTimer(*mountTimeout)
|
||||||
defer mountCheckTimer.Stop()
|
defer mountCheckTimer.Stop()
|
||||||
select {
|
select {
|
||||||
|
@ -170,18 +169,18 @@ func stuckMountWatcher(mountPoint string, success chan struct{}, logger log.Logg
|
||||||
case <-success:
|
case <-success:
|
||||||
// Success came in just after the timeout was reached, don't label the mount as stuck
|
// Success came in just after the timeout was reached, don't label the mount as stuck
|
||||||
default:
|
default:
|
||||||
level.Debug(logger).Log("msg", "Mount point timed out, it is being labeled as stuck and will not be monitored", "mountpoint", mountPoint)
|
logger.Debug("Mount point timed out, it is being labeled as stuck and will not be monitored", "mountpoint", mountPoint)
|
||||||
stuckMounts[mountPoint] = struct{}{}
|
stuckMounts[mountPoint] = struct{}{}
|
||||||
}
|
}
|
||||||
stuckMountsMtx.Unlock()
|
stuckMountsMtx.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mountPointDetails(logger log.Logger) ([]filesystemLabels, error) {
|
func mountPointDetails(logger *slog.Logger) ([]filesystemLabels, error) {
|
||||||
file, err := os.Open(procFilePath("1/mountinfo"))
|
file, err := os.Open(procFilePath("1/mountinfo"))
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
// Fallback to `/proc/self/mountinfo` if `/proc/1/mountinfo` is missing due hidepid.
|
// Fallback to `/proc/self/mountinfo` if `/proc/1/mountinfo` is missing due hidepid.
|
||||||
level.Debug(logger).Log("msg", "Reading root mounts failed, falling back to self mounts", "err", err)
|
logger.Debug("Reading root mounts failed, falling back to self mounts", "err", err)
|
||||||
file, err = os.Open(procFilePath("self/mountinfo"))
|
file, err = os.Open(procFilePath("self/mountinfo"))
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -17,11 +17,12 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_parseFilesystemLabelsError(t *testing.T) {
|
func Test_parseFilesystemLabelsError(t *testing.T) {
|
||||||
|
@ -82,7 +83,7 @@ func TestMountPointDetails(t *testing.T) {
|
||||||
"/var/lib/kubelet/plugins/kubernetes.io/vsphere-volume/mounts/[vsanDatastore] bafb9e5a-8856-7e6c-699c-801844e77a4a/kubernetes-dynamic-pvc-3eba5bba-48a3-11e8-89ab-005056b92113.vmdk": "",
|
"/var/lib/kubelet/plugins/kubernetes.io/vsphere-volume/mounts/[vsanDatastore] bafb9e5a-8856-7e6c-699c-801844e77a4a/kubernetes-dynamic-pvc-3eba5bba-48a3-11e8-89ab-005056b92113.vmdk": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
filesystems, err := mountPointDetails(log.NewNopLogger())
|
filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log(err)
|
t.Log(err)
|
||||||
}
|
}
|
||||||
|
@ -111,7 +112,7 @@ func TestMountsFallback(t *testing.T) {
|
||||||
"/": "",
|
"/": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
filesystems, err := mountPointDetails(log.NewNopLogger())
|
filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log(err)
|
t.Log(err)
|
||||||
}
|
}
|
||||||
|
@ -139,7 +140,7 @@ func TestPathRootfs(t *testing.T) {
|
||||||
"/sys/fs/cgroup": "",
|
"/sys/fs/cgroup": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
filesystems, err := mountPointDetails(log.NewNopLogger())
|
filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log(err)
|
t.Log(err)
|
||||||
}
|
}
|
||||||
|
|
108
collector/filesystem_macos.go
Normal file
108
collector/filesystem_macos.go
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
// 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) {
|
||||||
|
CFNumberRef tmp;
|
||||||
|
Float64 *value;
|
||||||
|
NSError *error = nil;
|
||||||
|
NSString *str = [NSString stringWithUTF8String:path];
|
||||||
|
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:str];
|
||||||
|
NSDictionary *results = [fileURL resourceValuesForKeys:@[NSURLVolumeAvailableCapacityForImportantUsageKey] error:&error];
|
||||||
|
if (results) {
|
||||||
|
if ((tmp = CFDictionaryGetValue((CFDictionaryRef)results, NSURLVolumeAvailableCapacityForImportantUsageKey)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
value = (Float64 *)malloc(sizeof(Float64));
|
||||||
|
if (CFNumberGetValue(tmp, kCFNumberFloat64Type, value)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(value);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
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(C.CString(mountpoint))),
|
||||||
|
ro: ro,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return stats, nil
|
||||||
|
}
|
132
collector/filesystem_netbsd.go
Normal file
132
collector/filesystem_netbsd.go
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
// 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 !nofilesystem
|
||||||
|
// +build !nofilesystem
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defMountPointsExcluded = "^/(dev)($|/)"
|
||||||
|
defFSTypesExcluded = "^(kernfs|procfs|ptyfs|fdesc)$"
|
||||||
|
_VFS_NAMELEN = 32
|
||||||
|
_VFS_MNAMELEN = 1024
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go uses the NetBSD 9 ABI and thus syscall.SYS_GETVFSSTAT is compat_90_getvfsstat.
|
||||||
|
* We have to declare struct statvfs90 because it is not included in the unix package.
|
||||||
|
* See NetBSD/src/sys/compat/sys/statvfs.h.
|
||||||
|
*/
|
||||||
|
type statvfs90 struct {
|
||||||
|
F_flag uint
|
||||||
|
F_bsize uint
|
||||||
|
F_frsize uint
|
||||||
|
F_iosize uint
|
||||||
|
|
||||||
|
F_blocks uint64
|
||||||
|
F_bfree uint64
|
||||||
|
F_bavail uint64
|
||||||
|
F_bresvd uint64
|
||||||
|
|
||||||
|
F_files uint64
|
||||||
|
F_ffree uint64
|
||||||
|
F_favail uint64
|
||||||
|
F_fresvd uint64
|
||||||
|
|
||||||
|
F_syncreads uint64
|
||||||
|
F_syncwrites uint64
|
||||||
|
|
||||||
|
F_asyncreads uint64
|
||||||
|
F_asyncwrites uint64
|
||||||
|
|
||||||
|
F_fsidx [2]uint32
|
||||||
|
F_fsid uint32
|
||||||
|
F_namemax uint
|
||||||
|
F_owner uint32
|
||||||
|
F_spare [4]uint32
|
||||||
|
|
||||||
|
F_fstypename [_VFS_NAMELEN]byte
|
||||||
|
F_mntonname [_VFS_MNAMELEN]byte
|
||||||
|
F_mntfromname [_VFS_MNAMELEN]byte
|
||||||
|
|
||||||
|
cgo_pad [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||||
|
var mnt []statvfs90
|
||||||
|
if syscall.SYS_GETVFSSTAT != 356 /* compat_90_getvfsstat */ {
|
||||||
|
/*
|
||||||
|
* Catch if golang ever updates to newer ABI and bail.
|
||||||
|
*/
|
||||||
|
return nil, fmt.Errorf("getvfsstat: ABI mismatch")
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
r1, _, errno := syscall.Syscall(syscall.SYS_GETVFSSTAT, uintptr(0), 0, unix.ST_NOWAIT)
|
||||||
|
if errno != 0 {
|
||||||
|
return nil, fmt.Errorf("getvfsstat: %s", string(errno))
|
||||||
|
}
|
||||||
|
mnt = make([]statvfs90, r1, r1)
|
||||||
|
r2, _, errno := syscall.Syscall(syscall.SYS_GETVFSSTAT, uintptr(unsafe.Pointer(&mnt[0])), unsafe.Sizeof(mnt[0])*r1, unix.ST_NOWAIT /* ST_NOWAIT */)
|
||||||
|
if errno != 0 {
|
||||||
|
return nil, fmt.Errorf("getvfsstat: %s", string(errno))
|
||||||
|
}
|
||||||
|
if r1 == r2 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stats = []filesystemStats{}
|
||||||
|
for _, v := range mnt {
|
||||||
|
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
||||||
|
if c.mountPointFilter.ignored(mountpoint) {
|
||||||
|
c.logger.Debug("msg", "Ignoring mount point", "mountpoint", mountpoint)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
||||||
|
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
||||||
|
if c.fsTypeFilter.ignored(fstype) {
|
||||||
|
c.logger.Debug("msg", "Ignoring fs type", "type", fstype)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var ro float64
|
||||||
|
if (v.F_flag & unix.MNT_RDONLY) != 0 {
|
||||||
|
ro = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
stats = append(stats, filesystemStats{
|
||||||
|
labels: filesystemLabels{
|
||||||
|
device: device,
|
||||||
|
mountPoint: mountpoint,
|
||||||
|
fsType: fstype,
|
||||||
|
},
|
||||||
|
size: float64(v.F_blocks) * float64(v.F_bsize),
|
||||||
|
free: float64(v.F_bfree) * float64(v.F_bsize),
|
||||||
|
avail: float64(v.F_bavail) * float64(v.F_bsize),
|
||||||
|
files: float64(v.F_files),
|
||||||
|
filesFree: float64(v.F_ffree),
|
||||||
|
ro: ro,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return stats, nil
|
||||||
|
}
|
|
@ -17,7 +17,6 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -42,15 +41,15 @@ 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) {
|
||||||
level.Debug(c.logger).Log("msg", "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) {
|
||||||
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype)
|
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,55 +1,59 @@
|
||||||
# HELP go_gc_duration_seconds A summary of the pause duration of 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
|
||||||
|
# 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.
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
# TYPE go_goroutines gauge
|
# TYPE go_goroutines gauge
|
||||||
# HELP go_info Information about the Go environment.
|
# HELP go_info Information about the Go environment.
|
||||||
# TYPE go_info gauge
|
# TYPE go_info gauge
|
||||||
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
|
# 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
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
|
# 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
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
|
# 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
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
# HELP go_memstats_frees_total Total number of frees.
|
# 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
|
# TYPE go_memstats_frees_total counter
|
||||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
|
# 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
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
|
# 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
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
|
# 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
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
|
# 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
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
# HELP go_memstats_heap_objects Number of allocated objects.
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
# TYPE go_memstats_heap_objects gauge
|
# TYPE go_memstats_heap_objects gauge
|
||||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
|
# 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
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.
|
# 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
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
# HELP go_memstats_lookups_total Total number of pointer lookups.
|
# 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_lookups_total counter
|
|
||||||
# HELP go_memstats_mallocs_total Total number of mallocs.
|
|
||||||
# TYPE go_memstats_mallocs_total counter
|
# TYPE go_memstats_mallocs_total counter
|
||||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.
|
# 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
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.
|
# 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
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.
|
# 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
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.
|
# 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
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.
|
# 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
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.
|
# 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
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.
|
# 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
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.
|
# 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
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system.
|
# 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
|
||||||
|
# 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
|
||||||
# HELP node_arp_entries ARP entries by device
|
# HELP node_arp_entries ARP entries by device
|
||||||
|
@ -484,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
|
||||||
|
@ -867,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
|
||||||
|
@ -980,6 +988,8 @@ 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="hwmon4",label="mclk",sensor="freq2"} 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="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_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
|
||||||
|
@ -4311,108 +4321,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
|
||||||
|
@ -4589,6 +4630,10 @@ node_zoneinfo_spanned_pages{node="0",zone="Normal"} 7.806976e+06
|
||||||
# TYPE process_cpu_seconds_total counter
|
# TYPE process_cpu_seconds_total counter
|
||||||
# HELP process_max_fds Maximum number of open file descriptors.
|
# HELP process_max_fds Maximum number of open file descriptors.
|
||||||
# TYPE process_max_fds gauge
|
# TYPE process_max_fds gauge
|
||||||
|
# HELP process_network_receive_bytes_total Number of bytes received by the process over the network.
|
||||||
|
# TYPE process_network_receive_bytes_total counter
|
||||||
|
# HELP process_network_transmit_bytes_total Number of bytes sent by the process over the network.
|
||||||
|
# TYPE process_network_transmit_bytes_total counter
|
||||||
# HELP process_open_fds Number of open file descriptors.
|
# HELP process_open_fds Number of open file descriptors.
|
||||||
# TYPE process_open_fds gauge
|
# TYPE process_open_fds gauge
|
||||||
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
||||||
|
|
277
collector/fixtures/e2e-output-darwin.txt
Normal file
277
collector/fixtures/e2e-output-darwin.txt
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
# 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 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
|
240
collector/fixtures/e2e-output-solaris.txt
Normal file
240
collector/fixtures/e2e-output-solaris.txt
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
# 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_cpu_frequency_max_hertz Maximum CPU thread frequency in hertz.
|
||||||
|
# TYPE node_cpu_frequency_max_hertz gauge
|
||||||
|
node_cpu_frequency_max_hertz{cpu="0"} 2.445e+09
|
||||||
|
node_cpu_frequency_max_hertz{cpu="1"} 2.445e+09
|
||||||
|
node_cpu_frequency_max_hertz{cpu="2"} 2.445e+09
|
||||||
|
node_cpu_frequency_max_hertz{cpu="3"} 2.445e+09
|
||||||
|
# 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,55 +1,59 @@
|
||||||
# HELP go_gc_duration_seconds A summary of the pause duration of 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
|
||||||
|
# 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.
|
# HELP go_goroutines Number of goroutines that currently exist.
|
||||||
# TYPE go_goroutines gauge
|
# TYPE go_goroutines gauge
|
||||||
# HELP go_info Information about the Go environment.
|
# HELP go_info Information about the Go environment.
|
||||||
# TYPE go_info gauge
|
# TYPE go_info gauge
|
||||||
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
|
# 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
|
# TYPE go_memstats_alloc_bytes gauge
|
||||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
|
# 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
|
# TYPE go_memstats_alloc_bytes_total counter
|
||||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
|
# 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
|
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||||
# HELP go_memstats_frees_total Total number of frees.
|
# 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
|
# TYPE go_memstats_frees_total counter
|
||||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
|
# 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
|
# TYPE go_memstats_gc_sys_bytes gauge
|
||||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
|
# 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
|
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
|
# 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
|
# TYPE go_memstats_heap_idle_bytes gauge
|
||||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
|
# 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
|
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||||
# HELP go_memstats_heap_objects Number of allocated objects.
|
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||||
# TYPE go_memstats_heap_objects gauge
|
# TYPE go_memstats_heap_objects gauge
|
||||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
|
# 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
|
# TYPE go_memstats_heap_released_bytes gauge
|
||||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.
|
# 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
|
# TYPE go_memstats_heap_sys_bytes gauge
|
||||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||||
# HELP go_memstats_lookups_total Total number of pointer lookups.
|
# 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_lookups_total counter
|
|
||||||
# HELP go_memstats_mallocs_total Total number of mallocs.
|
|
||||||
# TYPE go_memstats_mallocs_total counter
|
# TYPE go_memstats_mallocs_total counter
|
||||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.
|
# 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
|
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.
|
# 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
|
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.
|
# 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
|
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.
|
# 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
|
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.
|
# 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
|
# TYPE go_memstats_next_gc_bytes gauge
|
||||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.
|
# 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
|
# TYPE go_memstats_other_sys_bytes gauge
|
||||||
# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.
|
# 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
|
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.
|
# 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
|
# TYPE go_memstats_stack_sys_bytes gauge
|
||||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system.
|
# 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
|
||||||
|
# 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
|
||||||
# HELP node_arp_entries ARP entries by device
|
# HELP node_arp_entries ARP entries by device
|
||||||
|
@ -506,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
|
||||||
|
@ -889,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
|
||||||
|
@ -1002,6 +1010,8 @@ 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="hwmon4",label="mclk",sensor="freq2"} 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="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_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
|
||||||
|
@ -4333,108 +4343,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
|
||||||
|
@ -4611,6 +4652,10 @@ node_zoneinfo_spanned_pages{node="0",zone="Normal"} 7.806976e+06
|
||||||
# TYPE process_cpu_seconds_total counter
|
# TYPE process_cpu_seconds_total counter
|
||||||
# HELP process_max_fds Maximum number of open file descriptors.
|
# HELP process_max_fds Maximum number of open file descriptors.
|
||||||
# TYPE process_max_fds gauge
|
# TYPE process_max_fds gauge
|
||||||
|
# HELP process_network_receive_bytes_total Number of bytes received by the process over the network.
|
||||||
|
# TYPE process_network_receive_bytes_total counter
|
||||||
|
# HELP process_network_transmit_bytes_total Number of bytes sent by the process over the network.
|
||||||
|
# TYPE process_network_transmit_bytes_total counter
|
||||||
# HELP process_open_fds Number of open file descriptors.
|
# HELP process_open_fds Number of open file descriptors.
|
||||||
# TYPE process_open_fds gauge
|
# TYPE process_open_fds gauge
|
||||||
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
||||||
|
|
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,243 @@
|
||||||
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/bus
|
Directory: sys/bus
|
||||||
Mode: 755
|
Mode: 755
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -437,6 +674,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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -18,6 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
@ -25,8 +27,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -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",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -55,12 +55,12 @@ func init() {
|
||||||
type hwMonCollector struct {
|
type hwMonCollector struct {
|
||||||
deviceFilter deviceFilter
|
deviceFilter deviceFilter
|
||||||
sensorFilter deviceFilter
|
sensorFilter deviceFilter
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHwMonCollector returns a new Collector exposing /sys/class/hwmon stats
|
// NewHwMonCollector returns a new Collector exposing /sys/class/hwmon stats
|
||||||
// (similar to lm-sensors).
|
// (similar to lm-sensors).
|
||||||
func NewHwMonCollector(logger log.Logger) (Collector, error) {
|
func NewHwMonCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
|
||||||
return &hwMonCollector{
|
return &hwMonCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
@ -108,6 +108,9 @@ func sysReadFile(file string) ([]byte, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if n < 0 {
|
||||||
|
return nil, fmt.Errorf("failed to read file: %q, read returned negative bytes value: %d", file, n)
|
||||||
|
}
|
||||||
|
|
||||||
return b[:n], nil
|
return b[:n], nil
|
||||||
}
|
}
|
||||||
|
@ -168,7 +171,7 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.deviceFilter.ignored(hwmonName) {
|
if c.deviceFilter.ignored(hwmonName) {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring hwmon chip", "chip", hwmonName)
|
c.logger.Debug("ignoring hwmon chip", "chip", hwmonName)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +214,7 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
|
||||||
// sensors on specific devices. For example, to exclude the sensor "temp3" on
|
// sensors on specific devices. For example, to exclude the sensor "temp3" on
|
||||||
// the device "platform_coretemp_0", use "platform_coretemp_0;temp3"
|
// the device "platform_coretemp_0", use "platform_coretemp_0;temp3"
|
||||||
if c.sensorFilter.ignored(hwmonName + ";" + sensor) {
|
if c.sensorFilter.ignored(hwmonName + ";" + sensor) {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring sensor", "sensor", sensor)
|
c.logger.Debug("ignoring sensor", "sensor", sensor)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,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)
|
||||||
|
@ -450,7 +462,7 @@ func (c *hwMonCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
hwmonFiles, err := os.ReadDir(hwmonPathName)
|
hwmonFiles, err := os.ReadDir(hwmonPathName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "hwmon collector metrics are not available for this system")
|
c.logger.Debug("hwmon collector metrics are not available for this system")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,10 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
@ -31,7 +30,7 @@ import (
|
||||||
type infinibandCollector struct {
|
type infinibandCollector struct {
|
||||||
fs sysfs.FS
|
fs sysfs.FS
|
||||||
metricDescs map[string]*prometheus.Desc
|
metricDescs map[string]*prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
subsystem string
|
subsystem string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +39,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewInfiniBandCollector returns a new Collector exposing InfiniBand stats.
|
// NewInfiniBandCollector returns a new Collector exposing InfiniBand stats.
|
||||||
func NewInfiniBandCollector(logger log.Logger) (Collector, error) {
|
func NewInfiniBandCollector(logger *slog.Logger) (Collector, error) {
|
||||||
var i infinibandCollector
|
var i infinibandCollector
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -116,7 +115,7 @@ func (c *infinibandCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
devices, err := c.fs.InfiniBandClass()
|
devices, err := c.fs.InfiniBandClass()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "infiniband statistics not found, skipping")
|
c.logger.Debug("infiniband statistics not found, skipping")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return fmt.Errorf("error obtaining InfiniBand class info: %w", err)
|
return fmt.Errorf("error obtaining InfiniBand class info: %w", err)
|
||||||
|
|
|
@ -18,14 +18,15 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type interruptsCollector struct {
|
type interruptsCollector struct {
|
||||||
desc typedDesc
|
desc typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
nameFilter deviceFilter
|
nameFilter deviceFilter
|
||||||
includeZeros bool
|
includeZeros bool
|
||||||
}
|
}
|
||||||
|
@ -41,7 +42,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewInterruptsCollector returns a new Collector exposing interrupts stats.
|
// NewInterruptsCollector returns a new Collector exposing interrupts stats.
|
||||||
func NewInterruptsCollector(logger log.Logger) (Collector, error) {
|
func NewInterruptsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &interruptsCollector{
|
return &interruptsCollector{
|
||||||
desc: typedDesc{prometheus.NewDesc(
|
desc: typedDesc{prometheus.NewDesc(
|
||||||
namespace+"_interrupts_total",
|
namespace+"_interrupts_total",
|
||||||
|
|
|
@ -25,7 +25,6 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -42,7 +41,7 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) (err error) {
|
||||||
for cpuNo, value := range interrupt.values {
|
for cpuNo, value := range interrupt.values {
|
||||||
filterName := name + ";" + interrupt.info + ";" + interrupt.devices
|
filterName := name + ";" + interrupt.info + ";" + interrupt.devices
|
||||||
if c.nameFilter.ignored(filterName) {
|
if c.nameFilter.ignored(filterName) {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName)
|
c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fv, err := strconv.ParseFloat(value, 64)
|
fv, err := strconv.ParseFloat(value, 64)
|
||||||
|
@ -50,7 +49,7 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) (err error) {
|
||||||
return fmt.Errorf("invalid value %s in interrupts: %w", value, err)
|
return fmt.Errorf("invalid value %s in interrupts: %w", value, err)
|
||||||
}
|
}
|
||||||
if !c.includeZeros && fv == 0.0 {
|
if !c.includeZeros && fv == 0.0 {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ch <- c.desc.mustNewConstMetric(fv, strconv.Itoa(cpuNo), name, interrupt.info, interrupt.devices)
|
ch <- c.desc.mustNewConstMetric(fv, strconv.Itoa(cpuNo), name, interrupt.info, interrupt.devices)
|
||||||
|
|
|
@ -20,7 +20,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -110,11 +109,11 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
interruptType := fmt.Sprintf("%d", interrupt.vector)
|
interruptType := fmt.Sprintf("%d", interrupt.vector)
|
||||||
filterName := interruptType + ";" + dev
|
filterName := interruptType + ";" + dev
|
||||||
if c.nameFilter.ignored(filterName) {
|
if c.nameFilter.ignored(filterName) {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName)
|
c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !c.includeZeros && value == 0.0 {
|
if !c.includeZeros && value == 0.0 {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ch <- c.desc.mustNewConstMetric(
|
ch <- c.desc.mustNewConstMetric(
|
||||||
|
|
|
@ -21,7 +21,6 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -81,11 +80,11 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
interruptType := fmt.Sprintf("%d", interrupt.vector)
|
interruptType := fmt.Sprintf("%d", interrupt.vector)
|
||||||
filterName := interruptType + ";" + dev
|
filterName := interruptType + ";" + dev
|
||||||
if c.nameFilter.ignored(filterName) {
|
if c.nameFilter.ignored(filterName) {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName)
|
c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !c.includeZeros && value == 0.0 {
|
if !c.includeZeros && value == 0.0 {
|
||||||
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ch <- c.desc.mustNewConstMetric(
|
ch <- c.desc.mustNewConstMetric(
|
||||||
|
|
|
@ -19,14 +19,13 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -37,7 +36,7 @@ type ipvsCollector struct {
|
||||||
backendLabels []string
|
backendLabels []string
|
||||||
backendConnectionsActive, backendConnectionsInact, backendWeight typedDesc
|
backendConnectionsActive, backendConnectionsInact, backendWeight typedDesc
|
||||||
connections, incomingPackets, outgoingPackets, incomingBytes, outgoingBytes typedDesc
|
connections, incomingPackets, outgoingPackets, incomingBytes, outgoingBytes typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type ipvsBackendStatus struct {
|
type ipvsBackendStatus struct {
|
||||||
|
@ -73,11 +72,11 @@ func init() {
|
||||||
|
|
||||||
// NewIPVSCollector sets up a new collector for IPVS metrics. It accepts the
|
// NewIPVSCollector sets up a new collector for IPVS metrics. It accepts the
|
||||||
// "procfs" config parameter to override the default proc location (/proc).
|
// "procfs" config parameter to override the default proc location (/proc).
|
||||||
func NewIPVSCollector(logger log.Logger) (Collector, error) {
|
func NewIPVSCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return newIPVSCollector(logger)
|
return newIPVSCollector(logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newIPVSCollector(logger log.Logger) (*ipvsCollector, error) {
|
func newIPVSCollector(logger *slog.Logger) (*ipvsCollector, error) {
|
||||||
var (
|
var (
|
||||||
c ipvsCollector
|
c ipvsCollector
|
||||||
err error
|
err error
|
||||||
|
@ -143,7 +142,7 @@ func (c *ipvsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Cannot access ipvs metrics, report no error.
|
// Cannot access ipvs metrics, report no error.
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "ipvs collector metrics are not available for this system")
|
c.logger.Debug("ipvs collector metrics are not available for this system")
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
return fmt.Errorf("could not get IPVS stats: %w", err)
|
return fmt.Errorf("could not get IPVS stats: %w", err)
|
||||||
|
|
|
@ -19,14 +19,14 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
|
|
||||||
"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/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
|
@ -114,7 +114,7 @@ func TestIPVSCollector(t *testing.T) {
|
||||||
if _, err := kingpin.CommandLine.Parse(args); err != nil {
|
if _, err := kingpin.CommandLine.Parse(args); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
collector, err := newIPVSCollector(log.NewNopLogger())
|
collector, err := newIPVSCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if test.err == nil {
|
if test.err == nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -182,7 +182,7 @@ func TestIPVSCollectorResponse(t *testing.T) {
|
||||||
if _, err := kingpin.CommandLine.Parse(args); err != nil {
|
if _, err := kingpin.CommandLine.Parse(args); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
collector, err := NewIPVSCollector(log.NewNopLogger())
|
collector, err := NewIPVSCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,9 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ var (
|
||||||
|
|
||||||
type ksmdCollector struct {
|
type ksmdCollector struct {
|
||||||
metricDescs map[string]*prometheus.Desc
|
metricDescs map[string]*prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -50,7 +50,7 @@ func getCanonicalMetricName(filename string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKsmdCollector returns a new Collector exposing kernel/system statistics.
|
// NewKsmdCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewKsmdCollector(logger log.Logger) (Collector, error) {
|
func NewKsmdCollector(logger *slog.Logger) (Collector, error) {
|
||||||
subsystem := "ksmd"
|
subsystem := "ksmd"
|
||||||
descs := make(map[string]*prometheus.Desc)
|
descs := make(map[string]*prometheus.Desc)
|
||||||
|
|
||||||
|
|
|
@ -18,22 +18,22 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type lnstatCollector struct {
|
type lnstatCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("lnstat", defaultDisabled, NewLnstatCollector)
|
registerCollector("lnstat", defaultDisabled, NewLnstatCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLnstatCollector(logger log.Logger) (Collector, error) {
|
func NewLnstatCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &lnstatCollector{logger}, nil
|
return &lnstatCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,23 +11,22 @@
|
||||||
// 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 || freebsd || linux || netbsd || openbsd || solaris) && !noloadavg
|
//go:build (darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix) && !noloadavg
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
// +build darwin dragonfly freebsd linux netbsd openbsd solaris aix
|
||||||
// +build !noloadavg
|
// +build !noloadavg
|
||||||
|
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type loadavgCollector struct {
|
type loadavgCollector struct {
|
||||||
metric []typedDesc
|
metric []typedDesc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -35,7 +34,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLoadavgCollector returns a new Collector exposing load average stats.
|
// NewLoadavgCollector returns a new Collector exposing load average stats.
|
||||||
func NewLoadavgCollector(logger log.Logger) (Collector, error) {
|
func NewLoadavgCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &loadavgCollector{
|
return &loadavgCollector{
|
||||||
metric: []typedDesc{
|
metric: []typedDesc{
|
||||||
{prometheus.NewDesc(namespace+"_load1", "1m load average.", nil, nil), prometheus.GaugeValue},
|
{prometheus.NewDesc(namespace+"_load1", "1m load average.", nil, nil), prometheus.GaugeValue},
|
||||||
|
@ -52,7 +51,7 @@ func (c *loadavgCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
return fmt.Errorf("couldn't get load: %w", err)
|
return fmt.Errorf("couldn't get load: %w", err)
|
||||||
}
|
}
|
||||||
for i, load := range loads {
|
for i, load := range loads {
|
||||||
level.Debug(c.logger).Log("msg", "return load", "index", i, "load", load)
|
c.logger.Debug("return load", "index", i, "load", load)
|
||||||
ch <- c.metric[i].mustNewConstMetric(load)
|
ch <- c.metric[i].mustNewConstMetric(load)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
30
collector/loadavg_aix.go
Normal file
30
collector/loadavg_aix.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// 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 !noloadavg
|
||||||
|
// +build !noloadavg
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getLoad() ([]float64, error) {
|
||||||
|
stat, err := perfstat.CpuTotalStat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return []float64{float64(stat.LoadAvg1), float64(stat.LoadAvg5), float64(stat.LoadAvg15)}, nil
|
||||||
|
}
|
|
@ -18,10 +18,10 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
@ -46,7 +46,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
type logindCollector struct {
|
type logindCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type logindDbus struct {
|
type logindDbus struct {
|
||||||
|
@ -86,7 +86,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLogindCollector returns a new Collector exposing logind statistics.
|
// NewLogindCollector returns a new Collector exposing logind statistics.
|
||||||
func NewLogindCollector(logger log.Logger) (Collector, error) {
|
func NewLogindCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &logindCollector{logger}, nil
|
return &logindCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,16 +19,15 @@ package collector
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type mdadmCollector struct {
|
type mdadmCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -36,7 +35,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMdadmCollector returns a new Collector exposing raid statistics.
|
// NewMdadmCollector returns a new Collector exposing raid statistics.
|
||||||
func NewMdadmCollector(logger log.Logger) (Collector, error) {
|
func NewMdadmCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &mdadmCollector{logger}, nil
|
return &mdadmCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +111,7 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
level.Debug(c.logger).Log("msg", "Not collecting mdstat, file does not exist", "file", *procPath)
|
c.logger.Debug("Not collecting mdstat, file does not exist", "file", *procPath)
|
||||||
return ErrNoData
|
return ErrNoData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +119,7 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, mdStat := range mdStats {
|
for _, mdStat := range mdStats {
|
||||||
level.Debug(c.logger).Log("msg", "collecting metrics for device", "device", mdStat.Name)
|
c.logger.Debug("collecting metrics for device", "device", mdStat.Name)
|
||||||
|
|
||||||
stateVals := make(map[string]float64)
|
stateVals := make(map[string]float64)
|
||||||
stateVals[mdStat.ActivityState] = 1
|
stateVals[mdStat.ActivityState] = 1
|
||||||
|
|
|
@ -11,8 +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 || linux || openbsd || netbsd) && !nomeminfo
|
//go:build (darwin || linux || openbsd || netbsd || aix) && !nomeminfo
|
||||||
// +build darwin linux openbsd netbsd
|
// +build darwin linux openbsd netbsd aix
|
||||||
// +build !nomeminfo
|
// +build !nomeminfo
|
||||||
|
|
||||||
package collector
|
package collector
|
||||||
|
@ -21,7 +21,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ func (c *meminfoCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("couldn't get meminfo: %w", err)
|
return fmt.Errorf("couldn't get meminfo: %w", err)
|
||||||
}
|
}
|
||||||
level.Debug(c.logger).Log("msg", "Set node_mem", "memInfo", fmt.Sprintf("%v", memInfo))
|
c.logger.Debug("Set node_mem", "memInfo", fmt.Sprintf("%v", memInfo))
|
||||||
for k, v := range memInfo {
|
for k, v := range memInfo {
|
||||||
if strings.HasSuffix(k, "_total") {
|
if strings.HasSuffix(k, "_total") {
|
||||||
metricType = prometheus.CounterValue
|
metricType = prometheus.CounterValue
|
||||||
|
|
47
collector/meminfo_aix.go
Normal file
47
collector/meminfo_aix.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// 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 !nomeminfo
|
||||||
|
// +build !nomeminfo
|
||||||
|
|
||||||
|
package collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/power-devops/perfstat"
|
||||||
|
)
|
||||||
|
|
||||||
|
type meminfoCollector struct {
|
||||||
|
logger *slog.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
|
return &meminfoCollector{
|
||||||
|
logger: logger,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *meminfoCollector) getMemInfo() (map[string]float64, error) {
|
||||||
|
stats, err := perfstat.MemoryTotalStat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]float64{
|
||||||
|
"total_bytes": float64(stats.RealTotal * 4096),
|
||||||
|
"free_bytes": float64(stats.RealFree * 4096),
|
||||||
|
"available_bytes": float64(stats.RealAvailable * 4096),
|
||||||
|
}, nil
|
||||||
|
}
|
|
@ -24,18 +24,18 @@ import "C"
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
type meminfoCollector struct {
|
type meminfoCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &meminfoCollector{
|
return &meminfoCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -18,18 +18,18 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type meminfoCollector struct {
|
type meminfoCollector struct {
|
||||||
fs procfs.FS
|
fs procfs.FS
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, 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)
|
||||||
|
|
|
@ -17,15 +17,14 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMemInfo(t *testing.T) {
|
func TestMemInfo(t *testing.T) {
|
||||||
*procPath = "fixtures/proc"
|
*procPath = "fixtures/proc"
|
||||||
logger := log.NewLogfmtLogger(os.Stderr)
|
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
|
||||||
|
|
||||||
collector, err := NewMeminfoCollector(logger)
|
collector, err := NewMeminfoCollector(logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -17,16 +17,16 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kit/log"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
"log/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type meminfoCollector struct {
|
type meminfoCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &meminfoCollector{
|
return &meminfoCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -20,13 +20,13 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ type meminfoMetric struct {
|
||||||
|
|
||||||
type meminfoNumaCollector struct {
|
type meminfoNumaCollector struct {
|
||||||
metricDescs map[string]*prometheus.Desc
|
metricDescs map[string]*prometheus.Desc
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -53,7 +53,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoNumaCollector returns a new Collector exposing memory stats.
|
// NewMeminfoNumaCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoNumaCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoNumaCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &meminfoNumaCollector{
|
return &meminfoNumaCollector{
|
||||||
metricDescs: map[string]*prometheus.Desc{},
|
metricDescs: map[string]*prometheus.Desc{},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -18,8 +18,7 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"github.com/go-kit/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -56,11 +55,11 @@ sysctl_bcstats(struct bcachestats *bcstats)
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
type meminfoCollector struct {
|
type meminfoCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &meminfoCollector{
|
return &meminfoCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,11 +51,11 @@ type bcachestats struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type meminfoCollector struct {
|
type meminfoCollector struct {
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
// NewMeminfoCollector returns a new Collector exposing memory stats.
|
||||||
func NewMeminfoCollector(logger log.Logger) (Collector, error) {
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
|
||||||
return &meminfoCollector{
|
return &meminfoCollector{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -19,8 +19,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
@ -33,7 +33,7 @@ type memoryCollector struct {
|
||||||
pageSize uint64
|
pageSize uint64
|
||||||
sysctls []bsdSysctl
|
sysctls []bsdSysctl
|
||||||
kvm kvm
|
kvm kvm
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -41,7 +41,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMemoryCollector returns a new Collector exposing memory stats.
|
// NewMemoryCollector returns a new Collector exposing memory stats.
|
||||||
func NewMemoryCollector(logger log.Logger) (Collector, error) {
|
func NewMemoryCollector(logger *slog.Logger) (Collector, error) {
|
||||||
tmp32, err := unix.SysctlUint32("vm.stats.vm.v_page_size")
|
tmp32, err := unix.SysctlUint32("vm.stats.vm.v_page_size")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("sysctl(vm.stats.vm.v_page_size) failed: %w", err)
|
return nil, fmt.Errorf("sysctl(vm.stats.vm.v_page_size) failed: %w", err)
|
||||||
|
|
|
@ -18,9 +18,8 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
|
||||||
"github.com/go-kit/log/level"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
@ -96,7 +95,7 @@ type mountStatsCollector struct {
|
||||||
|
|
||||||
proc procfs.Proc
|
proc procfs.Proc
|
||||||
|
|
||||||
logger log.Logger
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// used to uniquely identify an NFS mount to prevent duplicates
|
// used to uniquely identify an NFS mount to prevent duplicates
|
||||||
|
@ -111,7 +110,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMountStatsCollector returns a new Collector exposing NFS statistics.
|
// NewMountStatsCollector returns a new Collector exposing NFS statistics.
|
||||||
func NewMountStatsCollector(logger log.Logger) (Collector, error) {
|
func NewMountStatsCollector(logger *slog.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, 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)
|
||||||
|
@ -542,7 +541,7 @@ func (c *mountStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
deviceIdentifier := nfsDeviceIdentifier{m.Device, stats.Transport[k].Protocol, mountAddress}
|
deviceIdentifier := nfsDeviceIdentifier{m.Device, stats.Transport[k].Protocol, mountAddress}
|
||||||
i := deviceList[deviceIdentifier]
|
i := deviceList[deviceIdentifier]
|
||||||
if i {
|
if i {
|
||||||
level.Debug(c.logger).Log("msg", "Skipping duplicate device entry", "device", deviceIdentifier)
|
c.logger.Debug("Skipping duplicate device entry", "device", deviceIdentifier)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
deviceList[deviceIdentifier] = true
|
deviceList[deviceIdentifier] = true
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue