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

|
||||

|
||||
[][quay]
|
||||
[][hub]
|
||||
[][goreportcard]
|
||||
|
@ -99,8 +100,8 @@ cpu | flags | --collector.cpu.info.flags-include | N/A
|
|||
diskstats | device | --collector.diskstats.device-include | --collector.diskstats.device-exclude
|
||||
ethtool | device | --collector.ethtool.device-include | --collector.ethtool.device-exclude
|
||||
ethtool | metrics | --collector.ethtool.metrics-include | N/A
|
||||
filesystem | fs-types | N/A | --collector.filesystem.fs-types-exclude
|
||||
filesystem | mount-points | N/A | --collector.filesystem.mount-points-exclude
|
||||
filesystem | fs-types | --collector.filesystem.fs-types-include | --collector.filesystem.fs-types-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 | sensor | --collector.hwmon.sensor-include | --collector.hwmon.sensor-exclude
|
||||
interrupts | name | --collector.interrupts.name-include | --collector.interrupts.name-exclude
|
||||
|
|
|
@ -17,13 +17,11 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/jsimonetti/rtnetlink/v2"
|
||||
"github.com/jsimonetti/rtnetlink/v2/rtnl"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs"
|
||||
"golang.org/x/sys/unix"
|
||||
|
@ -76,44 +74,30 @@ func getTotalArpEntries(deviceEntries []procfs.ARPEntry) map[string]uint32 {
|
|||
}
|
||||
|
||||
func getTotalArpEntriesRTNL() (map[string]uint32, error) {
|
||||
conn, err := rtnetlink.Dial(nil)
|
||||
conn, err := rtnl.Dial(nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
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 {
|
||||
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 {
|
||||
// Neighbors will also contain IPv6 neighbors, but since this is purely an ARP collector,
|
||||
// restrict to AF_INET. Also skip entries which have state NUD_NOARP to conform to output
|
||||
// of /proc/net/arp.
|
||||
if n.Family == unix.AF_INET && n.State&unix.NUD_NOARP == 0 {
|
||||
ifIndexEntries[n.Index]++
|
||||
// Skip entries which have state NUD_NOARP to conform to output of /proc/net/arp.
|
||||
if n.State&unix.NUD_NOARP == 0 {
|
||||
entries[n.Interface.Name]++
|
||||
}
|
||||
}
|
||||
|
||||
enumEntries := make(map[string]uint32)
|
||||
|
||||
// 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
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
func (c *arpCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
|
|
|
@ -30,22 +30,50 @@ import (
|
|||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
var (
|
||||
nodeCPUPhysicalSecondsDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "physical_seconds_total"),
|
||||
"Seconds the physical CPUs spent in each mode.",
|
||||
[]string{"cpu", "mode"}, nil,
|
||||
)
|
||||
nodeCPUSRunQueueDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "runqueue"),
|
||||
"Length of the run queue.", []string{"cpu"}, nil,
|
||||
)
|
||||
nodeCPUFlagsDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "flags"),
|
||||
"CPU flags.",
|
||||
[]string{"cpu", "flag"}, nil,
|
||||
)
|
||||
nodeCPUContextSwitchDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "context_switches_total"),
|
||||
"Number of context switches.",
|
||||
[]string{"cpu"}, nil,
|
||||
)
|
||||
)
|
||||
|
||||
type cpuCollector struct {
|
||||
cpu typedDesc
|
||||
logger *slog.Logger
|
||||
tickPerSecond int64
|
||||
cpu typedDesc
|
||||
cpuPhysical typedDesc
|
||||
cpuRunQueue typedDesc
|
||||
cpuFlags typedDesc
|
||||
cpuContextSwitch typedDesc
|
||||
|
||||
logger *slog.Logger
|
||||
tickPerSecond float64
|
||||
purrTicksPerSecond float64
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerCollector("cpu", defaultEnabled, NewCpuCollector)
|
||||
}
|
||||
|
||||
func tickPerSecond() (int64, error) {
|
||||
func tickPerSecond() (float64, 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
|
||||
return float64(ticks), nil
|
||||
}
|
||||
|
||||
func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
||||
|
@ -53,10 +81,22 @@ func NewCpuCollector(logger *slog.Logger) (Collector, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pconfig, err := perfstat.PartitionStat()
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &cpuCollector{
|
||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||
logger: logger,
|
||||
tickPerSecond: ticks,
|
||||
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
|
||||
cpuPhysical: typedDesc{nodeCPUPhysicalSecondsDesc, prometheus.CounterValue},
|
||||
cpuRunQueue: typedDesc{nodeCPUSRunQueueDesc, prometheus.GaugeValue},
|
||||
cpuFlags: typedDesc{nodeCPUFlagsDesc, prometheus.GaugeValue},
|
||||
cpuContextSwitch: typedDesc{nodeCPUContextSwitchDesc, prometheus.CounterValue},
|
||||
logger: logger,
|
||||
tickPerSecond: ticks,
|
||||
purrTicksPerSecond: float64(pconfig.ProcessorMhz * 1e6),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
@ -67,10 +107,26 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
}
|
||||
|
||||
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")
|
||||
// LPAR metrics
|
||||
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")
|
||||
|
||||
// Physical CPU metrics
|
||||
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PIdle)/c.purrTicksPerSecond, strconv.Itoa(n), "pidle")
|
||||
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PUser)/c.purrTicksPerSecond, strconv.Itoa(n), "puser")
|
||||
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PSys)/c.purrTicksPerSecond, strconv.Itoa(n), "psys")
|
||||
ch <- c.cpuPhysical.mustNewConstMetric(float64(stat.PWait)/c.purrTicksPerSecond, strconv.Itoa(n), "pwait")
|
||||
|
||||
// Run queue length
|
||||
ch <- c.cpuRunQueue.mustNewConstMetric(float64(stat.RunQueue), strconv.Itoa(n))
|
||||
|
||||
// Flags
|
||||
ch <- c.cpuFlags.mustNewConstMetric(float64(stat.SpurrFlag), strconv.Itoa(n), "spurr")
|
||||
|
||||
// Context switches
|
||||
ch <- c.cpuContextSwitch.mustNewConstMetric(float64(stat.CSwitches), strconv.Itoa(n))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
|
@ -26,15 +27,17 @@ import (
|
|||
"strconv"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/exp/maps"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs"
|
||||
"github.com/prometheus/procfs/sysfs"
|
||||
"golang.org/x/exp/maps"
|
||||
)
|
||||
|
||||
type cpuCollector struct {
|
||||
fs procfs.FS
|
||||
procfs procfs.FS
|
||||
sysfs sysfs.FS
|
||||
cpu *prometheus.Desc
|
||||
cpuInfo *prometheus.Desc
|
||||
cpuFrequencyHz *prometheus.Desc
|
||||
|
@ -45,6 +48,7 @@ type cpuCollector struct {
|
|||
cpuPackageThrottle *prometheus.Desc
|
||||
cpuIsolated *prometheus.Desc
|
||||
logger *slog.Logger
|
||||
cpuOnline *prometheus.Desc
|
||||
cpuStats map[int64]procfs.CPUStat
|
||||
cpuStatsMutex sync.Mutex
|
||||
isolatedCpus []uint16
|
||||
|
@ -70,17 +74,17 @@ func init() {
|
|||
|
||||
// NewCPUCollector returns a new Collector exposing kernel/system statistics.
|
||||
func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
||||
fs, err := procfs.NewFS(*procPath)
|
||||
pfs, err := procfs.NewFS(*procPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||
}
|
||||
|
||||
sysfs, err := sysfs.NewFS(*sysPath)
|
||||
sfs, err := sysfs.NewFS(*sysPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
||||
}
|
||||
|
||||
isolcpus, err := sysfs.IsolatedCPUs()
|
||||
isolcpus, err := sfs.IsolatedCPUs()
|
||||
if err != nil {
|
||||
if !os.IsNotExist(err) {
|
||||
return nil, fmt.Errorf("Unable to get isolated cpus: %w", err)
|
||||
|
@ -89,8 +93,9 @@ func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
|||
}
|
||||
|
||||
c := &cpuCollector{
|
||||
fs: fs,
|
||||
cpu: nodeCPUSecondsDesc,
|
||||
procfs: pfs,
|
||||
sysfs: sfs,
|
||||
cpu: nodeCPUSecondsDesc,
|
||||
cpuInfo: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "info"),
|
||||
"CPU information from /proc/cpuinfo.",
|
||||
|
@ -131,6 +136,11 @@ func NewCPUCollector(logger *slog.Logger) (Collector, error) {
|
|||
"Whether each core is isolated, information from /sys/devices/system/cpu/isolated.",
|
||||
[]string{"cpu"}, nil,
|
||||
),
|
||||
cpuOnline: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuCollectorSubsystem, "online"),
|
||||
"CPUs that are online and being scheduled.",
|
||||
[]string{"cpu"}, nil,
|
||||
),
|
||||
logger: logger,
|
||||
isolatedCpus: isolcpus,
|
||||
cpuStats: make(map[int64]procfs.CPUStat),
|
||||
|
@ -177,12 +187,21 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
if c.isolatedCpus != nil {
|
||||
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
|
||||
func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error {
|
||||
info, err := c.fs.CPUInfo()
|
||||
info, err := c.procfs.CPUInfo()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -333,9 +352,31 @@ func (c *cpuCollector) updateIsolated(ch chan<- prometheus.Metric) {
|
|||
}
|
||||
}
|
||||
|
||||
// updateOnline reads /sys/devices/system/cpu/cpu*/online through sysfs and exports online status metrics.
|
||||
func (c *cpuCollector) updateOnline(ch chan<- prometheus.Metric) error {
|
||||
cpus, err := c.sysfs.CPUs()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// No-op if the system does not support CPU online stats.
|
||||
cpu0 := cpus[0]
|
||||
if _, err := cpu0.Online(); err != nil && errors.Is(err, os.ErrNotExist) {
|
||||
return nil
|
||||
}
|
||||
for _, cpu := range cpus {
|
||||
setOnline := float64(0)
|
||||
if online, _ := cpu.Online(); online {
|
||||
setOnline = 1
|
||||
}
|
||||
ch <- prometheus.MustNewConstMetric(c.cpuOnline, prometheus.GaugeValue, setOnline, cpu.Number())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// updateStat reads /proc/stat through procfs and exports CPU-related metrics.
|
||||
func (c *cpuCollector) updateStat(ch chan<- prometheus.Metric) error {
|
||||
stats, err := c.fs.Stat()
|
||||
stats, err := c.procfs.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -32,6 +32,15 @@ import (
|
|||
"howett.net/plist"
|
||||
)
|
||||
|
||||
const (
|
||||
_IOC_OUT = uint(0x40000000)
|
||||
_IOC_IN = uint(0x80000000)
|
||||
_IOC_INOUT = (_IOC_IN | _IOC_OUT)
|
||||
_IOCPARM_MASK = uint(0x1fff)
|
||||
_IOCPARM_SHIFT = uint(16)
|
||||
_IOCGROUP_SHIFT = uint(8)
|
||||
)
|
||||
|
||||
type clockinfo struct {
|
||||
hz int32 // clock frequency
|
||||
tick int32 // micro-seconds per hz tick
|
||||
|
@ -50,7 +59,7 @@ type cputime struct {
|
|||
|
||||
type plistref struct {
|
||||
pref_plist unsafe.Pointer
|
||||
pref_len uint64
|
||||
pref_len uint
|
||||
}
|
||||
|
||||
type sysmonValues struct {
|
||||
|
@ -64,25 +73,19 @@ type sysmonProperty []sysmonValues
|
|||
|
||||
type sysmonProperties map[string]sysmonProperty
|
||||
|
||||
func readBytes(ptr unsafe.Pointer, length uint64) []byte {
|
||||
buf := make([]byte, length-1)
|
||||
var i uint64
|
||||
for ; i < length-1; i++ {
|
||||
buf[i] = *(*byte)(unsafe.Pointer(uintptr(ptr) + uintptr(i)))
|
||||
}
|
||||
return buf
|
||||
func _IOC(inout uint, group byte, num uint, len uintptr) uint {
|
||||
return ((inout) | ((uint(len) & _IOCPARM_MASK) << _IOCPARM_SHIFT) | (uint(group) << _IOCGROUP_SHIFT) | (num))
|
||||
}
|
||||
|
||||
func ioctl(fd int, nr int64, typ byte, size uintptr, retptr unsafe.Pointer) error {
|
||||
func _IOWR(group byte, num uint, len uintptr) uint {
|
||||
return _IOC(_IOC_INOUT, group, num, len)
|
||||
}
|
||||
|
||||
func ioctl(fd int, nr uint, typ byte, size uintptr, retptr unsafe.Pointer) error {
|
||||
_, _, errno := unix.Syscall(
|
||||
unix.SYS_IOCTL,
|
||||
uintptr(fd),
|
||||
// Some magicks derived from sys/ioccom.h.
|
||||
uintptr((0x40000000|0x80000000)|
|
||||
((int64(size)&(1<<13-1))<<16)|
|
||||
(int64(typ)<<8)|
|
||||
nr,
|
||||
),
|
||||
uintptr(_IOWR(typ, nr, size)),
|
||||
uintptr(retptr),
|
||||
)
|
||||
if errno != 0 {
|
||||
|
@ -92,7 +95,7 @@ func ioctl(fd int, nr int64, typ byte, size uintptr, retptr unsafe.Pointer) erro
|
|||
}
|
||||
|
||||
func readSysmonProperties() (sysmonProperties, error) {
|
||||
fd, err := unix.Open(rootfsFilePath("/dev/sysmon"), unix.O_RDONLY, 0777)
|
||||
fd, err := unix.Open(rootfsFilePath("/dev/sysmon"), unix.O_RDONLY, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -103,8 +106,8 @@ func readSysmonProperties() (sysmonProperties, error) {
|
|||
if err = ioctl(fd, 0, 'E', unsafe.Sizeof(retptr), unsafe.Pointer(&retptr)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
bytes := readBytes(retptr.pref_plist, retptr.pref_len)
|
||||
defer unix.Syscall(unix.SYS_MUNMAP, uintptr(retptr.pref_plist), uintptr(retptr.pref_len), uintptr(0))
|
||||
bytes := unsafe.Slice((*byte)(unsafe.Pointer(retptr.pref_plist)), retptr.pref_len-1)
|
||||
|
||||
var props sysmonProperties
|
||||
if _, err = plist.Unmarshal(bytes, &props); err != nil {
|
||||
|
@ -179,7 +182,7 @@ func getCPUTimes() ([]cputime, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ncpus := *(*int)(unsafe.Pointer(&ncpusb[0]))
|
||||
ncpus := int(*(*uint32)(unsafe.Pointer(&ncpusb[0])))
|
||||
|
||||
if ncpus < 1 {
|
||||
return nil, errors.New("Invalid cpu number")
|
||||
|
@ -191,10 +194,10 @@ func getCPUTimes() ([]cputime, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for len(cpb) >= int(unsafe.Sizeof(int(0))) {
|
||||
t := *(*int)(unsafe.Pointer(&cpb[0]))
|
||||
for len(cpb) >= int(unsafe.Sizeof(uint64(0))) {
|
||||
t := *(*uint64)(unsafe.Pointer(&cpb[0]))
|
||||
times = append(times, float64(t)/cpufreq)
|
||||
cpb = cpb[unsafe.Sizeof(int(0)):]
|
||||
cpb = cpb[unsafe.Sizeof(uint64(0)):]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,12 +22,12 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
cpuVulerabilitiesCollector = "cpu_vulnerabilities"
|
||||
cpuVulnerabilitiesCollectorSubsystem = "cpu_vulnerabilities"
|
||||
)
|
||||
|
||||
var (
|
||||
vulnerabilityDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, cpuVulerabilitiesCollector, "info"),
|
||||
prometheus.BuildFQName(namespace, cpuVulnerabilitiesCollectorSubsystem, "info"),
|
||||
"Details of each CPU vulnerability reported by sysfs. The value of the series is an int encoded state of the vulnerability. The same state is stored as a string in the label",
|
||||
[]string{"codename", "state", "mitigation"},
|
||||
nil,
|
||||
|
@ -37,7 +37,7 @@ var (
|
|||
type cpuVulnerabilitiesCollector struct{}
|
||||
|
||||
func init() {
|
||||
registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector)
|
||||
registerCollector(cpuVulnerabilitiesCollectorSubsystem, defaultDisabled, NewVulnerabilitySysfsCollector)
|
||||
}
|
||||
|
||||
func NewVulnerabilitySysfsCollector(logger *slog.Logger) (Collector, error) {
|
||||
|
|
|
@ -18,10 +18,11 @@ package collector
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs/sysfs"
|
||||
"log/slog"
|
||||
"strings"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs/sysfs"
|
||||
)
|
||||
|
||||
type cpuFreqCollector struct {
|
||||
|
|
|
@ -30,11 +30,19 @@ type diskstatsCollector struct {
|
|||
rbytes typedDesc
|
||||
wbytes typedDesc
|
||||
time typedDesc
|
||||
bsize typedDesc
|
||||
qdepth typedDesc
|
||||
|
||||
rserv typedDesc
|
||||
wserv typedDesc
|
||||
|
||||
xfers typedDesc
|
||||
xrate typedDesc
|
||||
|
||||
deviceFilter deviceFilter
|
||||
logger *slog.Logger
|
||||
|
||||
tickPerSecond int64
|
||||
tickPerSecond float64
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
@ -57,6 +65,54 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
|||
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
|
||||
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
|
||||
|
||||
bsize: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "block_size_bytes"),
|
||||
"Size of the block device in bytes.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.GaugeValue,
|
||||
},
|
||||
qdepth: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "queue_depth"),
|
||||
"Number of requests in the queue.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.GaugeValue,
|
||||
},
|
||||
rserv: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "read_time_seconds_total"),
|
||||
"The total time spent servicing read requests.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.CounterValue,
|
||||
},
|
||||
wserv: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "write_time_seconds_total"),
|
||||
"The total time spent servicing write requests.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.CounterValue,
|
||||
},
|
||||
xfers: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "transfers_total"),
|
||||
"The total number of transfers to/from disk.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.CounterValue,
|
||||
},
|
||||
xrate: typedDesc{
|
||||
prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, diskSubsystem, "transfers_to_disk_total"),
|
||||
"The total number of transfers from disk.",
|
||||
diskLabelNames, nil,
|
||||
),
|
||||
prometheus.CounterValue,
|
||||
},
|
||||
deviceFilter: deviceFilter,
|
||||
logger: logger,
|
||||
|
||||
|
@ -76,7 +132,14 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
}
|
||||
ch <- c.rbytes.mustNewConstMetric(float64(stat.Rblks*512), stat.Name)
|
||||
ch <- c.wbytes.mustNewConstMetric(float64(stat.Wblks*512), stat.Name)
|
||||
ch <- c.time.mustNewConstMetric(float64(stat.Time/c.tickPerSecond), stat.Name)
|
||||
ch <- c.time.mustNewConstMetric(float64(stat.Time)/float64(c.tickPerSecond), stat.Name)
|
||||
|
||||
ch <- c.bsize.mustNewConstMetric(float64(stat.BSize), stat.Name)
|
||||
ch <- c.qdepth.mustNewConstMetric(float64(stat.QDepth), stat.Name)
|
||||
ch <- c.rserv.mustNewConstMetric(float64(stat.Rserv)/1e9, stat.Name)
|
||||
ch <- c.wserv.mustNewConstMetric(float64(stat.Wserv)/1e9, stat.Name)
|
||||
ch <- c.xfers.mustNewConstMetric(float64(stat.Xfers), stat.Name)
|
||||
ch <- c.xrate.mustNewConstMetric(float64(stat.XRate), stat.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
|
|||
infoDesc: typedFactorDesc{
|
||||
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"),
|
||||
"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,
|
||||
), valueType: prometheus.GaugeValue,
|
||||
},
|
||||
|
@ -294,6 +294,12 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
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,
|
||||
fmt.Sprint(stats.MajorNumber),
|
||||
fmt.Sprint(stats.MinorNumber),
|
||||
|
@ -302,6 +308,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
info[udevIDModel],
|
||||
serial,
|
||||
info[udevIDRevision],
|
||||
strconv.FormatUint(queueStats.Rotational, 2),
|
||||
)
|
||||
|
||||
statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName
|
||||
|
@ -391,15 +398,9 @@ func getUdevDeviceProperties(major, minor uint32) (udevInfo, error) {
|
|||
|
||||
line = strings.TrimPrefix(line, udevDevicePropertyPrefix)
|
||||
|
||||
/* TODO: After we drop support for Go 1.17, the condition below can be simplified to:
|
||||
|
||||
if name, value, found := strings.Cut(line, "="); found {
|
||||
info[name] = value
|
||||
}
|
||||
*/
|
||||
if fields := strings.SplitN(line, "=", 2); len(fields) == 2 {
|
||||
info[fields[0]] = fields[1]
|
||||
}
|
||||
}
|
||||
|
||||
return info, nil
|
||||
|
|
|
@ -113,21 +113,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
|||
node_disk_flush_requests_total{device="sdc"} 1555
|
||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||
# 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-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",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="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",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="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="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="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="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="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="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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",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",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",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",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",rotational="0",serial="AAAABBBBCCCC1",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.
|
||||
# TYPE node_disk_io_now gauge
|
||||
node_disk_io_now{device="dm-0"} 0
|
||||
|
|
|
@ -372,7 +372,7 @@ func (c *ethtoolCollector) updateSpeeds(ch chan<- prometheus.Metric, prefix stri
|
|||
}
|
||||
|
||||
func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
netClass, err := c.fs.NetClass()
|
||||
netClass, err := c.fs.NetClassDevices()
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) {
|
||||
c.logger.Debug("Could not read netclass file", "err", err)
|
||||
|
@ -385,7 +385,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
return fmt.Errorf("no network devices found")
|
||||
}
|
||||
|
||||
for device := range netClass {
|
||||
for _, device := range netClass {
|
||||
var stats map[string]uint64
|
||||
var err error
|
||||
|
||||
|
@ -446,13 +446,14 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
}
|
||||
}
|
||||
|
||||
if stats == nil || len(stats) < 1 {
|
||||
if len(stats) == 0 {
|
||||
// No stats returned; device does not support ethtool stats.
|
||||
continue
|
||||
}
|
||||
|
||||
// Sanitizing the metric names can lead to duplicate metric names. Therefore check for clashes beforehand.
|
||||
metricFQNames := make(map[string]string)
|
||||
renamedStats := make(map[string]uint64, len(stats))
|
||||
for metric := range stats {
|
||||
metricName := SanitizeMetricName(metric)
|
||||
if !c.metricsPattern.MatchString(metricName) {
|
||||
|
@ -467,6 +468,8 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
metricFQNames[metricFQName] = ""
|
||||
} else {
|
||||
metricFQNames[metricFQName] = metricName
|
||||
// Later we'll go look for the stat with the "sanitized" metric name, so we can copy it there already
|
||||
renamedStats[metricName] = stats[metric]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -484,7 +487,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
continue
|
||||
}
|
||||
|
||||
val := stats[metric]
|
||||
val := renamedStats[metric]
|
||||
|
||||
// Check to see if this metric exists; if not then create it and store it in c.entries.
|
||||
entry := c.entryWithCreate(metric, metricFQName)
|
||||
|
|
|
@ -269,6 +269,7 @@ func NewEthtoolTestCollector(logger *slog.Logger) (Collector, error) {
|
|||
|
||||
func TestBuildEthtoolFQName(t *testing.T) {
|
||||
testcases := map[string]string{
|
||||
"port.rx_errors": "node_ethtool_port_received_errors",
|
||||
"rx_errors": "node_ethtool_received_errors",
|
||||
"Queue[0] AllocFails": "node_ethtool_queue_0_allocfails",
|
||||
"Tx LPI entry count": "node_ethtool_transmitted_lpi_entry_count",
|
||||
|
@ -292,6 +293,9 @@ node_ethtool_align_errors{device="eth0"} 0
|
|||
# HELP node_ethtool_info A metric with a constant '1' value labeled by bus_info, device, driver, expansion_rom_version, firmware_version, version.
|
||||
# TYPE node_ethtool_info gauge
|
||||
node_ethtool_info{bus_info="0000:00:1f.6",device="eth0",driver="e1000e",expansion_rom_version="",firmware_version="0.5-4",version="5.11.0-22-generic"} 1
|
||||
# HELP node_ethtool_port_received_dropped Network interface port_rx_dropped
|
||||
# TYPE node_ethtool_port_received_dropped untyped
|
||||
node_ethtool_port_received_dropped{device="eth0"} 12028
|
||||
# HELP node_ethtool_received_broadcast Network interface rx_broadcast
|
||||
# TYPE node_ethtool_received_broadcast untyped
|
||||
node_ethtool_received_broadcast{device="eth0"} 5792
|
||||
|
|
|
@ -32,12 +32,12 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
|||
return nil, err
|
||||
}
|
||||
for _, stat := range fsStat {
|
||||
if c.excludedMountPointsPattern.MatchString(stat.MountPoint) {
|
||||
if c.mountPointFilter.ignored(stat.MountPoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", stat.MountPoint)
|
||||
continue
|
||||
}
|
||||
fstype := stat.TypeString()
|
||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
@ -53,9 +53,9 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
|||
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.
|
||||
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,
|
||||
|
|
|
@ -11,9 +11,8 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build (darwin || dragonfly) && !nofilesystem
|
||||
// +build darwin dragonfly
|
||||
// +build !nofilesystem
|
||||
//go:build dragonfly && !nofilesystem
|
||||
// +build dragonfly,!nofilesystem
|
||||
|
||||
package collector
|
||||
|
||||
|
@ -48,14 +47,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
|||
stats = []filesystemStats{}
|
||||
for i := 0; i < int(count); i++ {
|
||||
mountpoint := C.GoString(&mnt[i].f_mntonname[0])
|
||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
||||
if c.mountPointFilter.ignored(mountpoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||
continue
|
||||
}
|
||||
|
||||
device := C.GoString(&mnt[i].f_mntfromname[0])
|
||||
fstype := C.GoString(&mnt[i].f_fstypename[0])
|
||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -19,8 +19,8 @@ package collector
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"regexp"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
@ -36,7 +36,7 @@ var (
|
|||
mountPointsExcludeSet bool
|
||||
mountPointsExclude = kingpin.Flag(
|
||||
"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 {
|
||||
mountPointsExcludeSet = true
|
||||
return nil
|
||||
|
@ -45,11 +45,15 @@ var (
|
|||
"collector.filesystem.ignored-mount-points",
|
||||
"Regexp of mount points to ignore for filesystem collector.",
|
||||
).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
|
||||
fsTypesExclude = kingpin.Flag(
|
||||
"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 {
|
||||
fsTypesExcludeSet = true
|
||||
return nil
|
||||
|
@ -58,15 +62,20 @@ var (
|
|||
"collector.filesystem.ignored-fs-types",
|
||||
"Regexp of filesystem types to ignore for filesystem collector.",
|
||||
).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"}
|
||||
)
|
||||
|
||||
type filesystemCollector struct {
|
||||
excludedMountPointsPattern *regexp.Regexp
|
||||
excludedFSTypesPattern *regexp.Regexp
|
||||
mountPointFilter deviceFilter
|
||||
fsTypeFilter deviceFilter
|
||||
sizeDesc, freeDesc, availDesc *prometheus.Desc
|
||||
filesDesc, filesFreeDesc *prometheus.Desc
|
||||
purgeableDesc *prometheus.Desc
|
||||
roDesc, deviceErrorDesc *prometheus.Desc
|
||||
mountInfoDesc *prometheus.Desc
|
||||
logger *slog.Logger
|
||||
|
@ -80,6 +89,7 @@ type filesystemStats struct {
|
|||
labels filesystemLabels
|
||||
size, free, avail float64
|
||||
files, filesFree float64
|
||||
purgeable float64
|
||||
ro, deviceError float64
|
||||
}
|
||||
|
||||
|
@ -89,29 +99,7 @@ func init() {
|
|||
|
||||
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
|
||||
func NewFilesystemCollector(logger *slog.Logger) (Collector, 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 nil, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive")
|
||||
}
|
||||
}
|
||||
|
||||
if *oldFSTypesExcluded != "" {
|
||||
if !fsTypesExcludeSet {
|
||||
logger.Warn("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude")
|
||||
*fsTypesExclude = *oldFSTypesExcluded
|
||||
} else {
|
||||
return nil, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive")
|
||||
}
|
||||
}
|
||||
|
||||
subsystem := "filesystem"
|
||||
logger.Info("Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
|
||||
mountPointPattern := regexp.MustCompile(*mountPointsExclude)
|
||||
logger.Info("Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude)
|
||||
filesystemsTypesPattern := regexp.MustCompile(*fsTypesExclude)
|
||||
const subsystem = "filesystem"
|
||||
|
||||
sizeDesc := prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, subsystem, "size_bytes"),
|
||||
|
@ -143,6 +131,12 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
|||
filesystemLabelNames, nil,
|
||||
)
|
||||
|
||||
purgeableDesc := prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, subsystem, "purgeable_bytes"),
|
||||
"Filesystem space available including purgeable space (MacOS specific).",
|
||||
filesystemLabelNames, nil,
|
||||
)
|
||||
|
||||
roDesc := prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, subsystem, "readonly"),
|
||||
"Filesystem read-only status.",
|
||||
|
@ -162,18 +156,29 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
|
|||
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{
|
||||
excludedMountPointsPattern: mountPointPattern,
|
||||
excludedFSTypesPattern: filesystemsTypesPattern,
|
||||
sizeDesc: sizeDesc,
|
||||
freeDesc: freeDesc,
|
||||
availDesc: availDesc,
|
||||
filesDesc: filesDesc,
|
||||
filesFreeDesc: filesFreeDesc,
|
||||
roDesc: roDesc,
|
||||
deviceErrorDesc: deviceErrorDesc,
|
||||
mountInfoDesc: mountInfoDesc,
|
||||
logger: logger,
|
||||
mountPointFilter: mountPointFilter,
|
||||
fsTypeFilter: fsTypeFilter,
|
||||
sizeDesc: sizeDesc,
|
||||
freeDesc: freeDesc,
|
||||
availDesc: availDesc,
|
||||
filesDesc: filesDesc,
|
||||
filesFreeDesc: filesFreeDesc,
|
||||
purgeableDesc: purgeableDesc,
|
||||
roDesc: roDesc,
|
||||
deviceErrorDesc: deviceErrorDesc,
|
||||
mountInfoDesc: mountInfoDesc,
|
||||
logger: logger,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
@ -227,6 +232,70 @@ func (c *filesystemCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
c.mountInfoDesc, prometheus.GaugeValue,
|
||||
1.0, s.labels.device, s.labels.major, s.labels.minor, s.labels.mountPoint,
|
||||
)
|
||||
if s.purgeable >= 0 {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.purgeableDesc, prometheus.GaugeValue,
|
||||
s.purgeable, s.labels.device, s.labels.mountPoint, s.labels.fsType, s.labels.deviceError,
|
||||
)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func newMountPointsFilter(logger *slog.Logger) (deviceFilter, error) {
|
||||
if *oldMountPointsExcluded != "" {
|
||||
if !mountPointsExcludeSet {
|
||||
logger.Warn("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude")
|
||||
*mountPointsExclude = *oldMountPointsExcluded
|
||||
} else {
|
||||
return deviceFilter{}, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive")
|
||||
}
|
||||
}
|
||||
|
||||
if *mountPointsInclude != "" && !mountPointsExcludeSet {
|
||||
logger.Debug("mount-points-exclude flag not set when mount-points-include flag is set, assuming include is desired")
|
||||
*mountPointsExclude = ""
|
||||
}
|
||||
|
||||
if *mountPointsExclude != "" && *mountPointsInclude != "" {
|
||||
return deviceFilter{}, errors.New("--collector.filesystem.mount-points-exclude and --collector.filesystem.mount-points-include are mutually exclusive")
|
||||
}
|
||||
|
||||
if *mountPointsExclude != "" {
|
||||
logger.Info("Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
|
||||
}
|
||||
if *mountPointsInclude != "" {
|
||||
logger.Info("Parsed flag --collector.filesystem.mount-points-include", "flag", *mountPointsInclude)
|
||||
}
|
||||
|
||||
return newDeviceFilter(*mountPointsExclude, *mountPointsInclude), nil
|
||||
}
|
||||
|
||||
func newFSTypeFilter(logger *slog.Logger) (deviceFilter, error) {
|
||||
if *oldFSTypesExcluded != "" {
|
||||
if !fsTypesExcludeSet {
|
||||
logger.Warn("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude")
|
||||
*fsTypesExclude = *oldFSTypesExcluded
|
||||
} else {
|
||||
return deviceFilter{}, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive")
|
||||
}
|
||||
}
|
||||
|
||||
if *fsTypesInclude != "" && !fsTypesExcludeSet {
|
||||
logger.Debug("fs-types-exclude flag not set when fs-types-include flag is set, assuming include is desired")
|
||||
*fsTypesExclude = ""
|
||||
}
|
||||
|
||||
if *fsTypesExclude != "" && *fsTypesInclude != "" {
|
||||
return deviceFilter{}, errors.New("--collector.filesystem.fs-types-exclude and --collector.filesystem.fs-types-include are mutually exclusive")
|
||||
}
|
||||
|
||||
if *fsTypesExclude != "" {
|
||||
logger.Info("Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude)
|
||||
}
|
||||
if *fsTypesInclude != "" {
|
||||
logger.Info("Parsed flag --collector.filesystem.fs-types-include", "flag", *fsTypesInclude)
|
||||
}
|
||||
|
||||
return newDeviceFilter(*fsTypesExclude, *fsTypesInclude), nil
|
||||
}
|
||||
|
|
|
@ -39,14 +39,14 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
|
|||
stats := []filesystemStats{}
|
||||
for _, fs := range buf {
|
||||
mountpoint := unix.ByteSliceToString(fs.Mntonname[:])
|
||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
||||
if c.mountPointFilter.ignored(mountpoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||
continue
|
||||
}
|
||||
|
||||
device := unix.ByteSliceToString(fs.Mntfromname[:])
|
||||
fstype := unix.ByteSliceToString(fs.Fstypename[:])
|
||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -73,12 +73,12 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
|
|||
|
||||
go func() {
|
||||
for _, labels := range mps {
|
||||
if c.excludedMountPointsPattern.MatchString(labels.mountPoint) {
|
||||
if c.mountPointFilter.ignored(labels.mountPoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", labels.mountPoint)
|
||||
continue
|
||||
}
|
||||
if c.excludedFSTypesPattern.MatchString(labels.fsType) {
|
||||
c.logger.Debug("Ignoring fs", "type", labels.fsType)
|
||||
if c.fsTypeFilter.ignored(labels.fsType) {
|
||||
c.logger.Debug("Ignoring fs type", "type", labels.fsType)
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
114
collector/filesystem_macos.go
Normal file
114
collector/filesystem_macos.go
Normal file
|
@ -0,0 +1,114 @@
|
|||
// Copyright 2015 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build darwin && !nofilesystem
|
||||
// +build darwin,!nofilesystem
|
||||
|
||||
package collector
|
||||
|
||||
/*
|
||||
#cgo CFLAGS: -x objective-c
|
||||
#cgo LDFLAGS: -framework Foundation
|
||||
#import <Foundation/Foundation.h>
|
||||
Float64 purgeable(char *path) {
|
||||
Float64 value = -1.0f;
|
||||
|
||||
@autoreleasepool {
|
||||
NSError *error = nil;
|
||||
NSString *str = [NSString stringWithUTF8String:path];
|
||||
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:str];
|
||||
|
||||
NSDictionary *results = [fileURL resourceValuesForKeys:@[NSURLVolumeAvailableCapacityForImportantUsageKey] error:&error];
|
||||
if (results) {
|
||||
CFNumberRef tmp = CFDictionaryGetValue((CFDictionaryRef)results, NSURLVolumeAvailableCapacityForImportantUsageKey);
|
||||
if (tmp != NULL) {
|
||||
CFNumberGetValue(tmp, kCFNumberFloat64Type, &value);
|
||||
}
|
||||
}
|
||||
|
||||
[fileURL release];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
/*
|
||||
#include <sys/param.h>
|
||||
#include <sys/ucred.h>
|
||||
#include <sys/mount.h>
|
||||
#include <stdio.h>
|
||||
*/
|
||||
import "C"
|
||||
|
||||
const (
|
||||
defMountPointsExcluded = "^/(dev)($|/)"
|
||||
defFSTypesExcluded = "^devfs$"
|
||||
readOnly = 0x1 // MNT_RDONLY
|
||||
)
|
||||
|
||||
// Expose filesystem fullness.
|
||||
func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
||||
var mntbuf *C.struct_statfs
|
||||
count := C.getmntinfo(&mntbuf, C.MNT_NOWAIT)
|
||||
if count == 0 {
|
||||
return nil, errors.New("getmntinfo() failed")
|
||||
}
|
||||
|
||||
mnt := (*[1 << 20]C.struct_statfs)(unsafe.Pointer(mntbuf))
|
||||
stats = []filesystemStats{}
|
||||
for i := 0; i < int(count); i++ {
|
||||
mountpoint := C.GoString(&mnt[i].f_mntonname[0])
|
||||
if c.mountPointFilter.ignored(mountpoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||
continue
|
||||
}
|
||||
|
||||
device := C.GoString(&mnt[i].f_mntfromname[0])
|
||||
fstype := C.GoString(&mnt[i].f_fstypename[0])
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
||||
var ro float64
|
||||
if (mnt[i].f_flags & readOnly) != 0 {
|
||||
ro = 1
|
||||
}
|
||||
|
||||
mountpointCString := C.CString(mountpoint)
|
||||
defer C.free(unsafe.Pointer(mountpointCString))
|
||||
|
||||
stats = append(stats, filesystemStats{
|
||||
labels: filesystemLabels{
|
||||
device: device,
|
||||
mountPoint: rootfsStripPrefix(mountpoint),
|
||||
fsType: fstype,
|
||||
},
|
||||
size: float64(mnt[i].f_blocks) * float64(mnt[i].f_bsize),
|
||||
free: float64(mnt[i].f_bfree) * float64(mnt[i].f_bsize),
|
||||
avail: float64(mnt[i].f_bavail) * float64(mnt[i].f_bsize),
|
||||
files: float64(mnt[i].f_files),
|
||||
filesFree: float64(mnt[i].f_ffree),
|
||||
purgeable: float64(C.purgeable(mountpointCString)),
|
||||
ro: ro,
|
||||
})
|
||||
}
|
||||
return stats, nil
|
||||
}
|
|
@ -97,14 +97,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
|||
stats = []filesystemStats{}
|
||||
for _, v := range mnt {
|
||||
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
||||
if c.mountPointFilter.ignored(mountpoint) {
|
||||
c.logger.Debug("msg", "Ignoring mount point", "mountpoint", mountpoint)
|
||||
continue
|
||||
}
|
||||
|
||||
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
||||
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("msg", "Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -41,14 +41,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
|
|||
stats = []filesystemStats{}
|
||||
for _, v := range mnt {
|
||||
mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
|
||||
if c.excludedMountPointsPattern.MatchString(mountpoint) {
|
||||
if c.mountPointFilter.ignored(mountpoint) {
|
||||
c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
|
||||
continue
|
||||
}
|
||||
|
||||
device := unix.ByteSliceToString(v.F_mntfromname[:])
|
||||
fstype := unix.ByteSliceToString(v.F_fstypename[:])
|
||||
if c.excludedFSTypesPattern.MatchString(fstype) {
|
||||
if c.fsTypeFilter.ignored(fstype) {
|
||||
c.logger.Debug("Ignoring fs type", "type", fstype)
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
|
@ -52,7 +52,7 @@
|
|||
# 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
|
||||
# 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
|
||||
|
@ -488,21 +488,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
|||
node_disk_flush_requests_total{device="sdc"} 1555
|
||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||
# 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-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",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="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",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="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="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="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="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="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="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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",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",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",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",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",rotational="0",serial="AAAABBBBCCCC1",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.
|
||||
# TYPE node_disk_io_now gauge
|
||||
node_disk_io_now{device="dm-0"} 0
|
||||
|
@ -871,6 +871,10 @@ node_hwmon_fan_target_rpm{chip="nct6779",sensor="fan2"} 27000
|
|||
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
||||
# TYPE node_hwmon_fan_tolerance gauge
|
||||
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)
|
||||
# TYPE node_hwmon_in_alarm gauge
|
||||
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
||||
|
@ -984,8 +988,10 @@ node_hwmon_pwm_weight_temp_step_tol{chip="nct6779",sensor="pwm1"} 0
|
|||
# TYPE node_hwmon_sensor_label gauge
|
||||
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="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="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="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 1",sensor="temp3"} 1
|
||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
||||
|
@ -1579,6 +1585,14 @@ node_md_blocks_synced{device="md6"} 1.6775552e+07
|
|||
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||
node_md_blocks_synced{device="md9"} 0
|
||||
# HELP node_md_degraded Number of degraded disks on device.
|
||||
# TYPE node_md_degraded gauge
|
||||
node_md_degraded{device="md0"} 0
|
||||
node_md_degraded{device="md1"} 0
|
||||
node_md_degraded{device="md10"} 0
|
||||
node_md_degraded{device="md4"} 0
|
||||
node_md_degraded{device="md5"} 1
|
||||
node_md_degraded{device="md6"} 1
|
||||
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||
# TYPE node_md_disks gauge
|
||||
node_md_disks{device="md0",state="active"} 2
|
||||
|
@ -1651,6 +1665,14 @@ node_md_disks_required{device="md6"} 2
|
|||
node_md_disks_required{device="md7"} 4
|
||||
node_md_disks_required{device="md8"} 2
|
||||
node_md_disks_required{device="md9"} 4
|
||||
# HELP node_md_raid_disks Number of raid disks on device.
|
||||
# TYPE node_md_raid_disks gauge
|
||||
node_md_raid_disks{device="md0"} 2
|
||||
node_md_raid_disks{device="md1"} 2
|
||||
node_md_raid_disks{device="md10"} 4
|
||||
node_md_raid_disks{device="md4"} 3
|
||||
node_md_raid_disks{device="md5"} 3
|
||||
node_md_raid_disks{device="md6"} 4
|
||||
# HELP node_md_state Indicates the state of md-device.
|
||||
# TYPE node_md_state gauge
|
||||
node_md_state{device="md0",state="active"} 1
|
||||
|
@ -4315,108 +4337,139 @@ node_zfs_zil_zil_itx_needcopy_count 0
|
|||
# TYPE node_zfs_zpool_dataset_nread untyped
|
||||
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="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/dataset1",zpool="poolz1"} 28
|
||||
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
||||
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
||||
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="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/dataset1",zpool="poolz1"} 14
|
||||
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
||||
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
||||
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="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/dataset1",zpool="poolz1"} 14
|
||||
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
||||
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
||||
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="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/dataset1",zpool="poolz1"} 32806
|
||||
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
||||
# TYPE node_zfs_zpool_dataset_reads untyped
|
||||
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="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/dataset1",zpool="poolz1"} 2
|
||||
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
||||
# TYPE node_zfs_zpool_dataset_writes untyped
|
||||
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="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/dataset1",zpool="poolz1"} 10
|
||||
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
||||
# TYPE node_zfs_zpool_nread untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
||||
# TYPE node_zfs_zpool_nwritten untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
||||
# TYPE node_zfs_zpool_rcnt untyped
|
||||
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
||||
node_zfs_zpool_rcnt{zpool="pool3"} 0
|
||||
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
||||
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
||||
# TYPE node_zfs_zpool_reads untyped
|
||||
node_zfs_zpool_reads{zpool="pool1"} 22
|
||||
node_zfs_zpool_reads{zpool="pool3"} 22
|
||||
node_zfs_zpool_reads{zpool="poolz1"} 33
|
||||
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
||||
# TYPE node_zfs_zpool_rlentime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
||||
# TYPE node_zfs_zpool_rtime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
||||
# TYPE node_zfs_zpool_rupdate untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
||||
# TYPE node_zfs_zpool_state gauge
|
||||
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="pool3"} 0
|
||||
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="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="offline",zpool="pool1"} 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="online",zpool="pool1"} 1
|
||||
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="removed",zpool="pool1"} 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="suspended",zpool="pool1"} 0
|
||||
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="unavail",zpool="pool1"} 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
|
||||
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
||||
# TYPE node_zfs_zpool_wcnt untyped
|
||||
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
||||
node_zfs_zpool_wcnt{zpool="pool3"} 0
|
||||
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
||||
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
||||
# TYPE node_zfs_zpool_wlentime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
||||
# TYPE node_zfs_zpool_writes untyped
|
||||
node_zfs_zpool_writes{zpool="pool1"} 132
|
||||
node_zfs_zpool_writes{zpool="pool3"} 132
|
||||
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
||||
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
||||
# TYPE node_zfs_zpool_wtime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
||||
# TYPE node_zfs_zpool_wupdate untyped
|
||||
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
|
||||
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
||||
# TYPE node_zoneinfo_high_pages gauge
|
||||
|
|
291
collector/fixtures/e2e-output-darwin.txt
Normal file
291
collector/fixtures/e2e-output-darwin.txt
Normal file
|
@ -0,0 +1,291 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||
# TYPE node_buddyinfo_blocks gauge
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||
# HELP node_disk_read_errors_total The total number of read errors.
|
||||
# TYPE node_disk_read_errors_total counter
|
||||
node_disk_read_errors_total{device="disk0"} 0
|
||||
# HELP node_disk_read_retries_total The total number of read retries.
|
||||
# TYPE node_disk_read_retries_total counter
|
||||
node_disk_read_retries_total{device="disk0"} 0
|
||||
# HELP node_disk_write_errors_total The total number of write errors.
|
||||
# TYPE node_disk_write_errors_total counter
|
||||
node_disk_write_errors_total{device="disk0"} 0
|
||||
# HELP node_disk_write_retries_total The total number of write retries.
|
||||
# TYPE node_disk_write_retries_total counter
|
||||
node_disk_write_retries_total{device="disk0"} 0
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_memory_swap_total_bytes Memory information field swap_total_bytes.
|
||||
# TYPE node_memory_swap_total_bytes gauge
|
||||
node_memory_swap_total_bytes 0
|
||||
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||
# TYPE node_memory_swap_used_bytes gauge
|
||||
node_memory_swap_used_bytes 0
|
||||
# HELP node_memory_total_bytes Memory information field total_bytes.
|
||||
# TYPE node_memory_total_bytes gauge
|
||||
node_memory_total_bytes 7.516192768e+09
|
||||
# HELP node_network_noproto_total Network device statistic noproto.
|
||||
# TYPE node_network_noproto_total counter
|
||||
node_network_noproto_total{device="lo0"} 0
|
||||
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||
# TYPE node_network_receive_drop_total counter
|
||||
node_network_receive_drop_total{device="lo0"} 0
|
||||
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||
# TYPE node_network_receive_errs_total counter
|
||||
node_network_receive_errs_total{device="lo0"} 0
|
||||
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||
# TYPE node_network_receive_packets_total counter
|
||||
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||
# TYPE node_network_transmit_bytes_total counter
|
||||
# HELP node_network_transmit_colls_total Network device statistic transmit_colls.
|
||||
# TYPE node_network_transmit_colls_total counter
|
||||
node_network_transmit_colls_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||
# TYPE node_network_transmit_errs_total counter
|
||||
node_network_transmit_errs_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||
# TYPE node_network_transmit_packets_total counter
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 1
|
||||
node_scrape_collector_success{collector="diskstats"} 1
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="meminfo"} 1
|
||||
node_scrape_collector_success{collector="netdev"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="powersupplyclass"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="thermal"} 0
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
|
||||
# TYPE process_cpu_seconds_total counter
|
||||
# HELP process_max_fds Maximum number of open file descriptors.
|
||||
# TYPE process_max_fds gauge
|
||||
# HELP process_open_fds Number of open file descriptors.
|
||||
# TYPE process_open_fds gauge
|
||||
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
||||
# TYPE process_resident_memory_bytes gauge
|
||||
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
|
||||
# TYPE process_start_time_seconds gauge
|
||||
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
|
||||
# TYPE process_virtual_memory_bytes gauge
|
||||
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
|
||||
# TYPE process_virtual_memory_max_bytes gauge
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
251
collector/fixtures/e2e-output-dragonfly.txt
Normal file
251
collector/fixtures/e2e-output-dragonfly.txt
Normal file
|
@ -0,0 +1,251 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||
# TYPE node_buddyinfo_blocks gauge
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||
# TYPE node_network_receive_drop_total counter
|
||||
node_network_receive_drop_total{device="lo0"} 0
|
||||
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||
# TYPE node_network_receive_errs_total counter
|
||||
node_network_receive_errs_total{device="lo0"} 0
|
||||
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||
# TYPE node_network_receive_packets_total counter
|
||||
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||
# TYPE node_network_transmit_bytes_total counter
|
||||
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||
# TYPE node_network_transmit_drop_total counter
|
||||
node_network_transmit_drop_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||
# TYPE node_network_transmit_errs_total counter
|
||||
node_network_transmit_errs_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||
# TYPE node_network_transmit_packets_total counter
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 1
|
||||
node_scrape_collector_success{collector="exec"} 1
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="meminfo"} 0
|
||||
node_scrape_collector_success{collector="netdev"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
287
collector/fixtures/e2e-output-freebsd.txt
Normal file
287
collector/fixtures/e2e-output-freebsd.txt
Normal file
|
@ -0,0 +1,287 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||
# TYPE node_buddyinfo_blocks gauge
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_memory_swap_in_bytes_total Bytes paged in from swap devices
|
||||
# TYPE node_memory_swap_in_bytes_total counter
|
||||
node_memory_swap_in_bytes_total 0
|
||||
# HELP node_memory_swap_out_bytes_total Bytes paged out to swap devices
|
||||
# TYPE node_memory_swap_out_bytes_total counter
|
||||
node_memory_swap_out_bytes_total 0
|
||||
# HELP node_memory_swap_size_bytes Total swap memory size
|
||||
# TYPE node_memory_swap_size_bytes gauge
|
||||
node_memory_swap_size_bytes 1.073741824e+09
|
||||
# HELP node_memory_swap_used_bytes Currently allocated swap
|
||||
# TYPE node_memory_swap_used_bytes gauge
|
||||
node_memory_swap_used_bytes 0
|
||||
# HELP node_memory_user_wired_bytes Locked in memory by user, mlock, etc
|
||||
# TYPE node_memory_user_wired_bytes gauge
|
||||
node_memory_user_wired_bytes 0
|
||||
# HELP node_netisr_bindthreads netisr threads bound to CPUs
|
||||
# TYPE node_netisr_bindthreads gauge
|
||||
node_netisr_bindthreads 0
|
||||
# HELP node_netisr_defaultqlimit netisr default queue limit
|
||||
# TYPE node_netisr_defaultqlimit gauge
|
||||
node_netisr_defaultqlimit 256
|
||||
# HELP node_netisr_maxprot netisr maximum protocols
|
||||
# TYPE node_netisr_maxprot gauge
|
||||
node_netisr_maxprot 16
|
||||
# HELP node_netisr_maxqlimit netisr maximum queue limit
|
||||
# TYPE node_netisr_maxqlimit gauge
|
||||
node_netisr_maxqlimit 10240
|
||||
# HELP node_netisr_maxthreads netisr maximum thread count
|
||||
# TYPE node_netisr_maxthreads gauge
|
||||
node_netisr_maxthreads 1
|
||||
# HELP node_netisr_numthreads netisr current thread count
|
||||
# TYPE node_netisr_numthreads gauge
|
||||
node_netisr_numthreads 1
|
||||
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||
# TYPE node_network_receive_drop_total counter
|
||||
node_network_receive_drop_total{device="lo0"} 0
|
||||
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||
# TYPE node_network_receive_errs_total counter
|
||||
node_network_receive_errs_total{device="lo0"} 0
|
||||
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||
# TYPE node_network_receive_packets_total counter
|
||||
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||
# TYPE node_network_transmit_bytes_total counter
|
||||
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||
# TYPE node_network_transmit_drop_total counter
|
||||
node_network_transmit_drop_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||
# TYPE node_network_transmit_errs_total counter
|
||||
node_network_transmit_errs_total{device="lo0"} 0
|
||||
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||
# TYPE node_network_transmit_packets_total counter
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 1
|
||||
node_scrape_collector_success{collector="exec"} 1
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="meminfo"} 1
|
||||
node_scrape_collector_success{collector="netdev"} 1
|
||||
node_scrape_collector_success{collector="netisr"} 1
|
||||
node_scrape_collector_success{collector="netstat"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
node_scrape_collector_success{collector="zfs"} 1
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
209
collector/fixtures/e2e-output-netbsd.txt
Normal file
209
collector/fixtures/e2e-output-netbsd.txt
Normal file
|
@ -0,0 +1,209 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_memory_swap_size_bytes Memory information field swap_size_bytes.
|
||||
# TYPE node_memory_swap_size_bytes gauge
|
||||
node_memory_swap_size_bytes 6.442426368e+09
|
||||
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||
# TYPE node_memory_swap_used_bytes gauge
|
||||
node_memory_swap_used_bytes 0
|
||||
# HELP node_memory_swapped_in_pages_bytes_total Memory information field swapped_in_pages_bytes_total.
|
||||
# TYPE node_memory_swapped_in_pages_bytes_total counter
|
||||
node_memory_swapped_in_pages_bytes_total 0
|
||||
# HELP node_memory_swapped_out_pages_bytes_total Memory information field swapped_out_pages_bytes_total.
|
||||
# TYPE node_memory_swapped_out_pages_bytes_total counter
|
||||
node_memory_swapped_out_pages_bytes_total 0
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 0
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="meminfo"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP process_open_fds Number of open file descriptors.
|
||||
# TYPE process_open_fds gauge
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
276
collector/fixtures/e2e-output-openbsd.txt
Normal file
276
collector/fixtures/e2e-output-openbsd.txt
Normal file
|
@ -0,0 +1,276 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||
# TYPE node_buddyinfo_blocks gauge
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_memory_swap_size_bytes Memory information field swap_size_bytes.
|
||||
# TYPE node_memory_swap_size_bytes gauge
|
||||
node_memory_swap_size_bytes 6.693941248e+09
|
||||
# HELP node_memory_swap_used_bytes Memory information field swap_used_bytes.
|
||||
# TYPE node_memory_swap_used_bytes gauge
|
||||
node_memory_swap_used_bytes 0
|
||||
# HELP node_memory_swapped_in_pages_bytes_total Memory information field swapped_in_pages_bytes_total.
|
||||
# TYPE node_memory_swapped_in_pages_bytes_total counter
|
||||
node_memory_swapped_in_pages_bytes_total 0
|
||||
# HELP node_memory_swapped_out_pages_bytes_total Memory information field swapped_out_pages_bytes_total.
|
||||
# TYPE node_memory_swapped_out_pages_bytes_total counter
|
||||
node_memory_swapped_out_pages_bytes_total 0
|
||||
# HELP node_network_noproto_total Network device statistic noproto.
|
||||
# TYPE node_network_noproto_total counter
|
||||
node_network_noproto_total{device="lo0"} 0
|
||||
node_network_noproto_total{device="pflog0"} 0
|
||||
# HELP node_network_receive_drop_total Network device statistic receive_drop.
|
||||
# TYPE node_network_receive_drop_total counter
|
||||
node_network_receive_drop_total{device="lo0"} 0
|
||||
node_network_receive_drop_total{device="pflog0"} 0
|
||||
# HELP node_network_receive_errs_total Network device statistic receive_errs.
|
||||
# TYPE node_network_receive_errs_total counter
|
||||
node_network_receive_errs_total{device="lo0"} 0
|
||||
node_network_receive_errs_total{device="pflog0"} 0
|
||||
# HELP node_network_receive_packets_total Network device statistic receive_packets.
|
||||
# TYPE node_network_receive_packets_total counter
|
||||
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
|
||||
# TYPE node_network_transmit_bytes_total counter
|
||||
# HELP node_network_transmit_colls_total Network device statistic transmit_colls.
|
||||
# TYPE node_network_transmit_colls_total counter
|
||||
node_network_transmit_colls_total{device="lo0"} 0
|
||||
node_network_transmit_colls_total{device="pflog0"} 0
|
||||
# HELP node_network_transmit_drop_total Network device statistic transmit_drop.
|
||||
# TYPE node_network_transmit_drop_total counter
|
||||
node_network_transmit_drop_total{device="lo0"} 0
|
||||
node_network_transmit_drop_total{device="pflog0"} 0
|
||||
# HELP node_network_transmit_errs_total Network device statistic transmit_errs.
|
||||
# TYPE node_network_transmit_errs_total counter
|
||||
node_network_transmit_errs_total{device="lo0"} 0
|
||||
node_network_transmit_errs_total{device="pflog0"} 0
|
||||
# HELP node_network_transmit_packets_total Network device statistic transmit_packets.
|
||||
# TYPE node_network_transmit_packets_total counter
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 1
|
||||
node_scrape_collector_success{collector="diskstats"} 1
|
||||
node_scrape_collector_success{collector="interrupts"} 1
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="meminfo"} 1
|
||||
node_scrape_collector_success{collector="netdev"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
234
collector/fixtures/e2e-output-solaris.txt
Normal file
234
collector/fixtures/e2e-output-solaris.txt
Normal file
|
@ -0,0 +1,234 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
# HELP go_info Information about the Go environment.
|
||||
# TYPE go_info gauge
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated in heap and currently in use. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated in heap until now, even if released already. Equals to /gc/heap/allocs:bytes.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. Equals to /memory/classes/profiling/buckets:bytes.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
# HELP go_memstats_frees_total Total number of heap objects frees. Equals to /gc/heap/frees:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. Equals to /memory/classes/metadata/other:bytes.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and currently in use, same as go_memstats_alloc_bytes. Equals to /memory/classes/heap/objects:bytes.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. Equals to /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
# HELP go_memstats_heap_objects Number of currently allocated objects. Equals to /gc/heap/objects:objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. Equals to /memory/classes/heap/released:bytes.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. Equals to /memory/classes/heap/objects:bytes + /memory/classes/heap/unused:bytes + /memory/classes/heap/released:bytes + /memory/classes/heap/free:bytes.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
# HELP go_memstats_mallocs_total Total number of heap objects allocated, both live and gc-ed. Semantically a counter version for go_memstats_heap_objects gauge. Equals to /gc/heap/allocs:objects + /gc/heap/tiny/allocs:objects.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. Equals to /memory/classes/metadata/mcache/inuse:bytes.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. Equals to /memory/classes/metadata/mcache/inuse:bytes + /memory/classes/metadata/mcache/free:bytes.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. Equals to /memory/classes/metadata/mspan/inuse:bytes.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. Equals to /memory/classes/metadata/mspan/inuse:bytes + /memory/classes/metadata/mspan/free:bytes.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. Equals to /gc/heap/goal:bytes.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. Equals to /memory/classes/other:bytes.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes obtained from system for stack allocator in non-CGO environments. Equals to /memory/classes/heap/stacks:bytes.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. Equals to /memory/classes/heap/stacks:bytes + /memory/classes/os-stacks:bytes.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system. Equals to /memory/classes/total:byte.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
# HELP go_sched_gomaxprocs_threads The current runtime.GOMAXPROCS setting, or the number of operating system threads that can execute user-level Go code simultaneously. Sourced from /sched/gomaxprocs:threads.
|
||||
# TYPE go_sched_gomaxprocs_threads gauge
|
||||
# HELP go_threads Number of OS threads created.
|
||||
# TYPE go_threads gauge
|
||||
# HELP node_buddyinfo_blocks Count of free blocks according to size.
|
||||
# TYPE node_buddyinfo_blocks gauge
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="DMA32"} 759
|
||||
node_buddyinfo_blocks{node="0",size="0",zone="Normal"} 4381
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="DMA32"} 572
|
||||
node_buddyinfo_blocks{node="0",size="1",zone="Normal"} 1093
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA"} 3
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="10",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="DMA32"} 791
|
||||
node_buddyinfo_blocks{node="0",size="2",zone="Normal"} 185
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="DMA32"} 475
|
||||
node_buddyinfo_blocks{node="0",size="3",zone="Normal"} 1530
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA"} 2
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="DMA32"} 194
|
||||
node_buddyinfo_blocks{node="0",size="4",zone="Normal"} 567
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="DMA32"} 45
|
||||
node_buddyinfo_blocks{node="0",size="5",zone="Normal"} 102
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="DMA32"} 12
|
||||
node_buddyinfo_blocks{node="0",size="6",zone="Normal"} 4
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="7",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="8",zone="Normal"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA"} 1
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="DMA32"} 0
|
||||
node_buddyinfo_blocks{node="0",size="9",zone="Normal"} 0
|
||||
# HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which node_exporter was built, and the goos and goarch for the build.
|
||||
# TYPE node_exporter_build_info gauge
|
||||
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
|
||||
# TYPE node_os_info gauge
|
||||
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1
|
||||
# HELP node_os_version Metric containing the major.minor part of the OS version.
|
||||
# TYPE node_os_version gauge
|
||||
node_os_version{id="ubuntu",id_like="debian",name="Ubuntu"} 20.04
|
||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||
# TYPE node_scrape_collector_duration_seconds gauge
|
||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||
# TYPE node_scrape_collector_success gauge
|
||||
node_scrape_collector_success{collector="boottime"} 1
|
||||
node_scrape_collector_success{collector="buddyinfo"} 1
|
||||
node_scrape_collector_success{collector="cpu"} 0
|
||||
node_scrape_collector_success{collector="cpufreq"} 1
|
||||
node_scrape_collector_success{collector="loadavg"} 1
|
||||
node_scrape_collector_success{collector="os"} 1
|
||||
node_scrape_collector_success{collector="textfile"} 1
|
||||
node_scrape_collector_success{collector="time"} 1
|
||||
node_scrape_collector_success{collector="xfrm"} 1
|
||||
node_scrape_collector_success{collector="zfs"} 0
|
||||
# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read.
|
||||
# TYPE node_textfile_mtime_seconds gauge
|
||||
# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise
|
||||
# TYPE node_textfile_scrape_error gauge
|
||||
node_textfile_scrape_error 0
|
||||
# HELP node_time_seconds System time in seconds since epoch (1970).
|
||||
# TYPE node_time_seconds gauge
|
||||
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
|
||||
# TYPE node_time_zone_offset_seconds gauge
|
||||
# HELP node_xfrm_acquire_error_packets_total State hasn’t been fully acquired before use
|
||||
# TYPE node_xfrm_acquire_error_packets_total counter
|
||||
node_xfrm_acquire_error_packets_total 24532
|
||||
# HELP node_xfrm_fwd_hdr_error_packets_total Forward routing of a packet is not allowed
|
||||
# TYPE node_xfrm_fwd_hdr_error_packets_total counter
|
||||
node_xfrm_fwd_hdr_error_packets_total 6654
|
||||
# HELP node_xfrm_in_buffer_error_packets_total No buffer is left
|
||||
# TYPE node_xfrm_in_buffer_error_packets_total counter
|
||||
node_xfrm_in_buffer_error_packets_total 2
|
||||
# HELP node_xfrm_in_error_packets_total All errors not matched by other
|
||||
# TYPE node_xfrm_in_error_packets_total counter
|
||||
node_xfrm_in_error_packets_total 1
|
||||
# HELP node_xfrm_in_hdr_error_packets_total Header error
|
||||
# TYPE node_xfrm_in_hdr_error_packets_total counter
|
||||
node_xfrm_in_hdr_error_packets_total 4
|
||||
# HELP node_xfrm_in_no_pols_packets_total No policy is found for states e.g. Inbound SAs are correct but no SP is found
|
||||
# TYPE node_xfrm_in_no_pols_packets_total counter
|
||||
node_xfrm_in_no_pols_packets_total 65432
|
||||
# HELP node_xfrm_in_no_states_packets_total No state is found i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
# TYPE node_xfrm_in_no_states_packets_total counter
|
||||
node_xfrm_in_no_states_packets_total 3
|
||||
# HELP node_xfrm_in_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_in_pol_block_packets_total counter
|
||||
node_xfrm_in_pol_block_packets_total 100
|
||||
# HELP node_xfrm_in_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_in_pol_error_packets_total counter
|
||||
node_xfrm_in_pol_error_packets_total 10000
|
||||
# HELP node_xfrm_in_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_in_state_expired_packets_total counter
|
||||
node_xfrm_in_state_expired_packets_total 7
|
||||
# HELP node_xfrm_in_state_invalid_packets_total State is invalid
|
||||
# TYPE node_xfrm_in_state_invalid_packets_total counter
|
||||
node_xfrm_in_state_invalid_packets_total 55555
|
||||
# HELP node_xfrm_in_state_mismatch_packets_total State has mismatch option e.g. UDP encapsulation type is mismatch
|
||||
# TYPE node_xfrm_in_state_mismatch_packets_total counter
|
||||
node_xfrm_in_state_mismatch_packets_total 23451
|
||||
# HELP node_xfrm_in_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_in_state_mode_error_packets_total counter
|
||||
node_xfrm_in_state_mode_error_packets_total 100
|
||||
# HELP node_xfrm_in_state_proto_error_packets_total Transformation protocol specific error e.g. SA key is wrong
|
||||
# TYPE node_xfrm_in_state_proto_error_packets_total counter
|
||||
node_xfrm_in_state_proto_error_packets_total 40
|
||||
# HELP node_xfrm_in_state_seq_error_packets_total Sequence error i.e. Sequence number is out of window
|
||||
# TYPE node_xfrm_in_state_seq_error_packets_total counter
|
||||
node_xfrm_in_state_seq_error_packets_total 6000
|
||||
# HELP node_xfrm_in_tmpl_mismatch_packets_total No matching template for states e.g. Inbound SAs are correct but SP rule is wrong
|
||||
# TYPE node_xfrm_in_tmpl_mismatch_packets_total counter
|
||||
node_xfrm_in_tmpl_mismatch_packets_total 51
|
||||
# HELP node_xfrm_out_bundle_check_error_packets_total Bundle check error
|
||||
# TYPE node_xfrm_out_bundle_check_error_packets_total counter
|
||||
node_xfrm_out_bundle_check_error_packets_total 555
|
||||
# HELP node_xfrm_out_bundle_gen_error_packets_total Bundle generation error
|
||||
# TYPE node_xfrm_out_bundle_gen_error_packets_total counter
|
||||
node_xfrm_out_bundle_gen_error_packets_total 43321
|
||||
# HELP node_xfrm_out_error_packets_total All errors which is not matched others
|
||||
# TYPE node_xfrm_out_error_packets_total counter
|
||||
node_xfrm_out_error_packets_total 1e+06
|
||||
# HELP node_xfrm_out_no_states_packets_total No state is found
|
||||
# TYPE node_xfrm_out_no_states_packets_total counter
|
||||
node_xfrm_out_no_states_packets_total 869
|
||||
# HELP node_xfrm_out_pol_block_packets_total Policy discards
|
||||
# TYPE node_xfrm_out_pol_block_packets_total counter
|
||||
node_xfrm_out_pol_block_packets_total 43456
|
||||
# HELP node_xfrm_out_pol_dead_packets_total Policy is dead
|
||||
# TYPE node_xfrm_out_pol_dead_packets_total counter
|
||||
node_xfrm_out_pol_dead_packets_total 7656
|
||||
# HELP node_xfrm_out_pol_error_packets_total Policy error
|
||||
# TYPE node_xfrm_out_pol_error_packets_total counter
|
||||
node_xfrm_out_pol_error_packets_total 1454
|
||||
# HELP node_xfrm_out_state_expired_packets_total State is expired
|
||||
# TYPE node_xfrm_out_state_expired_packets_total counter
|
||||
node_xfrm_out_state_expired_packets_total 565
|
||||
# HELP node_xfrm_out_state_invalid_packets_total State is invalid, perhaps expired
|
||||
# TYPE node_xfrm_out_state_invalid_packets_total counter
|
||||
node_xfrm_out_state_invalid_packets_total 28765
|
||||
# HELP node_xfrm_out_state_mode_error_packets_total Transformation mode specific error
|
||||
# TYPE node_xfrm_out_state_mode_error_packets_total counter
|
||||
node_xfrm_out_state_mode_error_packets_total 8
|
||||
# HELP node_xfrm_out_state_proto_error_packets_total Transformation protocol specific error
|
||||
# TYPE node_xfrm_out_state_proto_error_packets_total counter
|
||||
node_xfrm_out_state_proto_error_packets_total 4542
|
||||
# HELP node_xfrm_out_state_seq_error_packets_total Sequence error i.e. Sequence number overflow
|
||||
# TYPE node_xfrm_out_state_seq_error_packets_total counter
|
||||
node_xfrm_out_state_seq_error_packets_total 543
|
||||
# HELP process_open_fds Number of open file descriptors.
|
||||
# TYPE process_open_fds gauge
|
||||
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
|
||||
# TYPE promhttp_metric_handler_errors_total counter
|
||||
promhttp_metric_handler_errors_total{cause="encoding"} 0
|
||||
promhttp_metric_handler_errors_total{cause="gathering"} 0
|
||||
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
|
||||
# TYPE promhttp_metric_handler_requests_in_flight gauge
|
||||
promhttp_metric_handler_requests_in_flight 1
|
||||
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
|
||||
# TYPE promhttp_metric_handler_requests_total counter
|
||||
promhttp_metric_handler_requests_total{code="200"} 0
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP testmetric1_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_1 untyped
|
||||
testmetric1_1{foo="bar"} 10
|
||||
# HELP testmetric1_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics1.prom
|
||||
# TYPE testmetric1_2 untyped
|
||||
testmetric1_2{foo="baz"} 20
|
||||
# HELP testmetric2_1 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_1 untyped
|
||||
testmetric2_1{foo="bar"} 30
|
||||
# HELP testmetric2_2 Metric read from collector/fixtures/textfile/two_metric_files/metrics2.prom
|
||||
# TYPE testmetric2_2 untyped
|
||||
testmetric2_2{foo="baz"} 40
|
|
@ -1,8 +1,8 @@
|
|||
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent
|
||||
# HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent.
|
||||
# TYPE go_gc_gogc_percent gauge
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes
|
||||
# HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes.
|
||||
# TYPE go_gc_gomemlimit_bytes gauge
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
|
@ -52,7 +52,7 @@
|
|||
# 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
|
||||
# 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
|
||||
|
@ -510,21 +510,21 @@ node_disk_flush_requests_time_seconds_total{device="sdc"} 1.944
|
|||
node_disk_flush_requests_total{device="sdc"} 1555
|
||||
# HELP node_disk_info Info of /sys/block/<block_device>.
|
||||
# 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-1",major="252",minor="1",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-2",major="252",minor="2",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-3",major="252",minor="3",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-4",major="252",minor="4",model="",path="",revision="",serial="",wwn=""} 1
|
||||
node_disk_info{device="dm-5",major="252",minor="5",model="",path="",revision="",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="mmcblk0p1",major="179",minor="1",model="",path="platform-df2969f3.mmc",revision="",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="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="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="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="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="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="vda",major="254",minor="0",model="",path="pci-0000:00:06.0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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="",rotational="0",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",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",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",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",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",rotational="0",serial="AAAABBBBCCCC1",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.
|
||||
# TYPE node_disk_io_now gauge
|
||||
node_disk_io_now{device="dm-0"} 0
|
||||
|
@ -893,6 +893,10 @@ node_hwmon_fan_target_rpm{chip="nct6779",sensor="fan2"} 27000
|
|||
# HELP node_hwmon_fan_tolerance Hardware monitor fan element tolerance
|
||||
# TYPE node_hwmon_fan_tolerance gauge
|
||||
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)
|
||||
# TYPE node_hwmon_in_alarm gauge
|
||||
node_hwmon_in_alarm{chip="nct6779",sensor="in0"} 0
|
||||
|
@ -1006,8 +1010,10 @@ node_hwmon_pwm_weight_temp_step_tol{chip="nct6779",sensor="pwm1"} 0
|
|||
# TYPE node_hwmon_sensor_label gauge
|
||||
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="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="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="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 1",sensor="temp3"} 1
|
||||
node_hwmon_sensor_label{chip="platform_coretemp_0",label="Core 2",sensor="temp4"} 1
|
||||
|
@ -1601,6 +1607,14 @@ node_md_blocks_synced{device="md6"} 1.6775552e+07
|
|||
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||
node_md_blocks_synced{device="md9"} 0
|
||||
# HELP node_md_degraded Number of degraded disks on device.
|
||||
# TYPE node_md_degraded gauge
|
||||
node_md_degraded{device="md0"} 0
|
||||
node_md_degraded{device="md1"} 0
|
||||
node_md_degraded{device="md10"} 0
|
||||
node_md_degraded{device="md4"} 0
|
||||
node_md_degraded{device="md5"} 1
|
||||
node_md_degraded{device="md6"} 1
|
||||
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||
# TYPE node_md_disks gauge
|
||||
node_md_disks{device="md0",state="active"} 2
|
||||
|
@ -1673,6 +1687,14 @@ node_md_disks_required{device="md6"} 2
|
|||
node_md_disks_required{device="md7"} 4
|
||||
node_md_disks_required{device="md8"} 2
|
||||
node_md_disks_required{device="md9"} 4
|
||||
# HELP node_md_raid_disks Number of raid disks on device.
|
||||
# TYPE node_md_raid_disks gauge
|
||||
node_md_raid_disks{device="md0"} 2
|
||||
node_md_raid_disks{device="md1"} 2
|
||||
node_md_raid_disks{device="md10"} 4
|
||||
node_md_raid_disks{device="md4"} 3
|
||||
node_md_raid_disks{device="md5"} 3
|
||||
node_md_raid_disks{device="md6"} 4
|
||||
# HELP node_md_state Indicates the state of md-device.
|
||||
# TYPE node_md_state gauge
|
||||
node_md_state{device="md0",state="active"} 1
|
||||
|
@ -4337,108 +4359,139 @@ node_zfs_zil_zil_itx_needcopy_count 0
|
|||
# TYPE node_zfs_zpool_dataset_nread untyped
|
||||
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="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/dataset1",zpool="poolz1"} 28
|
||||
# HELP node_zfs_zpool_dataset_nunlinked kstat.zfs.misc.objset.nunlinked
|
||||
# TYPE node_zfs_zpool_dataset_nunlinked untyped
|
||||
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="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/dataset1",zpool="poolz1"} 14
|
||||
# HELP node_zfs_zpool_dataset_nunlinks kstat.zfs.misc.objset.nunlinks
|
||||
# TYPE node_zfs_zpool_dataset_nunlinks untyped
|
||||
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="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/dataset1",zpool="poolz1"} 14
|
||||
# HELP node_zfs_zpool_dataset_nwritten kstat.zfs.misc.objset.nwritten
|
||||
# TYPE node_zfs_zpool_dataset_nwritten untyped
|
||||
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="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/dataset1",zpool="poolz1"} 32806
|
||||
# HELP node_zfs_zpool_dataset_reads kstat.zfs.misc.objset.reads
|
||||
# TYPE node_zfs_zpool_dataset_reads untyped
|
||||
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="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/dataset1",zpool="poolz1"} 2
|
||||
# HELP node_zfs_zpool_dataset_writes kstat.zfs.misc.objset.writes
|
||||
# TYPE node_zfs_zpool_dataset_writes untyped
|
||||
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="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/dataset1",zpool="poolz1"} 10
|
||||
# HELP node_zfs_zpool_nread kstat.zfs.misc.io.nread
|
||||
# TYPE node_zfs_zpool_nread untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_nwritten kstat.zfs.misc.io.nwritten
|
||||
# TYPE node_zfs_zpool_nwritten untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rcnt kstat.zfs.misc.io.rcnt
|
||||
# TYPE node_zfs_zpool_rcnt untyped
|
||||
node_zfs_zpool_rcnt{zpool="pool1"} 0
|
||||
node_zfs_zpool_rcnt{zpool="pool3"} 0
|
||||
node_zfs_zpool_rcnt{zpool="poolz1"} 0
|
||||
# HELP node_zfs_zpool_reads kstat.zfs.misc.io.reads
|
||||
# TYPE node_zfs_zpool_reads untyped
|
||||
node_zfs_zpool_reads{zpool="pool1"} 22
|
||||
node_zfs_zpool_reads{zpool="pool3"} 22
|
||||
node_zfs_zpool_reads{zpool="poolz1"} 33
|
||||
# HELP node_zfs_zpool_rlentime kstat.zfs.misc.io.rlentime
|
||||
# TYPE node_zfs_zpool_rlentime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rtime kstat.zfs.misc.io.rtime
|
||||
# TYPE node_zfs_zpool_rtime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_rupdate kstat.zfs.misc.io.rupdate
|
||||
# TYPE node_zfs_zpool_rupdate untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_state kstat.zfs.misc.state
|
||||
# TYPE node_zfs_zpool_state gauge
|
||||
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="pool3"} 0
|
||||
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="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="offline",zpool="pool1"} 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="online",zpool="pool1"} 1
|
||||
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="removed",zpool="pool1"} 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="suspended",zpool="pool1"} 0
|
||||
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="unavail",zpool="pool1"} 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
|
||||
# HELP node_zfs_zpool_wcnt kstat.zfs.misc.io.wcnt
|
||||
# TYPE node_zfs_zpool_wcnt untyped
|
||||
node_zfs_zpool_wcnt{zpool="pool1"} 0
|
||||
node_zfs_zpool_wcnt{zpool="pool3"} 0
|
||||
node_zfs_zpool_wcnt{zpool="poolz1"} 0
|
||||
# HELP node_zfs_zpool_wlentime kstat.zfs.misc.io.wlentime
|
||||
# TYPE node_zfs_zpool_wlentime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_writes kstat.zfs.misc.io.writes
|
||||
# TYPE node_zfs_zpool_writes untyped
|
||||
node_zfs_zpool_writes{zpool="pool1"} 132
|
||||
node_zfs_zpool_writes{zpool="pool3"} 132
|
||||
node_zfs_zpool_writes{zpool="poolz1"} 25294
|
||||
# HELP node_zfs_zpool_wtime kstat.zfs.misc.io.wtime
|
||||
# TYPE node_zfs_zpool_wtime untyped
|
||||
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
|
||||
# HELP node_zfs_zpool_wupdate kstat.zfs.misc.io.wupdate
|
||||
# TYPE node_zfs_zpool_wupdate untyped
|
||||
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
|
||||
# HELP node_zoneinfo_high_pages Zone watermark pages_high
|
||||
# TYPE node_zoneinfo_high_pages gauge
|
||||
|
|
|
@ -4,6 +4,7 @@ NIC statistics:
|
|||
rx_packets: 1260062
|
||||
tx_errors: 0
|
||||
rx_errors: 0
|
||||
port.rx_dropped: 12028
|
||||
rx_missed: 401
|
||||
align_errors: 0
|
||||
tx_single_collisions: 0
|
||||
|
|
3
collector/fixtures/proc/spl/kstat/zfs/pool3/io
Normal file
3
collector/fixtures/proc/spl/kstat/zfs/pool3/io
Normal file
|
@ -0,0 +1,3 @@
|
|||
12 3 0x00 1 80 79205351707403 395818011156865
|
||||
nread nwritten reads writes wtime wlentime wupdate rtime rlentime rupdate wcnt rcnt
|
||||
1884160 3206144 22 132 7155162 104112268 79210489694949 24168078 104112268 79210489849220 0 0
|
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-1
Normal file
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-1
Normal file
|
@ -0,0 +1,9 @@
|
|||
23 1 0x01 7 2160 221578688875 6665999035587
|
||||
name type data
|
||||
dataset_name 7 pool3
|
||||
writes 4 0
|
||||
nwritten 4 0
|
||||
reads 4 0
|
||||
nread 4 0
|
||||
nunlinks 4 0
|
||||
nunlinked 4 0
|
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-2
Normal file
9
collector/fixtures/proc/spl/kstat/zfs/pool3/objset-2
Normal file
|
@ -0,0 +1,9 @@
|
|||
24 1 0x01 7 2160 221611904716 7145015038451
|
||||
name type data
|
||||
dataset_name 7 pool3/dataset with space
|
||||
writes 4 4
|
||||
nwritten 4 12302
|
||||
reads 4 2
|
||||
nread 4 28
|
||||
nunlinks 4 3
|
||||
nunlinked 4 3
|
1
collector/fixtures/proc/spl/kstat/zfs/pool3/state
Normal file
1
collector/fixtures/proc/spl/kstat/zfs/pool3/state
Normal file
|
@ -0,0 +1 @@
|
|||
ONLINE
|
|
@ -2,6 +2,830 @@
|
|||
Directory: sys
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/sda
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/sda/queue
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/add_random
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/chunk_sectors
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/dax
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/discard_granularity
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/discard_max_bytes
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/discard_max_hw_bytes
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/discard_zeroes_data
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/fua
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/hw_sector_size
|
||||
Lines: 1
|
||||
512
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/io_poll
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/io_poll_delay
|
||||
Lines: 1
|
||||
-1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/io_timeout
|
||||
Lines: 1
|
||||
30000
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/sda/queue/iosched
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/back_seek_max
|
||||
Lines: 1
|
||||
16384
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/back_seek_penalty
|
||||
Lines: 1
|
||||
2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/fifo_expire_async
|
||||
Lines: 1
|
||||
250
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/fifo_expire_sync
|
||||
Lines: 1
|
||||
125
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/low_latency
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/max_budget
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/slice_idle
|
||||
Lines: 1
|
||||
8
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/slice_idle_us
|
||||
Lines: 1
|
||||
8000
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/strict_guarantees
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iosched/timeout_sync
|
||||
Lines: 1
|
||||
125
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/iostats
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/logical_block_size
|
||||
Lines: 1
|
||||
512
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_discard_segments
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_hw_sectors_kb
|
||||
Lines: 1
|
||||
32767
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_integrity_segments
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_sectors_kb
|
||||
Lines: 1
|
||||
1280
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_segment_size
|
||||
Lines: 1
|
||||
65536
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/max_segments
|
||||
Lines: 1
|
||||
168
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/minimum_io_size
|
||||
Lines: 1
|
||||
512
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/nomerges
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/nr_requests
|
||||
Lines: 1
|
||||
64
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/nr_zones
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/optimal_io_size
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/physical_block_size
|
||||
Lines: 1
|
||||
512
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/read_ahead_kb
|
||||
Lines: 1
|
||||
128
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/rotational
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/rq_affinity
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/scheduler
|
||||
Lines: 1
|
||||
mq-deadline kyber [bfq] none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/wbt_lat_usec
|
||||
Lines: 1
|
||||
75000
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/write_cache
|
||||
Lines: 1
|
||||
write back
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/write_same_max_bytes
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/write_zeroes_max_bytes
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/sda/queue/zoned
|
||||
Lines: 1
|
||||
none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/array_state
|
||||
Lines: 1
|
||||
clean
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/chunk_size
|
||||
Lines: 1
|
||||
524288
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0/md/dev-sdg
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/dev-sdg/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0/md/dev-sdh
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/dev-sdh/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/level
|
||||
Lines: 1
|
||||
raid0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/raid_disks
|
||||
Lines: 1
|
||||
2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md0/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md0/md/uuid
|
||||
Lines: 1
|
||||
155f29ff-1716-4107-b362-52307ef86cac
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/array_state
|
||||
Lines: 1
|
||||
clean
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/chunk_size
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/degraded
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1/md/dev-sdi
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/dev-sdi/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1/md/dev-sdj
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/dev-sdj/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/level
|
||||
Lines: 1
|
||||
raid1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/raid_disks
|
||||
Lines: 1
|
||||
2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md1/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/sync_action
|
||||
Lines: 1
|
||||
idle
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/sync_completed
|
||||
Lines: 1
|
||||
none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md1/md/uuid
|
||||
Lines: 1
|
||||
0fbf5f2c-add2-43c2-bd78-a4be3ab709ef
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/array_state
|
||||
Lines: 1
|
||||
clean
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/chunk_size
|
||||
Lines: 1
|
||||
524288
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/degraded
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/dev-sdu
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/dev-sdu/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/dev-sdv
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/dev-sdv/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/dev-sdw
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/dev-sdw/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/dev-sdx
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/dev-sdx/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/level
|
||||
Lines: 1
|
||||
raid10
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/raid_disks
|
||||
Lines: 1
|
||||
4
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/rd2
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/rd2/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md10/md/rd3
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/rd3/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/sync_action
|
||||
Lines: 1
|
||||
idle
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/sync_completed
|
||||
Lines: 1
|
||||
none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md10/md/uuid
|
||||
Lines: 1
|
||||
0c15f7e7-b159-4b1f-a5cd-a79b5c04b6f5
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/array_state
|
||||
Lines: 1
|
||||
clean
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/chunk_size
|
||||
Lines: 1
|
||||
524288
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/degraded
|
||||
Lines: 1
|
||||
0
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/dev-sdk
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/dev-sdk/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/dev-sdl
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/dev-sdl/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/dev-sdm
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/dev-sdm/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/level
|
||||
Lines: 1
|
||||
raid4
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/raid_disks
|
||||
Lines: 1
|
||||
3
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md4/md/rd2
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/rd2/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/sync_action
|
||||
Lines: 1
|
||||
idle
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/sync_completed
|
||||
Lines: 1
|
||||
none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md4/md/uuid
|
||||
Lines: 1
|
||||
67f415d5-2c0c-4b69-8e0d-7e20ef553457
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/array_state
|
||||
Lines: 1
|
||||
clean
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/chunk_size
|
||||
Lines: 1
|
||||
524288
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/degraded
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/dev-sdaa
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/dev-sdaa/state
|
||||
Lines: 1
|
||||
spare
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/dev-sdn
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/dev-sdn/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/dev-sdo
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/dev-sdo/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/dev-sdp
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/dev-sdp/state
|
||||
Lines: 1
|
||||
faulty
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/level
|
||||
Lines: 1
|
||||
raid5
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/raid_disks
|
||||
Lines: 1
|
||||
3
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md5/md/rd2
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/rd2/state
|
||||
Lines: 1
|
||||
faulty
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/sync_action
|
||||
Lines: 1
|
||||
idle
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/sync_completed
|
||||
Lines: 1
|
||||
none
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md5/md/uuid
|
||||
Lines: 1
|
||||
7615b98d-f2ba-4d99-bee8-6202d8e130b9
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/array_state
|
||||
Lines: 1
|
||||
active
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/chunk_size
|
||||
Lines: 1
|
||||
524288
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/degraded
|
||||
Lines: 1
|
||||
1
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/dev-sdq
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/dev-sdq/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/dev-sdr
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/dev-sdr/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/dev-sds
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/dev-sds/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/dev-sdt
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/dev-sdt/state
|
||||
Lines: 1
|
||||
spare
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/level
|
||||
Lines: 1
|
||||
raid6
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/metadata_version
|
||||
Lines: 1
|
||||
1.2
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/raid_disks
|
||||
Lines: 1
|
||||
4
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/rd0
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/rd0/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/rd1
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/rd1/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/rd2
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/rd2/state
|
||||
Lines: 1
|
||||
in_sync
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/block/md6/md/rd3
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/rd3/state
|
||||
Lines: 1
|
||||
spare
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/sync_action
|
||||
Lines: 1
|
||||
recover
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/sync_completed
|
||||
Lines: 1
|
||||
1569888 / 2093056
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/block/md6/md/uuid
|
||||
Lines: 1
|
||||
5f529b25-6efd-46e4-99a2-31f6f597be6b
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Directory: sys/bus
|
||||
Mode: 755
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -437,6 +1261,26 @@ Lines: 1
|
|||
100000
|
||||
Mode: 644
|
||||
# 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
|
||||
SymlinkTo: ../../devices/platform/bogus.0/hwmon/hwmon5/
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -1337,7 +2181,7 @@ Mode: 444
|
|||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/class/nvme/nvme0/model
|
||||
Lines: 1
|
||||
Samsung SSD 970 PRO 512GB
|
||||
Samsung SSD 970 PRO 512GB
|
||||
Mode: 444
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/class/nvme/nvme0/serial
|
||||
|
@ -2750,7 +3594,7 @@ Mode: 644
|
|||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/devices/platform/applesmc.768/fan1_label
|
||||
Lines: 1
|
||||
Left side
|
||||
Left side
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/devices/platform/applesmc.768/fan1_manual
|
||||
|
@ -2784,7 +3628,7 @@ Mode: 644
|
|||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/devices/platform/applesmc.768/fan2_label
|
||||
Lines: 1
|
||||
Right side
|
||||
Right side
|
||||
Mode: 644
|
||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Path: sys/devices/platform/applesmc.768/fan2_manual
|
||||
|
|
|
@ -44,7 +44,7 @@ var (
|
|||
hwmonSensorTypes = []string{
|
||||
"vrm", "beep_enable", "update_interval", "in", "cpu", "fan",
|
||||
"pwm", "temp", "curr", "power", "energy", "humidity",
|
||||
"intrusion",
|
||||
"intrusion", "freq",
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -357,6 +357,15 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
|
|||
continue
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
desc := prometheus.NewDesc(name, "Hardware monitor "+sensorType+" element "+element, hwmonLabelDesc, nil)
|
||||
|
|
|
@ -18,9 +18,10 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type interruptsCollector struct {
|
||||
|
|
|
@ -21,6 +21,8 @@ import (
|
|||
"strconv"
|
||||
"unsafe"
|
||||
|
||||
"github.com/prometheus/node_exporter/collector/utils"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
@ -49,7 +51,7 @@ func intr(idx _C_int) (itr interrupt, err error) {
|
|||
return
|
||||
}
|
||||
dev := *(*[128]byte)(unsafe.Pointer(&buf[0]))
|
||||
itr.device = string(dev[:])
|
||||
itr.device = utils.SafeBytesToString(dev[:])
|
||||
|
||||
mib[2] = KERN_INTRCNT_VECTOR
|
||||
buf, err = sysctl(mib[:])
|
||||
|
|
|
@ -22,6 +22,8 @@ import (
|
|||
"log/slog"
|
||||
"os"
|
||||
|
||||
"github.com/prometheus/procfs/sysfs"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs"
|
||||
)
|
||||
|
@ -98,17 +100,30 @@ var (
|
|||
[]string{"device"},
|
||||
nil,
|
||||
)
|
||||
|
||||
mdraidDisks = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, "md", "raid_disks"),
|
||||
"Number of raid disks on device.",
|
||||
[]string{"device"},
|
||||
nil,
|
||||
)
|
||||
|
||||
mdraidDegradedDisksDesc = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, "md", "degraded"),
|
||||
"Number of degraded disks on device.",
|
||||
[]string{"device"},
|
||||
nil,
|
||||
)
|
||||
)
|
||||
|
||||
func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
fs, err := procfs.NewFS(*procPath)
|
||||
procFS, err := procfs.NewFS(*procPath)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open procfs: %w", err)
|
||||
}
|
||||
|
||||
mdStats, err := fs.MDStat()
|
||||
|
||||
mdStats, err := procFS.MDStat()
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
c.logger.Debug("Not collecting mdstat, file does not exist", "file", *procPath)
|
||||
|
@ -201,5 +216,34 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
)
|
||||
}
|
||||
|
||||
sysFS, err := sysfs.NewFS(*sysPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open sysfs: %w", err)
|
||||
}
|
||||
mdraids, err := sysFS.Mdraids()
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
c.logger.Debug("Not collecting mdraids, file does not exist", "file", *sysPath)
|
||||
return ErrNoData
|
||||
}
|
||||
|
||||
return fmt.Errorf("error parsing mdraids: %w", err)
|
||||
}
|
||||
|
||||
for _, mdraid := range mdraids {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
mdraidDisks,
|
||||
prometheus.GaugeValue,
|
||||
float64(mdraid.Disks),
|
||||
mdraid.Device,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
mdraidDegradedDisksDesc,
|
||||
prometheus.GaugeValue,
|
||||
float64(mdraid.DegradedDisks),
|
||||
mdraid.Device,
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
294
collector/mdadm_linux_test.go
Normal file
294
collector/mdadm_linux_test.go
Normal file
|
@ -0,0 +1,294 @@
|
|||
// Copyright 2024 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build !nomdadm
|
||||
// +build !nomdadm
|
||||
|
||||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/testutil"
|
||||
)
|
||||
|
||||
type testMdadmCollector struct {
|
||||
mc Collector
|
||||
}
|
||||
|
||||
func (c testMdadmCollector) Collect(ch chan<- prometheus.Metric) {
|
||||
c.mc.Update(ch)
|
||||
}
|
||||
|
||||
func (c testMdadmCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||
prometheus.DescribeByCollect(c, ch)
|
||||
}
|
||||
|
||||
func NewTestMdadmCollector(logger *slog.Logger) (prometheus.Collector, error) {
|
||||
mc, err := NewMdadmCollector(logger)
|
||||
if err != nil {
|
||||
return testMdadmCollector{}, err
|
||||
}
|
||||
return &testMdadmCollector{mc}, nil
|
||||
}
|
||||
|
||||
func TestMdadmStats(t *testing.T) {
|
||||
*sysPath = "fixtures/sys"
|
||||
*procPath = "fixtures/proc"
|
||||
testcase := `# HELP node_md_blocks Total number of blocks on device.
|
||||
# TYPE node_md_blocks gauge
|
||||
node_md_blocks{device="md0"} 248896
|
||||
node_md_blocks{device="md00"} 4.186624e+06
|
||||
node_md_blocks{device="md10"} 3.14159265e+08
|
||||
node_md_blocks{device="md101"} 322560
|
||||
node_md_blocks{device="md11"} 4.190208e+06
|
||||
node_md_blocks{device="md12"} 3.886394368e+09
|
||||
node_md_blocks{device="md120"} 2.095104e+06
|
||||
node_md_blocks{device="md126"} 1.855870976e+09
|
||||
node_md_blocks{device="md127"} 3.12319552e+08
|
||||
node_md_blocks{device="md201"} 1.993728e+06
|
||||
node_md_blocks{device="md219"} 7932
|
||||
node_md_blocks{device="md3"} 5.853468288e+09
|
||||
node_md_blocks{device="md4"} 4.883648e+06
|
||||
node_md_blocks{device="md6"} 1.95310144e+08
|
||||
node_md_blocks{device="md7"} 7.813735424e+09
|
||||
node_md_blocks{device="md8"} 1.95310144e+08
|
||||
node_md_blocks{device="md9"} 523968
|
||||
# HELP node_md_blocks_synced Number of blocks synced on device.
|
||||
# TYPE node_md_blocks_synced gauge
|
||||
node_md_blocks_synced{device="md0"} 248896
|
||||
node_md_blocks_synced{device="md00"} 4.186624e+06
|
||||
node_md_blocks_synced{device="md10"} 3.14159265e+08
|
||||
node_md_blocks_synced{device="md101"} 322560
|
||||
node_md_blocks_synced{device="md11"} 0
|
||||
node_md_blocks_synced{device="md12"} 3.886394368e+09
|
||||
node_md_blocks_synced{device="md120"} 2.095104e+06
|
||||
node_md_blocks_synced{device="md126"} 1.855870976e+09
|
||||
node_md_blocks_synced{device="md127"} 3.12319552e+08
|
||||
node_md_blocks_synced{device="md201"} 114176
|
||||
node_md_blocks_synced{device="md219"} 7932
|
||||
node_md_blocks_synced{device="md3"} 5.853468288e+09
|
||||
node_md_blocks_synced{device="md4"} 4.883648e+06
|
||||
node_md_blocks_synced{device="md6"} 1.6775552e+07
|
||||
node_md_blocks_synced{device="md7"} 7.813735424e+09
|
||||
node_md_blocks_synced{device="md8"} 1.6775552e+07
|
||||
node_md_blocks_synced{device="md9"} 0
|
||||
# HELP node_md_degraded Number of degraded disks on device.
|
||||
# TYPE node_md_degraded gauge
|
||||
node_md_degraded{device="md0"} 0
|
||||
node_md_degraded{device="md1"} 0
|
||||
node_md_degraded{device="md10"} 0
|
||||
node_md_degraded{device="md4"} 0
|
||||
node_md_degraded{device="md5"} 1
|
||||
node_md_degraded{device="md6"} 1
|
||||
# HELP node_md_disks Number of active/failed/spare disks of device.
|
||||
# TYPE node_md_disks gauge
|
||||
node_md_disks{device="md0",state="active"} 2
|
||||
node_md_disks{device="md0",state="failed"} 0
|
||||
node_md_disks{device="md0",state="spare"} 0
|
||||
node_md_disks{device="md00",state="active"} 1
|
||||
node_md_disks{device="md00",state="failed"} 0
|
||||
node_md_disks{device="md00",state="spare"} 0
|
||||
node_md_disks{device="md10",state="active"} 2
|
||||
node_md_disks{device="md10",state="failed"} 0
|
||||
node_md_disks{device="md10",state="spare"} 0
|
||||
node_md_disks{device="md101",state="active"} 3
|
||||
node_md_disks{device="md101",state="failed"} 0
|
||||
node_md_disks{device="md101",state="spare"} 0
|
||||
node_md_disks{device="md11",state="active"} 2
|
||||
node_md_disks{device="md11",state="failed"} 1
|
||||
node_md_disks{device="md11",state="spare"} 2
|
||||
node_md_disks{device="md12",state="active"} 2
|
||||
node_md_disks{device="md12",state="failed"} 0
|
||||
node_md_disks{device="md12",state="spare"} 0
|
||||
node_md_disks{device="md120",state="active"} 2
|
||||
node_md_disks{device="md120",state="failed"} 0
|
||||
node_md_disks{device="md120",state="spare"} 0
|
||||
node_md_disks{device="md126",state="active"} 2
|
||||
node_md_disks{device="md126",state="failed"} 0
|
||||
node_md_disks{device="md126",state="spare"} 0
|
||||
node_md_disks{device="md127",state="active"} 2
|
||||
node_md_disks{device="md127",state="failed"} 0
|
||||
node_md_disks{device="md127",state="spare"} 0
|
||||
node_md_disks{device="md201",state="active"} 2
|
||||
node_md_disks{device="md201",state="failed"} 0
|
||||
node_md_disks{device="md201",state="spare"} 0
|
||||
node_md_disks{device="md219",state="active"} 0
|
||||
node_md_disks{device="md219",state="failed"} 0
|
||||
node_md_disks{device="md219",state="spare"} 3
|
||||
node_md_disks{device="md3",state="active"} 8
|
||||
node_md_disks{device="md3",state="failed"} 0
|
||||
node_md_disks{device="md3",state="spare"} 2
|
||||
node_md_disks{device="md4",state="active"} 0
|
||||
node_md_disks{device="md4",state="failed"} 1
|
||||
node_md_disks{device="md4",state="spare"} 1
|
||||
node_md_disks{device="md6",state="active"} 1
|
||||
node_md_disks{device="md6",state="failed"} 1
|
||||
node_md_disks{device="md6",state="spare"} 1
|
||||
node_md_disks{device="md7",state="active"} 3
|
||||
node_md_disks{device="md7",state="failed"} 1
|
||||
node_md_disks{device="md7",state="spare"} 0
|
||||
node_md_disks{device="md8",state="active"} 2
|
||||
node_md_disks{device="md8",state="failed"} 0
|
||||
node_md_disks{device="md8",state="spare"} 2
|
||||
node_md_disks{device="md9",state="active"} 4
|
||||
node_md_disks{device="md9",state="failed"} 2
|
||||
node_md_disks{device="md9",state="spare"} 1
|
||||
# HELP node_md_disks_required Total number of disks of device.
|
||||
# TYPE node_md_disks_required gauge
|
||||
node_md_disks_required{device="md0"} 2
|
||||
node_md_disks_required{device="md00"} 1
|
||||
node_md_disks_required{device="md10"} 2
|
||||
node_md_disks_required{device="md101"} 3
|
||||
node_md_disks_required{device="md11"} 2
|
||||
node_md_disks_required{device="md12"} 2
|
||||
node_md_disks_required{device="md120"} 2
|
||||
node_md_disks_required{device="md126"} 2
|
||||
node_md_disks_required{device="md127"} 2
|
||||
node_md_disks_required{device="md201"} 2
|
||||
node_md_disks_required{device="md219"} 0
|
||||
node_md_disks_required{device="md3"} 8
|
||||
node_md_disks_required{device="md4"} 0
|
||||
node_md_disks_required{device="md6"} 2
|
||||
node_md_disks_required{device="md7"} 4
|
||||
node_md_disks_required{device="md8"} 2
|
||||
node_md_disks_required{device="md9"} 4
|
||||
# HELP node_md_raid_disks Number of raid disks on device.
|
||||
# TYPE node_md_raid_disks gauge
|
||||
node_md_raid_disks{device="md0"} 2
|
||||
node_md_raid_disks{device="md1"} 2
|
||||
node_md_raid_disks{device="md10"} 4
|
||||
node_md_raid_disks{device="md4"} 3
|
||||
node_md_raid_disks{device="md5"} 3
|
||||
node_md_raid_disks{device="md6"} 4
|
||||
# HELP node_md_state Indicates the state of md-device.
|
||||
# TYPE node_md_state gauge
|
||||
node_md_state{device="md0",state="active"} 1
|
||||
node_md_state{device="md0",state="check"} 0
|
||||
node_md_state{device="md0",state="inactive"} 0
|
||||
node_md_state{device="md0",state="recovering"} 0
|
||||
node_md_state{device="md0",state="resync"} 0
|
||||
node_md_state{device="md00",state="active"} 1
|
||||
node_md_state{device="md00",state="check"} 0
|
||||
node_md_state{device="md00",state="inactive"} 0
|
||||
node_md_state{device="md00",state="recovering"} 0
|
||||
node_md_state{device="md00",state="resync"} 0
|
||||
node_md_state{device="md10",state="active"} 1
|
||||
node_md_state{device="md10",state="check"} 0
|
||||
node_md_state{device="md10",state="inactive"} 0
|
||||
node_md_state{device="md10",state="recovering"} 0
|
||||
node_md_state{device="md10",state="resync"} 0
|
||||
node_md_state{device="md101",state="active"} 1
|
||||
node_md_state{device="md101",state="check"} 0
|
||||
node_md_state{device="md101",state="inactive"} 0
|
||||
node_md_state{device="md101",state="recovering"} 0
|
||||
node_md_state{device="md101",state="resync"} 0
|
||||
node_md_state{device="md11",state="active"} 0
|
||||
node_md_state{device="md11",state="check"} 0
|
||||
node_md_state{device="md11",state="inactive"} 0
|
||||
node_md_state{device="md11",state="recovering"} 0
|
||||
node_md_state{device="md11",state="resync"} 1
|
||||
node_md_state{device="md12",state="active"} 1
|
||||
node_md_state{device="md12",state="check"} 0
|
||||
node_md_state{device="md12",state="inactive"} 0
|
||||
node_md_state{device="md12",state="recovering"} 0
|
||||
node_md_state{device="md12",state="resync"} 0
|
||||
node_md_state{device="md120",state="active"} 1
|
||||
node_md_state{device="md120",state="check"} 0
|
||||
node_md_state{device="md120",state="inactive"} 0
|
||||
node_md_state{device="md120",state="recovering"} 0
|
||||
node_md_state{device="md120",state="resync"} 0
|
||||
node_md_state{device="md126",state="active"} 1
|
||||
node_md_state{device="md126",state="check"} 0
|
||||
node_md_state{device="md126",state="inactive"} 0
|
||||
node_md_state{device="md126",state="recovering"} 0
|
||||
node_md_state{device="md126",state="resync"} 0
|
||||
node_md_state{device="md127",state="active"} 1
|
||||
node_md_state{device="md127",state="check"} 0
|
||||
node_md_state{device="md127",state="inactive"} 0
|
||||
node_md_state{device="md127",state="recovering"} 0
|
||||
node_md_state{device="md127",state="resync"} 0
|
||||
node_md_state{device="md201",state="active"} 0
|
||||
node_md_state{device="md201",state="check"} 1
|
||||
node_md_state{device="md201",state="inactive"} 0
|
||||
node_md_state{device="md201",state="recovering"} 0
|
||||
node_md_state{device="md201",state="resync"} 0
|
||||
node_md_state{device="md219",state="active"} 0
|
||||
node_md_state{device="md219",state="check"} 0
|
||||
node_md_state{device="md219",state="inactive"} 1
|
||||
node_md_state{device="md219",state="recovering"} 0
|
||||
node_md_state{device="md219",state="resync"} 0
|
||||
node_md_state{device="md3",state="active"} 1
|
||||
node_md_state{device="md3",state="check"} 0
|
||||
node_md_state{device="md3",state="inactive"} 0
|
||||
node_md_state{device="md3",state="recovering"} 0
|
||||
node_md_state{device="md3",state="resync"} 0
|
||||
node_md_state{device="md4",state="active"} 0
|
||||
node_md_state{device="md4",state="check"} 0
|
||||
node_md_state{device="md4",state="inactive"} 1
|
||||
node_md_state{device="md4",state="recovering"} 0
|
||||
node_md_state{device="md4",state="resync"} 0
|
||||
node_md_state{device="md6",state="active"} 0
|
||||
node_md_state{device="md6",state="check"} 0
|
||||
node_md_state{device="md6",state="inactive"} 0
|
||||
node_md_state{device="md6",state="recovering"} 1
|
||||
node_md_state{device="md6",state="resync"} 0
|
||||
node_md_state{device="md7",state="active"} 1
|
||||
node_md_state{device="md7",state="check"} 0
|
||||
node_md_state{device="md7",state="inactive"} 0
|
||||
node_md_state{device="md7",state="recovering"} 0
|
||||
node_md_state{device="md7",state="resync"} 0
|
||||
node_md_state{device="md8",state="active"} 0
|
||||
node_md_state{device="md8",state="check"} 0
|
||||
node_md_state{device="md8",state="inactive"} 0
|
||||
node_md_state{device="md8",state="recovering"} 0
|
||||
node_md_state{device="md8",state="resync"} 1
|
||||
node_md_state{device="md9",state="active"} 0
|
||||
node_md_state{device="md9",state="check"} 0
|
||||
node_md_state{device="md9",state="inactive"} 0
|
||||
node_md_state{device="md9",state="recovering"} 0
|
||||
node_md_state{device="md9",state="resync"} 1
|
||||
`
|
||||
logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
||||
Level: slog.LevelError,
|
||||
AddSource: true,
|
||||
}))
|
||||
collector, err := NewMdadmCollector(logger)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
c, err := NewTestMdadmCollector(logger)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
reg := prometheus.NewRegistry()
|
||||
reg.MustRegister(c)
|
||||
|
||||
sink := make(chan prometheus.Metric)
|
||||
go func() {
|
||||
err := collector.Update(sink)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
close(sink)
|
||||
}()
|
||||
|
||||
err = testutil.GatherAndCompare(reg, strings.NewReader(testcase))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
|
@ -40,8 +40,12 @@ func (c *meminfoCollector) getMemInfo() (map[string]float64, error) {
|
|||
}
|
||||
|
||||
return map[string]float64{
|
||||
"total_bytes": float64(stats.RealTotal * 4096),
|
||||
"free_bytes": float64(stats.RealFree * 4096),
|
||||
"available_bytes": float64(stats.RealAvailable * 4096),
|
||||
"total_bytes": float64(stats.RealTotal * 4096),
|
||||
"free_bytes": float64(stats.RealFree * 4096),
|
||||
"available_bytes": float64(stats.RealAvailable * 4096),
|
||||
"process_bytes": float64(stats.RealProcess * 4096),
|
||||
"paging_space_total_bytes": float64(stats.PgSpTotal * 4096),
|
||||
"paging_space_free_bytes": float64(stats.PgSpFree * 4096),
|
||||
"page_scans_total": float64(stats.Scans),
|
||||
}, nil
|
||||
}
|
||||
|
|
|
@ -32,16 +32,20 @@ func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, err
|
|||
|
||||
for _, stat := range stats {
|
||||
netDev[stat.Name] = map[string]uint64{
|
||||
"receive_packets": uint64(stat.RxPackets),
|
||||
"transmit_packets": uint64(stat.TxPackets),
|
||||
"receive_bytes": uint64(stat.RxBytes),
|
||||
"transmit_bytes": uint64(stat.TxBytes),
|
||||
"receive_errors": uint64(stat.RxErrors),
|
||||
"transmit_errors": uint64(stat.TxErrors),
|
||||
"receive_dropped": uint64(stat.RxPacketsDropped),
|
||||
"transmit_dropped": uint64(stat.TxPacketsDropped),
|
||||
"receive_multicast": uint64(stat.RxMulticastPackets),
|
||||
"transmit_multicast": uint64(stat.TxMulticastPackets),
|
||||
"receive_bytes": uint64(stat.RxBytes),
|
||||
"receive_dropped": uint64(stat.RxPacketsDropped),
|
||||
"receive_errors": uint64(stat.RxErrors),
|
||||
"receive_multicast": uint64(stat.RxMulticastPackets),
|
||||
"receive_packets": uint64(stat.RxPackets),
|
||||
"receive_collision_errors": uint64(stat.RxCollisionErrors),
|
||||
"transmit_bytes": uint64(stat.TxBytes),
|
||||
"transmit_dropped": uint64(stat.TxPacketsDropped),
|
||||
"transmit_errors": uint64(stat.TxErrors),
|
||||
"transmit_multicast": uint64(stat.TxMulticastPackets),
|
||||
"transmit_packets": uint64(stat.TxPackets),
|
||||
"transmit_queue_overflow": uint64(stat.TxQueueOverflow),
|
||||
"transmit_collision_single_errors": uint64(stat.TxSingleCollisionCount),
|
||||
"transmit_collision_multiple_errors": uint64(stat.TxMultipleCollisionCount),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import (
|
|||
"fmt"
|
||||
"log/slog"
|
||||
"net"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
@ -71,51 +72,107 @@ func getIfaceData(index int) (*ifMsghdr2, error) {
|
|||
return nil, err
|
||||
}
|
||||
err = binary.Read(bytes.NewReader(rawData), binary.LittleEndian, &data)
|
||||
if err != nil {
|
||||
return &data, err
|
||||
}
|
||||
|
||||
/*
|
||||
As of macOS Ventura 13.2.1, there’s a kernel bug which truncates traffic values at the 4GiB mark.
|
||||
This is a workaround to fetch the interface traffic metrics using a sysctl call.
|
||||
Apple wants to prevent fingerprinting by 3rdparty apps and might fix this bug in future which would break this implementation.
|
||||
*/
|
||||
mib := []int32{
|
||||
unix.CTL_NET,
|
||||
unix.AF_LINK,
|
||||
0, // NETLINK_GENERIC: functions not specific to a type of iface
|
||||
2, //IFMIB_IFDATA: per-interface data table
|
||||
int32(index),
|
||||
1, // IFDATA_GENERAL: generic stats for all kinds of ifaces
|
||||
}
|
||||
|
||||
var mibData ifMibData
|
||||
size := unsafe.Sizeof(mibData)
|
||||
|
||||
if _, _, errno := unix.Syscall6(
|
||||
unix.SYS___SYSCTL,
|
||||
uintptr(unsafe.Pointer(&mib[0])),
|
||||
uintptr(len(mib)),
|
||||
uintptr(unsafe.Pointer(&mibData)),
|
||||
uintptr(unsafe.Pointer(&size)),
|
||||
uintptr(unsafe.Pointer(nil)),
|
||||
0,
|
||||
); errno != 0 {
|
||||
return &data, err
|
||||
}
|
||||
|
||||
var ifdata ifData64
|
||||
err = binary.Read(bytes.NewReader(mibData.Data[:]), binary.LittleEndian, &ifdata)
|
||||
if err != nil {
|
||||
return &data, err
|
||||
}
|
||||
|
||||
data.Data.Ibytes = ifdata.Ibytes
|
||||
data.Data.Obytes = ifdata.Obytes
|
||||
return &data, err
|
||||
}
|
||||
|
||||
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if.h#L220-L232
|
||||
type ifMsghdr2 struct {
|
||||
Msglen uint16
|
||||
Version uint8
|
||||
Type uint8
|
||||
Addrs int32
|
||||
Flags int32
|
||||
Index uint16
|
||||
_ [2]byte
|
||||
SndLen int32
|
||||
SndMaxlen int32
|
||||
SndDrops int32
|
||||
Timer int32
|
||||
Data ifData64
|
||||
Msglen uint16 // to skip over non-understood messages
|
||||
Version uint8 // future binary compatabilit
|
||||
Type uint8 // message type
|
||||
Addrs int32 // like rtm_addrs
|
||||
Flags int32 // value of if_flags
|
||||
Index uint16 // index for associated ifp
|
||||
_ [2]byte // padding for alignment
|
||||
SndLen int32 // instantaneous length of send queue
|
||||
SndMaxlen int32 // maximum length of send queue
|
||||
SndDrops int32 // number of drops in send queue
|
||||
Timer int32 // time until if_watchdog called
|
||||
Data ifData64 // statistics and other data
|
||||
}
|
||||
|
||||
// https://github.com/apple/darwin-xnu/blob/main/bsd/net/if_var.h#L199-L231
|
||||
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if_var.h#L207-L235
|
||||
type ifData64 struct {
|
||||
Type uint8
|
||||
Typelen uint8
|
||||
Physical uint8
|
||||
Addrlen uint8
|
||||
Hdrlen uint8
|
||||
Recvquota uint8
|
||||
Xmitquota uint8
|
||||
Unused1 uint8
|
||||
Mtu uint32
|
||||
Metric uint32
|
||||
Baudrate uint64
|
||||
Ipackets uint64
|
||||
Ierrors uint64
|
||||
Opackets uint64
|
||||
Oerrors uint64
|
||||
Collisions uint64
|
||||
Ibytes uint64
|
||||
Obytes uint64
|
||||
Imcasts uint64
|
||||
Omcasts uint64
|
||||
Iqdrops uint64
|
||||
Noproto uint64
|
||||
Recvtiming uint32
|
||||
Xmittiming uint32
|
||||
Lastchange unix.Timeval32
|
||||
Type uint8 // ethernet, tokenring, etc
|
||||
Typelen uint8 // Length of frame type id
|
||||
Physical uint8 // e.g., AUI, Thinnet, 10base-T, etc
|
||||
Addrlen uint8 // media address length
|
||||
Hdrlen uint8 // media header length
|
||||
Recvquota uint8 // polling quota for receive intrs
|
||||
Xmitquota uint8 // polling quota for xmit intrs
|
||||
Unused1 uint8 // for future use
|
||||
Mtu uint32 // maximum transmission unit
|
||||
Metric uint32 // routing metric (external only)
|
||||
Baudrate uint64 // linespeed
|
||||
|
||||
// volatile statistics
|
||||
Ipackets uint64 // packets received on interface
|
||||
Ierrors uint64 // input errors on interface
|
||||
Opackets uint64 // packets sent on interface
|
||||
Oerrors uint64 // output errors on interface
|
||||
Collisions uint64 // collisions on csma interfaces
|
||||
Ibytes uint64 // total number of octets received
|
||||
Obytes uint64 // total number of octets sent
|
||||
Imcasts uint64 // packets received via multicast
|
||||
Omcasts uint64 // packets sent via multicast
|
||||
Iqdrops uint64 // dropped on input, this interface
|
||||
Noproto uint64 // destined for unsupported protocol
|
||||
Recvtiming uint32 // usec spent receiving when timing
|
||||
Xmittiming uint32 // usec spent xmitting when timing
|
||||
Lastchange unix.Timeval32 // time of last administrative change
|
||||
}
|
||||
|
||||
// https://github.com/apple-oss-distributions/xnu/blob/main/bsd/net/if_mib.h#L65-L74
|
||||
type ifMibData struct {
|
||||
Name [16]byte // name of interface
|
||||
PCount uint32 // number of promiscuous listeners
|
||||
Flags uint32 // interface flags
|
||||
SendLength uint32 // instantaneous length of send queue
|
||||
MaxSendLength uint32 // maximum length of send queue
|
||||
SendDrops uint32 // number of drops in send queue
|
||||
_ [4]uint32 // for future expansion
|
||||
Data [128]byte // generic information and statistics
|
||||
}
|
||||
|
||||
func getNetDevLabels() (map[string]map[string]string, error) {
|
||||
|
|
86
collector/netinterface_aix.go
Normal file
86
collector/netinterface_aix.go
Normal file
|
@ -0,0 +1,86 @@
|
|||
// Copyright 2025 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build !nonetinterface
|
||||
// +build !nonetinterface
|
||||
|
||||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/power-devops/perfstat"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type netinterfaceCollector struct {
|
||||
logger *slog.Logger
|
||||
collisions *prometheus.Desc
|
||||
ibytes *prometheus.Desc
|
||||
ipackets *prometheus.Desc
|
||||
obytes *prometheus.Desc
|
||||
opackets *prometheus.Desc
|
||||
}
|
||||
|
||||
const (
|
||||
netinterfaceSubsystem = "netinterface"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registerCollector("netinterface", defaultEnabled, NewNetinterfaceCollector)
|
||||
}
|
||||
|
||||
func NewNetinterfaceCollector(logger *slog.Logger) (Collector, error) {
|
||||
labels := []string{"interface"}
|
||||
return &netinterfaceCollector{
|
||||
logger: logger,
|
||||
collisions: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "collisions_total"),
|
||||
"Total number of CSMA collisions on the interface.", labels, nil,
|
||||
),
|
||||
ibytes: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "receive_bytes_total"),
|
||||
"Total number of bytes received on the interface.", labels, nil,
|
||||
),
|
||||
ipackets: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "receive_packets_total"),
|
||||
"Total number of packets received on the interface.", labels, nil,
|
||||
),
|
||||
obytes: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "transmit_bytes_total"),
|
||||
"Total number of bytes transmitted on the interface.", labels, nil,
|
||||
),
|
||||
opackets: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, netinterfaceSubsystem, "transmit_packets_total"),
|
||||
"Total number of packets transmitted on the interface.", labels, nil,
|
||||
),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *netinterfaceCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
stats, err := perfstat.NetIfaceStat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, stat := range stats {
|
||||
iface := stat.Name
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.collisions, prometheus.CounterValue, float64(stat.Collisions), iface)
|
||||
ch <- prometheus.MustNewConstMetric(c.ibytes, prometheus.CounterValue, float64(stat.IBytes), iface)
|
||||
ch <- prometheus.MustNewConstMetric(c.ipackets, prometheus.CounterValue, float64(stat.IPackets), iface)
|
||||
ch <- prometheus.MustNewConstMetric(c.obytes, prometheus.CounterValue, float64(stat.OBytes), iface)
|
||||
ch <- prometheus.MustNewConstMetric(c.opackets, prometheus.CounterValue, float64(stat.OPackets), iface)
|
||||
}
|
||||
return nil
|
||||
}
|
108
collector/netstat_freebsd.go
Normal file
108
collector/netstat_freebsd.go
Normal file
|
@ -0,0 +1,108 @@
|
|||
// Copyright 2024 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build freebsd
|
||||
// +build freebsd
|
||||
|
||||
package collector
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"unsafe"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
/*
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netinet/tcp_var.h>
|
||||
#include <netinet/udp.h>
|
||||
*/
|
||||
import "C"
|
||||
|
||||
var (
|
||||
bsdNetstatTcpSendPacketsTotal = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, "netstat", "tcp_transmit_packets_total"),
|
||||
"TCP packets sent",
|
||||
nil, nil,
|
||||
)
|
||||
|
||||
bsdNetstatTcpRecvPacketsTotal = prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, "netstat", "tcp_receive_packets_total"),
|
||||
"TCP packets received",
|
||||
nil, nil,
|
||||
)
|
||||
)
|
||||
|
||||
type netStatCollector struct {
|
||||
netStatMetric *prometheus.Desc
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerCollector("netstat", defaultEnabled, NewNetStatCollector)
|
||||
}
|
||||
|
||||
func NewNetStatCollector(logger *slog.Logger) (Collector, error) {
|
||||
return &netStatCollector{}, nil
|
||||
}
|
||||
|
||||
func (c *netStatCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||
ch <- c.netStatMetric
|
||||
}
|
||||
|
||||
func (c *netStatCollector) Collect(ch chan<- prometheus.Metric) {
|
||||
_ = c.Update(ch)
|
||||
}
|
||||
|
||||
func getData(queryString string) ([]byte, error) {
|
||||
data, err := unix.SysctlRaw(queryString)
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(data) < int(unsafe.Sizeof(C.struct_tcpstat{})) {
|
||||
return nil, errors.New("Data Size mismatch")
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
|
||||
tcpData, err := getData("net.inet.tcp.stats")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tcpStats := *(*C.struct_tcpstat)(unsafe.Pointer(&tcpData[0]))
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
bsdNetstatTcpSendPacketsTotal,
|
||||
prometheus.CounterValue,
|
||||
float64(tcpStats.tcps_sndtotal),
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
bsdNetstatTcpRecvPacketsTotal,
|
||||
prometheus.CounterValue,
|
||||
float64(tcpStats.tcps_rcvtotal),
|
||||
)
|
||||
|
||||
return nil
|
||||
}
|
77
collector/netstat_freebsd_test.go
Normal file
77
collector/netstat_freebsd_test.go
Normal file
|
@ -0,0 +1,77 @@
|
|||
// Copyright 2024 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build freebsd
|
||||
// +build freebsd
|
||||
|
||||
package collector
|
||||
|
||||
import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/sys/unix"
|
||||
"testing"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func TestNetStatCollectorDescribe(t *testing.T) {
|
||||
ch := make(chan *prometheus.Desc, 1)
|
||||
collector := &netStatCollector{
|
||||
netStatMetric: prometheus.NewDesc("dummy_metric", "dummy", nil, nil),
|
||||
}
|
||||
collector.Describe(ch)
|
||||
desc := <-ch
|
||||
|
||||
if want, got := "dummy_metric", desc.String(); want != got {
|
||||
t.Errorf("want %s, got %s", want, got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetData(t *testing.T) {
|
||||
data, err := getData("net.inet.tcp.stats")
|
||||
if err != nil {
|
||||
t.Fatal("unexpected error:", err)
|
||||
}
|
||||
|
||||
if got, want := len(data), int(unsafe.Sizeof(unix.TCPStats{})); got < want {
|
||||
t.Errorf("data length too small: want >= %d, got %d", want, got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNetStatCollectorUpdate(t *testing.T) {
|
||||
ch := make(chan prometheus.Metric, len(metrics))
|
||||
collector := &netStatCollector{
|
||||
netStatMetric: prometheus.NewDesc("netstat_metric", "NetStat Metric", nil, nil),
|
||||
}
|
||||
err := collector.Update(ch)
|
||||
if err != nil {
|
||||
t.Fatal("unexpected error:", err)
|
||||
}
|
||||
|
||||
if got, want := len(ch), len(metrics); got != want {
|
||||
t.Errorf("metric count mismatch: want %d, got %d", want, got)
|
||||
}
|
||||
|
||||
for range metrics {
|
||||
<-ch
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewNetStatCollector(t *testing.T) {
|
||||
collector, err := NewNetStatCollector(nil)
|
||||
if err != nil {
|
||||
t.Fatal("unexpected error:", err)
|
||||
}
|
||||
if collector == nil {
|
||||
t.Fatal("collector is nil, want non-nil")
|
||||
}
|
||||
}
|
118
collector/partition_aix.go
Normal file
118
collector/partition_aix.go
Normal file
|
@ -0,0 +1,118 @@
|
|||
// Copyright 2025 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build !nopartition
|
||||
// +build !nopartition
|
||||
|
||||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/power-devops/perfstat"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type partitionCollector struct {
|
||||
logger *slog.Logger
|
||||
entitledCapacity *prometheus.Desc
|
||||
memoryMax *prometheus.Desc
|
||||
memoryOnline *prometheus.Desc
|
||||
cpuOnline *prometheus.Desc
|
||||
cpuSys *prometheus.Desc
|
||||
cpuPool *prometheus.Desc
|
||||
powerSaveMode *prometheus.Desc
|
||||
smtThreads *prometheus.Desc
|
||||
}
|
||||
|
||||
const (
|
||||
partitionCollectorSubsystem = "partition"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registerCollector("partition", defaultEnabled, NewPartitionCollector)
|
||||
}
|
||||
|
||||
func NewPartitionCollector(logger *slog.Logger) (Collector, error) {
|
||||
return &partitionCollector{
|
||||
logger: logger,
|
||||
entitledCapacity: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "entitled_capacity"),
|
||||
"Entitled processor capacity of the partition in CPU units (e.g. 1.0 = one core).",
|
||||
nil, nil,
|
||||
),
|
||||
memoryMax: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "memory_max"),
|
||||
"Maximum memory of the partition in bytes.",
|
||||
nil, nil,
|
||||
),
|
||||
memoryOnline: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "memory_online"),
|
||||
"Online memory of the partition in bytes.",
|
||||
nil, nil,
|
||||
),
|
||||
cpuOnline: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_online"),
|
||||
"Number of online CPUs in the partition.",
|
||||
nil, nil,
|
||||
),
|
||||
cpuSys: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_sys"),
|
||||
"Number of physical CPUs in the system.",
|
||||
nil, nil,
|
||||
),
|
||||
cpuPool: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "cpus_pool"),
|
||||
"Number of physical CPUs in the pool.",
|
||||
nil, nil,
|
||||
),
|
||||
powerSaveMode: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "power_save_mode"),
|
||||
"Power save mode of the partition (1 for enabled, 0 for disabled).",
|
||||
nil, nil,
|
||||
),
|
||||
smtThreads: prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, partitionCollectorSubsystem, "smt_threads"),
|
||||
"Number of SMT threads per core.",
|
||||
nil, nil,
|
||||
),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *partitionCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
stats, err := perfstat.PartitionStat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
powerSaveMode := 0.0
|
||||
if stats.Conf.PowerSave {
|
||||
powerSaveMode = 1.0
|
||||
}
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.entitledCapacity, prometheus.GaugeValue, float64(stats.EntCapacity)/100.0)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.memoryMax, prometheus.GaugeValue, float64(stats.Mem.Max)*1024*1024)
|
||||
ch <- prometheus.MustNewConstMetric(c.memoryOnline, prometheus.GaugeValue, float64(stats.Mem.Online)*1024*1024)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.cpuOnline, prometheus.GaugeValue, float64(stats.VCpus.Online))
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.cpuSys, prometheus.GaugeValue, float64(stats.NumProcessors.Online))
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.cpuPool, prometheus.GaugeValue, float64(stats.ActiveCpusInPool))
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(c.powerSaveMode, prometheus.GaugeValue, powerSaveMode)
|
||||
ch <- prometheus.MustNewConstMetric(c.smtThreads, prometheus.GaugeValue, float64(stats.SmtThreads))
|
||||
|
||||
return nil
|
||||
}
|
|
@ -27,8 +27,15 @@ import (
|
|||
"github.com/prometheus/procfs"
|
||||
)
|
||||
|
||||
const (
|
||||
psiResourceCPU = "cpu"
|
||||
psiResourceIO = "io"
|
||||
psiResourceMemory = "memory"
|
||||
psiResourceIRQ = "irq"
|
||||
)
|
||||
|
||||
var (
|
||||
psiResources = []string{"cpu", "io", "memory", "irq"}
|
||||
psiResources = []string{psiResourceCPU, psiResourceIO, psiResourceMemory, psiResourceIRQ}
|
||||
)
|
||||
|
||||
type pressureStatsCollector struct {
|
||||
|
@ -93,13 +100,18 @@ func NewPressureStatsCollector(logger *slog.Logger) (Collector, error) {
|
|||
|
||||
// Update calls procfs.NewPSIStatsForResource for the different resources and updates the values
|
||||
func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
||||
foundResources := 0
|
||||
for _, res := range psiResources {
|
||||
c.logger.Debug("collecting statistics for resource", "resource", res)
|
||||
vals, err := c.fs.PSIStatsForResource(res)
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel")
|
||||
return ErrNoData
|
||||
if errors.Is(err, os.ErrNotExist) && res != psiResourceIRQ {
|
||||
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel", "resource", res)
|
||||
continue
|
||||
}
|
||||
if errors.Is(err, os.ErrNotExist) && res == psiResourceIRQ {
|
||||
c.logger.Debug("IRQ pressure information is unavailable, you need a Linux kernel >= 6.1 and/or CONFIG_PSI enabled for your kernel", "resource", res)
|
||||
continue
|
||||
}
|
||||
if errors.Is(err, syscall.ENOTSUP) {
|
||||
c.logger.Debug("pressure information is disabled, add psi=1 kernel command line to enable it")
|
||||
|
@ -109,28 +121,35 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
}
|
||||
// IRQ pressure does not have 'some' data.
|
||||
// See https://github.com/torvalds/linux/blob/v6.9/include/linux/psi_types.h#L65
|
||||
if vals.Some == nil && res != "irq" {
|
||||
if vals.Some == nil && res != psiResourceIRQ {
|
||||
c.logger.Debug("pressure information returned no 'some' data")
|
||||
return ErrNoData
|
||||
}
|
||||
if vals.Full == nil && res != "cpu" {
|
||||
if vals.Full == nil && res != psiResourceCPU {
|
||||
c.logger.Debug("pressure information returned no 'full' data")
|
||||
return ErrNoData
|
||||
}
|
||||
switch res {
|
||||
case "cpu":
|
||||
case psiResourceCPU:
|
||||
ch <- prometheus.MustNewConstMetric(c.cpu, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||
case "io":
|
||||
case psiResourceIO:
|
||||
ch <- prometheus.MustNewConstMetric(c.io, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||
ch <- prometheus.MustNewConstMetric(c.ioFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||
case "memory":
|
||||
case psiResourceMemory:
|
||||
ch <- prometheus.MustNewConstMetric(c.mem, prometheus.CounterValue, float64(vals.Some.Total)/1000.0/1000.0)
|
||||
ch <- prometheus.MustNewConstMetric(c.memFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||
case "irq":
|
||||
case psiResourceIRQ:
|
||||
ch <- prometheus.MustNewConstMetric(c.irqFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
|
||||
default:
|
||||
c.logger.Debug("did not account for resource", "resource", res)
|
||||
continue
|
||||
}
|
||||
foundResources++
|
||||
}
|
||||
|
||||
if foundResources == 0 {
|
||||
c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel")
|
||||
return ErrNoData
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
@ -106,7 +106,7 @@ func (c *processCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
|
||||
pidM, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to retrieve limit number of maximum pids alloved: %w", err)
|
||||
return fmt.Errorf("unable to retrieve limit number of maximum pids allowed: %w", err)
|
||||
}
|
||||
ch <- prometheus.MustNewConstMetric(c.pidUsed, prometheus.GaugeValue, float64(pids))
|
||||
ch <- prometheus.MustNewConstMetric(c.pidMax, prometheus.GaugeValue, float64(pidM))
|
||||
|
|
|
@ -48,7 +48,7 @@ func TestReadProcessStatus(t *testing.T) {
|
|||
}
|
||||
maxPid, err := readUintFromFile(procFilePath("sys/kernel/pid_max"))
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to retrieve limit number of maximum pids alloved %v\n", err)
|
||||
t.Fatalf("Unable to retrieve limit number of maximum pids allowed %v\n", err)
|
||||
}
|
||||
if uint64(pids) > maxPid || pids == 0 {
|
||||
t.Fatalf("Total running pids cannot be greater than %d or equals to 0", maxPid)
|
||||
|
|
|
@ -17,10 +17,11 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus-community/go-runit/runit"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
|
||||
|
|
|
@ -17,9 +17,10 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/opencontainers/selinux/go-selinux"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type selinuxCollector struct {
|
||||
|
|
|
@ -18,9 +18,10 @@ package collector
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/procfs"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type softirqsCollector struct {
|
||||
|
|
|
@ -74,6 +74,7 @@ type systemdCollector struct {
|
|||
socketCurrentConnectionsDesc *prometheus.Desc
|
||||
socketRefusedConnectionsDesc *prometheus.Desc
|
||||
systemdVersionDesc *prometheus.Desc
|
||||
virtualizationDesc *prometheus.Desc
|
||||
// Use regexps for more flexibility than device_filter.go allows
|
||||
systemdUnitIncludePattern *regexp.Regexp
|
||||
systemdUnitExcludePattern *regexp.Regexp
|
||||
|
@ -132,6 +133,9 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) {
|
|||
systemdVersionDesc := prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, subsystem, "version"),
|
||||
"Detected systemd version", []string{"version"}, nil)
|
||||
virtualizationDesc := prometheus.NewDesc(
|
||||
prometheus.BuildFQName(namespace, subsystem, "virtualization_info"),
|
||||
"Detected virtualization technology", []string{"virtualization_type"}, nil)
|
||||
|
||||
if *oldSystemdUnitExclude != "" {
|
||||
if !systemdUnitExcludeSet {
|
||||
|
@ -167,6 +171,7 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) {
|
|||
socketCurrentConnectionsDesc: socketCurrentConnectionsDesc,
|
||||
socketRefusedConnectionsDesc: socketRefusedConnectionsDesc,
|
||||
systemdVersionDesc: systemdVersionDesc,
|
||||
virtualizationDesc: virtualizationDesc,
|
||||
systemdUnitIncludePattern: systemdUnitIncludePattern,
|
||||
systemdUnitExcludePattern: systemdUnitExcludePattern,
|
||||
logger: logger,
|
||||
|
@ -194,6 +199,14 @@ func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
systemdVersionFull,
|
||||
)
|
||||
|
||||
systemdVirtualization := c.getSystemdVirtualization(conn)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.virtualizationDesc,
|
||||
prometheus.GaugeValue,
|
||||
1.0,
|
||||
systemdVirtualization,
|
||||
)
|
||||
|
||||
allUnits, err := c.getAllUnits(conn)
|
||||
if err != nil {
|
||||
return fmt.Errorf("couldn't get units: %w", err)
|
||||
|
@ -505,3 +518,19 @@ func (c *systemdCollector) getSystemdVersion(conn *dbus.Conn) (float64, string)
|
|||
}
|
||||
return v, version
|
||||
}
|
||||
|
||||
func (c *systemdCollector) getSystemdVirtualization(conn *dbus.Conn) string {
|
||||
virt, err := conn.GetManagerProperty("Virtualization")
|
||||
if err != nil {
|
||||
c.logger.Debug("Could not get Virtualization property", "err", err)
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
virtStr := strings.Trim(virt, `"`)
|
||||
if virtStr == "" {
|
||||
// If no virtualization type is returned, assume it's bare metal.
|
||||
return "none"
|
||||
}
|
||||
|
||||
return virtStr
|
||||
}
|
||||
|
|
|
@ -253,10 +253,16 @@ func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error {
|
|||
}
|
||||
}
|
||||
|
||||
mfHelp := make(map[string]*string)
|
||||
for _, mf := range parsedFamilies {
|
||||
if mf.Help == nil {
|
||||
if help, ok := mfHelp[*mf.Name]; ok {
|
||||
mf.Help = help
|
||||
continue
|
||||
}
|
||||
help := fmt.Sprintf("Metric read from %s", strings.Join(metricsNamesToFiles[*mf.Name], ", "))
|
||||
mf.Help = &help
|
||||
mfHelp[*mf.Name] = &help
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,8 @@ import (
|
|||
"log/slog"
|
||||
"unsafe"
|
||||
|
||||
"github.com/prometheus/node_exporter/collector/utils"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
|
@ -176,7 +178,7 @@ func mappingCFStringToString(s C.CFStringRef) string {
|
|||
buf := make([]byte, maxBufLen)
|
||||
var usedBufLen C.CFIndex
|
||||
_ = C.CFStringGetBytes(s, C.CFRange{0, length}, C.kCFStringEncodingUTF8, C.UInt8(0), C.false, (*C.UInt8)(&buf[0]), maxBufLen, &usedBufLen)
|
||||
return string(buf[:usedBufLen])
|
||||
return utils.SafeBytesToString(buf[:usedBufLen])
|
||||
}
|
||||
|
||||
func mappingCFNumberLongToInt(n C.CFNumberRef) int {
|
||||
|
|
|
@ -18,8 +18,9 @@
|
|||
package collector
|
||||
|
||||
import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"log/slog"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
var unameDesc = prometheus.NewDesc(
|
||||
|
@ -49,11 +50,11 @@ type uname struct {
|
|||
}
|
||||
|
||||
func init() {
|
||||
registerCollector("uname", defaultEnabled, newUnameCollector)
|
||||
registerCollector("uname", defaultEnabled, NewUnameCollector)
|
||||
}
|
||||
|
||||
// NewUnameCollector returns new unameCollector.
|
||||
func newUnameCollector(logger *slog.Logger) (Collector, error) {
|
||||
func NewUnameCollector(logger *slog.Logger) (Collector, error) {
|
||||
return &unameCollector{logger}, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,11 @@
|
|||
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func SafeDereference[T any](s ...*T) []T {
|
||||
var resolved []T
|
||||
for _, v := range s {
|
||||
|
@ -25,3 +30,18 @@ func SafeDereference[T any](s ...*T) []T {
|
|||
}
|
||||
return resolved
|
||||
}
|
||||
|
||||
// SafeBytesToString takes a slice of bytes and sanitizes it for Prometheus label
|
||||
// values.
|
||||
// * Terminate the string at the first null byte.
|
||||
// * Convert any invalid UTF-8 to "<22>".
|
||||
func SafeBytesToString(b []byte) string {
|
||||
var s string
|
||||
zeroIndex := bytes.IndexByte(b, 0)
|
||||
if zeroIndex == -1 {
|
||||
s = string(b)
|
||||
} else {
|
||||
s = string(b[:zeroIndex])
|
||||
}
|
||||
return strings.ToValidUTF8(s, "<22>")
|
||||
}
|
||||
|
|
30
collector/utils/utils_test.go
Normal file
30
collector/utils/utils_test.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
// Copyright 2025 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file ewcept in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSafeBytesToString(t *testing.T) {
|
||||
foo := []byte("foo\x00")
|
||||
if want, got := SafeBytesToString(foo), "foo"; want != got {
|
||||
t.Errorf("Expected: %s, Got: %s", want, got)
|
||||
}
|
||||
|
||||
foo = []byte{115, 97, 110, 101, 253, 190, 214}
|
||||
if want, got := SafeBytesToString(foo), "sane<6E>"; want != got {
|
||||
t.Errorf("Expected: %s, Got: %s", want, got)
|
||||
}
|
||||
}
|
|
@ -301,7 +301,8 @@ func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, h
|
|||
parseLine := false
|
||||
var zpoolName, datasetName string
|
||||
for scanner.Scan() {
|
||||
parts := strings.Fields(scanner.Text())
|
||||
line := scanner.Text()
|
||||
parts := strings.Fields(line)
|
||||
|
||||
if !parseLine && len(parts) == 3 && parts[0] == "name" && parts[1] == "type" && parts[2] == "data" {
|
||||
parseLine = true
|
||||
|
@ -315,7 +316,7 @@ func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, h
|
|||
zpoolPathElements := strings.Split(zpoolPath, "/")
|
||||
pathLen := len(zpoolPathElements)
|
||||
zpoolName = zpoolPathElements[pathLen-2]
|
||||
datasetName = parts[2]
|
||||
datasetName = line[strings.Index(line, parts[2]):]
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
|
@ -315,6 +315,55 @@ func TestZpoolParsing(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestZpoolObjsetParsingWithSpace(t *testing.T) {
|
||||
tests := []struct {
|
||||
path string
|
||||
expectedDataset string
|
||||
}{
|
||||
{
|
||||
path: "fixtures/proc/spl/kstat/zfs/pool1/objset-1",
|
||||
expectedDataset: "pool1",
|
||||
},
|
||||
{
|
||||
path: "fixtures/proc/spl/kstat/zfs/pool1/objset-2",
|
||||
expectedDataset: "pool1/dataset1",
|
||||
},
|
||||
{
|
||||
path: "fixtures/proc/spl/kstat/zfs/pool3/objset-1",
|
||||
expectedDataset: "pool3",
|
||||
},
|
||||
{
|
||||
path: "fixtures/proc/spl/kstat/zfs/pool3/objset-2",
|
||||
expectedDataset: "pool3/dataset with space",
|
||||
},
|
||||
}
|
||||
|
||||
c := zfsCollector{}
|
||||
|
||||
var handlerCalled bool
|
||||
for _, test := range tests {
|
||||
file, err := os.Open(test.path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
handlerCalled = false
|
||||
err = c.parsePoolObjsetFile(file, test.path, func(poolName string, datasetName string, s zfsSysctl, v uint64) {
|
||||
handlerCalled = true
|
||||
if test.expectedDataset != datasetName {
|
||||
t.Fatalf("Incorrectly parsed dataset name: expected: '%s', got: '%s'", test.expectedDataset, datasetName)
|
||||
}
|
||||
})
|
||||
file.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !handlerCalled {
|
||||
t.Fatalf("Zpool parsing handler was not called for '%s'", test.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestZpoolObjsetParsing(t *testing.T) {
|
||||
zpoolPaths, err := filepath.Glob("fixtures/proc/spl/kstat/zfs/*/objset-*")
|
||||
if err != nil {
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
(
|
||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpWarningThreshold)d
|
||||
and
|
||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[%(fsSpaceFillingUpPredictionWindow)s], 24*60*60) < 0
|
||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[%(fsSpaceFillingUpPredictionWindow)s], %(nodeWarningWindowHours)s*60*60) < 0
|
||||
and
|
||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||
)
|
||||
|
@ -20,7 +20,7 @@
|
|||
severity: 'warning',
|
||||
},
|
||||
annotations: {
|
||||
summary: 'Filesystem is predicted to run out of space within the next 24 hours.',
|
||||
summary: 'Filesystem is predicted to run out of space within the next %(nodeWarningWindowHours)s hours.' % $._config,
|
||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up.',
|
||||
},
|
||||
},
|
||||
|
@ -30,7 +30,7 @@
|
|||
(
|
||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_size_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < %(fsSpaceFillingUpCriticalThreshold)d
|
||||
and
|
||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 4*60*60) < 0
|
||||
predict_linear(node_filesystem_avail_bytes{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeCriticalWindowHours)s*60*60) < 0
|
||||
and
|
||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||
)
|
||||
|
@ -40,7 +40,7 @@
|
|||
severity: '%(nodeCriticalSeverity)s' % $._config,
|
||||
},
|
||||
annotations: {
|
||||
summary: 'Filesystem is predicted to run out of space within the next 4 hours.',
|
||||
summary: 'Filesystem is predicted to run out of space within the next %(nodeCriticalWindowHours)s hours.' % $._config,
|
||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up fast.',
|
||||
},
|
||||
},
|
||||
|
@ -86,7 +86,7 @@
|
|||
(
|
||||
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 40
|
||||
and
|
||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 24*60*60) < 0
|
||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeWarningWindowHours)s*60*60) < 0
|
||||
and
|
||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||
)
|
||||
|
@ -96,7 +96,7 @@
|
|||
severity: 'warning',
|
||||
},
|
||||
annotations: {
|
||||
summary: 'Filesystem is predicted to run out of inodes within the next 24 hours.',
|
||||
summary: 'Filesystem is predicted to run out of inodes within the next %(nodeWarningWindowHours)s hours.' % $._config,
|
||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up.',
|
||||
},
|
||||
},
|
||||
|
@ -106,7 +106,7 @@
|
|||
(
|
||||
node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} / node_filesystem_files{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} * 100 < 20
|
||||
and
|
||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], 4*60*60) < 0
|
||||
predict_linear(node_filesystem_files_free{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s}[6h], %(nodeCriticalWindowHours)s*60*60) < 0
|
||||
and
|
||||
node_filesystem_readonly{%(nodeExporterSelector)s,%(fsSelector)s,%(fsMountpointSelector)s} == 0
|
||||
)
|
||||
|
@ -116,7 +116,7 @@
|
|||
severity: '%(nodeCriticalSeverity)s' % $._config,
|
||||
},
|
||||
annotations: {
|
||||
summary: 'Filesystem is predicted to run out of inodes within the next 4 hours.',
|
||||
summary: 'Filesystem is predicted to run out of inodes within the next %(nodeCriticalWindowHours)s hours.' % $._config,
|
||||
description: 'Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up fast.',
|
||||
},
|
||||
},
|
||||
|
@ -191,7 +191,7 @@
|
|||
||| % $._config,
|
||||
annotations: {
|
||||
summary: 'Number of conntrack are getting close to the limit.',
|
||||
description: '{{ $value | humanizePercentage }} of conntrack entries are used.',
|
||||
description: '{{ $labels.instance }} {{ $value | humanizePercentage }} of conntrack entries are used.',
|
||||
},
|
||||
labels: {
|
||||
severity: 'warning',
|
||||
|
@ -312,7 +312,7 @@
|
|||
{
|
||||
alert: 'NodeCPUHighUsage',
|
||||
expr: |||
|
||||
sum without(mode) (avg without (cpu) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode!="idle"}[2m]))) * 100 > %(cpuHighUsageThreshold)d
|
||||
sum without(mode) (avg without (cpu) (rate(node_cpu_seconds_total{%(nodeExporterSelector)s, mode!~"idle|iowait"}[2m]))) * 100 > %(cpuHighUsageThreshold)d
|
||||
||| % $._config,
|
||||
'for': '15m',
|
||||
labels: {
|
||||
|
@ -407,6 +407,20 @@
|
|||
description: 'Systemd service {{ $labels.name }} has entered failed state at {{ $labels.instance }}',
|
||||
},
|
||||
},
|
||||
{
|
||||
alert: 'NodeSystemdServiceCrashlooping',
|
||||
expr: |||
|
||||
increase(node_systemd_service_restart_total{%(nodeExporterSelector)s}[5m]) > 2
|
||||
||| % $._config,
|
||||
'for': '15m',
|
||||
labels: {
|
||||
severity: 'warning',
|
||||
},
|
||||
annotations: {
|
||||
summary: 'Systemd service keeps restaring, possibly crash looping.',
|
||||
description: 'Systemd service {{ $labels.name }} has being restarted too many times at {{ $labels.instance }} for the last 15 minutes. Please check if service is crash looping.',
|
||||
},
|
||||
},
|
||||
{
|
||||
alert: 'NodeBondingDegraded',
|
||||
expr: |||
|
||||
|
|
|
@ -50,6 +50,16 @@
|
|||
// 'NodeSystemSaturation' alert.
|
||||
systemSaturationPerCoreThreshold: 2,
|
||||
|
||||
// Some of the alerts use predict_linear() to fire alerts ahead of time to
|
||||
// prevent unrecoverable situations (eg. no more disk space). However, the
|
||||
// node may have automatic processes (cronjobs) in place to prevent that
|
||||
// within a certain time window, this may not align with the default time
|
||||
// window of these alerts. This can cause these alerts to start flapping.
|
||||
// By reducing the time window, the system gets more time to
|
||||
// resolve this before problems occur.
|
||||
nodeWarningWindowHours: '24',
|
||||
nodeCriticalWindowHours: '4',
|
||||
|
||||
// Available disk space (%) thresholds on which to trigger the
|
||||
// 'NodeFilesystemSpaceFillingUp' alerts. These alerts fire if the disk
|
||||
// usage grows in a way that it is predicted to run out in 4h or 1d
|
||||
|
|
|
@ -1,469 +1,474 @@
|
|||
local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
|
||||
local grafana = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet';
|
||||
local dashboard = grafana.dashboard;
|
||||
local row = grafana.row;
|
||||
local prometheus = grafana.prometheus;
|
||||
local template = grafana.template;
|
||||
local graphPanel = grafana.graphPanel;
|
||||
local variable = dashboard.variable;
|
||||
local row = grafana.panel.row;
|
||||
local prometheus = grafana.query.prometheus;
|
||||
|
||||
local timeSeriesPanel = grafana.panel.timeSeries;
|
||||
local tsOptions = timeSeriesPanel.options;
|
||||
local tsStandardOptions = timeSeriesPanel.standardOptions;
|
||||
local tsQueryOptions = timeSeriesPanel.queryOptions;
|
||||
local tsCustom = timeSeriesPanel.fieldConfig.defaults.custom;
|
||||
local tsLegend = tsOptions.legend;
|
||||
|
||||
local c = import '../config.libsonnet';
|
||||
|
||||
local datasourceTemplate = {
|
||||
current: {
|
||||
text: 'default',
|
||||
value: 'default',
|
||||
},
|
||||
hide: 0,
|
||||
label: 'Data Source',
|
||||
name: 'datasource',
|
||||
options: [],
|
||||
query: 'prometheus',
|
||||
refresh: 1,
|
||||
regex: '',
|
||||
type: 'datasource',
|
||||
};
|
||||
local datasource = variable.datasource.new(
|
||||
'datasource', 'prometheus'
|
||||
);
|
||||
|
||||
local tsCommonPanelOptions =
|
||||
variable.query.withDatasourceFromVariable(datasource)
|
||||
+ tsCustom.stacking.withMode('normal')
|
||||
+ tsCustom.withFillOpacity(100)
|
||||
+ tsCustom.withShowPoints('never')
|
||||
+ tsLegend.withShowLegend(false)
|
||||
+ tsOptions.tooltip.withMode('multi')
|
||||
+ tsOptions.tooltip.withSort('desc');
|
||||
|
||||
local CPUUtilisation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'CPU Utilisation',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
local CPUSaturation =
|
||||
// TODO: Is this a useful panel? At least there should be some explanation how load
|
||||
// average relates to the "CPU saturation" in the title.
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'CPU Saturation (Load1 per CPU)',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
local memoryUtilisation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Memory Utilisation',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
local memorySaturation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Memory Saturation (Major Page Faults)',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='rds',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('rds');
|
||||
|
||||
local networkOverrides = tsStandardOptions.withOverrides(
|
||||
[
|
||||
tsStandardOptions.override.byRegexp.new('/Transmit/')
|
||||
+ tsStandardOptions.override.byRegexp.withPropertiesFromOptions(
|
||||
tsCustom.withTransform('negative-Y')
|
||||
),
|
||||
]
|
||||
);
|
||||
|
||||
local networkUtilisation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Network Utilisation (Bytes Receive/Transmit)',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='Bps',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
)
|
||||
.addSeriesOverride({ alias: '/Receive/', stack: 'A' })
|
||||
.addSeriesOverride({ alias: '/Transmit/', stack: 'B', transform: 'negative-Y' })
|
||||
{ tooltip+: { sort: 2 } };
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('Bps')
|
||||
+ networkOverrides;
|
||||
|
||||
local networkSaturation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Network Saturation (Drops Receive/Transmit)',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='Bps',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
)
|
||||
.addSeriesOverride({ alias: '/ Receive/', stack: 'A' })
|
||||
.addSeriesOverride({ alias: '/ Transmit/', stack: 'B', transform: 'negative-Y' })
|
||||
{ tooltip+: { sort: 2 } };
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('Bps')
|
||||
+ networkOverrides;
|
||||
|
||||
local diskIOUtilisation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Disk IO Utilisation',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
local diskIOSaturation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Disk IO Saturation',
|
||||
datasource='$datasource',
|
||||
span=6,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
local diskSpaceUtilisation =
|
||||
graphPanel.new(
|
||||
timeSeriesPanel.new(
|
||||
'Disk Space Utilisation',
|
||||
datasource='$datasource',
|
||||
span=12,
|
||||
format='percentunit',
|
||||
stack=true,
|
||||
fill=10,
|
||||
legend_show=false,
|
||||
) { tooltip+: { sort: 2 } };
|
||||
)
|
||||
+ tsCommonPanelOptions
|
||||
+ tsStandardOptions.withUnit('percentunit');
|
||||
|
||||
{
|
||||
_clusterTemplate:: template.new(
|
||||
name='cluster',
|
||||
datasource='$datasource',
|
||||
query='label_values(node_time_seconds, %s)' % $._config.clusterLabel,
|
||||
current='',
|
||||
hide=if $._config.showMultiCluster then '' else '2',
|
||||
refresh=2,
|
||||
includeAll=false,
|
||||
sort=1
|
||||
),
|
||||
_clusterVariable::
|
||||
variable.query.new('cluster')
|
||||
+ variable.query.withDatasourceFromVariable(datasource)
|
||||
+ variable.query.queryTypes.withLabelValues(
|
||||
$._config.clusterLabel,
|
||||
'node_time_seconds',
|
||||
)
|
||||
+ (if $._config.showMultiCluster then variable.query.generalOptions.showOnDashboard.withLabelAndValue() else variable.query.generalOptions.showOnDashboard.withNothing())
|
||||
+ variable.query.refresh.onTime()
|
||||
+ variable.query.selectionOptions.withIncludeAll(false)
|
||||
+ variable.query.withSort(asc=true),
|
||||
|
||||
grafanaDashboards+:: {
|
||||
'node-rsrc-use.json':
|
||||
|
||||
dashboard.new(
|
||||
'%sUSE Method / Node' % $._config.dashboardNamePrefix,
|
||||
time_from='now-1h',
|
||||
tags=($._config.dashboardTags),
|
||||
timezone='utc',
|
||||
refresh='30s',
|
||||
graphTooltip='shared_crosshair',
|
||||
uid=std.md5('node-rsrc-use.json')
|
||||
)
|
||||
.addTemplate(datasourceTemplate)
|
||||
.addTemplate($._clusterTemplate)
|
||||
.addTemplate(
|
||||
template.new(
|
||||
+ dashboard.time.withFrom('now-1h')
|
||||
+ dashboard.withTags($._config.dashboardTags)
|
||||
+ dashboard.withTimezone('utc')
|
||||
+ dashboard.withRefresh('30s')
|
||||
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||
+ dashboard.withUid(std.md5('node-rsrc-use.json'))
|
||||
+ dashboard.withVariables([
|
||||
datasource,
|
||||
$._clusterVariable,
|
||||
variable.query.new('instance')
|
||||
+ variable.query.withDatasourceFromVariable(datasource)
|
||||
+ variable.query.queryTypes.withLabelValues(
|
||||
'instance',
|
||||
'$datasource',
|
||||
'label_values(node_exporter_build_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}, instance)' % $._config,
|
||||
refresh='time',
|
||||
sort=1
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('CPU')
|
||||
.addPanel(CPUUtilisation.addTarget(prometheus.target('instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Utilisation')))
|
||||
.addPanel(CPUSaturation.addTarget(prometheus.target('instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Saturation')))
|
||||
)
|
||||
.addRow(
|
||||
row.new('Memory')
|
||||
.addPanel(memoryUtilisation.addTarget(prometheus.target('instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Utilisation')))
|
||||
.addPanel(memorySaturation.addTarget(prometheus.target('instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Major page Faults')))
|
||||
)
|
||||
.addRow(
|
||||
row.new('Network')
|
||||
.addPanel(
|
||||
networkUtilisation
|
||||
.addTarget(prometheus.target('instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Receive'))
|
||||
.addTarget(prometheus.target('instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Transmit'))
|
||||
)
|
||||
.addPanel(
|
||||
networkSaturation
|
||||
.addTarget(prometheus.target('instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Receive'))
|
||||
.addTarget(prometheus.target('instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='Transmit'))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk IO')
|
||||
.addPanel(diskIOUtilisation.addTarget(prometheus.target('instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{device}}')))
|
||||
.addPanel(diskIOSaturation.addTarget(prometheus.target('instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{device}}')))
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk Space')
|
||||
.addPanel(
|
||||
diskSpaceUtilisation.addTarget(prometheus.target(
|
||||
|||
|
||||
sort_desc(1 -
|
||||
(
|
||||
max without (mountpoint, fstype) (node_filesystem_avail_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||
/
|
||||
max without (mountpoint, fstype) (node_filesystem_size_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||
) != 0
|
||||
)
|
||||
||| % $._config, legendFormat='{{device}}'
|
||||
))
|
||||
'node_exporter_build_info{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config,
|
||||
)
|
||||
+ variable.query.refresh.onTime()
|
||||
+ variable.query.withSort(asc=true),
|
||||
])
|
||||
+ dashboard.withPanels(
|
||||
grafana.util.grid.makeGrid([
|
||||
row.new('CPU')
|
||||
+ row.withPanels([
|
||||
CPUUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Utilisation')]),
|
||||
CPUSaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Saturation')]),
|
||||
]),
|
||||
row.new('Memory')
|
||||
+ row.withPanels([
|
||||
memoryUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Utilisation')]),
|
||||
memorySaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Major page Faults')]),
|
||||
]),
|
||||
row.new('Network')
|
||||
+ row.withPanels([
|
||||
networkUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new('$datasource', 'instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Receive'),
|
||||
prometheus.new('$datasource', 'instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Transmit'),
|
||||
]),
|
||||
networkSaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new('$datasource', 'instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Receive'),
|
||||
prometheus.new('$datasource', 'instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('Transmit'),
|
||||
]),
|
||||
]),
|
||||
row.new('Disk IO')
|
||||
+ row.withPanels([
|
||||
diskIOUtilisation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('{{device}}')]),
|
||||
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new('$datasource', 'instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, instance="$instance", %(clusterLabel)s="$cluster"} != 0' % $._config) + prometheus.withLegendFormat('{{device}}')]),
|
||||
]),
|
||||
], panelWidth=12, panelHeight=7)
|
||||
+ grafana.util.grid.makeGrid([
|
||||
row.new('Disk Space')
|
||||
+ row.withPanels([
|
||||
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sort_desc(1 -
|
||||
(
|
||||
max without (mountpoint, fstype) (node_filesystem_avail_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||
/
|
||||
max without (mountpoint, fstype) (node_filesystem_size_bytes{%(nodeExporterSelector)s, fstype!="", instance="$instance", %(clusterLabel)s="$cluster"})
|
||||
) != 0
|
||||
)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{device}}'),
|
||||
]),
|
||||
]),
|
||||
], panelWidth=24, panelHeight=7, startY=34),
|
||||
),
|
||||
|
||||
'node-cluster-rsrc-use.json':
|
||||
dashboard.new(
|
||||
'%sUSE Method / Cluster' % $._config.dashboardNamePrefix,
|
||||
time_from='now-1h',
|
||||
tags=($._config.dashboardTags),
|
||||
timezone='utc',
|
||||
refresh='30s',
|
||||
graphTooltip='shared_crosshair',
|
||||
uid=std.md5('node-cluster-rsrc-use.json')
|
||||
)
|
||||
.addTemplate(datasourceTemplate)
|
||||
.addTemplate($._clusterTemplate)
|
||||
.addRow(
|
||||
row.new('CPU')
|
||||
.addPanel(
|
||||
CPUUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
((
|
||||
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
*
|
||||
instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
) != 0 )
|
||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
||| % $._config, legendFormat='{{ instance }}'
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
CPUSaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
(
|
||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config, legendFormat='{{instance}}'
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Memory')
|
||||
.addPanel(
|
||||
memoryUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
(
|
||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config, legendFormat='{{instance}}',
|
||||
))
|
||||
)
|
||||
.addPanel(memorySaturation.addTarget(prometheus.target('instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config, legendFormat='{{instance}}')))
|
||||
)
|
||||
.addRow(
|
||||
row.new('Network')
|
||||
.addPanel(
|
||||
networkUtilisation
|
||||
.addTarget(prometheus.target('instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Receive'))
|
||||
.addTarget(prometheus.target('instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Transmit'))
|
||||
)
|
||||
.addPanel(
|
||||
networkSaturation
|
||||
.addTarget(prometheus.target('instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Receive'))
|
||||
.addTarget(prometheus.target('instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config, legendFormat='{{instance}} Transmit'))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk IO')
|
||||
.addPanel(
|
||||
diskIOUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
(
|
||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config, legendFormat='{{instance}} {{device}}'
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
diskIOSaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
(
|
||||
+ dashboard.time.withFrom('now-1h')
|
||||
+ dashboard.withTags($._config.dashboardTags)
|
||||
+ dashboard.withTimezone('utc')
|
||||
+ dashboard.withRefresh('30s')
|
||||
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||
+ dashboard.withUid(std.md5('node-cluster-rsrc-use.json'))
|
||||
+ dashboard.withVariables([
|
||||
datasource,
|
||||
$._clusterVariable,
|
||||
])
|
||||
+ dashboard.withPanels(
|
||||
grafana.util.grid.makeGrid([
|
||||
row.new('CPU')
|
||||
+ row.withPanels([
|
||||
CPUUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
((
|
||||
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
*
|
||||
instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
) != 0 )
|
||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||
]),
|
||||
CPUSaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
(
|
||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||
]),
|
||||
]),
|
||||
row.new('Memory')
|
||||
+ row.withPanels([
|
||||
memoryUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
(
|
||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||
]),
|
||||
memorySaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
'instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}' % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||
]),
|
||||
]),
|
||||
row.new('Network')
|
||||
+ row.withPanels([
|
||||
networkUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
'instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} Receive'),
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
'instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} Transmit'),
|
||||
]),
|
||||
networkSaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
'instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} Receive'),
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
'instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"} != 0' % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} Transmit'),
|
||||
]),
|
||||
]),
|
||||
row.new('Disk IO')
|
||||
+ row.withPanels([
|
||||
diskIOUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} {{device}}'),
|
||||
]),
|
||||
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}
|
||||
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s, %(clusterLabel)s="$cluster"}))
|
||||
) != 0
|
||||
||| % $._config, legendFormat='{{instance}} {{device}}'
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk Space')
|
||||
.addPanel(
|
||||
diskSpaceUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum without (device) (
|
||||
max without (fstype, mountpoint) ((
|
||||
node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"}
|
||||
-
|
||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"}
|
||||
) != 0)
|
||||
)
|
||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"})))
|
||||
||| % $._config, legendFormat='{{instance}}'
|
||||
))
|
||||
)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }} {{device}}')]),
|
||||
]),
|
||||
], panelWidth=12, panelHeight=7)
|
||||
+ grafana.util.grid.makeGrid([
|
||||
row.new('Disk Space')
|
||||
+ row.withPanels([
|
||||
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum without (device) (
|
||||
max without (fstype, mountpoint) ((
|
||||
node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"}
|
||||
-
|
||||
node_filesystem_avail_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"}
|
||||
) != 0)
|
||||
)
|
||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s, %(clusterLabel)s="$cluster"})))
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{ instance }}'),
|
||||
]),
|
||||
]),
|
||||
], panelWidth=24, panelHeight=7, startY=34),
|
||||
),
|
||||
} +
|
||||
if $._config.showMultiCluster then {
|
||||
'node-multicluster-rsrc-use.json':
|
||||
dashboard.new(
|
||||
'%sUSE Method / Multi-cluster' % $._config.dashboardNamePrefix,
|
||||
time_from='now-1h',
|
||||
tags=($._config.dashboardTags),
|
||||
timezone='utc',
|
||||
refresh='30s',
|
||||
graphTooltip='shared_crosshair',
|
||||
uid=std.md5('node-multicluster-rsrc-use.json')
|
||||
)
|
||||
.addTemplate(datasourceTemplate)
|
||||
.addRow(
|
||||
row.new('CPU')
|
||||
.addPanel(
|
||||
CPUUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum(
|
||||
((
|
||||
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
*
|
||||
instance:node_num_cpu:sum{%(nodeExporterSelector)s}
|
||||
) != 0)
|
||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s}))
|
||||
) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
CPUSaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Memory')
|
||||
.addPanel(
|
||||
memoryUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
memorySaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Network')
|
||||
.addPanel(
|
||||
networkUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Receive' % $._config
|
||||
))
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Transmit' % $._config
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
networkSaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Receive' % $._config
|
||||
))
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} Transmit' % $._config
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk IO')
|
||||
.addPanel(
|
||||
diskIOUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s, device)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} {{device}}' % $._config
|
||||
))
|
||||
)
|
||||
.addPanel(
|
||||
diskIOSaturation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum((
|
||||
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s, device)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}} {{device}}' % $._config
|
||||
))
|
||||
)
|
||||
)
|
||||
.addRow(
|
||||
row.new('Disk Space')
|
||||
.addPanel(
|
||||
diskSpaceUtilisation
|
||||
.addTarget(prometheus.target(
|
||||
|||
|
||||
sum (
|
||||
sum without (device) (
|
||||
max without (fstype, mountpoint, instance, pod) ((
|
||||
node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s} - node_filesystem_avail_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s}
|
||||
) != 0)
|
||||
)
|
||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s})))
|
||||
) by (%(clusterLabel)s)
|
||||
||| % $._config, legendFormat='{{%(clusterLabel)s}}' % $._config
|
||||
))
|
||||
)
|
||||
+ dashboard.time.withFrom('now-1h')
|
||||
+ dashboard.withTags($._config.dashboardTags)
|
||||
+ dashboard.withTimezone('utc')
|
||||
+ dashboard.withRefresh('30s')
|
||||
+ dashboard.graphTooltip.withSharedCrosshair()
|
||||
+ dashboard.withUid(std.md5('node-multicluster-rsrc-use.json'))
|
||||
+ dashboard.withVariables([
|
||||
datasource,
|
||||
])
|
||||
+ dashboard.withPanels(
|
||||
grafana.util.grid.makeGrid([
|
||||
row.new('CPU')
|
||||
+ row.withPanels([
|
||||
CPUUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum(
|
||||
((
|
||||
instance:node_cpu_utilisation:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
*
|
||||
instance:node_num_cpu:sum{%(nodeExporterSelector)s}
|
||||
) != 0)
|
||||
/ scalar(sum(instance:node_num_cpu:sum{%(nodeExporterSelector)s}))
|
||||
) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||
]),
|
||||
CPUSaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance:node_load1_per_cpu:ratio{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||
]),
|
||||
]),
|
||||
row.new('Memory')
|
||||
+ row.withPanels([
|
||||
memoryUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance:node_memory_utilisation:ratio{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||
]),
|
||||
memorySaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_vmstat_pgmajfault:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
|||
|
||||
% $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||
]),
|
||||
]),
|
||||
row.new('Network')
|
||||
+ row.withPanels([
|
||||
networkUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_receive_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Receive'),
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_transmit_bytes_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Transmit'),
|
||||
]),
|
||||
networkSaturation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_receive_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Receive'),
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance:node_network_transmit_drop_excluding_lo:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
) != 0) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} Transmit'),
|
||||
]),
|
||||
]),
|
||||
row.new('Disk IO')
|
||||
+ row.withPanels([
|
||||
diskIOUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance_device:node_disk_io_time_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s, device)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} {{device}}'),
|
||||
]),
|
||||
diskIOSaturation + tsQueryOptions.withTargets([prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum((
|
||||
instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}
|
||||
/ scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate%(rateInterval)s{%(nodeExporterSelector)s}))
|
||||
) != 0) by (%(clusterLabel)s, device)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}} {{device}}')]),
|
||||
]),
|
||||
|
||||
], panelWidth=12, panelHeight=7)
|
||||
+ grafana.util.grid.makeGrid([
|
||||
row.new('Disk Space')
|
||||
+ row.withPanels([
|
||||
diskSpaceUtilisation + tsQueryOptions.withTargets([
|
||||
prometheus.new(
|
||||
'$datasource',
|
||||
|||
|
||||
sum (
|
||||
sum without (device) (
|
||||
max without (fstype, mountpoint, instance, pod) ((
|
||||
node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s} - node_filesystem_avail_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s}
|
||||
) != 0)
|
||||
)
|
||||
/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{%(nodeExporterSelector)s, %(fsSelector)s, %(fsMountpointSelector)s})))
|
||||
) by (%(clusterLabel)s)
|
||||
||| % $._config
|
||||
) + prometheus.withLegendFormat('{{%(clusterLabel)s}}'),
|
||||
]),
|
||||
]),
|
||||
], panelWidth=24, panelHeight=7, startY=34),
|
||||
),
|
||||
} else {},
|
||||
}
|
||||
|
|
|
@ -4,20 +4,11 @@
|
|||
{
|
||||
"source": {
|
||||
"git": {
|
||||
"remote": "https://github.com/grafana/grafonnet-lib.git",
|
||||
"subdir": "grafonnet"
|
||||
"remote": "https://github.com/grafana/grafonnet.git",
|
||||
"subdir": "gen/grafonnet-latest"
|
||||
}
|
||||
},
|
||||
"version": "master"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"git": {
|
||||
"remote": "https://github.com/grafana/grafonnet-lib.git",
|
||||
"subdir": "grafonnet-7.0"
|
||||
}
|
||||
},
|
||||
"version": "master"
|
||||
"version": "main"
|
||||
}
|
||||
],
|
||||
"legacyImports": false
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2,6 +2,38 @@
|
|||
|
||||
set -euf -o pipefail
|
||||
|
||||
# Allow setting GOHOSTOS for debugging purposes.
|
||||
GOHOSTOS=${GOHOSTOS:-$(go env GOHOSTOS)}
|
||||
|
||||
# Allow setting arch for debugging purposes.
|
||||
arch=${arch:-$(uname -m)}
|
||||
|
||||
maybe_flag_search_scope() {
|
||||
local collector=$1
|
||||
os_aux_os=""
|
||||
if [[ $GOHOSTOS =~ ^(freebsd|openbsd|netbsd|solaris|dragonfly)$ ]]; then
|
||||
os_aux_os=" ${collector}_bsd.go"
|
||||
fi
|
||||
echo "${collector}_common.go ${collector}.go ${collector}_${GOHOSTOS}.go ${collector}_${GOHOSTOS}_${arch}.go${os_aux_os}"
|
||||
}
|
||||
|
||||
supported_collectors() {
|
||||
local collectors=$1
|
||||
local supported=""
|
||||
for collector in ${collectors}; do
|
||||
for filename in $(maybe_flag_search_scope "${collector}"); do
|
||||
file="collector/${filename}"
|
||||
if ./tools/tools match ${file} > /dev/null 2>&1; then
|
||||
if grep -h -E -o -- "registerCollector\(" ${file} > /dev/null 2>&1; then
|
||||
supported="${supported} ${collector}"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
echo "${supported}" | tr ' ' '\n' | sort | uniq
|
||||
}
|
||||
|
||||
enabled_collectors=$(cat << COLLECTORS
|
||||
arp
|
||||
bcache
|
||||
|
@ -57,6 +89,8 @@ enabled_collectors=$(cat << COLLECTORS
|
|||
zoneinfo
|
||||
COLLECTORS
|
||||
)
|
||||
supported_enabled_collectors=$(supported_collectors "${enabled_collectors}")
|
||||
|
||||
disabled_collectors=$(cat << COLLECTORS
|
||||
selinux
|
||||
filesystem
|
||||
|
@ -64,6 +98,8 @@ disabled_collectors=$(cat << COLLECTORS
|
|||
uname
|
||||
COLLECTORS
|
||||
)
|
||||
supported_disabled_collectors=$(supported_collectors "${disabled_collectors}")
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
port="$((10000 + (RANDOM % 10000)))"
|
||||
|
@ -71,11 +107,9 @@ tmpdir=$(mktemp -d /tmp/node_exporter_e2e_test.XXXXXX)
|
|||
|
||||
skip_re="^(go_|node_exporter_build_info|node_scrape_collector_duration_seconds|process_|node_textfile_mtime_seconds|node_time_(zone|seconds)|node_network_(receive|transmit)_(bytes|packets)_total)"
|
||||
|
||||
arch="$(uname -m)"
|
||||
|
||||
case "${arch}" in
|
||||
aarch64|ppc64le) fixture='collector/fixtures/e2e-64k-page-output.txt' ;;
|
||||
*) fixture='collector/fixtures/e2e-output.txt' ;;
|
||||
aarch64|ppc64le) fixture_metrics='collector/fixtures/e2e-64k-page-output.txt' ;;
|
||||
*) fixture_metrics='collector/fixtures/e2e-output.txt' ;;
|
||||
esac
|
||||
|
||||
# Only test CPU info collection on x86_64.
|
||||
|
@ -109,7 +143,7 @@ do
|
|||
*)
|
||||
echo "Usage: $0 [-k] [-u] [-v]"
|
||||
echo " -k: keep temporary files and leave node_exporter running"
|
||||
echo " -u: update fixture"
|
||||
echo " -u: update fixture_metrics"
|
||||
echo " -v: verbose output"
|
||||
exit 1
|
||||
;;
|
||||
|
@ -122,37 +156,126 @@ then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
collector_flags=$(cat << FLAGS
|
||||
${cpu_info_collector}
|
||||
--collector.arp.device-exclude=nope
|
||||
--collector.bcache.priorityStats
|
||||
--collector.cpu.info.bugs-include=${cpu_info_bugs}
|
||||
--collector.cpu.info.flags-include=${cpu_info_flags}
|
||||
--collector.hwmon.chip-include=(applesmc|coretemp|hwmon4|nct6779)
|
||||
--collector.netclass.ignore-invalid-speed
|
||||
--collector.netclass.ignored-devices=(dmz|int)
|
||||
--collector.netdev.device-include=lo
|
||||
--collector.qdisc.device-include=(wlan0|eth0)
|
||||
--collector.qdisc.fixtures=collector/fixtures/qdisc/
|
||||
--collector.stat.softirq
|
||||
--collector.sysctl.include-info=kernel.seccomp.actions_avail
|
||||
--collector.sysctl.include=fs.file-nr
|
||||
--collector.sysctl.include=fs.file-nr:total,current,max
|
||||
--collector.sysctl.include=kernel.threads-max
|
||||
--collector.textfile.directory=collector/fixtures/textfile/two_metric_files/
|
||||
--collector.wifi.fixtures=collector/fixtures/wifi
|
||||
--no-collector.arp.netlink
|
||||
FLAGS
|
||||
)
|
||||
|
||||
# Handle supported --[no-]collector.<name> flags. These are not hardcoded.
|
||||
_filtered_collector_flags=""
|
||||
for flag in ${collector_flags}; do
|
||||
collector=$(echo "${flag}" | cut -d"." -f2)
|
||||
# If the flag is associated with an enabled-by-default collector, include it.
|
||||
enabled_by_default=0
|
||||
for filename in $(maybe_flag_search_scope "${collector}") ; do
|
||||
file="collector/${filename}"
|
||||
if grep -h -E -o -- "registerCollector\(.*, defaultEnabled" ${file} > /dev/null 2>&1; then
|
||||
_filtered_collector_flags="${_filtered_collector_flags} ${flag}"
|
||||
enabled_by_default=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ ${enabled_by_default} -eq 1 ]; then
|
||||
continue
|
||||
fi
|
||||
# If the flag is associated with an enabled-list collector, include it.
|
||||
if echo "${supported_enabled_collectors} ${supported_disabled_collectors}" | grep -q -w "${collector}"; then
|
||||
_filtered_collector_flags="${_filtered_collector_flags} ${flag}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Handle supported --[no-]collector.<name>.<collector> flags. These are hardcoded and matched by the expression below.
|
||||
filtered_collector_flags=""
|
||||
# Check flags of all supported collectors further down their sub-collectors (beyond the 2nd ".").
|
||||
for flag in ${_filtered_collector_flags}; do
|
||||
# Iterate through all possible files where the flag may be defined.
|
||||
flag_collector="$(echo "${flag}" | cut -d"." -f2)"
|
||||
for filename in $(maybe_flag_search_scope "${flag_collector}") ; do
|
||||
file="collector/${filename}"
|
||||
# Move to next iteration if the current file is not included under the build context.
|
||||
if ! ./tools/tools match "$file" > /dev/null 2>&1; then
|
||||
continue
|
||||
fi
|
||||
# Flag has the format: --[no-]collector.<name>.<collector>.
|
||||
if [ -n "$(echo ${flag} | cut -d"." -f3)" ]; then
|
||||
# Check if the flag is used in the file.
|
||||
trimmed_flag=$(echo "${flag}" | tr -d "\"' " | cut -d"=" -f1 | cut -c 3-)
|
||||
if [[ $trimmed_flag =~ ^no- ]]; then
|
||||
trimmed_flag=$(echo $trimmed_flag | cut -c 4-)
|
||||
fi
|
||||
if grep -h -E -o -- "kingpin.Flag\(\"${trimmed_flag}" ${file} > /dev/null 2>&1; then
|
||||
filtered_collector_flags="${filtered_collector_flags} ${flag}"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
# Flag has the format: --[no-]collector.<name>.
|
||||
else
|
||||
# Flag is supported by the host.
|
||||
filtered_collector_flags="${filtered_collector_flags} ${flag}"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# Check for ignored flags.
|
||||
ignored_flags=""
|
||||
for flag in ${collector_flags}; do
|
||||
flag=$(echo "${flag}" | tr -d " ")
|
||||
if ! echo "${filtered_collector_flags}" | grep -q -F -- "${flag}" > /dev/null 2>&1; then
|
||||
ignored_flags="${ignored_flags} ${flag}"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "ENABLED COLLECTORS======="
|
||||
echo "${supported_enabled_collectors:1}" | tr ' ' '\n' | sort
|
||||
echo "========================="
|
||||
|
||||
echo "DISABLED COLLECTORS======"
|
||||
echo "${supported_disabled_collectors:1}" | tr ' ' '\n' | sort
|
||||
echo "========================="
|
||||
|
||||
echo "IGNORED FLAGS============"
|
||||
echo "${ignored_flags:1}"| tr ' ' '\n' | sort | uniq
|
||||
echo "========================="
|
||||
|
||||
./node_exporter \
|
||||
--path.rootfs="collector/fixtures" \
|
||||
--path.procfs="collector/fixtures/proc" \
|
||||
--path.sysfs="collector/fixtures/sys" \
|
||||
--path.udev.data="collector/fixtures/udev/data" \
|
||||
$(for c in ${enabled_collectors}; do echo --collector.${c} ; done) \
|
||||
$(for c in ${disabled_collectors}; do echo --no-collector.${c} ; done) \
|
||||
--collector.textfile.directory="collector/fixtures/textfile/two_metric_files/" \
|
||||
--collector.wifi.fixtures="collector/fixtures/wifi" \
|
||||
--collector.qdisc.fixtures="collector/fixtures/qdisc/" \
|
||||
--collector.qdisc.device-include="(wlan0|eth0)" \
|
||||
--collector.arp.device-exclude="nope" \
|
||||
--no-collector.arp.netlink \
|
||||
--collector.hwmon.chip-include="(applesmc|coretemp|hwmon4|nct6779)" \
|
||||
--collector.netclass.ignored-devices="(dmz|int)" \
|
||||
--collector.netclass.ignore-invalid-speed \
|
||||
--collector.netdev.device-include="lo" \
|
||||
--collector.bcache.priorityStats \
|
||||
"${cpu_info_collector}" \
|
||||
--collector.cpu.info.bugs-include="${cpu_info_bugs}" \
|
||||
--collector.cpu.info.flags-include="${cpu_info_flags}" \
|
||||
--collector.stat.softirq \
|
||||
--collector.sysctl.include="kernel.threads-max" \
|
||||
--collector.sysctl.include="fs.file-nr" \
|
||||
--collector.sysctl.include="fs.file-nr:total,current,max" \
|
||||
--collector.sysctl.include-info="kernel.seccomp.actions_avail" \
|
||||
$(for c in ${supported_enabled_collectors}; do echo --collector.${c} ; done) \
|
||||
$(for c in ${supported_disabled_collectors}; do echo --no-collector.${c} ; done) \
|
||||
${filtered_collector_flags} \
|
||||
--web.listen-address "127.0.0.1:${port}" \
|
||||
--log.level="debug" > "${tmpdir}/node_exporter.log" 2>&1 &
|
||||
|
||||
echo $! > "${tmpdir}/node_exporter.pid"
|
||||
|
||||
generated_metrics="${tmpdir}/e2e-output.txt"
|
||||
for os in freebsd openbsd netbsd solaris dragonfly darwin; do
|
||||
if [ "${GOHOSTOS}" = "${os}" ]; then
|
||||
generated_metrics="${tmpdir}/e2e-output-${GOHOSTOS}.txt"
|
||||
fixture_metrics="${fixture_metrics::-4}-${GOHOSTOS}.txt"
|
||||
fi
|
||||
done
|
||||
|
||||
finish() {
|
||||
if [ $? -ne 0 -o ${verbose} -ne 0 ]
|
||||
then
|
||||
|
@ -165,7 +288,7 @@ EOF
|
|||
|
||||
if [ ${update} -ne 0 ]
|
||||
then
|
||||
cp "${tmpdir}/e2e-output.txt" "${fixture}"
|
||||
cp "${generated_metrics}" "${fixture_metrics}"
|
||||
fi
|
||||
|
||||
if [ ${keep} -eq 0 ]
|
||||
|
@ -195,8 +318,64 @@ get() {
|
|||
|
||||
sleep 1
|
||||
|
||||
get "127.0.0.1:${port}/metrics" | grep -E -v "${skip_re}" > "${tmpdir}/e2e-output.txt"
|
||||
get "127.0.0.1:${port}/metrics" | grep --text -E -v "${skip_re}" > "${generated_metrics}"
|
||||
|
||||
# The following ignore-list is only applicable to the VMs used to run E2E tests on platforms for which containerized environments are not available.
|
||||
# However, owing to this, there are some non-deterministic metrics that end up generating samples, unlike their containerized counterparts, for e.g., node_network_receive_bytes_total.
|
||||
non_deterministic_metrics=$(cat << METRICS
|
||||
node_boot_time_seconds
|
||||
node_cpu_frequency_hertz
|
||||
node_cpu_frequency_max_hertz
|
||||
node_cpu_seconds_total
|
||||
node_disk_io_time_seconds_total
|
||||
node_disk_read_bytes_total
|
||||
node_disk_read_sectors_total
|
||||
node_disk_read_time_seconds_total
|
||||
node_disk_reads_completed_total
|
||||
node_disk_write_time_seconds_total
|
||||
node_disk_writes_completed_total
|
||||
node_disk_written_bytes_total
|
||||
node_disk_written_sectors_total
|
||||
node_exec_context_switches_total
|
||||
node_exec_device_interrupts_total
|
||||
node_exec_forks_total
|
||||
node_exec_software_interrupts_total
|
||||
node_exec_system_calls_total
|
||||
node_exec_traps_total
|
||||
node_interrupts_total
|
||||
node_load1
|
||||
node_load15
|
||||
node_load5
|
||||
node_memory_active_bytes
|
||||
node_memory_buffer_bytes
|
||||
node_memory_cache_bytes
|
||||
node_memory_compressed_bytes
|
||||
node_memory_free_bytes
|
||||
node_memory_inactive_bytes
|
||||
node_memory_internal_bytes
|
||||
node_memory_laundry_bytes
|
||||
node_memory_purgeable_bytes
|
||||
node_memory_size_bytes
|
||||
node_memory_swapped_in_bytes_total
|
||||
node_memory_swapped_out_bytes_total
|
||||
node_memory_wired_bytes
|
||||
node_netstat_tcp_receive_packets_total
|
||||
node_netstat_tcp_transmit_packets_total
|
||||
node_network_receive_bytes_total
|
||||
node_network_receive_multicast_total
|
||||
node_network_transmit_multicast_total
|
||||
METRICS
|
||||
)
|
||||
|
||||
# Remove non-deterministic metrics from the generated metrics file (as we run their workflows in VMs).
|
||||
for os in freebsd openbsd netbsd solaris dragonfly darwin; do
|
||||
if [ "${GOHOSTOS}" = "${os}" ]; then
|
||||
for metric in ${non_deterministic_metrics}; do
|
||||
sed -i "/${metric}/d" "${generated_metrics}"
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
diff -u \
|
||||
"${fixture}" \
|
||||
"${tmpdir}/e2e-output.txt"
|
||||
"${fixture_metrics}" \
|
||||
"${generated_metrics}"
|
||||
|
|
36
go.mod
36
go.mod
|
@ -1,6 +1,6 @@
|
|||
module github.com/prometheus/node_exporter
|
||||
|
||||
go 1.22.0
|
||||
go 1.23.0
|
||||
|
||||
require (
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0
|
||||
|
@ -18,18 +18,18 @@ require (
|
|||
github.com/mattn/go-xmlrpc v0.0.3
|
||||
github.com/mdlayher/ethtool v0.2.0
|
||||
github.com/mdlayher/netlink v1.7.2
|
||||
github.com/mdlayher/wifi v0.2.0
|
||||
github.com/opencontainers/selinux v1.11.0
|
||||
github.com/mdlayher/wifi v0.5.0
|
||||
github.com/opencontainers/selinux v1.11.1
|
||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55
|
||||
github.com/prometheus-community/go-runit v0.1.0
|
||||
github.com/prometheus/client_golang v1.20.3
|
||||
github.com/prometheus/client_model v0.6.1
|
||||
github.com/prometheus/common v0.59.1
|
||||
github.com/prometheus/exporter-toolkit v0.13.0
|
||||
github.com/prometheus/procfs v0.15.1
|
||||
github.com/safchain/ethtool v0.4.1
|
||||
github.com/prometheus/client_golang v1.21.1
|
||||
github.com/prometheus/client_model v0.6.2
|
||||
github.com/prometheus/common v0.64.0
|
||||
github.com/prometheus/exporter-toolkit v0.14.0
|
||||
github.com/prometheus/procfs v0.16.1
|
||||
github.com/safchain/ethtool v0.5.10
|
||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
|
||||
golang.org/x/sys v0.25.0
|
||||
golang.org/x/sys v0.33.0
|
||||
howett.net/plist v1.0.1
|
||||
)
|
||||
|
||||
|
@ -38,9 +38,9 @@ require (
|
|||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/dennwc/ioctl v1.0.0 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/google/go-cmp v0.7.0 // indirect
|
||||
github.com/jpillora/backoff v1.0.0 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/klauspost/compress v1.17.11 // indirect
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
github.com/mdlayher/genetlink v1.3.2 // indirect
|
||||
github.com/mdlayher/socket v0.4.1 // indirect
|
||||
|
@ -51,11 +51,11 @@ require (
|
|||
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.6.0 // indirect
|
||||
golang.org/x/crypto v0.26.0 // indirect
|
||||
golang.org/x/net v0.28.0 // indirect
|
||||
golang.org/x/oauth2 v0.22.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/text v0.17.0 // indirect
|
||||
google.golang.org/protobuf v1.34.2 // indirect
|
||||
golang.org/x/crypto v0.38.0 // indirect
|
||||
golang.org/x/net v0.40.0 // indirect
|
||||
golang.org/x/oauth2 v0.30.0 // indirect
|
||||
golang.org/x/sync v0.14.0 // indirect
|
||||
golang.org/x/text v0.25.0 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
|
|
74
go.sum
74
go.sum
|
@ -24,8 +24,8 @@ github.com/ema/qdisc v1.0.0/go.mod h1:FhIc0fLYi7f+lK5maMsesDqwYojIOh3VfRs8EVd5YJ
|
|||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY=
|
||||
github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc=
|
||||
github.com/hodgesds/perf-utils v0.7.0 h1:7KlHGMuig4FRH5fNw68PV6xLmgTe7jKs9hgAcEAbioU=
|
||||
|
@ -39,8 +39,8 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
|
|||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/jsimonetti/rtnetlink/v2 v2.0.2 h1:ZKlbCujrIpp4/u3V2Ka0oxlf4BCkt6ojkvpy3nZoCBY=
|
||||
github.com/jsimonetti/rtnetlink/v2 v2.0.2/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
|
@ -61,66 +61,66 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U
|
|||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
|
||||
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
|
||||
github.com/mdlayher/wifi v0.2.0 h1:vwbVyu5MWTiFNvOmWdvIx9veBlMVnEasZ90PhUi1DYU=
|
||||
github.com/mdlayher/wifi v0.2.0/go.mod h1:yOfWhVZ4FFJxeHzAxDzt87Om9EkqqcCiY9Gi5gfSXwI=
|
||||
github.com/mdlayher/wifi v0.5.0 h1:TGZIcrhL6h3710amshpEJnMzLs74MrZOF+8qbm8Gx/I=
|
||||
github.com/mdlayher/wifi v0.5.0/go.mod h1:yfQs+5zr1eOIfdsWDcZonWdznnt/Iiz0/4772cfZuHk=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
|
||||
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
||||
github.com/opencontainers/selinux v1.11.1 h1:nHFvthhM0qY8/m+vfhJylliSshm8G1jJ2jDMcgULaH8=
|
||||
github.com/opencontainers/selinux v1.11.1/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/prometheus-community/go-runit v0.1.0 h1:uTWEj/Fn2RoLdfg/etSqwzgYNOYPrARx1BHUN052tGA=
|
||||
github.com/prometheus-community/go-runit v0.1.0/go.mod h1:AvJ9Jo3gAFu2lbM4+qfjdpq30FfiLDJZKbQ015u08IQ=
|
||||
github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4=
|
||||
github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0=
|
||||
github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0=
|
||||
github.com/prometheus/exporter-toolkit v0.13.0 h1:lmA0Q+8IaXgmFRKw09RldZmZdnvu9wwcDLIXGmTPw1c=
|
||||
github.com/prometheus/exporter-toolkit v0.13.0/go.mod h1:2uop99EZl80KdXhv/MxVI2181fMcwlsumFOqBecGkG0=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
|
||||
github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
|
||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||
github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
|
||||
github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
|
||||
github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg=
|
||||
github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA=
|
||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
|
||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
|
||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||
github.com/safchain/ethtool v0.4.1 h1:S6mEleTADqgynileXoiapt/nKnatyR6bmIHoF+h2ADo=
|
||||
github.com/safchain/ethtool v0.4.1/go.mod h1:XLLnZmy4OCRTkksP/UiMjij96YmIsBfmBQcs7H6tA48=
|
||||
github.com/safchain/ethtool v0.5.10 h1:Im294gZtuf4pSGJRAOGKaASNi3wMeFaGaWuSaomedpc=
|
||||
github.com/safchain/ethtool v0.5.10/go.mod h1:w9jh2Lx7YBR4UwzLkzCmWl85UY0W2uZdd7/DckVE5+c=
|
||||
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973 h1:GfSdC6wKfTGcgCS7BtzF5694Amne1pGCSTY252WhlEY=
|
||||
github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
|
||||
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
|
||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
|
||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
|
||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
|
||||
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
|
||||
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
|
||||
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
|
|
79
tools/main.go
Normal file
79
tools/main.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
// Copyright 2024 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"go/build"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
printHelpAndDie := func() {
|
||||
fmt.Println(`
|
||||
Usage: tools [command]`)
|
||||
os.Exit(1)
|
||||
}
|
||||
if len(os.Args) < 2 {
|
||||
printHelpAndDie()
|
||||
}
|
||||
|
||||
// Sub-commands.
|
||||
matchCmd := flag.NewFlagSet("match", flag.ExitOnError)
|
||||
switch os.Args[1] {
|
||||
case "match":
|
||||
err := matchCmd.Parse(os.Args[2:])
|
||||
if err != nil {
|
||||
fmt.Println("Error parsing flags:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if matchCmd.NArg() != 1 {
|
||||
fmt.Println("Usage: match [file]")
|
||||
os.Exit(1)
|
||||
}
|
||||
file := matchCmd.Arg(0)
|
||||
|
||||
// For debugging purposes, allow overriding these.
|
||||
goos, found := os.LookupEnv("GOHOSTOS")
|
||||
if !found {
|
||||
goos = runtime.GOOS
|
||||
}
|
||||
goarch, found := os.LookupEnv("GOARCH")
|
||||
if !found {
|
||||
goarch = runtime.GOARCH
|
||||
}
|
||||
ctx := build.Context{
|
||||
GOOS: goos,
|
||||
GOARCH: goarch,
|
||||
}
|
||||
abs, err := filepath.Abs(file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
match, err := ctx.MatchFile(filepath.Dir(abs), filepath.Base(abs))
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if match {
|
||||
os.Exit(0)
|
||||
}
|
||||
os.Exit(1)
|
||||
default:
|
||||
printHelpAndDie()
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue