#!/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 glob is env-driven (any slice namespace, not just ukrrs-*) # - metric prefix is env-driven (default knelperf_) set -u 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 [ -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"