Files
KNELPerf/scheduler/collectors/knelperf-psi-textfile.sh
T
ic-builder 3680f1dba1
ci / audit (push) Successful in 26s
Fleet monitoring: sysstat 28d + perfsnap/PSI/iotop timers + on-demand toolbox container (#826)
- monitoring/node-install.sh: idempotent per-node installer (sar HISTORY=28,
  three oneshot timers, per-node conf with qemu.slice/lxc cgroup globs)
- monitoring/collectors + systemd units: iotop-snap 15min, perfsnap 60s,
  psi-textfile 15s (now sources /etc/knelperf/perfsnap.conf; multi-glob)
- monitoring/toolbox: pct LXC (vmid 950, privileged, apparmor unconfined,
  stopped at rest) + knelperf-toolbox wrapper + Dockerfile variant
- monitoring/deploy-fleet.sh: workstation-side rollout driver
- piloted on pfv-tsys1: per-VM PSI gauges verified live

Redmine: https://projects.knownelement.com/issues/826
2026-09-06 18:50:07 -05:00

47 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# KNELPerf PSI (pressure stall info) avg60 -> node_exporter textfile collector.
# Ported from ultix staged/ukrrs-psi-textfile.sh (#826); generalizations:
# - cgroup globs are env-driven (space-separated LIST, any slice namespace)
# - metric prefix is env-driven (default knelperf_)
set -u
CONF=/etc/knelperf/perfsnap.conf
[ -r "$CONF" ] && . "$CONF"
OUT_DIR=${KNELPERF_TEXTFILE_DIR:-/var/lib/node_exporter/textfile}
CGROOT=${KNELPERF_CGROOT:-/sys/fs/cgroup}
CG_GLOB=${KNELPERF_CG_GLOB:-"$CGROOT"/system.slice/knelperf-*.slice}
PREFIX=${KNELPERF_PREFIX:-knelperf}
mkdir -p "$OUT_DIR"
tmp=$(mktemp "$OUT_DIR/.knelperf.XXXXXX")
some60() { # file -> prints avg60 value or nothing
awk '$1=="some"{for(i=2;i<=NF;i++) if($i ~ /^avg60=/){sub("avg60=","",$i); print $i; exit}}' "$1" 2>/dev/null
}
emit() { # name cgroup_path
local res v
for res in cpu memory io; do
[ -r "$2/$res.pressure" ] || continue
v=$(some60 "$2/$res.pressure")
[ -n "${v:-}" ] && echo "${PREFIX}_slice_pressure_some60{slice=\"$1\",res=\"$res\"} $v"
done
}
echo "# HELP ${PREFIX}_slice_pressure_some60 PSI some avg60 (percent) per slice" >>"$tmp"
echo "# TYPE ${PREFIX}_slice_pressure_some60 gauge" >>"$tmp"
for cg in $CG_GLOB; do
case $cg in "$CGROOT"/*) ;; *) continue ;; esac # skip unmatched glob literals
[ -d "$cg" ] && emit "${cg##*/}" "$cg"
done
[ -d "$CGROOT/user.slice" ] && emit "user.slice" "$CGROOT/user.slice"
echo "# HELP ${PREFIX}_host_pressure_some60 PSI some avg60 (percent) host-wide" >>"$tmp"
echo "# TYPE ${PREFIX}_host_pressure_some60 gauge" >>"$tmp"
for res in cpu memory io; do
[ -r "/proc/pressure/$res" ] || continue
v=$(some60 "/proc/pressure/$res")
[ -n "${v:-}" ] && echo "${PREFIX}_host_pressure_some60{res=\"$res\"} $v"
done
mv "$tmp" "$OUT_DIR/${PREFIX}_pressure.prom"
chmod 0644 "$OUT_DIR/${PREFIX}_pressure.prom"