Files

57 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# gpu-rocm.sh — AMD-GPU-Metriken via rocm-smi.
#
# Ausgabe im PROMETHEUS-Format (nicht Influx), damit die Metriknamen ohne
# Suffix in Prometheus landen:
# gpu_utilization_gpu{gpu="card0"} 25
# Mit data_format="influx" haengt Telegraf beim Export "_value" an
# (gpu_utilization_gpu_value) — deshalb prometheus.
#
# rocm-smi liefert je nach Version MIT oder OHNE Einheitensuffix:
# alt: card0,37%,52c,45W
# neu: card0,51.0,54.0,47.0,25 (Einheit nur im Spaltenkopf!)
# Deshalb wird die KOPFZEILE geparst und die Spalte ueber ihren Namen
# zugeordnet — nicht ueber Position oder Suffix. Versionstolerant.
set -eu
if ! command -v rocm-smi >/dev/null 2>&1; then
echo "# rocm-smi nicht gefunden" >&2
exit 0
fi
TMP="$(mktemp)"; trap 'rm -f "$TMP"' EXIT
rocm-smi --showuse --showtemp --showpower --showmeminfo vram --csv > "$TMP" 2>/dev/null || true
[ -s "$TMP" ] || exit 0
awk -F, '
function metric_for(header, h) {
h = tolower(header)
if (h ~ /gpu use|gpu_use|utilization/) return "gpu_utilization_gpu"
if (h ~ /sensor edge|edge/) return "gpu_temperature_edge"
if (h ~ /sensor junction|junction/) return "gpu_temperature_junction"
if (h ~ /sensor memory|memory.*\(c\)/) return "gpu_temperature_memory"
if (h ~ /power/) return "gpu_power_draw"
if (h ~ /vram total used|used memory/) return "gpu_memory_used"
if (h ~ /vram total|total memory/) return "gpu_memory_total"
return ""
}
function num(s) { gsub(/[^0-9.eE+-]/, "", s); return s }
NR == 1 {
for (i = 1; i <= NF; i++) col[i] = metric_for($i)
next
}
{
card = $1
gsub(/^[ \t]+|[ \t]+$/, "", card)
if (card == "") next
for (i = 2; i <= NF; i++) {
if (col[i] == "") continue
v = $i
gsub(/^[ \t]+|[ \t]+$/, "", v)
if (v == "" || v == "N/A" || v ~ /^\[/) continue
printf "%s{gpu=\"%s\"} %s\n", col[i], card, num(v)
}
}' "$TMP"